document more map object types

This commit is contained in:
Martin Michelsen
2025-03-17 22:57:21 -07:00
parent 333b62b884
commit 4489bca037
3 changed files with 117 additions and 43 deletions
+20 -20
View File
@@ -1718,10 +1718,10 @@ void ItemCreator::generate_weapon_shop_item_bonus2(ItemData& item, size_t player
}
ItemCreator::DropResult ItemCreator::on_specialized_box_item_drop(
uint8_t area, float def_z, uint32_t def0, uint32_t def1, uint32_t def2) {
uint8_t area, float param3, uint32_t param4, uint32_t param5, uint32_t param6) {
DropResult res;
res.item = this->base_item_for_specialized_box(def0, def1, def2);
if (def_z == 0.0f) {
res.item = this->base_item_for_specialized_box(param4, param5, param6);
if (param3 == 0.0f) {
uint16_t type = res.item.data1w[0];
res.item.clear();
res.item.data1w[0] = type;
@@ -1730,39 +1730,39 @@ ItemCreator::DropResult ItemCreator::on_specialized_box_item_drop(
return res;
}
ItemData ItemCreator::base_item_for_specialized_box(uint32_t def0, uint32_t def1, uint32_t def2) const {
ItemData ItemCreator::base_item_for_specialized_box(uint32_t param4, uint32_t param5, uint32_t param6) const {
ItemData item;
item.data1[0] = (def0 >> 0x18) & 0x0F;
item.data1[1] = (def0 >> 0x10) + ((item.data1[0] == 0x00) || (item.data1[0] == 0x01));
item.data1[2] = def0 >> 8;
item.data1[0] = (param4 >> 0x18) & 0x0F;
item.data1[1] = (param4 >> 0x10) + ((item.data1[0] == 0x00) || (item.data1[0] == 0x01));
item.data1[2] = param4 >> 8;
switch (item.data1[0]) {
case 0x00:
item.data1[3] = (def1 >> 0x18) & 0xFF;
item.data1[4] = def0 & 0xFF;
item.data1[6] = (def1 >> 8) & 0xFF;
item.data1[7] = def1 & 0xFF;
item.data1[8] = (def2 >> 0x18) & 0xFF;
item.data1[9] = (def2 >> 0x10) & 0xFF;
item.data1[10] = (def2 >> 8) & 0xFF;
item.data1[11] = def2 & 0xFF;
item.data1[3] = (param5 >> 0x18) & 0xFF;
item.data1[4] = param4 & 0xFF;
item.data1[6] = (param5 >> 8) & 0xFF;
item.data1[7] = param5 & 0xFF;
item.data1[8] = (param6 >> 0x18) & 0xFF;
item.data1[9] = (param6 >> 0x10) & 0xFF;
item.data1[10] = (param6 >> 8) & 0xFF;
item.data1[11] = param6 & 0xFF;
break;
case 0x01:
item.data1[3] = (def1 >> 0x18) & 0xFF;
item.data1[4] = (def1 >> 0x10) & 0xFF;
item.data1[5] = def0 & 0xFF;
item.data1[3] = (param5 >> 0x18) & 0xFF;
item.data1[4] = (param5 >> 0x10) & 0xFF;
item.data1[5] = param4 & 0xFF;
break;
case 0x02:
item.assign_mag_stats(ItemMagStats());
break;
case 0x03:
if (item.data1[1] == 0x02) {
item.data1[4] = def0 & 0xFF;
item.data1[4] = param4 & 0xFF;
}
item.set_tool_item_amount(*this->stack_limits, 1);
break;
case 0x04:
item.data2d = ((def1 >> 0x10) & 0xFFFF) * 10;
item.data2d = ((param5 >> 0x10) & 0xFFFF) * 10;
break;
default:
+3 -3
View File
@@ -37,9 +37,9 @@ public:
DropResult on_monster_item_drop(uint32_t enemy_type, uint8_t area);
DropResult on_box_item_drop(uint8_t area);
DropResult on_specialized_box_item_drop(uint8_t area, float def_z, uint32_t def0, uint32_t def1, uint32_t def2);
ItemData base_item_for_specialized_box(uint32_t def0, uint32_t def1, uint32_t def2) const;
// Note: param3-6 refer to the corresponding fields of the object definition
DropResult on_specialized_box_item_drop(uint8_t area, float param3, uint32_t param4, uint32_t param5, uint32_t param6);
ItemData base_item_for_specialized_box(uint32_t param4, uint32_t param5, uint32_t param6) const;
std::vector<ItemData> generate_armor_shop_contents(size_t player_level);
std::vector<ItemData> generate_tool_shop_contents(size_t player_level);
+94 -20
View File
@@ -609,6 +609,12 @@ const char* MapFile::name_for_object_type(uint16_t type) {
// param3 = TODO
{0x0004, "TObjLight"},
// Arbitrary item. The parameters specify the item data; see
// ItemCreator::base_item_for_specialized_box for how the encoding works.
// This object is only available on v1 and v2; it is not available in v3
// and v4.
{0x0005, "TItem"},
// Environmental sound. This object is not constructed in offline multi
// mode. Params:
// param3 = audibility radius (if <= 0 uses default of 200)
@@ -1299,6 +1305,11 @@ const char* MapFile::name_for_object_type(uint16_t type) {
// param1 = radius
{0x0057, "TObjTradeCollision"},
// TODO: Describe this object. Presumably similar to TObjTradeCollision
// but enables the deck edit counter? Params:
// param1 = radius
{0x0058, "TObjDeckCollision"},
// Forest door. Params:
// param4 = switch flag number (low byte) and number to appear on door
// (second-lowest byte, modulo 0x0A)
@@ -1463,18 +1474,54 @@ const char* MapFile::name_for_object_type(uint16_t type) {
// object, does not disable the switch flag automatically
{0x00C3, "TOHangceilingCave01Normal/TOHangceilingCave01Key/TOHangceilingCave01KeyQuick"},
// Caves signs. There appear to be no parameters.
{0x00C4, "TOSignCave01"},
{0x00C5, "TOSignCave02"},
{0x00C6, "TOSignCave03"},
// Hexagonal tank. There appear to be no parameters.
{0x00C7, "TOAirconCave01"},
// Brown platform. There appear to be no parameters.
{0x00C8, "TOAirconCave02"},
// Revolving warning light. Params:
// param1 = rotation speed in degrees per frame
{0x00C9, "TORevlightCave01"},
// Caves rainbow. Params:
// param1-3 = scale factors (x, y, z)
// param4 = TODO (value used is 1 / (param4 + 30))
// param6 = visibility radius? (TODO; value used is param6 + 40000)
{0x00CB, "TORainbowCave01"},
// Floating jellyfish. Params:
// param1 = visibility radius; visible when any player is within this
// distance of the object
// param2 = move radius (according to debug strings)
// param3 = rebirth radius (according to debug strings); like param1,
// checks against all players, not only the local player
{0x00CC, "TOKurage"},
// Floating dragonfly. Params:
// param1 = TODO
// param2 = TODO
// param3 = max distance from home?
// param4 = TODO
// param5 = TODO
{0x00CD, "TODragonflyCave01"},
// Caves door. Params:
// param4 = switch flag number
{0x00CE, "TODoorCave03"},
// Robot recharge station. Params:
// param4 = quest register number; activates when this register
// contains a nonzero value; does not deactivate if it becomes zero
// again
{0x00CF, "TOBind"},
// TODO: Describe the rest of the object types.
{0x00C4, "TOSignCave01"}, // Constructor in 3OE1: 801765B4
{0x00C5, "TOSignCave02"}, // Constructor in 3OE1: 80176968
{0x00C6, "TOSignCave03"}, // Constructor in 3OE1: 80176DAC
{0x00C7, "TOAirconCave01"}, // Constructor in 3OE1: 80156DF8
{0x00C8, "TOAirconCave02"}, // Constructor in 3OE1: 80157034
{0x00C9, "TORevlightCave01"}, // Constructor in 3OE1: 80173470
{0x00CB, "TORainbowCave01"}, // Constructor in 3OE1: 8017318C
{0x00CC, "TOKurage"}, // Constructor in 3OE1: 8016E65C
{0x00CD, "TODragonflyCave01"}, // Constructor in 3OE1: 801642F4
{0x00CE, "TODoorCave03"}, // Constructor in 3OE1: 8016259C
{0x00CF, "TOBind"}, // Constructor in 3OE1: 80158638
{0x00D0, "TOCakeshopCave01"}, // Constructor in 3OE1: 80159F68
{0x00D1, "TORockCaveS01"}, // Constructor in 3OE1: 80174A44
{0x00D2, "TORockCaveM01"}, // Constructor in 3OE1: 801748E4
@@ -1560,6 +1607,8 @@ const char* MapFile::name_for_object_type(uint16_t type) {
{0x018A, "TObjTreeLobby"}, // Constructor in 3OE1: 80362D44
{0x018B, "TObjSuisouLobby"}, // Constructor in 3OE1: 80368118
{0x018C, "TObjParticleLobby"}, // Constructor in 3OE1: 80367DC0
{0x018D, "TObjLobbyTable"}, // (Ep3 only) Constructor in 3SE0: 802C07E4
{0x018E, "TObjJukeBox"}, // (Ep3 only) Constructor in 3SE0: 8030D8A8
{0x0190, "TObjCamera"}, // Constructor in 3OE1: 8017FAC0
{0x0191, "TObjTuitate"}, // Constructor in 3OE1: 8019AF20
{0x0192, "TObjDoaEx01"}, // Constructor in 3OE1: 8018E02C
@@ -1611,12 +1660,12 @@ const char* MapFile::name_for_object_type(uint16_t type) {
{0x0280, "__BARBA_RAY_TELEPORTER__"}, // Formerly __TObjAreaWarpForest_subclass_0280__ // Constructor in 3OE1: 802EF620
{0x02A0, "TObjLiveCamera"}, // Constructor in 3OE1: 80309D5C
{0x02B0, "TContainerAncient01R"}, // Constructor in 3OE1: 8018ADF8
{0x02B1, "TObjLaboDesignBase"}, // Constructor in 3OE1: 803631D4
{0x02B2, "TObjLaboDesignBase"}, // Constructor in 3OE1: 80363184
{0x02B3, "TObjLaboDesignBase"}, // Constructor in 3OE1: 80363134
{0x02B4, "TObjLaboDesignBase"}, // Constructor in 3OE1: 803630E4
{0x02B5, "TObjLaboDesignBase"}, // Constructor in 3OE1: 80363094
{0x02B6, "TObjLaboDesignBase"}, // Constructor in 3OE1: 80363044
{0x02B1, "TObjLaboDesignBase(0)"}, // Constructor in 3OE1: 803631D4
{0x02B2, "TObjLaboDesignBase(1)"}, // Constructor in 3OE1: 80363184
{0x02B3, "TObjLaboDesignBase(2)"}, // Constructor in 3OE1: 80363134
{0x02B4, "TObjLaboDesignBase(3)"}, // Constructor in 3OE1: 803630E4
{0x02B5, "TObjLaboDesignBase(4)"}, // Constructor in 3OE1: 80363094
{0x02B6, "TObjLaboDesignBase(5)"}, // Constructor in 3OE1: 80363044
{0x02B7, "TObjGbAdvance"}, // Constructor in 3OE1: 80187C10
{0x02B8, "TObjQuestColALock2"}, // Constructor in 3OE1: 80195824
{0x02B9, "TObjMapForceWarp"}, // Constructor in 3OE1: 801A297C
@@ -1624,6 +1673,31 @@ const char* MapFile::name_for_object_type(uint16_t type) {
{0x02BB, "TODoorLaboNormal"}, // Constructor in 3OE1: 801A26D0
{0x02BC, "TObjAreaWarpEndingJung"}, // Constructor in 3OE1: 8019AFF4
{0x02BD, "TObjLaboMapWarp"}, // Constructor in 3OE1: 80185430
{0x02D0, "TObjKazariCard"}, // (Ep3 only) Constructor in 3SE0: 8026C79C; battle only
{0x02D1, "TObj_FloatingCardMaterial_Dark"}, // (Ep3 only) Constructor in 3SE0: 800C5F30; city only
{0x02D2, "TObj_FloatingCardMaterial_Hero"}, // (Ep3 only) Constructor in 3SE0: 800C5F7C; city only
{0x02D3, "TObjCardCityMapWarp(0)"}, // (Ep3 only) Constructor in 3SE0: 800B9528; city only
{0x02D4, "TObjCardCityDoor(0)"}, // (Ep3 only) Constructor in 3SE0: 800B8C40; city only
{0x02D5, "TObjCardCityDoor(1)"}, // (Ep3 only) Constructor in 3SE0: 800B8BF0; city only
{0x02D6, "TObjKazariGeyserMizu"}, // (Ep3 only) Constructor in 3SE0: 80278E08; battle only
{0x02D7, "TObjSetCardColi"}, // (Ep3 only) Constructor in 3SE0: 802BCE80; battle only
{0x02D8, "TObjCardCityDoor(2)"}, // (Ep3 only) Constructor in 3SE0: 800B8BA0; city only
{0x02D9, "TObjCardCityMapWarp(1)"}, // (Ep3 only) Constructor in 3SE0: 800B94D8; city only
{0x02DA, "TOFlyMekaHero"}, // (Ep3 only) Constructor in 3SE0: 802DFD18; city only
{0x02DB, "TOFlyMekaDark"}, // (Ep3 only) Constructor in 3SE0: 802DFAAC; city only
{0x02DC, "TObjCardCityDoor_Closed(0)"}, // (Ep3 only) Constructor in 3SE0: 800B884C; city only
{0x02DD, "TObjCardCityDoor_Closed(1)"}, // (Ep3 only) Constructor in 3SE0: 800B87FC; city only
{0x02DE, "TObjCardCityDoor_Closed(2)"}, // (Ep3 only) Constructor in 3SE0: 800B87AC; city only
{0x02DF, "TObjCardCityDoor(3)"}, // (Ep3 only) Constructor in 3SE0: 800B8B50; city only
{0x02E0, "TObjCardCityDoor(4)"}, // (Ep3 only) Constructor in 3SE0: 800B8B00; city only
{0x02E1, "TObjCardCityDoor_Closed(3)"}, // (Ep3 only) Constructor in 3SE0: 800B875C; city only
{0x02E2, "TObjCardCityDoor_Closed(4)"}, // (Ep3 only) Constructor in 3SE0: 800B870C; city only
{0x02E3, "TObjCardCityMapWarp(2)"}, // (Ep3 only) Constructor in 3SE0: 800B9488; city only
{0x02E4, "TObjSinBoardCard"}, // (Ep3 only) Constructor in 3SE0: 80309608; city/lobby only
{0x02E5, "TObjCityMoji"}, // (Ep3 only) Constructor in 3SE0: 8030DE8C; city only
{0x02E6, "TObjCityWarpOff"}, // (Ep3 only) Constructor in 3SE0: 8030DB4C; city only
{0x02E7, "TObjFlyCom"}, // (Ep3 only) Constructor in 3SE0: 80310BEC; city only
{0x02E8, "__UNKNOWN_02E8__"}, // (Ep3 only) Subclass of TObjPathObj; 3SE0: 8019A638; city only
{0x0300, "__EP4_LIGHT__"}, // Constructor in 59NL: 00661158
{0x0301, "__WILDS_CRATER_CACTUS__"}, // Constructor in 59NL: 0067612C
{0x0302, "__WILDS_CRATER_BROWN_ROCK__"}, // Constructor in 59NL: 00675748
@@ -1772,9 +1846,9 @@ const char* MapFile::name_for_enemy_type(uint16_t type) {
{0x00DF, "TObjEneRecobox"},
{0x00E0, "TObjEneMe3SinowZoaReal/TObjEneEpsilonBody"},
{0x00E1, "TObjEneIllGill"},
{0x0110, "__ASTARK__"},
{0x0111, "__YOWIE__/__SATELLITE_LIZARD__"},
{0x0112, "__MERISSA_A__"},
{0x0110, "__ASTARK__/TObjNpcWalkingMeka_Hero"},
{0x0111, "__YOWIE__/__SATELLITE_LIZARD__/TObjNpcWalkingMeka_Dark"},
{0x0112, "__MERISSA_A__/TObjNpcHeroAide"},
{0x0113, "__GIRTABLULU__"},
{0x0114, "__ZU__"},
{0x0115, "__BOOTA_FAMILY__"},