rename section to room

This commit is contained in:
Martin Michelsen
2025-01-19 23:21:16 -08:00
parent aa08e3c183
commit 721b01a294
4 changed files with 114 additions and 114 deletions
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);