fix edge cases in drop table area computation

This commit is contained in:
Martin Michelsen
2024-07-28 19:41:31 -07:00
parent 0f29b1801d
commit 299e187380
+18 -15
View File
@@ -85,27 +85,33 @@ bool ItemCreator::are_rare_drops_allowed() const {
} }
uint8_t ItemCreator::normalize_area_number(uint8_t area) const { uint8_t ItemCreator::normalize_area_number(uint8_t area) const {
if (!this->restrictions || (this->restrictions->box_drop_area == 0) || (area < 0x10) || (area > 0x11)) { if (this->restrictions && (this->restrictions->box_drop_area != 0)) {
return this->restrictions->box_drop_area - 1;
} else {
switch (this->episode) { switch (this->episode) {
case Episode::EP1: case Episode::EP1:
if (area >= 0x0F) { if (area >= 0x11) {
throw runtime_error("invalid Episode 1 area number"); throw runtime_error("invalid Episode 1 area number");
} }
switch (area) { switch (area) {
case 11: case 0x0B: // Dragon -> Cave 1
return 2; // Dragon -> Cave 1 return 2;
case 12: case 0x0C: // De Rol Le -> Mine 1
return 5; // De Rol Le -> Mine 1 return 5;
case 13: case 0x0D: // Vol Opt -> Ruins 1
return 7; // Vol Opt -> Ruins 1 return 7;
case 14: case 0x0E: // Dark Falz -> Ruins 3
return 9; // Dark Falz -> Ruins 3 case 0x10: // Palace -> Ruins 3
case 0x11: // Spaceship -> Ruins 3
return 9;
case 0x0F: // Lobby
throw runtime_error("visual lobby does not have item drop tables");
default: default:
return area - 1; return area - 1;
} }
throw logic_error("this should be impossible"); throw logic_error("this should be impossible");
case Episode::EP2: { case Episode::EP2: {
static const vector<uint8_t> area_subs = { static const array<uint8_t, 0x11> area_subs = {
0x00, // 13 (VR Temple Alpha) 0x00, // 13 (VR Temple Alpha)
0x01, // 14 (VR Temple Beta) 0x01, // 14 (VR Temple Beta)
0x02, // 15 (VR Spaceship Alpha) 0x02, // 15 (VR Spaceship Alpha)
@@ -127,7 +133,7 @@ uint8_t ItemCreator::normalize_area_number(uint8_t area) const {
if ((area >= 0x13) && (area < 0x24)) { if ((area >= 0x13) && (area < 0x24)) {
return area_subs.at(area - 0x13); return area_subs.at(area - 0x13);
} }
return area - 1; throw runtime_error("invalid Episode 2 area number");
} }
case Episode::EP4: case Episode::EP4:
if (area >= 0x24 && area < 0x2D) { if (area >= 0x24 && area < 0x2D) {
@@ -137,9 +143,6 @@ uint8_t ItemCreator::normalize_area_number(uint8_t area) const {
default: default:
throw logic_error("invalid episode number"); throw logic_error("invalid episode number");
} }
} else {
return this->restrictions->box_drop_area - 1;
} }
} }