rename section to room
This commit is contained in:
@@ -4683,7 +4683,7 @@ struct G_StandardDropItemRequest_DC_6x60 {
|
||||
/* 05 */ uint8_t rt_index = 0;
|
||||
/* 06 */ le_uint16_t entity_index = 0;
|
||||
/* 08 */ VectorXZF pos;
|
||||
/* 10 */ le_uint16_t section = 0;
|
||||
/* 10 */ le_uint16_t room = 0;
|
||||
/* 12 */ le_uint16_t ignore_def = 0;
|
||||
/* 14 */
|
||||
} __packed_ws__(G_StandardDropItemRequest_DC_6x60, 0x14);
|
||||
|
||||
+73
-73
@@ -990,7 +990,7 @@ const char* MapFile::name_for_enemy_type(uint16_t type) {
|
||||
|
||||
string MapFile::ObjectSetEntry::str() const {
|
||||
string name_str = MapFile::name_for_object_type(this->base_type);
|
||||
return phosg::string_printf("[ObjectEntry type=%04hX \"%s\" set_flags=%04hX index=%04hX a2=%04hX entity_id=%04hX group=%04hX section=%04hX a3=%04hX x=%g y=%g z=%g x_angle=%08" PRIX32 " y_angle=%08" PRIX32 " z_angle=%08" PRIX32 " params=[%g %g %g %08" PRIX32 " %08" PRIX32 " %08" PRIX32 "] unused=%08" PRIX32 "]",
|
||||
return phosg::string_printf("[ObjectEntry type=%04hX \"%s\" set_flags=%04hX index=%04hX a2=%04hX entity_id=%04hX group=%04hX room=%04hX a3=%04hX x=%g y=%g z=%g x_angle=%08" PRIX32 " y_angle=%08" PRIX32 " z_angle=%08" PRIX32 " params=[%g %g %g %08" PRIX32 " %08" PRIX32 " %08" PRIX32 "] unused=%08" PRIX32 "]",
|
||||
this->base_type.load(),
|
||||
name_str.c_str(),
|
||||
this->set_flags.load(),
|
||||
@@ -998,7 +998,7 @@ string MapFile::ObjectSetEntry::str() const {
|
||||
this->unknown_a2.load(),
|
||||
this->entity_id.load(),
|
||||
this->group.load(),
|
||||
this->section.load(),
|
||||
this->room.load(),
|
||||
this->unknown_a3.load(),
|
||||
this->pos.x.load(),
|
||||
this->pos.y.load(),
|
||||
@@ -1018,7 +1018,7 @@ string MapFile::ObjectSetEntry::str() const {
|
||||
uint64_t MapFile::ObjectSetEntry::semantic_hash() const {
|
||||
uint64_t ret = phosg::fnv1a64(&this->base_type, sizeof(this->base_type));
|
||||
ret = phosg::fnv1a64(&this->group, sizeof(this->group), ret);
|
||||
ret = phosg::fnv1a64(&this->section, sizeof(this->section), ret);
|
||||
ret = phosg::fnv1a64(&this->room, sizeof(this->room), ret);
|
||||
ret = phosg::fnv1a64(&this->pos, sizeof(this->pos), ret);
|
||||
ret = phosg::fnv1a64(&this->angle, sizeof(this->angle), ret);
|
||||
ret = phosg::fnv1a64(&this->param1, sizeof(this->param1), ret);
|
||||
@@ -1031,7 +1031,7 @@ uint64_t MapFile::ObjectSetEntry::semantic_hash() const {
|
||||
}
|
||||
|
||||
string MapFile::EnemySetEntry::str() const {
|
||||
return phosg::string_printf("[EnemyEntry type=%04hX \"%s\" set_flags=%04hX index=%04hX num_children=%04hX floor=%04hX entity_id=%04hX section=%04hX wave_number=%04hX wave_number2=%04hX a1=%04hX x=%g y=%g z=%g x_angle=%08" PRIX32 " y_angle=%08" PRIX32 " z_angle=%08" PRIX32 " params=[%g %g %g %g %g %04hX %04hX] unused=%08" PRIX32 "]",
|
||||
return phosg::string_printf("[EnemyEntry type=%04hX \"%s\" set_flags=%04hX index=%04hX num_children=%04hX floor=%04hX entity_id=%04hX room=%04hX wave_number=%04hX wave_number2=%04hX a1=%04hX x=%g y=%g z=%g x_angle=%08" PRIX32 " y_angle=%08" PRIX32 " z_angle=%08" PRIX32 " params=[%g %g %g %g %g %04hX %04hX] unused=%08" PRIX32 "]",
|
||||
this->base_type.load(),
|
||||
MapFile::name_for_enemy_type(this->base_type),
|
||||
this->set_flags.load(),
|
||||
@@ -1039,7 +1039,7 @@ string MapFile::EnemySetEntry::str() const {
|
||||
this->num_children.load(),
|
||||
this->floor.load(),
|
||||
this->entity_id.load(),
|
||||
this->section.load(),
|
||||
this->room.load(),
|
||||
this->wave_number.load(),
|
||||
this->wave_number2.load(),
|
||||
this->unknown_a1.load(),
|
||||
@@ -1062,7 +1062,7 @@ string MapFile::EnemySetEntry::str() const {
|
||||
uint64_t MapFile::EnemySetEntry::semantic_hash() const {
|
||||
uint64_t ret = phosg::fnv1a64(&this->base_type, sizeof(this->base_type));
|
||||
ret = phosg::fnv1a64(&this->num_children, sizeof(this->num_children), ret);
|
||||
ret = phosg::fnv1a64(&this->section, sizeof(this->section), ret);
|
||||
ret = phosg::fnv1a64(&this->room, sizeof(this->room), ret);
|
||||
ret = phosg::fnv1a64(&this->wave_number, sizeof(this->wave_number), ret);
|
||||
ret = phosg::fnv1a64(&this->wave_number2, sizeof(this->wave_number2), ret);
|
||||
ret = phosg::fnv1a64(&this->pos, sizeof(this->pos), ret);
|
||||
@@ -1078,11 +1078,11 @@ uint64_t MapFile::EnemySetEntry::semantic_hash() const {
|
||||
}
|
||||
|
||||
string MapFile::Event1Entry::str() const {
|
||||
return phosg::string_printf("[Event1Entry event_id=%08" PRIX32 " flags=%04hX event_type=%04hX section=%04hX wave_number=%04hX delay=%08" PRIX32 " action_stream_offset=%08" PRIX32 "]",
|
||||
return phosg::string_printf("[Event1Entry event_id=%08" PRIX32 " flags=%04hX event_type=%04hX room=%04hX wave_number=%04hX delay=%08" PRIX32 " action_stream_offset=%08" PRIX32 "]",
|
||||
this->event_id.load(),
|
||||
this->flags.load(),
|
||||
this->event_type.load(),
|
||||
this->section.load(),
|
||||
this->room.load(),
|
||||
this->wave_number.load(),
|
||||
this->delay.load(),
|
||||
this->action_stream_offset.load());
|
||||
@@ -1090,17 +1090,17 @@ string MapFile::Event1Entry::str() const {
|
||||
|
||||
uint64_t MapFile::Event1Entry::semantic_hash() const {
|
||||
uint64_t ret = phosg::fnv1a64(&this->event_id, sizeof(this->event_id));
|
||||
ret = phosg::fnv1a64(&this->section, sizeof(this->section), ret);
|
||||
ret = phosg::fnv1a64(&this->room, sizeof(this->room), ret);
|
||||
ret = phosg::fnv1a64(&this->wave_number, sizeof(this->wave_number), ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
string MapFile::Event2Entry::str() const {
|
||||
return phosg::string_printf("[Event2Entry event_id=%08" PRIX32 " flags=%04hX event_type=%04hX section=%04hX wave_number=%04hX min_delay=%08" PRIX32 " max_delay=%08" PRIX32 " min_enemies=%02hhX max_enemies=%02hhX max_waves=%04hX action_stream_offset=%08" PRIX32 "]",
|
||||
return phosg::string_printf("[Event2Entry event_id=%08" PRIX32 " flags=%04hX event_type=%04hX room=%04hX wave_number=%04hX min_delay=%08" PRIX32 " max_delay=%08" PRIX32 " min_enemies=%02hhX max_enemies=%02hhX max_waves=%04hX action_stream_offset=%08" PRIX32 "]",
|
||||
this->event_id.load(),
|
||||
this->flags.load(),
|
||||
this->event_type.load(),
|
||||
this->section.load(),
|
||||
this->room.load(),
|
||||
this->wave_number.load(),
|
||||
this->min_delay.load(),
|
||||
this->max_delay.load(),
|
||||
@@ -1170,26 +1170,26 @@ uint32_t MapFile::RandomState::next_location_index() {
|
||||
}
|
||||
|
||||
void MapFile::RandomState::generate_shuffled_location_table(
|
||||
const RandomEnemyLocationsHeader& header, phosg::StringReader r, uint16_t section) {
|
||||
if (header.num_sections == 0) {
|
||||
const RandomEnemyLocationsHeader& header, phosg::StringReader r, uint16_t room) {
|
||||
if (header.num_rooms == 0) {
|
||||
throw runtime_error("no locations defined");
|
||||
}
|
||||
|
||||
phosg::StringReader sections_r = r.sub(header.section_table_offset, header.num_sections * sizeof(RandomEnemyLocationSection));
|
||||
phosg::StringReader rooms_r = r.sub(header.room_table_offset, header.num_rooms * sizeof(RandomEnemyLocationSection));
|
||||
|
||||
size_t bs_min = 0;
|
||||
size_t bs_max = header.num_sections - 1;
|
||||
size_t bs_max = header.num_rooms - 1;
|
||||
do {
|
||||
size_t bs_mid = (bs_min + bs_max) / 2;
|
||||
if (sections_r.pget<RandomEnemyLocationSection>(bs_mid * sizeof(RandomEnemyLocationSection)).section < section) {
|
||||
if (rooms_r.pget<RandomEnemyLocationSection>(bs_mid * sizeof(RandomEnemyLocationSection)).room < room) {
|
||||
bs_min = bs_mid + 1;
|
||||
} else {
|
||||
bs_max = bs_mid;
|
||||
}
|
||||
} while (bs_min < bs_max);
|
||||
|
||||
const auto& sec = sections_r.pget<RandomEnemyLocationSection>(bs_min * sizeof(RandomEnemyLocationSection));
|
||||
if (section != sec.section) {
|
||||
const auto& sec = rooms_r.pget<RandomEnemyLocationSection>(bs_min * sizeof(RandomEnemyLocationSection));
|
||||
if (room != sec.room) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1432,7 +1432,7 @@ std::shared_ptr<MapFile> MapFile::materialize_random_sections(uint32_t random_se
|
||||
size_t remaining_enemies = random_state.rand_int_biased(source_event2.min_enemies, source_event2.max_enemies);
|
||||
// Trace: at 0080E208 EDI is enemy count
|
||||
|
||||
random_state.generate_shuffled_location_table(locations_header, locations_sec_r, source_event2.section);
|
||||
random_state.generate_shuffled_location_table(locations_header, locations_sec_r, source_event2.room);
|
||||
// Trace: at 0080EBB0 *(EBP + 4) points to table (0x20 uint32_ts)
|
||||
|
||||
while (remaining_enemies) {
|
||||
@@ -1457,7 +1457,7 @@ std::shared_ptr<MapFile> MapFile::materialize_random_sections(uint32_t random_se
|
||||
EnemySetEntry e;
|
||||
e.base_type = rand_enemy_base_types.at(weight_entry.base_type_index);
|
||||
e.wave_number = wave_number;
|
||||
e.section = source_event2.section;
|
||||
e.room = source_event2.room;
|
||||
e.floor = floor;
|
||||
|
||||
size_t bs_min = 0;
|
||||
@@ -1507,7 +1507,7 @@ std::shared_ptr<MapFile> MapFile::materialize_random_sections(uint32_t random_se
|
||||
event.event_id = wave_next_event_id;
|
||||
event.flags = source_event2.flags;
|
||||
event.event_type = source_event2.event_type;
|
||||
event.section = source_event2.section;
|
||||
event.room = source_event2.room;
|
||||
event.wave_number = wave_number;
|
||||
event.delay = random_state.rand_int_biased(source_event2.min_delay, source_event2.max_delay);
|
||||
event.action_stream_offset = action_stream_w.size();
|
||||
@@ -1526,7 +1526,7 @@ std::shared_ptr<MapFile> MapFile::materialize_random_sections(uint32_t random_se
|
||||
event.event_id = wave_next_event_id;
|
||||
event.flags = source_event2.flags;
|
||||
event.event_type = source_event2.event_type;
|
||||
event.section = source_event2.section;
|
||||
event.room = source_event2.room;
|
||||
event.wave_number = wave_number;
|
||||
event.delay = random_state.rand_int_biased(source_event2.min_delay, source_event2.max_delay);
|
||||
event.action_stream_offset = source_event2.action_stream_offset;
|
||||
@@ -1619,17 +1619,17 @@ string MapFile::disassemble_action_stream(const void* data, size_t size) {
|
||||
r.go(r.size());
|
||||
break;
|
||||
case 0x08: {
|
||||
uint16_t section = r.get_u16l();
|
||||
uint16_t room = r.get_u16l();
|
||||
uint16_t group = r.get_u16l();
|
||||
ret.emplace_back(phosg::string_printf(" 08 %04hX %04hX construct_objects section=%04hX group=%04hX",
|
||||
section, group, section, group));
|
||||
ret.emplace_back(phosg::string_printf(" 08 %04hX %04hX construct_objects room=%04hX group=%04hX",
|
||||
room, group, room, group));
|
||||
break;
|
||||
}
|
||||
case 0x09: {
|
||||
uint16_t section = r.get_u16l();
|
||||
uint16_t room = r.get_u16l();
|
||||
uint16_t wave_number = r.get_u16l();
|
||||
ret.emplace_back(phosg::string_printf(" 09 %04hX %04hX construct_enemies section=%04hX wave_number=%04hX",
|
||||
section, wave_number, section, wave_number));
|
||||
ret.emplace_back(phosg::string_printf(" 09 %04hX %04hX construct_enemies room=%04hX wave_number=%04hX",
|
||||
room, wave_number, room, wave_number));
|
||||
break;
|
||||
}
|
||||
case 0x0A: {
|
||||
@@ -1648,10 +1648,10 @@ string MapFile::disassemble_action_stream(const void* data, size_t size) {
|
||||
break;
|
||||
}
|
||||
case 0x0D: {
|
||||
uint16_t section = r.get_u16l();
|
||||
uint16_t room = r.get_u16l();
|
||||
uint16_t wave_number = r.get_u16l();
|
||||
ret.emplace_back(phosg::string_printf(" 0D %04hX %04hX construct_enemies_stop section=%04hX wave_number=%04hX",
|
||||
section, wave_number, section, wave_number));
|
||||
ret.emplace_back(phosg::string_printf(" 0D %04hX %04hX construct_enemies_stop room=%04hX wave_number=%04hX",
|
||||
room, wave_number, room, wave_number));
|
||||
r.go(r.size());
|
||||
break;
|
||||
}
|
||||
@@ -1806,8 +1806,8 @@ SuperMap::SuperMap(Episode episode, const std::array<std::shared_ptr<const MapFi
|
||||
this->verify(); // TODO: Remove this when no longer needed
|
||||
}
|
||||
|
||||
static uint64_t section_index_key(uint8_t floor, uint16_t section, uint16_t wave_number) {
|
||||
return (static_cast<uint64_t>(floor) << 32) | (static_cast<uint64_t>(section) << 16) | static_cast<uint64_t>(wave_number);
|
||||
static uint64_t room_index_key(uint8_t floor, uint16_t room, uint16_t wave_number) {
|
||||
return (static_cast<uint64_t>(floor) << 32) | (static_cast<uint64_t>(room) << 16) | static_cast<uint64_t>(wave_number);
|
||||
}
|
||||
|
||||
shared_ptr<SuperMap::Object> SuperMap::add_object(
|
||||
@@ -1836,9 +1836,9 @@ void SuperMap::link_object_version(std::shared_ptr<Object> obj, Version version,
|
||||
|
||||
entities.objects.emplace_back(obj);
|
||||
|
||||
// Add to section/group index
|
||||
uint64_t k = section_index_key(obj->floor, set_entry->section, set_entry->group);
|
||||
entities.object_for_floor_section_and_group.emplace(k, obj);
|
||||
// Add to room/group index
|
||||
uint64_t k = room_index_key(obj->floor, set_entry->room, set_entry->group);
|
||||
entities.object_for_floor_room_and_group.emplace(k, obj);
|
||||
|
||||
// Add to door index
|
||||
uint32_t base_switch_flag = 0;
|
||||
@@ -1914,9 +1914,9 @@ shared_ptr<SuperMap::Enemy> SuperMap::add_enemy_and_children(
|
||||
entities.enemy_sets.emplace_back(ene);
|
||||
}
|
||||
|
||||
// Add to section/group index
|
||||
uint64_t k = section_index_key(ene->floor, set_entry->section, set_entry->wave_number);
|
||||
entities.enemy_for_floor_section_and_wave_number.emplace(k, ene);
|
||||
// Add to room/group index
|
||||
uint64_t k = room_index_key(ene->floor, set_entry->room, set_entry->wave_number);
|
||||
entities.enemy_for_floor_room_and_wave_number.emplace(k, ene);
|
||||
};
|
||||
|
||||
// The following logic was originally based on the public version of
|
||||
@@ -2349,9 +2349,9 @@ void SuperMap::link_enemy_version_and_children(
|
||||
entities.enemy_sets.emplace_back(ene);
|
||||
}
|
||||
|
||||
// Add to section/group index
|
||||
uint64_t k = section_index_key(ene->floor, set_entry->section, set_entry->wave_number);
|
||||
entities.enemy_for_floor_section_and_wave_number.emplace(k, ene);
|
||||
// Add to room/group index
|
||||
uint64_t k = room_index_key(ene->floor, set_entry->room, set_entry->wave_number);
|
||||
entities.enemy_for_floor_room_and_wave_number.emplace(k, ene);
|
||||
|
||||
try {
|
||||
ene = this->enemies.at(ene->super_id + 1);
|
||||
@@ -2372,10 +2372,10 @@ static size_t get_action_stream_size(const void* data, size_t size) {
|
||||
case 0x01: // stop()
|
||||
done = (cmd == 0x01);
|
||||
break;
|
||||
case 0x08: // construct_objects(uint16_t section, uint16_t group)
|
||||
case 0x09: // construct_enemies(uint16_t section, uint16_t wave_number)
|
||||
case 0x08: // construct_objects(uint16_t room, uint16_t group)
|
||||
case 0x09: // construct_enemies(uint16_t room, uint16_t wave_number)
|
||||
case 0x0C: // trigger_event(uint32_t event_id)
|
||||
case 0x0D: // construct_enemies_stop(uint16_t section, uint16_t wave_number)
|
||||
case 0x0D: // construct_enemies_stop(uint16_t room, uint16_t wave_number)
|
||||
r.skip(4);
|
||||
done = (cmd == 0x0D);
|
||||
break;
|
||||
@@ -2434,8 +2434,8 @@ void SuperMap::link_event_version(
|
||||
|
||||
entities.events.emplace_back(ev);
|
||||
|
||||
uint64_t k = section_index_key(ev->floor, entry->section, entry->wave_number);
|
||||
entities.event_for_floor_section_and_wave_number.emplace(k, ev);
|
||||
uint64_t k = room_index_key(ev->floor, entry->room, entry->wave_number);
|
||||
entities.event_for_floor_room_and_wave_number.emplace(k, ev);
|
||||
k = (static_cast<uint64_t>(ev->floor) << 32) | entry->event_id;
|
||||
entities.event_for_floor_and_event_id.emplace(k, ev);
|
||||
}
|
||||
@@ -2591,11 +2591,11 @@ static double object_set_edit_cost(const MapFile::ObjectSetEntry& prev, const Ma
|
||||
if (prev.base_type != current.base_type) {
|
||||
return 500.0;
|
||||
}
|
||||
// Group or section changes are pretty bad, but small variances in position
|
||||
// Group or room changes are pretty bad, but small variances in position
|
||||
// and params are tolerated
|
||||
return (
|
||||
((prev.group != current.group) * 50.0) +
|
||||
((prev.section != current.section) * 50.0) +
|
||||
((prev.room != current.room) * 50.0) +
|
||||
(prev.pos - current.pos).norm() +
|
||||
((prev.param1 != current.param1) * 10.0) +
|
||||
((prev.param2 != current.param2) * 10.0) +
|
||||
@@ -2617,10 +2617,10 @@ static double enemy_set_edit_cost(const MapFile::EnemySetEntry& prev, const MapF
|
||||
if ((prev.base_type != current.base_type) || (prev.num_children != current.num_children)) {
|
||||
return 500.0;
|
||||
}
|
||||
// Section or wave_number changes are pretty bad, but small variances in
|
||||
// Room or wave_number changes are pretty bad, but small variances in
|
||||
// position and params are tolerated
|
||||
return (
|
||||
((prev.section != current.section) * 50.0) +
|
||||
((prev.room != current.room) * 50.0) +
|
||||
((prev.wave_number != current.wave_number) * 50.0) +
|
||||
(prev.pos - current.pos).norm() +
|
||||
((prev.fparam1 != current.fparam1) * 10.0) +
|
||||
@@ -2642,7 +2642,7 @@ static double event_edit_cost(const MapFile::Event1Entry& prev, const MapFile::E
|
||||
// Unlike object and enemy sets, event matching is essentially binary: no
|
||||
// variance is tolerated in some parameters, but others are entirely ignored.
|
||||
bool is_same = ((prev.event_id == current.event_id) &&
|
||||
(prev.section == current.section) &&
|
||||
(prev.room == current.room) &&
|
||||
(prev.wave_number == current.wave_number));
|
||||
return is_same ? 0.0 : 5.0;
|
||||
}
|
||||
@@ -2828,12 +2828,12 @@ void SuperMap::add_map_file(Version this_v, shared_ptr<const MapFile> this_map_f
|
||||
}
|
||||
}
|
||||
|
||||
vector<shared_ptr<const SuperMap::Object>> SuperMap::objects_for_floor_section_group(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t group) const {
|
||||
vector<shared_ptr<const SuperMap::Object>> SuperMap::objects_for_floor_room_group(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t group) const {
|
||||
const auto& entities = this->version(version);
|
||||
uint64_t k = section_index_key(floor, section, group);
|
||||
uint64_t k = room_index_key(floor, room, group);
|
||||
vector<shared_ptr<const Object>> ret;
|
||||
for (auto its = entities.object_for_floor_section_and_group.equal_range(k); its.first != its.second; its.first++) {
|
||||
for (auto its = entities.object_for_floor_room_and_group.equal_range(k); its.first != its.second; its.first++) {
|
||||
ret.emplace_back(its.first->second);
|
||||
}
|
||||
return ret;
|
||||
@@ -2888,13 +2888,13 @@ shared_ptr<const SuperMap::Enemy> SuperMap::enemy_for_floor_type(Version version
|
||||
throw out_of_range("enemy not found");
|
||||
}
|
||||
|
||||
vector<shared_ptr<const SuperMap::Enemy>> SuperMap::enemies_for_floor_section_wave(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t wave_number) const {
|
||||
vector<shared_ptr<const SuperMap::Enemy>> SuperMap::enemies_for_floor_room_wave(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t wave_number) const {
|
||||
const auto& entities = this->version(version);
|
||||
|
||||
uint64_t k = section_index_key(floor, section, wave_number);
|
||||
uint64_t k = room_index_key(floor, room, wave_number);
|
||||
vector<shared_ptr<const Enemy>> ret;
|
||||
for (auto its = entities.enemy_for_floor_section_and_wave_number.equal_range(k); its.first != its.second; its.first++) {
|
||||
for (auto its = entities.enemy_for_floor_room_and_wave_number.equal_range(k); its.first != its.second; its.first++) {
|
||||
ret.emplace_back(its.first->second);
|
||||
}
|
||||
return ret;
|
||||
@@ -2923,12 +2923,12 @@ vector<shared_ptr<const SuperMap::Event>> SuperMap::events_for_floor(Version ver
|
||||
return ret;
|
||||
}
|
||||
|
||||
vector<shared_ptr<const SuperMap::Event>> SuperMap::events_for_floor_section_wave(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t wave_number) const {
|
||||
vector<shared_ptr<const SuperMap::Event>> SuperMap::events_for_floor_room_wave(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t wave_number) const {
|
||||
const auto& entities = this->version(version);
|
||||
uint64_t k = section_index_key(floor, section, wave_number);
|
||||
uint64_t k = room_index_key(floor, room, wave_number);
|
||||
vector<shared_ptr<const Event>> ret;
|
||||
for (auto its = entities.event_for_floor_section_and_wave_number.equal_range(k); its.first != its.second; its.first++) {
|
||||
for (auto its = entities.event_for_floor_room_and_wave_number.equal_range(k); its.first != its.second; its.first++) {
|
||||
ret.emplace_back(its.first->second);
|
||||
}
|
||||
return ret;
|
||||
@@ -3588,12 +3588,12 @@ shared_ptr<MapState::ObjectState> MapState::object_state_for_index(Version versi
|
||||
}
|
||||
}
|
||||
|
||||
vector<shared_ptr<MapState::ObjectState>> MapState::object_states_for_floor_section_group(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t group) {
|
||||
vector<shared_ptr<MapState::ObjectState>> MapState::object_states_for_floor_room_group(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t group) {
|
||||
vector<shared_ptr<ObjectState>> ret;
|
||||
auto& fc = this->floor_config(floor);
|
||||
if (fc.super_map) {
|
||||
for (const auto& obj : fc.super_map->objects_for_floor_section_group(version, floor, section, group)) {
|
||||
for (const auto& obj : fc.super_map->objects_for_floor_room_group(version, floor, room, group)) {
|
||||
ret.emplace_back(this->object_states.at(fc.base_super_ids.base_object_index + obj->super_id));
|
||||
}
|
||||
}
|
||||
@@ -3648,12 +3648,12 @@ shared_ptr<MapState::EnemyState> MapState::enemy_state_for_floor_type(Version ve
|
||||
throw out_of_range("map definition missing for floor");
|
||||
}
|
||||
|
||||
vector<shared_ptr<MapState::EnemyState>> MapState::enemy_states_for_floor_section_wave(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t wave_number) {
|
||||
vector<shared_ptr<MapState::EnemyState>> MapState::enemy_states_for_floor_room_wave(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t wave_number) {
|
||||
vector<shared_ptr<EnemyState>> ret;
|
||||
auto& fc = this->floor_config(floor);
|
||||
if (fc.super_map) {
|
||||
for (const auto& ene : fc.super_map->enemies_for_floor_section_wave(version, floor, section, wave_number)) {
|
||||
for (const auto& ene : fc.super_map->enemies_for_floor_room_wave(version, floor, room, wave_number)) {
|
||||
ret.emplace_back(this->enemy_states.at(fc.base_super_ids.base_enemy_index + ene->super_id));
|
||||
}
|
||||
}
|
||||
@@ -3695,12 +3695,12 @@ vector<shared_ptr<MapState::EventState>> MapState::event_states_for_floor(Versio
|
||||
return ret;
|
||||
}
|
||||
|
||||
vector<shared_ptr<MapState::EventState>> MapState::event_states_for_floor_section_wave(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t wave_number) {
|
||||
vector<shared_ptr<MapState::EventState>> MapState::event_states_for_floor_room_wave(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t wave_number) {
|
||||
vector<shared_ptr<EventState>> ret;
|
||||
auto& fc = this->floor_config(floor);
|
||||
if (fc.super_map) {
|
||||
for (const auto& ev : fc.super_map->events_for_floor_section_wave(version, floor, section, wave_number)) {
|
||||
for (const auto& ev : fc.super_map->events_for_floor_room_wave(version, floor, room, wave_number)) {
|
||||
ret.emplace_back(this->event_states.at(fc.base_super_ids.base_event_index + ev->super_id));
|
||||
}
|
||||
}
|
||||
|
||||
+23
-23
@@ -171,7 +171,7 @@ public:
|
||||
/* 06 */ le_uint16_t unknown_a2 = 0;
|
||||
/* 08 */ le_uint16_t entity_id = 0; // == index + 0x4000; used by PSO at runtime, unused in DAT file
|
||||
/* 0A */ le_uint16_t group = 0;
|
||||
/* 0C */ le_uint16_t section = 0;
|
||||
/* 0C */ le_uint16_t room = 0;
|
||||
/* 0E */ le_uint16_t unknown_a3 = 0;
|
||||
/* 10 */ VectorXYZF pos;
|
||||
/* 1C */ VectorXYZI angle;
|
||||
@@ -195,7 +195,7 @@ public:
|
||||
/* 06 */ le_uint16_t num_children = 0; // If == 0, use the default child count from the constructor table (which is often also 0)
|
||||
/* 08 */ le_uint16_t floor = 0;
|
||||
/* 0A */ le_uint16_t entity_id = 0; // == index + 0x1000; used by PSO at runtime, unused in DAT file
|
||||
/* 0C */ le_uint16_t section = 0;
|
||||
/* 0C */ le_uint16_t room = 0;
|
||||
/* 0E */ le_uint16_t wave_number = 0;
|
||||
/* 10 */ le_uint16_t wave_number2 = 0;
|
||||
/* 12 */ le_uint16_t unknown_a1 = 0;
|
||||
@@ -235,7 +235,7 @@ public:
|
||||
// 0010 = all enemies killed
|
||||
/* 04 */ le_uint16_t flags = 0; // Used by PSO at runtime, unused in DAT file
|
||||
/* 06 */ le_uint16_t event_type = 0;
|
||||
/* 08 */ le_uint16_t section = 0;
|
||||
/* 08 */ le_uint16_t room = 0;
|
||||
/* 0A */ le_uint16_t wave_number = 0;
|
||||
/* 0C */ le_uint32_t delay = 0;
|
||||
/* 10 */ le_uint32_t action_stream_offset = 0;
|
||||
@@ -249,7 +249,7 @@ public:
|
||||
/* 00 */ le_uint32_t event_id = 0;
|
||||
/* 04 */ le_uint16_t flags = 0; // Used by PSO at runtime, unused in DAT file
|
||||
/* 06 */ le_uint16_t event_type = 0;
|
||||
/* 08 */ le_uint16_t section = 0;
|
||||
/* 08 */ le_uint16_t room = 0;
|
||||
/* 0A */ le_uint16_t wave_number = 0;
|
||||
/* 0C */ le_uint16_t min_delay = 0;
|
||||
/* 0E */ le_uint16_t max_delay = 0;
|
||||
@@ -263,14 +263,14 @@ public:
|
||||
} __packed_ws__(Event2Entry, 0x18);
|
||||
|
||||
struct RandomEnemyLocationsHeader { // Section type 4 (RANDOM_ENEMY_LOCATIONS)
|
||||
/* 00 */ le_uint32_t section_table_offset; // Offset to RandomEnemyLocationSegment structs, from start of this struct
|
||||
/* 00 */ le_uint32_t room_table_offset; // Offset to RandomEnemyLocationSegment structs, from start of this struct
|
||||
/* 04 */ le_uint32_t entries_offset; // Offset to RandomEnemyLocationEntry structs, from start of this struct
|
||||
/* 08 */ le_uint32_t num_sections;
|
||||
/* 08 */ le_uint32_t num_rooms;
|
||||
/* 0C */
|
||||
} __packed_ws__(RandomEnemyLocationsHeader, 0x0C);
|
||||
|
||||
struct RandomEnemyLocationSection { // Section type 4 (RANDOM_ENEMY_LOCATIONS)
|
||||
/* 00 */ le_uint16_t section;
|
||||
/* 00 */ le_uint16_t room;
|
||||
/* 02 */ le_uint16_t count;
|
||||
/* 04 */ le_uint32_t offset;
|
||||
/* 08 */
|
||||
@@ -333,7 +333,7 @@ public:
|
||||
RandomState(uint32_t random_seed);
|
||||
size_t rand_int_biased(size_t min_v, size_t max_v);
|
||||
uint32_t next_location_index();
|
||||
void generate_shuffled_location_table(const RandomEnemyLocationsHeader& header, phosg::StringReader r, uint16_t section);
|
||||
void generate_shuffled_location_table(const RandomEnemyLocationsHeader& header, phosg::StringReader r, uint16_t room);
|
||||
};
|
||||
|
||||
struct FloorSections {
|
||||
@@ -523,10 +523,10 @@ public:
|
||||
std::array<size_t, 0x12> event_floor_start_indexes = {};
|
||||
|
||||
// Indexes
|
||||
std::unordered_multimap<uint64_t, std::shared_ptr<Object>> object_for_floor_section_and_group;
|
||||
std::unordered_multimap<uint64_t, std::shared_ptr<Object>> object_for_floor_room_and_group;
|
||||
std::unordered_multimap<uint64_t, std::shared_ptr<Object>> door_for_floor_and_switch_flag;
|
||||
std::unordered_multimap<uint64_t, std::shared_ptr<Enemy>> enemy_for_floor_section_and_wave_number;
|
||||
std::unordered_multimap<uint64_t, std::shared_ptr<Event>> event_for_floor_section_and_wave_number;
|
||||
std::unordered_multimap<uint64_t, std::shared_ptr<Enemy>> enemy_for_floor_room_and_wave_number;
|
||||
std::unordered_multimap<uint64_t, std::shared_ptr<Event>> event_for_floor_room_and_wave_number;
|
||||
std::multimap<uint64_t, std::shared_ptr<Event>> event_for_floor_and_event_id;
|
||||
};
|
||||
|
||||
@@ -559,20 +559,20 @@ public:
|
||||
return this->events;
|
||||
}
|
||||
|
||||
std::vector<std::shared_ptr<const Object>> objects_for_floor_section_group(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t group) const;
|
||||
std::vector<std::shared_ptr<const Object>> objects_for_floor_room_group(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t group) const;
|
||||
std::vector<std::shared_ptr<const Object>> doors_for_switch_flag(
|
||||
Version version, uint8_t floor, uint8_t switch_flag) const;
|
||||
|
||||
std::shared_ptr<const Enemy> enemy_for_index(Version version, uint16_t enemy_index, bool follow_alias) const;
|
||||
std::shared_ptr<const Enemy> enemy_for_floor_type(Version version, uint8_t floor, EnemyType type) const;
|
||||
std::vector<std::shared_ptr<const Enemy>> enemies_for_floor_section_wave(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t wave_number) const;
|
||||
std::vector<std::shared_ptr<const Enemy>> enemies_for_floor_room_wave(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t wave_number) const;
|
||||
|
||||
std::vector<std::shared_ptr<const Event>> events_for_id(Version version, uint8_t floor, uint32_t event_id) const;
|
||||
std::vector<std::shared_ptr<const Event>> events_for_floor(Version version, uint8_t floor) const;
|
||||
std::vector<std::shared_ptr<const Event>> events_for_floor_section_wave(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t wave_number) const;
|
||||
std::vector<std::shared_ptr<const Event>> events_for_floor_room_wave(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t wave_number) const;
|
||||
|
||||
void verify() const;
|
||||
|
||||
@@ -883,22 +883,22 @@ public:
|
||||
uint16_t index_for_event_state(Version version, std::shared_ptr<const EventState> evt_st) const;
|
||||
|
||||
std::shared_ptr<ObjectState> object_state_for_index(Version version, uint8_t floor, uint16_t object_index);
|
||||
std::vector<std::shared_ptr<ObjectState>> object_states_for_floor_section_group(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t group);
|
||||
std::vector<std::shared_ptr<ObjectState>> object_states_for_floor_room_group(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t group);
|
||||
std::vector<std::shared_ptr<ObjectState>> door_states_for_switch_flag(
|
||||
Version version, uint8_t floor, uint8_t switch_flag);
|
||||
|
||||
std::shared_ptr<EnemyState> enemy_state_for_index(Version version, uint8_t floor, uint16_t enemy_index);
|
||||
std::shared_ptr<EnemyState> enemy_state_for_set_index(Version version, uint8_t floor, uint16_t enemy_set_index);
|
||||
std::shared_ptr<EnemyState> enemy_state_for_floor_type(Version version, uint8_t floor, EnemyType type);
|
||||
std::vector<std::shared_ptr<EnemyState>> enemy_states_for_floor_section_wave(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t wave_number);
|
||||
std::vector<std::shared_ptr<EnemyState>> enemy_states_for_floor_room_wave(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t wave_number);
|
||||
|
||||
std::shared_ptr<EventState> event_state_for_index(Version version, uint8_t floor, uint16_t event_index);
|
||||
std::vector<std::shared_ptr<EventState>> event_states_for_id(Version version, uint8_t floor, uint32_t event_id);
|
||||
std::vector<std::shared_ptr<EventState>> event_states_for_floor(Version version, uint8_t floor);
|
||||
std::vector<std::shared_ptr<EventState>> event_states_for_floor_section_wave(
|
||||
Version version, uint8_t floor, uint16_t section, uint16_t wave_number);
|
||||
std::vector<std::shared_ptr<EventState>> event_states_for_floor_room_wave(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t wave_number);
|
||||
|
||||
void import_object_states_from_sync(Version from_version, const SyncObjectStateEntry* entries, size_t entry_count);
|
||||
void import_enemy_states_from_sync(Version from_version, const SyncEnemyStateEntry* entries, size_t entry_count);
|
||||
|
||||
+17
-17
@@ -3191,7 +3191,7 @@ static void on_set_entity_set_flag(shared_ptr<Client> c, uint8_t command, uint8_
|
||||
}
|
||||
|
||||
} else if (cmd.header.entity_id >= 0x1000) {
|
||||
int32_t section = -1;
|
||||
int32_t room = -1;
|
||||
int32_t wave_number = -1;
|
||||
try {
|
||||
size_t enemy_index = cmd.header.entity_id - 0x1000;
|
||||
@@ -3211,7 +3211,7 @@ static void on_set_entity_set_flag(shared_ptr<Client> c, uint8_t command, uint8_
|
||||
// We should not have been able to look up this enemy if it didn't exist on this version
|
||||
throw logic_error("enemy does not exist on this game version");
|
||||
}
|
||||
section = set_entry->section;
|
||||
room = set_entry->room;
|
||||
wave_number = set_entry->wave_number;
|
||||
l->log.info("Client set set flags %04hX on E-%03zX (flags are now %04hX)",
|
||||
cmd.flags.load(), ene_st->e_id, cmd.flags.load());
|
||||
@@ -3219,14 +3219,14 @@ static void on_set_entity_set_flag(shared_ptr<Client> c, uint8_t command, uint8_
|
||||
l->log.warning("Flag update refers to missing enemy");
|
||||
}
|
||||
|
||||
if ((section >= 0) && (wave_number >= 0)) {
|
||||
if ((room >= 0) && (wave_number >= 0)) {
|
||||
// When all enemies in a wave event have (set_flags & 8), which means
|
||||
// they are defeated, set event_flags = (event_flags | 0x18) & (~4),
|
||||
// which means it is done and should not trigger
|
||||
bool all_enemies_defeated = true;
|
||||
l->log.info("Checking for defeated enemies with section=%04" PRIX32 " wave_number=%04" PRIX32,
|
||||
section, wave_number);
|
||||
for (auto ene_st : l->map_state->enemy_states_for_floor_section_wave(c->version(), cmd.floor, section, wave_number)) {
|
||||
l->log.info("Checking for defeated enemies with room=%04" PRIX32 " wave_number=%04" PRIX32,
|
||||
room, wave_number);
|
||||
for (auto ene_st : l->map_state->enemy_states_for_floor_room_wave(c->version(), cmd.floor, room, wave_number)) {
|
||||
if (ene_st->super_ene->child_index) {
|
||||
l->log.info("E-%03zX is a child of another enemy", ene_st->e_id);
|
||||
} else if (!(ene_st->set_flags & 8)) {
|
||||
@@ -3238,9 +3238,9 @@ static void on_set_entity_set_flag(shared_ptr<Client> c, uint8_t command, uint8_
|
||||
}
|
||||
}
|
||||
if (all_enemies_defeated) {
|
||||
l->log.info("All enemies defeated; setting events with section=%04" PRIX32 " wave_number=%04" PRIX32 " to finished state",
|
||||
section, wave_number);
|
||||
for (auto ev_st : l->map_state->event_states_for_floor_section_wave(c->version(), cmd.floor, section, wave_number)) {
|
||||
l->log.info("All enemies defeated; setting events with room=%04" PRIX32 " wave_number=%04" PRIX32 " to finished state",
|
||||
room, wave_number);
|
||||
for (auto ev_st : l->map_state->event_states_for_floor_room_wave(c->version(), cmd.floor, room, wave_number)) {
|
||||
ev_st->flags = (ev_st->flags | 0x18) & (~4);
|
||||
l->log.info("Set flags on W-%03zX to %04hX", ev_st->w_id, ev_st->flags);
|
||||
|
||||
@@ -3257,11 +3257,11 @@ static void on_set_entity_set_flag(shared_ptr<Client> c, uint8_t command, uint8_
|
||||
actions_r.go(actions_r.size());
|
||||
break;
|
||||
case 0x08: { // construct_objects
|
||||
uint16_t section = actions_r.get_u16l();
|
||||
uint16_t room = actions_r.get_u16l();
|
||||
uint16_t group = actions_r.get_u16l();
|
||||
l->log.info("(W-%03zX script) construct_objects %04hX %04hX", ev_st->w_id, section, group);
|
||||
auto obj_sts = l->map_state->object_states_for_floor_section_group(
|
||||
c->version(), ev_st->super_ev->floor, section, group);
|
||||
l->log.info("(W-%03zX script) construct_objects %04hX %04hX", ev_st->w_id, room, group);
|
||||
auto obj_sts = l->map_state->object_states_for_floor_room_group(
|
||||
c->version(), ev_st->super_ev->floor, room, group);
|
||||
for (auto obj_st : obj_sts) {
|
||||
if (!(obj_st->set_flags & 0x0A)) {
|
||||
l->log.info("(W-%03zX script) Setting flags 0010 on object K-%03zX", ev_st->w_id, obj_st->k_id);
|
||||
@@ -3272,11 +3272,11 @@ static void on_set_entity_set_flag(shared_ptr<Client> c, uint8_t command, uint8_
|
||||
}
|
||||
case 0x09: // construct_enemies
|
||||
case 0x0D: { // construct_enemies_stop
|
||||
uint16_t section = actions_r.get_u16l();
|
||||
uint16_t room = actions_r.get_u16l();
|
||||
uint16_t wave_number = actions_r.get_u16l();
|
||||
l->log.info("(W-%03zX script) construct_enemies %04hX %04hX", ev_st->w_id, section, wave_number);
|
||||
auto ene_sts = l->map_state->enemy_states_for_floor_section_wave(
|
||||
c->version(), ev_st->super_ev->floor, section, wave_number);
|
||||
l->log.info("(W-%03zX script) construct_enemies %04hX %04hX", ev_st->w_id, room, wave_number);
|
||||
auto ene_sts = l->map_state->enemy_states_for_floor_room_wave(
|
||||
c->version(), ev_st->super_ev->floor, room, wave_number);
|
||||
for (auto ene_st : ene_sts) {
|
||||
if (!ene_st->super_ene->child_index && !(ene_st->set_flags & 0x0A)) {
|
||||
l->log.info("(W-%03zX script) Setting flags 0002 on enemy set E-%zX", ev_st->w_id, ene_st->e_id);
|
||||
|
||||
Reference in New Issue
Block a user