diff --git a/src/Episode3/DataIndex.cc b/src/Episode3/DataIndex.cc index 909ac82b..5db73843 100644 --- a/src/Episode3/DataIndex.cc +++ b/src/Episode3/DataIndex.cc @@ -994,7 +994,7 @@ string MapDefinition::str(const DataIndex* data_index) const { lines.emplace_back(string_printf("Map %08" PRIX32 ": %hhux%hhu", this->map_number.load(), this->width, this->height)); lines.emplace_back(string_printf(" a1=%08" PRIX32, this->unknown_a1.load())); - lines.emplace_back(string_printf(" scene_data2=%02hhX", this->scene_data2)); + lines.emplace_back(string_printf(" environment_number=%02hhX", this->environment_number)); lines.emplace_back(string_printf(" num_alt_maps=%02hhX", this->num_alt_maps)); lines.emplace_back(string_printf(" num_alt_maps=%02hhX", this->num_alt_maps)); lines.emplace_back(" tiles:"); @@ -1025,10 +1025,11 @@ string MapDefinition::str(const DataIndex* data_index) const { } } for (size_t w = 0; w < 3; w++) { - for (size_t z = 0; z < 0x24; z += 4) { - lines.emplace_back(string_printf(" a5[%zu][0x%02zX:0x%02zX]=%g %g %g %g", w, z, z + 4, - this->unknown_a5[w][z + 0].load(), this->unknown_a5[w][z + 1].load(), - this->unknown_a5[w][z + 2].load(), this->unknown_a5[w][z + 3].load())); + for (size_t z = 0; z < 0x24; z += 3) { + lines.emplace_back(string_printf(" a5[%zu][0x%02zX:0x%02zX]=%g %g %g", w, z, z + 3, + this->unknown_a5[w][z + 0].load(), + this->unknown_a5[w][z + 1].load(), + this->unknown_a5[w][z + 2].load())); } } lines.emplace_back(" modification tiles:"); @@ -1465,7 +1466,7 @@ const string& DataIndex::get_compressed_map_list() const { const auto& map = map_it.second->map; e.map_x = map.map_x; e.map_y = map.map_y; - e.scene_data2 = map.scene_data2; + e.environment_number = map.environment_number; e.map_number = map.map_number.load(); e.width = map.width; e.height = map.height; diff --git a/src/Episode3/DataIndex.hh b/src/Episode3/DataIndex.hh index 1b2f8f1f..7c77db9b 100644 --- a/src/Episode3/DataIndex.hh +++ b/src/Episode3/DataIndex.hh @@ -686,7 +686,7 @@ struct MapList { struct Entry { // Should be 0x220 bytes in total be_uint16_t map_x; be_uint16_t map_y; - be_uint16_t scene_data2; + be_uint16_t environment_number; be_uint16_t map_number; // Text offsets are from the beginning of the strings block after all map // entries (that is, add strings_offset to them to get the string offset) @@ -717,7 +717,34 @@ struct MapDefinition { // .mnmd format; also the format of (decompressed) quests /* 0004 */ be_uint32_t map_number; /* 0008 */ uint8_t width; /* 0009 */ uint8_t height; - /* 000A */ uint8_t scene_data2; // TODO: What is this? + // The environment number specifies several things: + // - The model to load for the main battle stage + // - The music to play during the main battle + // - The color of the battle tile outlines (probably) + // - The preview image to show in the upper-left corner in the map select menu + // The environment numbers are: + // 00 - Unguis Lapis + // 01 - Nebula Montana (1) + // 02 - Lupus Silva (1) + // 03 - Lupus Silva (2) + // 04 - Molae Venti + // 05 - Nebula Montana (2) + // 06 - Tener Sinus + // 07 - Mortis Fons + // 08 - Morgue (destroyed) + // 09 - Tower of Caelum + // 0A = ??? (referred to as "^mapname"; crashes) + // 0B = Cyber + // 0C = Morgue (not destroyed) + // 0D = (Castor/Pollux map) + // 0E - Dolor Odor + // 0F = Ravum Aedes Sacra + // 10 - (Amplum Umbla map) + // 11 - Via Tubus + // 12 = Morgue (same as 08?) + // 13 = ??? (crashes) + // Environment numbers beyond 13 are not used in any known quests or maps. + /* 000A */ uint8_t environment_number; // All alt_maps fields (including the floats) past num_alt_maps are filled in // with FF. For example, if num_alt_maps == 8, the last two fields in each // alt_maps array are filled with FF.