diff --git a/notes/dat-constructor-tables.txt b/notes/dat-constructor-tables.txt index 5c6e6bd6..05862b58 100644 --- a/notes/dat-constructor-tables.txt +++ b/notes/dat-constructor-tables.txt @@ -1,452 +1,454 @@ OBJECTS -./newserv address-translator files/pso-executables 59NL "parse-dat-object-constructor-tables 59NL:00A06BE0:2F 3OE1:804BD918:24 3SE0:8044DF40:24 1OJ1:8C23F340:10:names 1OJ2:8C252000:10:names 1OEF:8C291170:10:names 2OEF:8C2F7920:12" - -TYPE => 1OEF---------------------- 1OJ1------------------- 1OJ2---------------------- 2OEF---------------------- 3OE1---------------------------------- 3SE0------------- 59NL---------------------------------------------- NAME -0000 => 8C07ADD8:00-0F 8C070448:00-0F 8C072810:00-0F 8C08A784:00-11 8019554C:00-23 800BDD8C:00,0F 00661728:00-2E TObjPlayerSet -0001 => 8C0722A4:00-0F 8C068700:00-0F 8C06AA44:00-0F 8C080804:00-11 801954E4:00-23 800BDD24:00-01,0F 00660938:00-2B,2D-2E TObjParticle -0002 => 8C02E7BC:00-07,0B-0E 8C029898:00-07,0B-0E 8C02A60C:00-07,0B-0E 8C033FCC:00-07,0B-0E 801A28E4:00-07,0B-0E,12-16,1E-21 007BAC58:00-07,0B-0E,12-16,1E-21,24-2E TObjAreaWarpForest -0003 => 8C02E800:00-07,0B-0E 8C0298DC:00-07,0B-0E 8C02A650:00-07,0B-0E 8C034010:00-07,0B-0E,10-11 801A2930:00-07,0B-0E,10-1D,22-23 007BABDC:00-07,0B-0E,10-1D,22-2E TObjMapWarpForest -0004 => 8C0D8A74:00-0A,0F 8C0C87DC:00-0A,0F 8C0CBEB0:00-0A,0F 8C0EDC0C:00-0A,0F-11 801944E0:00-0A,0F-1D,22-23 800BD4B0:00-01,0F 0065F6FC:00-0A,0F-1D,22-2B,2D-2E TObjLight -0005 => 8C065EC0:00-05,08-0A 8C05D52C:00-05,08-0A 8C05E76C:00-05,08-0A 8C0735CC:00-05,08-0A TItem -0006 => 8C0EA5F8:00-0E 8C0D9A94:00-0E 8C0DD4DC:00-0E 8C101198:00-0E,10-11 80190810:00-0A,0D,10-1D,1F 800BC054:00 00659648:00-0A,0D,10-1D,1F,24-2B,2D-2E TObjEnvSound -0007 => 8C11E660:00-0E 8C10B8AC:00-0E 8C10EE04:00-0E 8C136B1C:00-0E,10-11 80153F24:00-0E,10-23 800AFC20:00 005C20E4:00-0E,10-2B,2D-2E TObjFogCollision -0008 => 8C166444:00-0E 8C14AB34:00-0E 8C1511CC:00-0E 8C188688:00-0E,10-11 80190B7C:00-0E,10-23 800BC3C0:00 00659E40:00-0E,10-2E TObjEvtCollision -0009 => 8C0104A0:00-05,08-0A 8C01049C:00-05,08-0A 8C0104A0:00-05,08-0A 8C0104A0:00-05,08-0A 800674D0:00-05,08-0A,12 8001D294:00 0077BFF4:00-05,08-0A,12,2D-2E TObjCollision -000A => 8C124DE0:01-0A 8C1119CC:01-0A 8C115068:01-0A 8C13E1B0:01-0A,10-11 80171314:01-0A,10-11,13-1D,22-23 006302BC:01-0A,10-11,13-1D,22-2C,2E TOMineIcon01 -000B => 8C125090:01-0A 8C111C6C:01-0A 8C115308:01-0A 8C13E474:01-0A,10-11 801715EC:01-0A,10-11,13-1D,22-23 00630624:01-0A,10-11,13-1D,22-2C,2E TOMineIcon02 -000C => 8C12536C:01-0A 8C111F34:01-0A 8C1155D4:01-0A 8C13E760:01-0A,10-11 801718C4:01-0A,10-11,13-1D,22-23 0063098C:01-0A,10-11,13-1D,22-2C,2E TOMineIcon03 -000D => 8C125648:01-0A 8C1121FC:01-0A 8C1158A0:01-0A 8C13EA4C:01-0A,10-11 80171CA8:01-0A,10-11,13-1D,22-23 00630DC0:01-0A,10-11,13-1D,22-2C,2E TOMineIcon04 -000E => 8C1639F0:01-0D 8C148284:01-0D 8C14E808:01-0D 8C1858FC:01-0D 801A1C24:01-0D,13-23 0066F2AC:01-0D,13-2C,2E TObjRoomId -000F => 8C142384:01-02,04-07 8C12DCB0:01-02,04-07 8C130C88:01-02,04-07 8C15D834:01-02,04-07 80176138:01-02,04-07 00636EC8:01-02,04-07,2E TOSensorGeneral01 -0011 => 8C08F4AC:01-04,08,0E 8C0843CC:01-04,08 8C0869C8:01-04,08,0E 8C09FFE4:01-04,08,0E 8008108C:01-04,08,0E 00500858:01-04,08,0E,2E TEF_LensFlare -0012 => 8C02E888:00-0E 8C029964:00-0E 8C02A6D8:00-0E 8C034098:00-0E 8019695C:00-0E,12-23 800BF22C:00 00661E48:00-0E,12-2B,2D-2E TObjQuestCol -0013 => 8C17D1C0:01-0A 8C15F044:01-0A 8C1669B4:01-0A 8C1A0448:01-0A 80169570:01-0A,13-1D,22-23 00628A4C:01-0A,13-1D,22-2B,2E TOHealGeneral -0014 => 8C17E59C:00-05,08-0A 8C160648:00-05,08-0A 8C167FB4:00-05,08-0A 8C1A1968:00-05,08-0A,10-11 80194804:00-05,08-0A,10-12,17-1D,22-23 800BD7D4:00 0065F960:00-05,08-0A,10-12,17-1D,22-23,2D-2E TObjMapCsn -0015 => 8C02E8CC:00-0E 8C0299A8:00-0E 8C02A71C:00-0E 8C0340DC:00-0E 80196750:00-0E,12-23 800BF020:00 0066210C:00-0E,12-2B,2D-2E TObjQuestColA -0016 => 8C02E954:00-0F 8C029A30:00-0F 8C02A7A4:00-0F 8C034164:00-0F 801A2BD4:00-0F,12-23 800C6060:00,0F 007BAA68:00-0F,12-2B,2D-2E TObjItemLight -0017 => 8C02E998:01-0F 8C029A74:01-0F 8C02A7E8:01-0F 8C0341EC:01-0F 801A2AA4:01-0F,13-23 800C5EE4:0F 007BAAE4:01-0F,13-2B,2E TObjRaderCol -0018 => 8C11EA58:01-0E 8C10BCD0:01-0E 8C10F228:01-0E 8C136F18:01-0E 801539F8:01-0E,13-23 005C2488:01-0E,13-2B,2E TObjFogCollisionSwitch -0019 => 8C02E844:00,02,05,07,0A 8C029920:00,02,05,07,0A 8C02A694:00,02,05,07,0A 8C034054:00,02,05,07,0A 8019F580:00,02,05,07,0A,12-1D,22-23 0066C4B4:00,02,05,07,0A,12-1D,22-2B,2D-2E TObjWarpBossMulti(off)/TObjWarpBoss(on) -001A => 8C2012C0:00 8C22AD80:00 80198158:00,12 800C06EC:00 006650C8:00,12,2D-2E TObjSinBoard -001B => 8C02EA64:01-07,0B-0E 8C034274:01-07,0B-0E 801A2898:01-07,0B-0E 007BACD4:01-07,0B-0E,2C,2E TObjAreaWarpQuest -001C => 8C02EBDC:0E 8C0343B8:0E 801A284C:0E,1F 007BAD50:0E,1F,2C,2E TObjAreaWarpEnding -001D => 8C251970:01 80084A2C:01 00507538:01,2E TEffStarLight2D_Base -001E => 8C255390:01-02,11 800857F4:01-02,11,13-14,20,20 00508070:01-02,11,13-14,20,20,24-28,2E __LENS_FLARE__ -001F => 8C0342B8:01-0A,10-11 801A2AF0:01-0A,10-11,13-1D,22-23 007BAB60:01-0A,10-11,13-1D,22-2B,2E TObjRaderHideCol -0020 => 8C261450:00-0A,10-11 80177F14:00-0A,10-1D,22-23 00638FC4:00-0A,10-1D,22-2B,2D-2E TOSwitchItem -0021 => 8C2618B0:00-0A,10-11 8017883C:00-0A,10-1D,22-23 0063998C:00-0A,10-1D,22-2B,2D-2E TOSymbolchatColli -0022 => 8C261C20:01-0A,10-11 8016C7E8:01-0A,10-11,13-1D,22-23 0062B2DC:01-0A,10-11,13-1D,22-2B,2E TOKeyCol -0023 => 8C262C1C:01-0A,10-11 80157908:01-0A,10-11,13-1D,22-23 00612788:01-0A,10-11,13-1D,22-2B,2E TOAttackableCol -0024 => 8C263DD8:00-0A,10-11 80177AB4:00-0A,10-14,17-23 00638688:00-0A,10-14,17-23,2D-2E TOSwitchAttack -0025 => 8C266504:00-0A,10-11 80178418:00-0A,10-1D,22-23 006393C4:00-0A,10-1D,22-2B,2D-2E TOSwitchTimer -0026 => 8C268DDC:00-0A,10-11 8015B03C:00-0A,10-1D,22-23 00615E70:00-0A,10-1D,22-2B,2D-2E TOChatSensor -0027 => 80196F90:12-23 006635D8:12-2B,2E TObjRaderIcon -TYPE => 1OEF---------------------- 1OJ1------------------- 1OJ2---------------------- 2OEF---------------------- 3OE1---------------------------------- 3SE0------------- 59NL---------------------------------------------- NAME -0028 => 801903BC:00-02,04-0A,0D,10-1D,1F,22-23 800BBC14:00 006599C0:00-02,04-0A,0D,10-1D,1F,22-2B,2D-2E TObjEnvSoundEx -0029 => 80190148:00-02,04-0A,0D,10-1D,1F,22-23 800BB9A0:00 00659C14:00-02,04-0A,0D,10-1D,1F,22-2B,2D-2E TObjEnvSoundGlobal -0040 => 8C0F432C:00 8C0E2BF4:00 8C0E66D4:00 8C10B640:00 8021D100:00,12 8012D830:00 006D71E4:00,12,2D-2E TShopGenerator -0041 => 8C16F4C4:00 8C152754:00 8C159678:00 8C191FA4:00 801A1710:00,12 800C5484:00 0066EC3C:00,12,2D-2E TObjLuker -0042 => 8C02E910:00 8C0299EC:00 8C02A760:00 8C034120:00 801A2B88:00,12 800C6014:00 007BAE48:00,12,2D-2E TObjBgmCol -0043 => 8C19B770:00 8C1767C4:00 8C1816A4:00 8C1BE4C8:00 801862DC:00,12 0064A8DC:00,12,2D-2E TObjCityMainWarp -0044 => 8C19BB78:00 8C176BA0:00 8C181AC4:00 8C1BE8FC:00 80185BE0:00,12 800B9920:00 0064AD68:00,12,2D-2E TObjCityAreaWarp -0045 => 8C19BEDC:00 8C176F1C:00 8C181E6C:00 8C1BEC78:00 8018588C:00,12 0064B058:00,12,2D-2E TObjCityMapWarp -0046 => 8C19F1B4:00 8C17A0BC:00 8C1850AC:00 8C1C204C:00 801826C4:00 00646000:00,2D-2E TObjCityDoor_Shop -0047 => 8C19F350:00 8C17A258:00 8C185248:00 8C1C21E8:00 801824F8:00 00646258:00,2D-2E TObjCityDoor_Guild -0048 => 8C19F4EC:00 8C17A3F4:00 8C1853E4:00 8C1C2384:00 80182328:00 006464D0:00,2D-2E TObjCityDoor_Warp -0049 => 8C19F7C0:00 8C17A6D0:00 8C1856B4:00 8C1C26C8:00 80181F84:00 006466F4:00,2D-2E TObjCityDoor_Med -004A => 8C19FEB4:00 8C17ADC4:00 8C185DA8:00 8C1C2DBC:00 80182EE4:00 006471BC:00,2D-2E __ELEVATOR__ -004B => 8C1B1EB8:00 8C189CA8:00 8C195AF0:00 8C1D89C4:00 80184730:00,12 00647A08:00,12,2D-2E TObjCity_Season_EasterEgg -004C => 8C1B2078:00 8C189E78:00 8C195CB0:00 8C1D8B84:00 801844EC:00,12 00647CE0:00,12,2D-2E TObjCity_Season_ValentineHeart -004D => 8C1B22E0:00 8C18A054:00 8C195F18:00 8C1D8DEC:00 801842D4:00,12 00647FD4:00,12,2D-2E TObjCity_Season_XmasTree -004E => 8C1B2540:00 8C18A244:00 8C196178:00 8C1D904C:00 801840DC:00,12 006482E0:00,12,2D-2E TObjCity_Season_XmasWreath -004F => 8C1B2680:00 8C18A384:00 8C1962B8:00 8C1D918C:00 80183F44:00,12 0064842C:00,12,2D-2E TObjCity_Season_HalloweenPumpkin -0050 => 8C1B2824:00 8C18A50C:00 8C19645C:00 8C1D9330:00 80183D30:00,12 0064858C:00,12,2D-2E TObjCity_Season_21_21 -0051 => 8C1B2AC8:00 8C18A744:00 8C196700:00 8C1D95D4:00 80183B28:00,12 006488AC:00,12,2D-2E TObjCity_Season_SonicAdv2 -0052 => 8C1B2D7C:00 8C18A9F8:00 8C1969B4:00 8C1D9888:00 80183860:00,12 00648BF0:00,12,2D-2E TObjCity_Season_Board -0053 => 8C1B2F10:00 8C18AB8C:00 8C196B48:00 8C1D9A1C:00 80183694:00,12,22 00648D84:00,12,22,2D-2E TObjCity_Season_FireWorkCtrl -0054 => 8C19FA80:00 8C17A990:00 8C185974:00 8C1C2988:00 80181CFC:00 00646874:00,2D-2E TObjCityDoor_Lobby -0055 => 8C0341A8:00 801A2C20:00,12 007BAEC4:00,12,2D-2E TObjCityMainWarpChallenge -0056 => 801A2684:12 007BB320:12,2E TODoorLabo -0057 => 802C6A7C:00,12 801A0320:00 00667AB4:00,12,2D-2E TObjTradeCollision -0058 => 80297390:00 TObjDeckCollision -0080 => 8C0738BC:01-02 8C069D80:01-02 8C06C0BC:01-02 8C082498:01-02 8018F148:01-02 00657358:01-02,2E TObjDoor -0081 => 8C0731F8:01-05 8C0696E4:01-05 8C06BA24:01-05 8C081DD4:01-05 80190000:01-05,13-16 00658A90:01-05,13-16,24-2B,2E TObjDoorKey -0082 => 8C0728B0:01-07 8C068D6C:01-05 8C06B0AC:01-07 8C080E18:01-07,10-11 80192E44:01-07,10-11 0065DA94:01-07,10-11,24-2B,2E TObjLazerFenceNorm -0083 => 8C105DE4:01-07 8C0F43A0:01-05 8C0F7590:01-07 8C11DC40:01-07,10-11 801933F4:01-07,10-11,13-1D 0065E540:01-07,10-11,13-1D,24-2B,2E TObjLazerFence4 -0084 => 8C0FC7A0:01-07 8C0EB548:01-05 8C0EE768:01-07 8C113DA8:01-07,10-11 80193AE0:01-07,10-11,13-1D,22-23 0065EC80:01-07,10-11,13-1D,22-2B,2E TLazerFenceSw -0085 => 8C072F10:01-02 8C0693CC:01-02 8C06B70C:01-02 8C081AEC:01-02 80192220:01-02,17-1B 0065C7C8:01-02,17-1B,29-2B,2E TKomorebi -0086 => 8C076E7C:01-02 8C06D2CC:01-02 8C06F694:01-02 8C086460:01-02 8017F2A4:01-02 00643598:01-02,29-2B,2E TButterfly -0087 => 8C072634:01-02 8C068AF0:01-02 8C06AE30:01-02 8C080B9C:01-02 80194EE4:01-02 006604BC:01-02,2E TMotorcycle -0088 => 8C0755A0:01-07 8C06B9D0:01-0A 8C06DDA0:01-07 8C084684:01-07 801899F8:01-07,1C-1D,1F 800BB010:01 0064DE38:01-07,1C-1D,1F,24-2B,2E TObjContainerBase2 -0089 => 8C071EA4:01-02 8C068304:01-02 8C06A648:01-02 8C080404:01-02 8019A7E4:01-02 00667860:01-02,2E TObjTank -008A => 8C077910:01-02 8C06DD70:01-02 8C070138:01-02 8C086EF4:01-02 TObjBattery -008B => 8C076C40:01-02,0A 8C06D090:01-02 8C06F458:01-02,0A 8C086224:01-0A,10-11 80188180:01-0A,10-11,13-1D,22-23 0064D080:01-0A,10-11,13-1D,22-2B,2E TObjComputer -TYPE => 1OEF---------------------- 1OJ1------------------- 1OJ2---------------------- 2OEF---------------------- 3OE1---------------------------------- 3SE0------------- 59NL---------------------------------------------- NAME -008C => 8C074B48:01-02 8C06AF6C:01-02 8C06D338:01-02 8C083790:01-03 8018C514:01-03 00651778:01-03,2E TObjContainerIdo -008D => 8C0DCE20:01-0A,0D 8C0CC748:01-0A 8C0CFF24:01-0A,0D 8C0F2520:01-0A,0D 8015A274:01-0A,0D 0061532C:01-0A,0D,2E TOCapsuleAncient01 -008E => 8C0F482C:01-02,04-07 8C0E3128:01-02,04-07 8C0E6C00:01-02,04-07 8C10BB98:01-02,04-07 80157EA8:01-02,04-07 00612F68:01-02,04-07,24-2B,2E TOBarrierEnergy01 -008F => 8C102C8C:01-02 8C0F1358:01-02 8C0F4574:01-02 8C11A6C8:01-02 8019157C:01-02 0065BB7C:01-02,2E TObjHashi -0090 => 8C118C88:01-02,06-07 8C106778:01-02,06-07 8C109DB0:01-02,06-07 8C130AF8:01-02,06-07,10-11 8016CB20:01-02,06-07,10-11,13-1D,22-23 0062B664:01-02,06-07,10-11,13-1D,22-2B,2E TOKeyGenericSw -0091 => 8C075A88:01-07 8C06BEB0:01-0A 8C06E27C:01-07 8C084B28:01-07 801895BC:01-07,1C-1D 0064E468:01-07,1C-1D,24-2B,2E TObjContainerEnemy -0092 => 8C02E9DC:01-07,0B-0E 8C029AB8:01-0A 8C02A82C:01-07,0B-0E 8C085994:01-07,0B-0E 80188928:01-07,0B-0E,1C-1D,1F 0064EDC8:01-07,0B-0E,1C-1D,1F,29-2C,2E TObjContainerBase -0093 => 8C02EA20:01-07 8C029AFC:01-0A 8C02A870:01-07 8C034230:01-07 801A2B3C:01-07,1C-1D 007BAF40:01-07,1C-1D,24-2B,2E TObjContainerAbeEnemy -0095 => 8C085108:01-07 80189074:01-07 0064E900:01-07,24-2B,2E TObjContainerNoItem -0096 => 8C0813DC:01-0A,10-11 801928C0:01-0A,10-11,13-1D,22-23 0065DEB8:01-0A,10-11,13-1D,22-2B,2E TObjLazerFenceExtra -00C0 => 8C11D13C:03-05 8C10A6F8:03-05 8C10DCA0:03-05 8C135558:03-05,10-11 8016C2A4:03-05,10-11,13-1D,22-23 0062AF04:03-05,10-11,13-1D,22-2B,2E TOKeyCave01 -00C1 => 8C11A960:03-05 8C1080D4:03-05 8C10B698:03-05 8C132AA8:03-05 801618C4:03-05 0061D8CC:03-05,2E TODoorCave01 -00C2 => 8C11CBA0:03-05 8C10A16C:03-05 8C10D710:03-05 8C134FBC:03-05 80161F4C:03-05 0061DF78:03-05,2E TODoorCave02 -00C3 => 8C1128CC:03-05 8C100480:03-05 8C103984:03-05 8C129FA0:03-05 80168848:03-05,13-16,23 00626DC8:03-05,13-16,23,2E TOHangceilingCave01Normal/TOHangceilingCave01Key/TOHangceilingCave01KeyQuick -00C4 => 8C0E8E20:04-05 8C0D8300:04-05 8C0DBD28:04-05 8C0FF998:04-05 801765B4:04-05 006371AC:04-05,2E TOSignCave01 -00C5 => 8C0E8A9C:04-05 8C0D7F7C:04-05 8C0DB9A4:04-05 8C0FF614:04-05 80176968:04-05 006375AC:04-05,2E TOSignCave02 -00C6 => 8C0E8680:04-05 8C0D7B60:04-05 8C0DB588:04-05 8C0FF1F8:04-05 80176DAC:04-05 006377EC:04-05,2E TOSignCave03 -00C7 => 8C0E91A4:04-05 8C0D8684:04-05 8C0DC0AC:04-05 8C0FFD1C:04-05 80156DF8:04-05 006114B0:04-05,2E TOAirconCave01 -00C8 => 8C0F0530:04-05 8C0DF0D4:04-05 8C0E2C3C:04-05 8C10773C:04-05 80157034:04-05 00611754:04-05,2E TOAirconCave02 -00C9 => 8C0E93BC:04-05 8C0D889C:04-05 8C0DC2C4:04-05 8C0FFF34:04-05 80173470:04-05 0063274C:04-05,24-28,2E TORevlightCave01 -00CB => 8C1075AC:04 8C0F5938:04 8C0F8D4C:04 8C11F4E8:04 8017318C:04 00632308:04,2E TORainbowCave01 -00CC => 8C10B640:04 8C0F9894:04 8C0FCD4C:04 8C1232B4:04 8016E65C:04,1C-1D 0062C1B0:04,1C-1D,2E TOKurage -00CD => 8C11A5C8:04 8C107D40:04 8C10B304:04 8C132784:04,10 801642F4:04,10,15-16 0062346C:04,10,15-16,29-2B,2E TODragonflyCave01 -00CE => 8C18CF50:03-05 8C16DC48:03-05 8C175C84:03-05 8C1AF0FC:03-05 8016259C:03-05 0061E574:03-05,2E TODoorCave03 -00CF => 8C18E8D4:03-07 8C16F428:03-07 8C177474:03-07 8C1B0AE0:03-07 80158638:03-07,23 006136E0:03-07,23,2E TOBind -00D0 => 8C19CDD0:05 8C177DE8:05 8C182D60:05 8C1BFC84:05 80159F68:05 00614FB4:05,2E TOCakeshopCave01 -00D1 => 8C1A9F98:03 8C183E34:03 8C18EEBC:03 8C1CE8D0:03 80174A44:03 006337B8:03,2E TORockCaveS01 -00D2 => 8C1AA0FC:03 8C183F98:03 8C18F020:03 8C1CEA34:03 801748E4:03 00633CD0:03,2E TORockCaveM01 -00D3 => 8C1AA264:03 8C184100:03 8C18F188:03 8C1CEB9C:03 80174784:03 00634190:03,24-2B,2E TORockCaveL01 -00D4 => 8C1AA3CC:04 8C184268:04 8C18F2F0:04 8C1CED04:04 80174628:04 00633920:04 TORockCaveS02 -00D5 => 8C1AA530:04 8C1843CC:04 8C18F454:04 8C1CEE68:04 801744C8:04 00633E00:04 TORockCaveM02 -00D6 => 8C1AA698:04 8C184534:04 8C18F5BC:04 8C1CEFD0:04 80174368:04 006342C0:04 TORockCaveL02 -00D7 => 8C1AA80C:04 8C1846A8:04 8C18F730:04 8C1CF144:04 8017420C:04 00633A50:04 TORockCaveSS02 -00D8 => 8C1AA994:04 8C184830:04 8C18F8B8:04 8C1CF2CC:04 801740AC:04 00633F30:04 TORockCaveSM02 -00D9 => 8C1AAB20:04 8C1849BC:04 8C18FA44:04 8C1CF458:04 80173F4C:04 006343F0:04 TORockCaveSL02 -00DA => 8C1AAC9C:05 8C184B38:05 8C18FBC0:05 8C1CF5D4:05 80173DF0:05 00633BA0:05 TORockCaveS03 -00DB => 8C1AAE00:05 8C184C9C:05 8C18FD24:05 8C1CF738:05 80173C90:05 00634060:05 TORockCaveM03 -00DC => 8C1AAF68:05 8C184E04:05 8C18FE8C:05 8C1CF8A0:05 80173B30:05 00634520:05 TORockCaveL03 -00DE => 8C263648:01-0A,10-11 80165D1C:01-0A,10-11,13-1D,22-23 006241D4:01-0A,10-11,13-1D,22-2B,2E TODummyKeyCave01 -TYPE => 1OEF---------------------- 1OJ1------------------- 1OJ2---------------------- 2OEF---------------------- 3OE1---------------------------------- 3SE0------------- 59NL---------------------------------------------- NAME -00DF => 8C1CFB54:03 801739AC:03 00634650:03,2E TORockCaveBL01 -00E0 => 8C1CFD40:04 80173828:04 006347D8:04,2E TORockCaveBL02 -00E1 => 8C1CFF2C:05 801736A4:05 0063492C:05,2E TORockCaveBL03 -0100 => 8C146C64:06-07 8C132534:06-07 8C1354F4:06-07 8C1623BC:06-07 80162E38:06-07 0061EE48:06-07,2E TODoorMachine01 -0101 => 8C1474F0:06-07 8C132D5C:06-07 8C135D74:06-07 8C162C48:01-02,06-07,10-11 8016D538:01-02,06-07,10-11,13-16 0062BE90:01-02,06-07,10-11,13-16,24-2B,2E TOKeyMachine01 -0102 => 8C18D4A8:06-07 8C16E184:06-07 8C1761D8:06-07 8C1AF6B4:06-07 80163440:06-07 0061F484:06-07 00677A80:29-2B,2E TODoorMachine02 -0103 => 8C19C734:06-07 8C17774C:06-07 8C1826C4:06-07 8C1BF5DC:06-07 8015A588:06-07,23 00615A9C:06-07,23,2E TOCapsuleMachine01 -0104 => 8C19CA08:06-07 8C177A20:06-07 8C182998:06-07 8C1BF8B0:06-07 8015B37C:06-07,23 00617204:06-07,23,2E TOComputerMachine01 -0105 => 8C19D208:06-07 8C178220:06-07 8C183198:06-07 8C1C00BC:06-07 801722A4:06-07,23 006314EC:06-07,23,2E TOMonitorMachine01 -0106 => 8C1A12B8:06-07 8C17BFE4:06-07 8C186FC8:06-07 8C1C4334:06-07 80165294:06-07 00623D38:06-07,2E TODragonflyMachine01 -0107 => 8C19D964:06-07 8C178974:06-07 8C18387C:06-07 8C1C0800:06-07 8016E99C:06-07 0062D244:06-07,2E TOLightMachine01 -0108 => 8C19DED0:06-07 8C178EDC:06-07 8C183DE8:06-07 8C1C0D68:06-07 80166144:06-07 00624FD4:06-07,2E TOExplosiveMachine01 -0109 => 8C19E044:06-07 8C179050:06-07 8C183F5C:06-07 8C1C0EDC:06-07 80165FD4:06-07 006251A0:06-07,2E TOExplosiveMachine02 -010A => 8C19E1C0:06-07 8C1791CC:06-07 8C1840D8:06-07 8C1C1058:06-07 80165E64:06-07 0062536C:06-07,2E TOExplosiveMachine03 -010B => 8C1A4460:06-07 8C17E0D0:06-07 8C18A1B8:06-07 8C1C71CC:06-07 80177190:06-07 00637EAC:06-07,2E TOSparkMachine01 -010C => 8C1A474C:06-07 8C17E3BC:06-07 8C18A4A4:06-07 8C1C74B8:06-07 80168DF4:06-07 006282D8:06-07,2E TOHangerMachine01 -0130 => 8C18DA44:0D 8C16E6B0:0D 8C1766FC:0D 8C1AFC50:0D 801639E8:0D 006225CC:0D,2E TODoorVoShip -0140 => 8C13D05C:08-0A 8C12882C:08-0A 8C12C690:08-0A 8C158348:08-0A 8017C9F4:08-0A 00640D08:08-0A,2E TObjGoalWarpAncient -0141 => 8C13CBE4:08-0A 8C1283B4:08-0A 8C12C218:08-0A 8C157EA8:08-0A 8017CDB8:08-0A 00640A04:08-0A,2E TObjMapWarpAncient -0142 => 8C0FCE18:08-0A 8C0EBBC0:08-0A 8C0EEDE0:08-0A 8C114420:08-0A 8016B3CC:08-0A 0062A4A4:08-0A,2E TOKeyAncient02 -0143 => 8C11E2E4:08-0A 8C10B514:08-0A 8C10EA74:08-0A 8C13679C:08-0A 8016BAB4:08-0A 0062A9A4:08-0A,2E TOKeyAncient03 -0144 => 8C0DA588:08 8C0CA308:08 8C0CDA04:08 8C0EF7B4:08 8015DECC:08 0061A0D4:08,2E TODoorAncient01 -0145 => 8C0DA9E0:0A 8C0CA764:0A 8C0CDE58:0A 8C0EFC0C:0A 8015E378:0A 0061A534:0A,2E TODoorAncient03 -0146 => 8C0DAE38:09 8C0CABC0:09 8C0CE2AC:09 8C0F0064:09 8015E824:09 0061A994:09,2E TODoorAncient04 -0147 => 8C107238:08 8C0F55C8:08 8C0F89DC:08 8C11F13C:08 8015ECE4:08 0061AE54:08,2E TODoorAncient05 -0148 => 8C106D88:09 8C0F51D0:09 8C0F8530:09 8C11EC54:09 8015F24C:09 0061B4B4:09,2E TODoorAncient06 -0149 => 8C1068C4:0A 8C0F4DC8:0A 8C0F8070:0A 8C11E758:0A 8015F7C4:0A 0061BB14:0A,2E TODoorAncient07 -014A => 8C119128:08-0A 8C106B8C:08-0A 8C10A24C:08-0A 8C130F98:08-0A 801603E0:08-0A 0061C674:08-0A,2E TODoorAncient08 -014B => 8C11D724:08-0A 8C10ACDC:08-0A 8C10E298:08-0A 8C135BCC:08-0A 80160F10:08-0A 0061D034:08-0A,2E TODoorAncient09 -014C => 8C141D9C:08-0A 8C12D6C8:08-0A 8C1306A0:08-0A 8C15D24C:08-0A 80175B24:08-0A 006368F0:08-0A,2E TOSensorAncient01 -014D => 8C0FD3D0:08-0A 8C0EC178:08-0A 8C0EF398:08-0A 8C1149D8:08-0A 8016AD90:08-0A 00629ED0:08-0A,2E TOKeyAncient01 -014E => 8C0DD52C:08-0A 8C0CCEF8:08-0A 8C0D0624:08-0A 8C0F2C38:08-0A 80166A4C:08-0A 006259EC:08-0A,24-2B,2E TOFenceAncient01 -014F => 8C0DD87C:08-0A 8C0CD248:08-0A 8C0D0974:08-0A 8C0F2F88:08-0A 80166E2C:08-0A 00625DD4:08-0A,24-2B,2E TOFenceAncient02 -0150 => 8C0DDBCC:08-0A 8C0CD598:08-0A 8C0D0CC4:08-0A 8C0F32D8:08-0A 801671D0:08-0A 006261CC:08-0A,2E TOFenceAncient03 -0151 => 8C0DDF64:08-0A 8C0CD930:08-0A 8C0D105C:08-0A 8C0F3670:08-0A 80167574:08-0A 006265BC:08-0A,2E TOFenceAncient04 -0152 => 8C111E0C:08-0A 8C0FFAB4:08-0A 8C102FB4:08-0A 8C1294E4:08-0A 8018B9B0:08-0A,17-1B 00650324:08-0A,17-1B,29-2B,2E TContainerAncient01 -0153 => 8C128464:08-0A 8C114CE4:08-0A 8C118418:08-0A 8C141978:08-0A 80179C90:08-0A,13-16 0063A518:08-0A,13-16,2E TOTrapAncient01 -0154 => 8C133A50:08-0A 8C11FE7C:08-0A 8C1237AC:08-0A 8C14D208:08-0A 8017B348:08-0A 0063BFD4:08-0A,2E TOTrapAncient02 -0155 => 8C0DC40C:08-0A 8C0CBE58:08-0A 8C0CF54C:08-0A 8C0F1A80:08-0A 801725B4:08-0A 006318C4:08-0A,2E TOMonumentAncient01 -TYPE => 1OEF---------------------- 1OJ1------------------- 1OJ2---------------------- 2OEF---------------------- 3OE1---------------------------------- 3SE0------------- 59NL---------------------------------------------- NAME -0156 => 8C0DC86C:02,04,07 8C0CC2C0:02,04,07 8C0CF9B4:02,04,07 8C0F1F28:02,04,07 80172BAC:02,04,07 00631E38:02,04,07,2E TOMonumentAncient02 -0159 => 8C0DB63C:08-0A 8C0CB3EC:08-0A 8C0CEACC:08-0A 8C0F08A0:08-0A 8017DA9C:08-0A 00641574:08-0A,2E TOWreckAncient01 -015A => 8C0DBCDC:08-0A 8C0CB7C8:08-0A 8C0CEEA8:08-0A 8C0F1308:08-0A 8017DDF0:08-0A 006422C0:08-0A,2E TOWreckAncient02 -015B => 8C0DBDA4:08-0A 8C0CB874:08-0A 8C0CEF54:08-0A 8C0F13D0:08-0A 8017DF10:08-0A 00642430:08-0A,2E TOWreckAncient03 -015C => 8C0DB790:08-0A 8C0CB4B8:08-0A 8C0CEB98:08-0A 8C0F09F4:08-0A 8017D978:08-0A 006416C8:08-0A,2E TOWreckAncient04 -015D => 8C0DB8EC:08-0A 8C0CB584:08-0A 8C0CEC64:08-0A 8C0F0B50:08-0A 8017D854:08-0A 0064181C:08-0A,2E TOWreckAncient05 -015E => 8C0DBA44:08-0A 8C0CB650:08-0A 8C0CED30:08-0A 8C0F0CA8:08-0A 8017D730:08-0A 00641970:08-0A,2E TOWreckAncient06 -015F => 8C0DBBA0:08-0A 8C0CB71C:08-0A 8C0CEDFC:08-0A 8C0F0E04:08-0A 8017D60C:08-0A 00641AC4:08-0A,2E TOWreckAncient07 -0160 => 8C02EB98:0D 8C11ED40:08-0A 8C10BFAC:08-0A 8C02A9A4:0D 8C10F504:08-0A 8C034374:0D 8C137204:08-0A 80153768:08-0A,15-16,1C-1D 801A29C8:0D 005C2678:08-0A,15-16,1C-1D,24-2B,2E 007BAFBC:0D,2E TObjFogCollisionPoison/TObjWarpBoss03 -0161 => 8C02EAA8:08-0A 8C029B40:08-0A 8C02A8B4:08-0A 8C1E493C:08-0A,10-11 8015BFE8:08-0A,10-11,13-16,20-21 00617BA4:08-0A,10-11,13-16,20-21,2E TOContainerAncientItemCommon -0162 => 8C02EAE4:08-0A 8C029B7C:08-0A 8C02A8F0:08-0A 8C0342FC:08-0A,10-11 801A2A14:08-0A,10-11,13-16,20-21 007BB5F0:08-0A,10-11,13-16,20-21,2E TOContainerAncientItemRare -0163 => 8C02EB20:08-0A 8C029BB8:08-0A 8C02A92C:08-0A 8C1E535C:08-0A,10-11 8015B69C:08-0A,10-11,13-16 006182F0:08-0A,10-11,13-16,2E TOContainerAncientEnemyCommon -0164 => 8C02EB5C:08-0A 8C029BF4:08-0A 8C02A968:08-0A 8C034338:08-0A,10-11 801A2A5C:08-0A,10-11,13-16 007BB578:08-0A,10-11,13-16,2E TOContainerAncientEnemyRare -0165 => 8C1E4C78:08-0A,10-11 8015BD78:08-0A,10-11,13-16 00617DA4:08-0A,10-11,13-16,2E TOContainerAncientItemNone -0166 => 8C0F11E4:08-0A 8017D1DC:08-0A 00642028:08-0A,2E TOWreckAncientBrakable05 -0167 => 8C14DAB8:06-0A 8017A96C:06-0A,13-1D,22-23 0063B4E8:06-0A,13-1D,22-23,2E TOTrapAncient02R -0170 => 8C1B4074:0E 8C18BA60:0E 8C197A24:0E 8C1DAB6C:0E,10 8015982C:0E,10,15-16 00613F90:0E,10,15-16,2E TOBoss4Bird -0171 => 8C1B44C0:0E 8C18BEAC:0E 8C197E70:0E 8C1DAFB8:0E 801592E0:0E 00614318:0E,2E TOBoss4Tower -0172 => 8C1B4A08:0E 8C18C3F4:0E 8C1983B8:0E 8C1DB500:0E 80158D90:0E 00614840:0E,2E TOBoss4Rock -0173 => 8C1B4F9C:0E 8C18C988:0E 8C19894C:0E 8C1DBA94:0E TOSoulDF -0174 => 8C1B78AC:0E 8C18EB54:0E 8C19AD14:0E 8C1DE660:0E TOButterflyDF -0180 => 8C02EC20:0F 8C029C30:0F 8C02A9E8:0F 8C0343FC:0F 801A27B4:0F 800C5E4C:0F 007BB038:0F,2E TObjInfoCol -0181 => 8C02EC64:0F 8C029C74:0F 8C02AA2C:0F 8C034440:0F 801A2800:0F 800C5E98:0F 007BB0B4:0F,2E TObjWarpLobby -0182 => 80350B84:0F 801D0C44:0F 00672254:0F,2E TObjLobbyMain -0183 => 802BF420:0F 8019AD18:01,0F 00655624:0F,2E __LOBBY_PIGEON__ -0184 => 8034FA8C:0F 801CFF08:01,0F 00670518:0F,2E TObjButterflyLobby -0185 => 8034EB9C:0F 801CF014:01,0F 00672B7C:0F,2E TObjRainbowLobby -0186 => 80351A18:0F 801D167C:0F 00670BD0:0F,2E TObjKabochaLobby -0187 => 80357CD8:0F 801D4270:0F 00672EEC:0F,2E TObjStendGlassLobby -0188 => 80359DF4:0F 801D4D78:0F 00670894:0F,2E TObjCurtainLobby -0189 => 8035A1E0:0F 801D5168:0F 00673A64:0F,2E TObjWeddingLobby -018A => 80362D44:0F 801D73B4:0F 00673750:0F,2E TObjTreeLobby -018B => 80368118:0F 801D858C:0F 00673284:0F,2E TObjSuisouLobby -018C => 80367DC0:0F 801D8234:0F 006726B0:0F,2E TObjParticleLobby -018D => 802C07E4:0F TObjLobbyTable -018E => 8030D8A8:0F TObjJukeBox -0190 => 8C2555E0:10 8017FAC0:10,15-16 00643D60:10,15-16,2E TObjCamera -0191 => 8C255D10:10 8019AF20:10,15-16,23 00667EC8:10,15-16,23,2E TObjTuitate -0192 => 8C2563B4:10 8018E02C:10,15-16 0065334C:10,15-16,2E TObjDoaEx01 -TYPE => 1OEF---------------------- 1OJ1------------------- 1OJ2---------------------- 2OEF---------------------- 3OE1---------------------------------- 3SE0------------- 59NL---------------------------------------------- NAME -0193 => 8C256050:10 8019AB9C:10,15-16,23 00668194:10,15-16,23,2E TObjBigTuitate -01A0 => 8C256C5C:11 80164084:11,13-14 00622C98:11,13-14,2E TODoorVS2Door01 -01A1 => 8C257644:11 8017C520:11,13-14 0063F6D4:11,13-14,2E TOVS2Wreck01 -01A2 => 8C257718:11 8017C438:11,13-14 0063F830:11,13-14,2E TOVS2Wreck02 -01A3 => 8C2577EC:11 8017C350:11,13-14 0063F98C:11,13-14,2E TOVS2Wreck03 -01A4 => 8C2578C0:11 8017C268:11,13-14 0063FAE8:11,13-14,2E TOVS2Wreck04 -01A5 => 8C257994:11 8017C180:11,13-14 0063FC44:11,13-14,2E TOVS2Wreck05 -01A6 => 8C257A68:11 8017C098:11,13-14 0063FDA0:11,13-14,2E TOVS2Wreck06 -01A7 => 8C257C74:11 8017BEC8:11,13-14 0063FEFC:11,13-14,2E TOVS2Wall01 -01A8 => 8C25540C:11 80085794:11,13-14,20,20 0050821C:11,13-14,20,20,24-28,2E __OBJECT_MAP_DETECT_TEMPLE__ -01A9 => 8C11A8CC:11 80191388:11,13-14 0065BDAC:11,13-14,2E TObjHashiVersus1 -01AA => 8C11AAF4:11 8019118C:11,13-14 0065BF18:11,13-14,2E TObjHashiVersus2 -01AB => 801A271C:13-14 007BB130:13-14,2E TODoorFourLightRuins -01C0 => 801A2768:15-16 007BB1AC:15-16 TODoorFourLightSpace -0200 => 8018D2CC:17-1B,1E,22-23 00652140:17-1B,1E,22-28,2E TObjContainerJung -0201 => 8019FF00:17-1F,22-23 0066D4C4:17-1F,22-23,2E TObjWarpJung -0202 => 8018F2DC:17-1B,22-23 00657A04:17-1B,22-23,2E TObjDoorJung -0203 => 8018CE58:17-1B,1E,22-23 0064EDC8:24-28 00652698:17-1B,1E,22-23,2E TObjContainerJungEx -0204 => 80299E20:17 00658218:17,2E TODoorJungleMain -0205 => 8029BA64:17-1B,22-23 00658EAC:17-1B,22-23,2E TOKeyJungleMain -0206 => 8029B3F8:17-1B,22 00635040:17-1B,22,2E TORockJungleS01 -0207 => 8029AFAC:17-1B,22 0063540C:17-1B,22,2E TORockJungleM01 -0208 => 8029AC38:17-1B,22 006358B8:17-1B,22,2E TORockJungleL01 -0209 => 8029B764:17-1B,22 006269A4:17-1B,22,2E TOGrassJungle -020A => 8019FA1C:17-1B,22-23 0066D840:17-1B,22-23,2E TObjWarpJungMain -020B => 802A8750:17,1E 004FFF04:17,1E,2E TBGLightningCtrl -020C => 802C0C64:18-19,1B,22-23 00654228:18-19,1B,22-23,29-2B,2E __WHITE_BIRD__ -020D => 802C05BC:18-19,1B,23 006548E4:18-19,1B,23,2E __ORANGE_BIRD__ -020E => 8018CCF8:17-1B,22-23 00652DB8:17-1B,22-23,2E TObjContainerJungEnemy -020F => 802C7748:17-1D,22-23 0063D688:17-1D,22-23,2E TOTrapChainSawDamage -0210 => 802C7234:17-1D,22-23 0063D134:17-1D,22-23,2E TOTrapChainSawKey -0211 => 802A8D98:17-19 80198138:01 0062DB1C:17-19,29-2B,2E TOBiwaMushi -0212 => 802BFDE8:17-1B,23 8019B6E0:01 00654F04:17-1B,23,2E __SEAGULL__ -0213 => 802FD478:18-1B,22 006294FC:18-1B,22,29-2B,2E TOJungleDesign -0220 => 8029D04C:0F,18,1B-1D,22 8019147C:01,0F 0065B068:0F,18,1B-1D,22,2E TObjFish -0221 => 801A25EC:1C-1D 007BB228:1C-1D,2E TODoorFourLightSeabed -0222 => 801A2638:1C-1D 007BB2A4:1C-1D,2E TODoorFourLightSeabedU -0223 => 802A5290:1C-1D,23 00664328:1C-1D,23,2E TObjSeabedSuiso_CH -0224 => 802A507C:1C-1D 006644EC:1C-1D,2E TObjSeabedSuisoBrakable -TYPE => 1OEF---------------------- 1OJ1------------------- 1OJ2---------------------- 2OEF---------------------- 3OE1---------------------------------- 3SE0------------- 59NL---------------------------------------------- NAME -0225 => 802A9378:1C-1D 0062D674:1C-1D,2E TOMekaFish00 -0226 => 802A9088:1C-1D 0062D8C8:1C-1D,2E TOMekaFish01 -0227 => 802C1378:1C-1D 00653B10:1C-1D,2E __DOLPHIN__ -0228 => 802C9154:17-1D,22-23 0063EE10:17-1D,22-23,2E TOTrapSeabed01 -0229 => 802ADD40:13-23 006156E0:13-23,2E TOCapsuleLabo -0240 => 801954E4:1E 00660938:1E,2E TObjParticle -0280 => 802EF620:20 004BE0F0:20,2E __BARBA_RAY_TELEPORTER__ -02A0 => 80309D5C:21 004D0EF8:21,2E TObjLiveCamera -02B0 => 8018ADF8:08-0A,17-1B,22-23 00650DF0:08-0A,17-1B,22-23,29-2B,2E TContainerAncient01R -02B1 => 803631D4:12 801D7848:00 0065CAE8:12,2E TObjLaboDesignBase(0) -02B2 => 80363184:12 801D77F8:00 0065CC94:12,2E TObjLaboDesignBase(1) -02B3 => 80363134:12 801D77A8:00 0065CE40:12,2E TObjLaboDesignBase(2) -02B4 => 803630E4:12 801D7758:00 0065CFEC:12,2E TObjLaboDesignBase(3) -02B5 => 80363094:12 801D7708:00 0065D198:12,2E TObjLaboDesignBase(4) -02B6 => 80363044:12 801D76B8:00 0065D344:12,2E TObjLaboDesignBase(5) -02B7 => 80187C10:00,12 TObjGbAdvance -02B8 => 80195824:00-0E,12-23 800BE0E8:00 00662C40:00-0E,12-2B,2D-2E TObjQuestColALock2 -02B9 => 801A297C:00-07,0B-0E,10-1D,22-23 800C5FC8:00 007BADCC:00-07,0B-0E,10-1D,22-2E TObjMapForceWarp -02BA => 80195680:00-0E,12-23 800BDF18:00 00662EF0:00-0E,12-2B,2D-2E TObjQuestCol2 -02BB => 801A26D0:12 007BB39C:12,2E TODoorLaboNormal -02BC => 8019AFF4:1F 0066A3FC:1F,2E TObjAreaWarpEndingJung -02BD => 80185430:12 0064B3AC:12,2E TObjLaboMapWarp -02D0 => 8026C79C:01 TObjKazariCard -02D1 => 800C5F30:00 TObj_FloatingCardMaterial_Dark -02D2 => 800C5F7C:00 TObj_FloatingCardMaterial_Hero -02D3 => 800B9528:00 TObjCardCityMapWarp(0) -02D4 => 800B8C40:00 TObjCardCityDoor(0) -02D5 => 800B8BF0:00 TObjCardCityDoor(1) -02D6 => 80278E08:01 TObjKazariGeyserMizu -02D7 => 802BCE80:01 TObjSetCardColi -02D8 => 800B8BA0:00 TObjCardCityDoor(2) -02D9 => 800B94D8:00 TObjCardCityMapWarp(1) -02DA => 802DFD18:00 TOFlyMekaHero -02DB => 802DFAAC:00 TOFlyMekaDark -02DC => 800B884C:00 TObjCardCityDoor_Closed(0) -02DD => 800B87FC:00 TObjCardCityDoor_Closed(1) -02DE => 800B87AC:00 TObjCardCityDoor_Closed(2) -02DF => 800B8B50:00 TObjCardCityDoor(3) -02E0 => 800B8B00:00 TObjCardCityDoor(4) -TYPE => 1OEF---------------------- 1OJ1------------------- 1OJ2---------------------- 2OEF---------------------- 3OE1---------------------------------- 3SE0------------- 59NL---------------------------------------------- NAME -02E1 => 800B875C:00 TObjCardCityDoor_Closed(3) -02E2 => 800B870C:00 TObjCardCityDoor_Closed(4) -02E3 => 800B9488:00 TObjCardCityMapWarp(2) -02E4 => 80309608:00,0F TObjSinBoardCard -02E5 => 8030DE8C:00 TObjCityMoji -02E6 => 8030DB4C:00 TObjCityWarpOff -02E7 => 80310BEC:00 TObjFlyCom -02E8 => 8019A638:00 __UNKNOWN_02E8__ -0300 => 00661158:24-2C,2E __EP4_LIGHT__ -0301 => 0067612C:24-2B,2E __WILDS_CRATER_CACTUS__ -0302 => 00675748:24-2B,2E __WILDS_CRATER_BROWN_ROCK__ -0303 => 00675BF8:24-2B,2E __WILDS_CRATER_BROWN_ROCK_DESTRUCTIBLE__ -0340 => 00673FB8:2E __UNKNOWN_0340__ -0341 => 00674118:2E __UNKNOWN_0341__ -0380 => 0067927C:29-2B,2E __POISON_PLANT__ -0381 => 00679678:29-2B,2E __UNKNOWN_0381__ -0382 => 0067A264:29-2B,2E __UNKNOWN_0382__ -0383 => 006781EC:29-2B,2E __DESERT_OOZE_PLANT__ -0385 => 006785C8:29-2B,2E __UNKNOWN_0385__ -0386 => 00677DE4:24-2B,2E __WILDS_CRATER_BLACK_ROCKS__ -0387 => 006119E4:29-2B,2E __UNKNOWN_0387__ -0388 => 00635D1C:29-2B,2E __UNKNOWN_0388__ -0389 => 0063810C:2E __UNKNOWN_0389__ -038A => 00619604:2E __UNKNOWN_038A__ -038B => 00679F58:29-2B,2E __FALLING_ROCK__ -038C => 0067A548:29-2B,2E __DESERT_PLANT_SOLID__ -038D => 00677610:29-2B,2E __DESERT_CRYSTALS_BOX__ -038E => 00677A80:2E __EP4_TEST_DOOR__ -038F => 00676ADC:29-2B,2E __BEE_HIVE__ -0390 => 00678C00:29-2B,2E __EP4_TEST_PARTICLE__ -0391 => 005C2820:29-2B,2E __HEAT__ -03C0 => 0076FB74:2C,2E __EP4_BOSS_EGG__ -03C1 => 00770028:2C,2E __EP4_BOSS_ROCK_SPAWNER__ +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +0000 => 8C070448:000000000000FFFF 8C072810:000000000000FFFF 8C07ADD8:000000000000FFFF 8C08A784:000000000003FFFF 8019554C:0000000FFFFFFFFF 800BDD8C:0000000000008001 001E1360:0000000FFFFFFFFF 00661728:00007FFFFFFFFFFF TObjPlayerSet +0001 => 8C068700:000000000000FFFF 8C06AA44:000000000000FFFF 8C0722A4:000000000000FFFF 8C080804:000000000003FFFF 801954E4:0000000FFFFFFFFF 800BDD24:0000000000008003 001E0F90:0000000FFFFFFFFF 00660938:00006FFFFFFFFFFF TObjParticle +0002 => 8C029898:00000000000078FF 8C02A60C:00000000000078FF 8C02E7BC:00000000000078FF 8C033FCC:00000000000078FF 801A28E4:00000003C07C78FF 002D36A0:00000003C07C78FF 007BAC58:00007FF3C07C78FF TObjAreaWarpForest +0003 => 8C0298DC:00000000000078FF 8C02A650:00000000000078FF 8C02E800:00000000000078FF 8C034010:00000000000378FF 801A2930:0000000C3FFF78FF 002D3670:0000000C3FFF78FF 007BABDC:00007FFC3FFF78FF TObjMapWarpForest +0004 => 8C0C87DC:00000000000087FF 8C0CBEB0:00000000000087FF 8C0D8A74:00000000000087FF 8C0EDC0C:00000000000387FF 801944E0:0000000C3FFF87FF 800BD4B0:0000000000008003 001DFCC0:0000000C3FFF87FF 0065F6FC:00006FFC3FFF87FF TObjLight +0005 => 8C05D52C:000000000000073F 8C05E76C:000000000000073F 8C065EC0:000000000000073F 8C0735CC:000000000000073F TItem +0006 => 8C0D9A94:0000000000007FFF 8C0DD4DC:0000000000007FFF 8C0EA5F8:0000000000007FFF 8C101198:0000000000037FFF 80190810:00000000BFFF27FF 800BC054:0000000000000001 001DBD30:00000000BFFF27FF 00659648:00006FF0BFFF27FF TObjEnvSound +0007 => 8C10B8AC:0000000000007FFF 8C10EE04:0000000000007FFF 8C11E660:0000000000007FFF 8C136B1C:0000000000037FFF 80153F24:0000000FFFFF7FFF 800AFC20:0000000000000001 00171390:0000000FFFFF7FFF 005C20E4:00006FFFFFFF7FFF TObjFogCollision +0008 => 8C14AB34:0000000000007FFF 8C1511CC:0000000000007FFF 8C166444:0000000000007FFF 8C188688:0000000000037FFF 80190B7C:0000000FFFFF7FFF 800BC3C0:0000000000000001 001DC2B0:0000000FFFFF7FFF 00659E40:00007FFFFFFF7FFF TObjEvtCollision +0009 => 8C01049C:000000000000073F 8C0104A0:000000000000073F 8C0104A0:000000000000073F 8C0104A0:000000000000073F 800674D0:000000000004073F 8001D294:0000000000000001 002ABF90:000000000004073F 0077BFF4:000060000004073F TObjCollision +000A => 8C1119CC:00000000000007FE 8C115068:00000000000007FE 8C124DE0:00000000000007FE 8C13E1B0:00000000000307FE 80171314:0000000C3FFB07FE 001BC240:0000000C3FFB07FE 006302BC:00005FFC3FFB07FE TOMineIcon01 +000B => 8C111C6C:00000000000007FE 8C115308:00000000000007FE 8C125090:00000000000007FE 8C13E474:00000000000307FE 801715EC:0000000C3FFB07FE 001BC4D0:0000000C3FFB07FE 00630624:00005FFC3FFB07FE TOMineIcon02 +000C => 8C111F34:00000000000007FE 8C1155D4:00000000000007FE 8C12536C:00000000000007FE 8C13E760:00000000000307FE 801718C4:0000000C3FFB07FE 001BC780:0000000C3FFB07FE 0063098C:00005FFC3FFB07FE TOMineIcon03 +000D => 8C1121FC:00000000000007FE 8C1158A0:00000000000007FE 8C125648:00000000000007FE 8C13EA4C:00000000000307FE 80171CA8:0000000C3FFB07FE 001BCA30:0000000C3FFB07FE 00630DC0:00005FFC3FFB07FE TOMineIcon04 +000E => 8C148284:0000000000003FFE 8C14E808:0000000000003FFE 8C1639F0:0000000000003FFE 8C1858FC:0000000000003FFE 801A1C24:0000000FFFF83FFE 001ECAA0:0000000FFFF83FFE 0066F2AC:00005FFFFFF83FFE TObjRoomId +000F => 8C12DCB0:00000000000000F6 8C130C88:00000000000000F6 8C142384:00000000000000F6 8C15D834:00000000000000F6 80176138:00000000000000F6 001C0FF0:00000000000000F6 00636EC8:00004000000000F6 TOSensorGeneral01 +0011 => 8C0843CC:000000000000011E 8C0869C8:000000000000411E 8C08F4AC:000000000000411E 8C09FFE4:000000000000411E 8008108C:000000000000411E 000D8E40:000000000000411E 00500858:000040000000411E TEF_LensFlare +0012 => 8C029964:0000000000007FFF 8C02A6D8:0000000000007FFF 8C02E888:0000000000007FFF 8C034098:0000000000007FFF 8019695C:0000000FFFFC7FFF 800BF22C:0000000000000001 001E15F0:0000000FFFFC7FFF 00661E48:00006FFFFFFC7FFF TObjQuestCol +0013 => 8C15F044:00000000000007FE 8C1669B4:00000000000007FE 8C17D1C0:00000000000007FE 8C1A0448:00000000000007FE 80169570:0000000C3FF807FE 001B58C0:0000000C3FF807FE 00628A4C:00004FFC3FF807FE TOHealGeneral +0014 => 8C160648:000000000000073F 8C167FB4:000000000000073F 8C17E59C:000000000000073F 8C1A1968:000000000003073F 80194804:0000000C3F87073F 800BD7D4:0000000000000001 001E04B0:0000000C3F87073F 0065F960:0000600C3F87073F TObjMapCsn +0015 => 8C0299A8:0000000000007FFF 8C02A71C:0000000000007FFF 8C02E8CC:0000000000007FFF 8C0340DC:0000000000007FFF 80196750:0000000FFFFC7FFF 800BF020:0000000000000001 001E1780:0000000FFFFC7FFF 0066210C:00006FFFFFFC7FFF TObjQuestColA +0016 => 8C029A30:000000000000FFFF 8C02A7A4:000000000000FFFF 8C02E954:000000000000FFFF 8C034164:000000000000FFFF 801A2BD4:0000000FFFFCFFFF 800C6060:0000000000008001 002D35B0:0000000FFFFCFFFF 007BAA68:00006FFFFFFCFFFF TObjItemLight +0017 => 8C029A74:000000000000FFFE 8C02A7E8:000000000000FFFE 8C02E998:000000000000FFFE 8C0341EC:000000000000FFFE 801A2AA4:0000000FFFF8FFFE 800C5EE4:0000000000008000 002D35E0:0000000FFFF8FFFE 007BAAE4:00004FFFFFF8FFFE TObjRaderCol +0018 => 8C10BCD0:0000000000007FFE 8C10F228:0000000000007FFE 8C11EA58:0000000000007FFE 8C136F18:0000000000007FFE 801539F8:0000000FFFF87FFE 00171740:0000000FFFF87FFE 005C2488:00004FFFFFF87FFE TObjFogCollisionSwitch +0019 => 8C029920:00000000000004A5 8C02A694:00000000000004A5 8C02E844:00000000000004A5 8C034054:00000000000004A5 8019F580:0000000C3FFC04A5 001E9400:0000000C3FFC04A5 0066C4B4:00006FFC3FFC04A5 TObjWarpBossMulti(off)/TObjWarpBoss(on) +001A => 8C2012C0:0000000000000001 8C22AD80:0000000000000001 80198158:0000000000040001 800C06EC:0000000000000001 001E3FB0:0000000000040001 006650C8:0000600000040001 TObjSinBoard +001B => 8C02EA64:00000000000078FE 8C034274:00000000000078FE 801A2898:00000000000078FE 002D36D0:00000000000078FE 007BACD4:00005000000078FE TObjAreaWarpQuest +001C => 8C02EBDC:0000000000004000 8C0343B8:0000000000004000 801A284C:0000000080004000 002D3700:0000000080004000 007BAD50:0000500080004000 TObjAreaWarpEnding +001D => 8C251970:0000000000000002 80084A2C:0000000000000002 000DE8A0:0000000000000002 00507538:0000400000000002 TEffStarLight2D_Base +001E => 8C255390:0000000000020006 800857F4:00000001001A0006 000DED40:00000001001A0006 00508070:000041F1001A0006 __LENS_FLARE__ +001F => 8C0342B8:00000000000307FE 801A2AF0:0000000C3FFB07FE 002D3610:0000000C3FFB07FE 007BAB60:00004FFC3FFB07FE TObjRaderHideCol +0020 => 8C261450:00000000000307FF 80177F14:0000000C3FFF07FF 001C24B0:0000000C3FFF07FF 00638FC4:00006FFC3FFF07FF TOSwitchItem +0021 => 8C2618B0:00000000000307FF 8017883C:0000000C3FFF07FF 001C2D10:0000000C3FFF07FF 0063998C:00006FFC3FFF07FF TOSymbolchatColli +0022 => 8C261C20:00000000000307FE 8016C7E8:0000000C3FFB07FE 001B8250:0000000C3FFB07FE 0062B2DC:00004FFC3FFB07FE TOKeyCol +0023 => 8C262C1C:00000000000307FE 80157908:0000000C3FFB07FE 001A43B0:0000000C3FFB07FE 00612788:00004FFC3FFB07FE TOAttackableCol +0024 => 8C263DD8:00000000000307FF 80177AB4:0000000FFF9F07FF 001C1CE0:0000000FFF9F07FF 00638688:0000600FFF9F07FF TOSwitchAttack +0025 => 8C266504:00000000000307FF 80178418:0000000C3FFF07FF 001C2840:0000000C3FFF07FF 006393C4:00006FFC3FFF07FF TOSwitchTimer +0026 => 8C268DDC:00000000000307FF 8015B03C:0000000C3FFF07FF 001A7200:0000000C3FFF07FF 00615E70:00006FFC3FFF07FF TOChatSensor +0027 => 80196F90:0000000FFFFC0000 001E2A60:0000000FFFFC0000 006635D8:00004FFFFFFC0000 TObjRaderIcon +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +0028 => 801903BC:0000000CBFFF27F7 800BBC14:0000000000000001 001DBFF0:0000000CBFFF27F7 006599C0:00006FFCBFFF27F7 TObjEnvSoundEx +0029 => 80190148:0000000CBFFF27F7 800BB9A0:0000000000000001 001DC110:0000000CBFFF27F7 00659C14:00006FFCBFFF27F7 TObjEnvSoundGlobal +0040 => 8C0E2BF4:0000000000000001 8C0E66D4:0000000000000001 8C0F432C:0000000000000001 8C10B640:0000000000000001 8021D100:0000000000040001 8012D830:0000000000000001 0023C4C0:0000000000040001 006D71E4:0000600000040001 TShopGenerator +0041 => 8C152754:0000000000000001 8C159678:0000000000000001 8C16F4C4:0000000000000001 8C191FA4:0000000000000001 801A1710:0000000000040001 800C5484:0000000000000001 001EBB00:0000000000040001 0066EC3C:0000600000040001 TObjLuker +0042 => 8C0299EC:0000000000000001 8C02A760:0000000000000001 8C02E910:0000000000000001 8C034120:0000000000000001 801A2B88:0000000000040001 800C6014:0000000000000001 002D3760:0000000000040001 007BAE48:0000600000040001 TObjBgmCol +0043 => 8C1767C4:0000000000000001 8C1816A4:0000000000000001 8C19B770:0000000000000001 8C1BE4C8:0000000000000001 801862DC:0000000000040001 001CF700:0000000000040001 0064A8DC:0000600000040001 TObjCityMainWarp +0044 => 8C176BA0:0000000000000001 8C181AC4:0000000000000001 8C19BB78:0000000000000001 8C1BE8FC:0000000000000001 80185BE0:0000000000040001 800B9920:0000000000000001 001CFE70:0000000000040001 0064AD68:0000600000040001 TObjCityAreaWarp +0045 => 8C176F1C:0000000000000001 8C181E6C:0000000000000001 8C19BEDC:0000000000000001 8C1BEC78:0000000000000001 8018588C:0000000000040001 001D01E0:0000000000040001 0064B058:0000600000040001 TObjCityMapWarp +0046 => 8C17A0BC:0000000000000001 8C1850AC:0000000000000001 8C19F1B4:0000000000000001 8C1C204C:0000000000000001 801826C4:0000000000000001 001CCD60:0000000000000001 00646000:0000600000000001 TObjCityDoor_Shop +0047 => 8C17A258:0000000000000001 8C185248:0000000000000001 8C19F350:0000000000000001 8C1C21E8:0000000000000001 801824F8:0000000000000001 001CCE80:0000000000000001 00646258:0000600000000001 TObjCityDoor_Guild +0048 => 8C17A3F4:0000000000000001 8C1853E4:0000000000000001 8C19F4EC:0000000000000001 8C1C2384:0000000000000001 80182328:0000000000000001 001CCF90:0000000000000001 006464D0:0000600000000001 TObjCityDoor_Warp +0049 => 8C17A6D0:0000000000000001 8C1856B4:0000000000000001 8C19F7C0:0000000000000001 8C1C26C8:0000000000000001 80181F84:0000000000000001 001CD220:0000000000000001 006466F4:0000600000000001 TObjCityDoor_Med +004A => 8C17ADC4:0000000000000001 8C185DA8:0000000000000001 8C19FEB4:0000000000000001 8C1C2DBC:0000000000000001 80182EE4:0000000000000001 001CD7B0:0000000000000001 006471BC:0000600000000001 __ELEVATOR__ +004B => 8C189CA8:0000000000000001 8C195AF0:0000000000000001 8C1B1EB8:0000000000000001 8C1D89C4:0000000000000001 80184730:0000000000040001 001CDC20:0000000000040001 00647A08:0000600000040001 TObjCity_Season_EasterEgg +004C => 8C189E78:0000000000000001 8C195CB0:0000000000000001 8C1B2078:0000000000000001 8C1D8B84:0000000000000001 801844EC:0000000000040001 001CDE20:0000000000040001 00647CE0:0000600000040001 TObjCity_Season_ValentineHeart +004D => 8C18A054:0000000000000001 8C195F18:0000000000000001 8C1B22E0:0000000000000001 8C1D8DEC:0000000000000001 801842D4:0000000000040001 001CE030:0000000000040001 00647FD4:0000600000040001 TObjCity_Season_XmasTree +004E => 8C18A244:0000000000000001 8C196178:0000000000000001 8C1B2540:0000000000000001 8C1D904C:0000000000000001 801840DC:0000000000040001 001CE140:0000000000040001 006482E0:0000600000040001 TObjCity_Season_XmasWreath +004F => 8C18A384:0000000000000001 8C1962B8:0000000000000001 8C1B2680:0000000000000001 8C1D918C:0000000000000001 80183F44:0000000000040001 001CE1F0:0000000000040001 0064842C:0000600000040001 TObjCity_Season_HalloweenPumpkin +0050 => 8C18A50C:0000000000000001 8C19645C:0000000000000001 8C1B2824:0000000000000001 8C1D9330:0000000000000001 80183D30:0000000000040001 001CE3B0:0000000000040001 0064858C:0000600000040001 TObjCity_Season_21_21 +0051 => 8C18A744:0000000000000001 8C196700:0000000000000001 8C1B2AC8:0000000000000001 8C1D95D4:0000000000000001 80183B28:0000000000040001 001CE520:0000000000040001 006488AC:0000600000040001 TObjCity_Season_SonicAdv2 +0052 => 8C18A9F8:0000000000000001 8C1969B4:0000000000000001 8C1B2D7C:0000000000000001 8C1D9888:0000000000000001 80183860:0000000000040001 001CE700:0000000000040001 00648BF0:0000600000040001 TObjCity_Season_Board +0053 => 8C18AB8C:0000000000000001 8C196B48:0000000000000001 8C1B2F10:0000000000000001 8C1D9A1C:0000000000000001 80183694:0000000400040001 001CE800:0000000400040001 00648D84:0000600400040001 TObjCity_Season_FireWorkCtrl +0054 => 8C17A990:0000000000000001 8C185974:0000000000000001 8C19FA80:0000000000000001 8C1C2988:0000000000000001 80181CFC:0000000000000001 001CD430:0000000000000001 00646874:0000600000000001 TObjCityDoor_Lobby +0055 => 8C0341A8:0000000000000001 801A2C20:0000000000040001 002D3790:0000000000040001 007BAEC4:0000600000040001 TObjCityMainWarpChallenge +0056 => 801A2684:0000000000040000 002D3A00:0000000000040000 007BB320:0000400000040000 TODoorLabo +0057 => 802C6A7C:0000000000040001 801A0320:0000000000000001 001E6560:0000000000040001 00667AB4:0000600000040001 TObjTradeCollision +0058 => 80297390:0000000000000001 TObjDeckCollision +0080 => 8C069D80:0000000000000006 8C06C0BC:0000000000000006 8C0738BC:0000000000000006 8C082498:0000000000000006 8018F148:0000000000000006 001D9320:0000000000000006 00657358:0000400000000006 TObjDoor +0081 => 8C0696E4:000000000000003E 8C06BA24:000000000000003E 8C0731F8:000000000000003E 8C081DD4:000000000000003E 80190000:000000000078003E 001DB130:000000000078003E 00658A90:00004FF00078003E TObjDoorKey +0082 => 8C068D6C:000000000000003E 8C06B0AC:00000000000000FE 8C0728B0:00000000000000FE 8C080E18:00000000000300FE 80192E44:00000000000300FE 001DEA30:00000000000300FE 0065DA94:00004FF0000300FE TObjLazerFenceNorm +0083 => 8C0F43A0:000000000000003E 8C0F7590:00000000000000FE 8C105DE4:00000000000000FE 8C11DC40:00000000000300FE 801933F4:000000003FFB00FE 001DF280:000000003FFB00FE 0065E540:00004FF03FFB00FE TObjLazerFence4 +0084 => 8C0EB548:000000000000003E 8C0EE768:00000000000000FE 8C0FC7A0:00000000000000FE 8C113DA8:00000000000300FE 80193AE0:0000000C3FFB00FE 001DF8F0:0000000C3FFB00FE 0065EC80:00004FFC3FFB00FE TLazerFenceSw +0085 => 8C0693CC:0000000000000006 8C06B70C:0000000000000006 8C072F10:0000000000000006 8C081AEC:0000000000000006 80192220:000000000F800006 001DE200:000000000F800006 0065C7C8:00004E000F800006 TKomorebi +0086 => 8C06D2CC:0000000000000006 8C06F694:0000000000000006 8C076E7C:0000000000000006 8C086460:0000000000000006 8017F2A4:0000000000000006 001CA2D0:0000000000000006 00643598:00004E0000000006 TButterfly +0087 => 8C068AF0:0000000000000006 8C06AE30:0000000000000006 8C072634:0000000000000006 8C080B9C:0000000000000006 80194EE4:0000000000000006 001E0E40:0000000000000006 006604BC:0000400000000006 TMotorcycle +0088 => 8C06B9D0:00000000000007FE 8C06DDA0:00000000000000FE 8C0755A0:00000000000000FE 8C084684:00000000000000FE 801899F8:00000000B00000FE 800BB010:0000000000000002 001D2A40:00000000B00000FE 0064DE38:00004FF0B00000FE TObjContainerBase2 +0089 => 8C068304:0000000000000006 8C06A648:0000000000000006 8C071EA4:0000000000000006 8C080404:0000000000000006 8019A7E4:0000000000000006 001E6380:0000000000000006 00667860:0000400000000006 TObjTank +008A => 8C06DD70:0000000000000006 8C070138:0000000000000006 8C077910:0000000000000006 8C086EF4:0000000000000006 TObjBattery +008B => 8C06D090:0000000000000006 8C06F458:0000000000000406 8C076C40:0000000000000406 8C086224:00000000000307FE 80188180:0000000C3FFB07FE 001D1F80:0000000C3FFB07FE 0064D080:00004FFC3FFB07FE TObjComputer +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +008C => 8C06AF6C:0000000000000006 8C06D338:0000000000000006 8C074B48:0000000000000006 8C083790:000000000000000E 8018C514:000000000000000E 001D4DA0:000000000000000E 00651778:000040000000000E TObjContainerIdo +008D => 8C0CC748:00000000000007FE 8C0CFF24:00000000000027FE 8C0DCE20:00000000000027FE 8C0F2520:00000000000027FE 8015A274:00000000000027FE 001A6A90:00000000000027FE 0061532C:00004000000027FE TOCapsuleAncient01 +008E => 8C0E3128:00000000000000F6 8C0E6C00:00000000000000F6 8C0F482C:00000000000000F6 8C10BB98:00000000000000F6 80157EA8:00000000000000F6 001A4C10:00000000000000F6 00612F68:00004FF0000000F6 TOBarrierEnergy01 +008F => 8C0F1358:0000000000000006 8C0F4574:0000000000000006 8C102C8C:0000000000000006 8C11A6C8:0000000000000006 8019157C:0000000000000006 001DDA00:0000000000000006 0065BB7C:0000400000000006 TObjHashi +0090 => 8C106778:00000000000000C6 8C109DB0:00000000000000C6 8C118C88:00000000000000C6 8C130AF8:00000000000300C6 8016CB20:0000000C3FFB00C6 001B8680:0000000C3FFB00C6 0062B664:00004FFC3FFB00C6 TOKeyGenericSw +0091 => 8C06BEB0:00000000000007FE 8C06E27C:00000000000000FE 8C075A88:00000000000000FE 8C084B28:00000000000000FE 801895BC:00000000300000FE 001D2BB0:00000000300000FE 0064E468:00004FF0300000FE TObjContainerEnemy +0092 => 8C029AB8:00000000000007FE 8C02A82C:00000000000078FE 8C02E9DC:00000000000078FE 8C085994:00000000000078FE 80188928:00000000B00078FE 001D3250:00000000B00078FE 0064EDC8:00005E00B00078FE TObjContainerBase +0093 => 8C029AFC:00000000000007FE 8C02A870:00000000000000FE 8C02EA20:00000000000000FE 8C034230:00000000000000FE 801A2B3C:00000000300000FE 002D37C0:00000000300000FE 007BAF40:00004FF0300000FE TObjContainerAbeEnemy +0095 => 8C085108:00000000000000FE 80189074:00000000000000FE 001D2D20:00000000000000FE 0064E900:00004FF0000000FE TObjContainerNoItem +0096 => 8C0813DC:00000000000307FE 801928C0:0000000C3FFB07FE 001DED30:0000000C3FFB07FE 0065DEB8:00004FFC3FFB07FE TObjLazerFenceExtra +00C0 => 8C10A6F8:0000000000000038 8C10DCA0:0000000000000038 8C11D13C:0000000000000038 8C135558:0000000000030038 8016C2A4:0000000C3FFB0038 001B7F30:0000000C3FFB0038 0062AF04:00004FFC3FFB0038 TOKeyCave01 +00C1 => 8C1080D4:0000000000000038 8C10B698:0000000000000038 8C11A960:0000000000000038 8C132AA8:0000000000000038 801618C4:0000000000000038 001AC9F0:0000000000000038 0061D8CC:0000400000000038 TODoorCave01 +00C2 => 8C10A16C:0000000000000038 8C10D710:0000000000000038 8C11CBA0:0000000000000038 8C134FBC:0000000000000038 80161F4C:0000000000000038 001AD270:0000000000000038 0061DF78:0000400000000038 TODoorCave02 +00C3 => 8C100480:0000000000000038 8C103984:0000000000000038 8C1128CC:0000000000000038 8C129FA0:0000000000000038 80168848:0000000800780038 001B4420:0000000800780038 00626DC8:0000400800780038 TOHangceilingCave01* +00C4 => 8C0D8300:0000000000000030 8C0DBD28:0000000000000030 8C0E8E20:0000000000000030 8C0FF998:0000000000000030 801765B4:0000000000000030 001C1350:0000000000000030 006371AC:0000400000000030 TOSignCave01 +00C5 => 8C0D7F7C:0000000000000030 8C0DB9A4:0000000000000030 8C0E8A9C:0000000000000030 8C0FF614:0000000000000030 80176968:0000000000000030 001C1450:0000000000000030 006375AC:0000400000000030 TOSignCave02 +00C6 => 8C0D7B60:0000000000000030 8C0DB588:0000000000000030 8C0E8680:0000000000000030 8C0FF1F8:0000000000000030 80176DAC:0000000000000030 001C1750:0000000000000030 006377EC:0000400000000030 TOSignCave03 +00C7 => 8C0D8684:0000000000000030 8C0DC0AC:0000000000000030 8C0E91A4:0000000000000030 8C0FFD1C:0000000000000030 80156DF8:0000000000000030 001A4010:0000000000000030 006114B0:0000400000000030 TOAirconCave01 +00C8 => 8C0DF0D4:0000000000000030 8C0E2C3C:0000000000000030 8C0F0530:0000000000000030 8C10773C:0000000000000030 80157034:0000000000000030 001A4180:0000000000000030 00611754:0000400000000030 TOAirconCave02 +00C9 => 8C0D889C:0000000000000030 8C0DC2C4:0000000000000030 8C0E93BC:0000000000000030 8C0FFF34:0000000000000030 80173470:0000000000000030 001BDEB0:0000000000000030 0063274C:000041F000000030 TORevlightCave01 +00CB => 8C0F5938:0000000000000010 8C0F8D4C:0000000000000010 8C1075AC:0000000000000010 8C11F4E8:0000000000000010 8017318C:0000000000000010 001BDB80:0000000000000010 00632308:0000400000000010 TORainbowCave01 +00CC => 8C0F9894:0000000000000010 8C0FCD4C:0000000000000010 8C10B640:0000000000000010 8C1232B4:0000000000000010 8016E65C:0000000030000010 001B8D70:0000000030000010 0062C1B0:0000400030000010 TOKurage +00CD => 8C107D40:0000000000000010 8C10B304:0000000000000010 8C11A5C8:0000000000000010 8C132784:0000000000010010 801642F4:0000000000610010 001B1C00:0000000000610010 0062346C:00004E0000610010 TODragonflyCave01 +00CE => 8C16DC48:0000000000000038 8C175C84:0000000000000038 8C18CF50:0000000000000038 8C1AF0FC:0000000000000038 8016259C:0000000000000038 001AD750:0000000000000038 0061E574:0000400000000038 TODoorCave03 +00CF => 8C16F428:00000000000000F8 8C177474:00000000000000F8 8C18E8D4:00000000000000F8 8C1B0AE0:00000000000000F8 80158638:00000008000000F8 001A53B0:00000008000000F8 006136E0:00004008000000F8 TOBind +00D0 => 8C177DE8:0000000000000020 8C182D60:0000000000000020 8C19CDD0:0000000000000020 8C1BFC84:0000000000000020 80159F68:0000000000000020 001A66B0:0000000000000020 00614FB4:0000400000000020 TOCakeshopCave01 +00D1 => 8C183E34:0000000000000008 8C18EEBC:0000000000000008 8C1A9F98:0000000000000008 8C1CE8D0:0000000000000008 80174A44:0000000000000008 001BE6E0:0000000000000008 006337B8:0000400000000008 TORockCaveS01 +00D2 => 8C183F98:0000000000000008 8C18F020:0000000000000008 8C1AA0FC:0000000000000008 8C1CEA34:0000000000000008 801748E4:0000000000000008 001BE820:0000000000000008 00633CD0:0000400000000008 TORockCaveM01 +00D3 => 8C184100:0000000000000008 8C18F188:0000000000000008 8C1AA264:0000000000000008 8C1CEB9C:0000000000000008 80174784:0000000000000008 001BE960:0000000000000008 00634190:00004FF000000008 TORockCaveL01 +00D4 => 8C184268:0000000000000010 8C18F2F0:0000000000000010 8C1AA3CC:0000000000000010 8C1CED04:0000000000000010 80174628:0000000000000010 001BEAA0:0000000000000010 00633920:0000000000000010 TORockCaveS02 +00D5 => 8C1843CC:0000000000000010 8C18F454:0000000000000010 8C1AA530:0000000000000010 8C1CEE68:0000000000000010 801744C8:0000000000000010 001BEBE0:0000000000000010 00633E00:0000000000000010 TORockCaveM02 +00D6 => 8C184534:0000000000000010 8C18F5BC:0000000000000010 8C1AA698:0000000000000010 8C1CEFD0:0000000000000010 80174368:0000000000000010 001BED20:0000000000000010 006342C0:0000000000000010 TORockCaveL02 +00D7 => 8C1846A8:0000000000000010 8C18F730:0000000000000010 8C1AA80C:0000000000000010 8C1CF144:0000000000000010 8017420C:0000000000000010 001BEE60:0000000000000010 00633A50:0000000000000010 TORockCaveSS02 +00D8 => 8C184830:0000000000000010 8C18F8B8:0000000000000010 8C1AA994:0000000000000010 8C1CF2CC:0000000000000010 801740AC:0000000000000010 001BEFA0:0000000000000010 00633F30:0000000000000010 TORockCaveSM02 +00D9 => 8C1849BC:0000000000000010 8C18FA44:0000000000000010 8C1AAB20:0000000000000010 8C1CF458:0000000000000010 80173F4C:0000000000000010 001BF0E0:0000000000000010 006343F0:0000000000000010 TORockCaveSL02 +00DA => 8C184B38:0000000000000020 8C18FBC0:0000000000000020 8C1AAC9C:0000000000000020 8C1CF5D4:0000000000000020 80173DF0:0000000000000020 001BF220:0000000000000020 00633BA0:0000000000000020 TORockCaveS03 +00DB => 8C184C9C:0000000000000020 8C18FD24:0000000000000020 8C1AAE00:0000000000000020 8C1CF738:0000000000000020 80173C90:0000000000000020 001BF360:0000000000000020 00634060:0000000000000020 TORockCaveM03 +00DC => 8C184E04:0000000000000020 8C18FE8C:0000000000000020 8C1AAF68:0000000000000020 8C1CF8A0:0000000000000020 80173B30:0000000000000020 001BF4A0:0000000000000020 00634520:0000000000000020 TORockCaveL03 +00DE => 8C263648:00000000000307FE 80165D1C:0000000C3FFB07FE 001B2300:0000000C3FFB07FE 006241D4:00004FFC3FFB07FE TODummyKeyCave01 +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +00DF => 8C1CFB54:0000000000000008 801739AC:0000000000000008 001BF610:0000000000000008 00634650:0000400000000008 TORockCaveBL01 +00E0 => 8C1CFD40:0000000000000010 80173828:0000000000000010 001BF780:0000000000000010 006347D8:0000400000000010 TORockCaveBL02 +00E1 => 8C1CFF2C:0000000000000020 801736A4:0000000000000020 001BF8F0:0000000000000020 0063492C:0000400000000020 TORockCaveBL03 +0100 => 8C132534:00000000000000C0 8C1354F4:00000000000000C0 8C146C64:00000000000000C0 8C1623BC:00000000000000C0 80162E38:00000000000000C0 001ADD30:00000000000000C0 0061EE48:00004000000000C0 TODoorMachine01 +0101 => 8C132D5C:00000000000000C0 8C135D74:00000000000000C0 8C1474F0:00000000000000C0 8C162C48:00000000000300C6 8016D538:00000000007B00C6 001B8A40:00000000007B00C6 0062BE90:00004FF0007B00C6 TOKeyMachine01 +0102 => 8C16E184:00000000000000C0 8C1761D8:00000000000000C0 8C18D4A8:00000000000000C0 8C1AF6B4:00000000000000C0 80163440:00000000000000C0 001AE600:00000000000000C0 0061F484:00000000000000C0 TODoorMachine02 +0102 => 00677A80:00004E0000000000 __EP4_TEST_DOOR__ +0103 => 8C17774C:00000000000000C0 8C1826C4:00000000000000C0 8C19C734:00000000000000C0 8C1BF5DC:00000000000000C0 8015A588:00000008000000C0 001A70D0:00000008000000C0 00615A9C:00004008000000C0 TOCapsuleMachine01 +0104 => 8C177A20:00000000000000C0 8C182998:00000000000000C0 8C19CA08:00000000000000C0 8C1BF8B0:00000000000000C0 8015B37C:00000008000000C0 001A79E0:00000008000000C0 00617204:00004008000000C0 TOComputerMachine01 +0105 => 8C178220:00000000000000C0 8C183198:00000000000000C0 8C19D208:00000000000000C0 8C1C00BC:00000000000000C0 801722A4:00000008000000C0 001BCD90:00000008000000C0 006314EC:00004008000000C0 TOMonitorMachine01 +0106 => 8C17BFE4:00000000000000C0 8C186FC8:00000000000000C0 8C1A12B8:00000000000000C0 8C1C4334:00000000000000C0 80165294:00000000000000C0 001B1E80:00000000000000C0 00623D38:00004000000000C0 TODragonflyMachine01 +0107 => 8C178974:00000000000000C0 8C18387C:00000000000000C0 8C19D964:00000000000000C0 8C1C0800:00000000000000C0 8016E99C:00000000000000C0 001B9B00:00000000000000C0 0062D244:00004000000000C0 TOLightMachine01 +0108 => 8C178EDC:00000000000000C0 8C183DE8:00000000000000C0 8C19DED0:00000000000000C0 8C1C0D68:00000000000000C0 80166144:00000000000000C0 001B2DD0:00000000000000C0 00624FD4:00004000000000C0 TOExplosiveMachine01 +0109 => 8C179050:00000000000000C0 8C183F5C:00000000000000C0 8C19E044:00000000000000C0 8C1C0EDC:00000000000000C0 80165FD4:00000000000000C0 001B2EC0:00000000000000C0 006251A0:00004000000000C0 TOExplosiveMachine02 +010A => 8C1791CC:00000000000000C0 8C1840D8:00000000000000C0 8C19E1C0:00000000000000C0 8C1C1058:00000000000000C0 80165E64:00000000000000C0 001B2FC0:00000000000000C0 0062536C:00004000000000C0 TOExplosiveMachine03 +010B => 8C17E0D0:00000000000000C0 8C18A1B8:00000000000000C0 8C1A4460:00000000000000C0 8C1C71CC:00000000000000C0 80177190:00000000000000C0 001C1B30:00000000000000C0 00637EAC:00004000000000C0 TOSparkMachine01 +010C => 8C17E3BC:00000000000000C0 8C18A4A4:00000000000000C0 8C1A474C:00000000000000C0 8C1C74B8:00000000000000C0 80168DF4:00000000000000C0 001B53A0:00000000000000C0 006282D8:00004000000000C0 TOHangerMachine01 +0130 => 8C16E6B0:0000000000002000 8C1766FC:0000000000002000 8C18DA44:0000000000002000 8C1AFC50:0000000000002000 801639E8:0000000000002000 001B0BD0:0000000000002000 006225CC:0000400000002000 TODoorVoShip +0140 => 8C12882C:0000000000000700 8C12C690:0000000000000700 8C13D05C:0000000000000700 8C158348:0000000000000700 8017C9F4:0000000000000700 001C8F90:0000000000000700 00640D08:0000400000000700 TObjGoalWarpAncient +0141 => 8C1283B4:0000000000000700 8C12C218:0000000000000700 8C13CBE4:0000000000000700 8C157EA8:0000000000000700 8017CDB8:0000000000000700 001C8C40:0000000000000700 00640A04:0000400000000700 TObjMapWarpAncient +0142 => 8C0EBBC0:0000000000000700 8C0EEDE0:0000000000000700 8C0FCE18:0000000000000700 8C114420:0000000000000700 8016B3CC:0000000000000700 001B7530:0000000000000700 0062A4A4:0000400000000700 TOKeyAncient02 +0143 => 8C10B514:0000000000000700 8C10EA74:0000000000000700 8C11E2E4:0000000000000700 8C13679C:0000000000000700 8016BAB4:0000000000000700 001B7970:0000000000000700 0062A9A4:0000400000000700 TOKeyAncient03 +0144 => 8C0CA308:0000000000000100 8C0CDA04:0000000000000100 8C0DA588:0000000000000100 8C0EF7B4:0000000000000100 8015DECC:0000000000000100 001A9BA0:0000000000000100 0061A0D4:0000400000000100 TODoorAncient01 +0145 => 8C0CA764:0000000000000400 8C0CDE58:0000000000000400 8C0DA9E0:0000000000000400 8C0EFC0C:0000000000000400 8015E378:0000000000000400 001AA000:0000000000000400 0061A534:0000400000000400 TODoorAncient03 +0146 => 8C0CABC0:0000000000000200 8C0CE2AC:0000000000000200 8C0DAE38:0000000000000200 8C0F0064:0000000000000200 8015E824:0000000000000200 001AA460:0000000000000200 0061A994:0000400000000200 TODoorAncient04 +0147 => 8C0F55C8:0000000000000100 8C0F89DC:0000000000000100 8C107238:0000000000000100 8C11F13C:0000000000000100 8015ECE4:0000000000000100 001AA940:0000000000000100 0061AE54:0000400000000100 TODoorAncient05 +0148 => 8C0F51D0:0000000000000200 8C0F8530:0000000000000200 8C106D88:0000000000000200 8C11EC54:0000000000000200 8015F24C:0000000000000200 001AAE10:0000000000000200 0061B4B4:0000400000000200 TODoorAncient06 +0149 => 8C0F4DC8:0000000000000400 8C0F8070:0000000000000400 8C1068C4:0000000000000400 8C11E758:0000000000000400 8015F7C4:0000000000000400 001AB2E0:0000000000000400 0061BB14:0000400000000400 TODoorAncient07 +014A => 8C106B8C:0000000000000700 8C10A24C:0000000000000700 8C119128:0000000000000700 8C130F98:0000000000000700 801603E0:0000000000000700 001AB750:0000000000000700 0061C674:0000400000000700 TODoorAncient08 +014B => 8C10ACDC:0000000000000700 8C10E298:0000000000000700 8C11D724:0000000000000700 8C135BCC:0000000000000700 80160F10:0000000000000700 001AC150:0000000000000700 0061D034:0000400000000700 TODoorAncient09 +014C => 8C12D6C8:0000000000000700 8C1306A0:0000000000000700 8C141D9C:0000000000000700 8C15D24C:0000000000000700 80175B24:0000000000000700 001C0A90:0000000000000700 006368F0:0000400000000700 TOSensorAncient01 +014D => 8C0EC178:0000000000000700 8C0EF398:0000000000000700 8C0FD3D0:0000000000000700 8C1149D8:0000000000000700 8016AD90:0000000000000700 001B7160:0000000000000700 00629ED0:0000400000000700 TOKeyAncient01 +014E => 8C0CCEF8:0000000000000700 8C0D0624:0000000000000700 8C0DD52C:0000000000000700 8C0F2C38:0000000000000700 80166A4C:0000000000000700 001B34C0:0000000000000700 006259EC:00004FF000000700 TOFenceAncient01 +014F => 8C0CD248:0000000000000700 8C0D0974:0000000000000700 8C0DD87C:0000000000000700 8C0F2F88:0000000000000700 80166E2C:0000000000000700 001B37D0:0000000000000700 00625DD4:00004FF000000700 TOFenceAncient02 +0150 => 8C0CD598:0000000000000700 8C0D0CC4:0000000000000700 8C0DDBCC:0000000000000700 8C0F32D8:0000000000000700 801671D0:0000000000000700 001B3B20:0000000000000700 006261CC:0000400000000700 TOFenceAncient03 +0151 => 8C0CD930:0000000000000700 8C0D105C:0000000000000700 8C0DDF64:0000000000000700 8C0F3670:0000000000000700 80167574:0000000000000700 001B3EF0:0000000000000700 006265BC:0000400000000700 TOFenceAncient04 +0152 => 8C0FFAB4:0000000000000700 8C102FB4:0000000000000700 8C111E0C:0000000000000700 8C1294E4:0000000000000700 8018B9B0:000000000F800700 001D38E0:000000000F800700 00650324:00004E000F800700 TContainerAncient01 +0153 => 8C114CE4:0000000000000700 8C118418:0000000000000700 8C128464:0000000000000700 8C141978:0000000000000700 80179C90:0000000000780700 001C3810:0000000000780700 0063A518:0000400000780700 TOTrapAncient01 +0154 => 8C11FE7C:0000000000000700 8C1237AC:0000000000000700 8C133A50:0000000000000700 8C14D208:0000000000000700 8017B348:0000000000000700 001C4680:0000000000000700 0063BFD4:0000400000000700 TOTrapAncient02 +0155 => 8C0CBE58:0000000000000700 8C0CF54C:0000000000000700 8C0DC40C:0000000000000700 8C0F1A80:0000000000000700 801725B4:0000000000000700 001BD2D0:0000000000000700 006318C4:0000400000000700 TOMonumentAncient01 +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +0156 => 8C0CC2C0:0000000000000094 8C0CF9B4:0000000000000094 8C0DC86C:0000000000000094 8C0F1F28:0000000000000094 80172BAC:0000000000000094 001BD630:0000000000000094 00631E38:0000400000000094 TOMonumentAncient02 +0159 => 8C0CB3EC:0000000000000700 8C0CEACC:0000000000000700 8C0DB63C:0000000000000700 8C0F08A0:0000000000000700 8017DA9C:0000000000000700 001C9510:0000000000000700 00641574:0000400000000700 TOWreckAncient01 +015A => 8C0CB7C8:0000000000000700 8C0CEEA8:0000000000000700 8C0DBCDC:0000000000000700 8C0F1308:0000000000000700 8017DDF0:0000000000000700 001C9CA0:0000000000000700 006422C0:0000400000000700 TOWreckAncient02 +015B => 8C0CB874:0000000000000700 8C0CEF54:0000000000000700 8C0DBDA4:0000000000000700 8C0F13D0:0000000000000700 8017DF10:0000000000000700 001C9D50:0000000000000700 00642430:0000400000000700 TOWreckAncient03 +015C => 8C0CB4B8:0000000000000700 8C0CEB98:0000000000000700 8C0DB790:0000000000000700 8C0F09F4:0000000000000700 8017D978:0000000000000700 001C95C0:0000000000000700 006416C8:0000400000000700 TOWreckAncient04 +015D => 8C0CB584:0000000000000700 8C0CEC64:0000000000000700 8C0DB8EC:0000000000000700 8C0F0B50:0000000000000700 8017D854:0000000000000700 001C9670:0000000000000700 0064181C:0000400000000700 TOWreckAncient05 +015E => 8C0CB650:0000000000000700 8C0CED30:0000000000000700 8C0DBA44:0000000000000700 8C0F0CA8:0000000000000700 8017D730:0000000000000700 001C9720:0000000000000700 00641970:0000400000000700 TOWreckAncient06 +015F => 8C0CB71C:0000000000000700 8C0CEDFC:0000000000000700 8C0DBBA0:0000000000000700 8C0F0E04:0000000000000700 8017D60C:0000000000000700 001C97D0:0000000000000700 00641AC4:0000400000000700 TOWreckAncient07 +0160 => 8C10BFAC:0000000000000700 8C10F504:0000000000000700 8C11ED40:0000000000000700 8C137204:0000000000000700 80153768:0000000030600700 00171900:0000000030600700 005C2678:00004FF030600700 TObjFogCollisionPoison +0160 => 8C10BFAC:0000000000000700 8C02A9A4:0000000000002000 8C02EB98:0000000000002000 8C034374:0000000000002000 801A29C8:0000000000002000 002D3890:0000000000002000 007BAFBC:0000400000002000 TObjWarpBoss03 +0161 => 8C029B40:0000000000000700 8C02A8B4:0000000000000700 8C02EAA8:0000000000000700 8C1E493C:0000000000030700 8015BFE8:00000003007B0700 001A8290:00000003007B0700 00617BA4:00004003007B0700 TOContainerAncientItemCommon +0162 => 8C029B7C:0000000000000700 8C02A8F0:0000000000000700 8C02EAE4:0000000000000700 8C0342FC:0000000000030700 801A2A14:00000003007B0700 002D37F0:00000003007B0700 007BB5F0:00004003007B0700 TOContainerAncientItemRare +0163 => 8C029BB8:0000000000000700 8C02A92C:0000000000000700 8C02EB20:0000000000000700 8C1E535C:0000000000030700 8015B69C:00000000007B0700 001A8810:00000000007B0700 006182F0:00004000007B0700 TOContainerAncientEnemyCommon +0164 => 8C029BF4:0000000000000700 8C02A968:0000000000000700 8C02EB5C:0000000000000700 8C034338:0000000000030700 801A2A5C:00000000007B0700 002D3840:00000000007B0700 007BB578:00004000007B0700 TOContainerAncientEnemyRare +0165 => 8C1E4C78:0000000000030700 8015BD78:00000000007B0700 001A8400:00000000007B0700 00617DA4:00004000007B0700 TOContainerAncientItemNone +0166 => 8C0F11E4:0000000000000700 8017D1DC:0000000000000700 001C9BF0:0000000000000700 00642028:0000400000000700 TOWreckAncientBrakable05 +0167 => 8C14DAB8:00000000000007C0 8017A96C:0000000C3FF807C0 001C51E0:0000000C3FF807C0 0063B4E8:0000400C3FF807C0 TOTrapAncient02R +0170 => 8C18BA60:0000000000004000 8C197A24:0000000000004000 8C1B4074:0000000000004000 8C1DAB6C:0000000000014000 8015982C:0000000000614000 001A58F0:0000000000614000 00613F90:0000400000614000 TOBoss4Bird +0171 => 8C18BEAC:0000000000004000 8C197E70:0000000000004000 8C1B44C0:0000000000004000 8C1DAFB8:0000000000004000 801592E0:0000000000004000 001A5D30:0000000000004000 00614318:0000400000004000 TOBoss4Tower +0172 => 8C18C3F4:0000000000004000 8C1983B8:0000000000004000 8C1B4A08:0000000000004000 8C1DB500:0000000000004000 80158D90:0000000000004000 001A6180:0000000000004000 00614840:0000400000004000 TOBoss4Rock +0173 => 8C18C988:0000000000004000 8C19894C:0000000000004000 8C1B4F9C:0000000000004000 8C1DBA94:0000000000004000 TOSoulDF +0174 => 8C18EB54:0000000000004000 8C19AD14:0000000000004000 8C1B78AC:0000000000004000 8C1DE660:0000000000004000 TOButterflyDF +0180 => 8C029C30:0000000000008000 8C02A9E8:0000000000008000 8C02EC20:0000000000008000 8C0343FC:0000000000008000 801A27B4:0000000000008000 800C5E4C:0000000000008000 002D38E0:0000000000008000 007BB038:0000400000008000 TObjInfoCol +0181 => 8C029C74:0000000000008000 8C02AA2C:0000000000008000 8C02EC64:0000000000008000 8C034440:0000000000008000 801A2800:0000000000008000 800C5E98:0000000000008000 002D3910:0000000000008000 007BB0B4:0000400000008000 TObjWarpLobby +0182 => 80350B84:0000000000008000 801D0C44:0000000000008000 001A2760:0000000000008000 00672254:0000400000008000 TObjLobbyMain +0183 => 802BF420:0000000000008000 8019AD18:0000000000008002 001D9190:0000000000008000 00655624:0000400000008000 __LOBBY_PIGEON__ +0184 => 8034FA8C:0000000000008000 801CFF08:0000000000008002 001A1440:0000000000008000 00670518:0000400000008000 TObjButterflyLobby +0185 => 8034EB9C:0000000000008000 801CF014:0000000000008002 001A31E0:0000000000008000 00672B7C:0000400000008000 TObjRainbowLobby +0186 => 80351A18:0000000000008000 801D167C:0000000000008000 001A2160:0000000000008000 00670BD0:0000400000008000 TObjKabochaLobby +0187 => 80357CD8:0000000000008000 801D4270:0000000000008000 001A33B0:0000000000008000 00672EEC:0000400000008000 TObjStendGlassLobby +0188 => 80359DF4:0000000000008000 801D4D78:0000000000008000 001A1F10:0000000000008000 00670894:0000400000008000 TObjCurtainLobby +0189 => 8035A1E0:0000000000008000 801D5168:0000000000008000 001A3BA0:0000000000008000 00673A64:0000400000008000 TObjWeddingLobby +018A => 80362D44:0000000000008000 801D73B4:0000000000008000 001A39F0:0000000000008000 00673750:0000400000008000 TObjTreeLobby +018B => 80368118:0000000000008000 801D858C:0000000000008000 001A3740:0000000000008000 00673284:0000400000008000 TObjSuisouLobby +018C => 80367DC0:0000000000008000 801D8234:0000000000008000 001A2DC0:0000000000008000 006726B0:0000400000008000 TObjParticleLobby +018D => 802C07E4:0000000000008000 TObjLobbyTable +018E => 8030D8A8:0000000000008000 TObjJukeBox +0190 => 8C2555E0:0000000000010000 8017FAC0:0000000000610000 001CAAD0:0000000000610000 00643D60:0000400000610000 TObjCamera +0191 => 8C255D10:0000000000010000 8019AF20:0000000800610000 001E6770:0000000800610000 00667EC8:0000400800610000 TObjTuitate +0192 => 8C2563B4:0000000000010000 8018E02C:0000000000610000 001D6480:0000000000610000 0065334C:0000400000610000 TObjDoaEx01 +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +0193 => 8C256050:0000000000010000 8019AB9C:0000000800610000 001E6AE0:0000000800610000 00668194:0000400800610000 TObjBigTuitate +01A0 => 8C256C5C:0000000000020000 80164084:00000000001A0000 001B1130:00000000001A0000 00622C98:00004000001A0000 TODoorVS2Door01 +01A1 => 8C257644:0000000000020000 8017C520:00000000001A0000 001C8010:00000000001A0000 0063F6D4:00004000001A0000 TOVS2Wreck01 +01A2 => 8C257718:0000000000020000 8017C438:00000000001A0000 001C8080:00000000001A0000 0063F830:00004000001A0000 TOVS2Wreck02 +01A3 => 8C2577EC:0000000000020000 8017C350:00000000001A0000 001C80F0:00000000001A0000 0063F98C:00004000001A0000 TOVS2Wreck03 +01A4 => 8C2578C0:0000000000020000 8017C268:00000000001A0000 001C8160:00000000001A0000 0063FAE8:00004000001A0000 TOVS2Wreck04 +01A5 => 8C257994:0000000000020000 8017C180:00000000001A0000 001C81D0:00000000001A0000 0063FC44:00004000001A0000 TOVS2Wreck05 +01A6 => 8C257A68:0000000000020000 8017C098:00000000001A0000 001C8240:00000000001A0000 0063FDA0:00004000001A0000 TOVS2Wreck06 +01A7 => 8C257C74:0000000000020000 8017BEC8:00000000001A0000 001C8430:00000000001A0000 0063FEFC:00004000001A0000 TOVS2Wall01 +01A8 => 8C25540C:0000000000020000 80085794:00000001001A0000 000DEDA0:00000001001A0000 0050821C:000041F1001A0000 __LENS_FLARE_SWITCH_COLLISION__ +01A9 => 8C11A8CC:0000000000020000 80191388:00000000001A0000 001DDBC0:00000000001A0000 0065BDAC:00004000001A0000 TObjHashiVersus1 +01AA => 8C11AAF4:0000000000020000 8019118C:00000000001A0000 001DDD90:00000000001A0000 0065BF18:00004000001A0000 TObjHashiVersus2 +01AB => 801A271C:0000000000180000 002D3940:0000000000180000 007BB130:0000400000180000 TODoorFourLightRuins +01C0 => 801A2768:0000000000600000 002D3970:0000000000600000 007BB1AC:0000000000600000 TODoorFourLightSpace +0200 => 8018D2CC:0000000C4F800000 001D5930:0000000C4F800000 00652140:000041FC4F800000 TObjContainerJung +0201 => 8019FF00:0000000CFF800000 001EB0C0:0000000CFF800000 0066D4C4:0000400CFF800000 TObjWarpJung +0202 => 8018F2DC:0000000C0F800000 001DA6A0:0000000C0F800000 00657A04:0000400C0F800000 TObjDoorJung +0203 => 8018CE58:0000000C4F800000 001D5DA0:0000000C4F800000 00652698:0000400C4F800000 TObjContainerJungEx +0203 => 0064EDC8:000001F000000000 TObjContainerBase(0203) +0204 => 80299E20:0000000000800000 001DAE60:0000000000800000 00658218:0000400000800000 TODoorJungleMain +0205 => 8029BA64:0000000C0F800000 001DBB80:0000000C0F800000 00658EAC:0000400C0F800000 TOKeyJungleMain +0206 => 8029B3F8:000000040F800000 001BFC10:000000040F800000 00635040:000040040F800000 TORockJungleS01 +0207 => 8029AFAC:000000040F800000 001C00D0:000000040F800000 0063540C:000040040F800000 TORockJungleM01 +0208 => 8029AC38:000000040F800000 001C04A0:000000040F800000 006358B8:000040040F800000 TORockJungleL01 +0209 => 8029B764:000000040F800000 001B40E0:000000040F800000 006269A4:000040040F800000 TOGrassJungle +020A => 8019FA1C:0000000C0F800000 001EB560:0000000C0F800000 0066D840:0000400C0F800000 TObjWarpJungMain +020B => 802A8750:0000000040800000 000D8850:0000000040800000 004FFF04:0000400040800000 TBGLightningCtrl +020C => 802C0C64:0000000C0B000000 001D7AB0:0000000C0B000000 00654228:00004E0C0B000000 __WHITE_BIRD__ +020D => 802C05BC:000000080B000000 001D8130:000000080B000000 006548E4:000040080B000000 __ORANGE_BIRD__ +020E => 8018CCF8:0000000C0F800000 001D5F00:0000000C0F800000 00652DB8:0000400C0F800000 TObjContainerJungEnemy +020F => 802C7748:0000000C3F800000 001C6440:0000000C3F800000 0063D688:0000400C3F800000 TOTrapChainSawDamage +0210 => 802C7234:0000000C3F800000 001C67B0:0000000C3F800000 0063D134:0000400C3F800000 TOTrapChainSawKey +0211 => 802A8D98:0000000003800000 80198138:0000000000000002 001BA1A0:0000000003800000 0062DB1C:00004E0003800000 TOBiwaMushi +0212 => 802BFDE8:000000080F800000 8019B6E0:0000000000000002 001D8890:000000080F800000 00654F04:000040080F800000 __SEAGULL__ +0213 => 802FD478:000000040F000000 001B6420:000000040F000000 006294FC:00004E040F000000 TOJungleDesign +0220 => 8029D04C:0000000439008000 8019147C:0000000000008002 001DC940:0000000439008000 0065B068:0000400439008000 TObjFish +0221 => 801A25EC:0000000030000000 002D39A0:0000000030000000 007BB228:0000400030000000 TODoorFourLightSeabed +0222 => 801A2638:0000000030000000 002D39D0:0000000030000000 007BB2A4:0000400030000000 TODoorFourLightSeabedU +0223 => 802A5290:0000000830000000 001E3850:0000000830000000 00664328:0000400830000000 TObjSeabedSuiso_CH +0224 => 802A507C:0000000030000000 001E3B20:0000000030000000 006644EC:0000400030000000 TObjSeabedSuisoBrakable +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +0225 => 802A9378:0000000030000000 001B9DE0:0000000030000000 0062D674:0000400030000000 TOMekaFish00 +0226 => 802A9088:0000000030000000 001B9FC0:0000000030000000 0062D8C8:0000400030000000 TOMekaFish01 +0227 => 802C1378:0000000030000000 001D7390:0000000030000000 00653B10:0000400030000000 __DOLPHIN__ +0228 => 802C9154:0000000C3F800000 001C70B0:0000000C3F800000 0063EE10:0000400C3F800000 TOTrapSeabed01 +0229 => 802ADD40:0000000FFFF80000 001A6E90:0000000FFFF80000 006156E0:0000400FFFF80000 TOCapsuleLabo +0240 => 801954E4:0000000040000000 001E0F90:0000000040000000 00660938:0000400040000000 TObjParticle +0280 => 802EF620:0000000100000000 000A6FF0:0000000100000000 004BE0F0:0000400100000000 __BARBA_RAY_TELEPORTER__ +02A0 => 80309D5C:0000000200000000 000B4B40:0000000200000000 004D0EF8:0000400200000000 TObjLiveCamera +02B0 => 8018ADF8:0000000C0F800700 001D42B0:0000000C0F800700 00650DF0:00004E0C0F800700 TContainerAncient01R +02B1 => 803631D4:0000000000040000 801D7848:0000000000000001 001DE7D0:0000000000040000 0065CAE8:0000400000040000 TObjLaboDesignBase(0) +02B2 => 80363184:0000000000040000 801D77F8:0000000000000001 001DE800:0000000000040000 0065CC94:0000400000040000 TObjLaboDesignBase(1) +02B3 => 80363134:0000000000040000 801D77A8:0000000000000001 001DE830:0000000000040000 0065CE40:0000400000040000 TObjLaboDesignBase(2) +02B4 => 803630E4:0000000000040000 801D7758:0000000000000001 001DE860:0000000000040000 0065CFEC:0000400000040000 TObjLaboDesignBase(3) +02B5 => 80363094:0000000000040000 801D7708:0000000000000001 001DE890:0000000000040000 0065D198:0000400000040000 TObjLaboDesignBase(4) +02B6 => 80363044:0000000000040000 801D76B8:0000000000000001 001DE8C0:0000000000040000 0065D344:0000400000040000 TObjLaboDesignBase(5) +02B7 => 80187C10:0000000000040001 TObjGbAdvance +02B8 => 80195824:0000000FFFFC7FFF 800BE0E8:0000000000000001 001E2360:0000000FFFFC7FFF 00662C40:00006FFFFFFC7FFF TObjQuestColALock2 +02B9 => 801A297C:0000000C3FFF78FF 800C5FC8:0000000000000001 002D3730:0000000C3FFF78FF 007BADCC:00007FFC3FFF78FF TObjMapForceWarp +02BA => 80195680:0000000FFFFC7FFF 800BDF18:0000000000000001 001E2470:0000000FFFFC7FFF 00662EF0:00006FFFFFFC7FFF TObjQuestCol2 +02BB => 801A26D0:0000000000040000 002D3A30:0000000000040000 007BB39C:0000400000040000 TODoorLaboNormal +02BC => 8019AFF4:0000000080000000 001E9270:0000000080000000 0066A3FC:0000400080000000 TObjAreaWarpEndingJung +02BD => 80185430:0000000000040000 001D0630:0000000000040000 0064B3AC:0000400000040000 TObjLaboMapWarp +02D0 => 8026C79C:0000000000000002 TObjKazariCard +02D1 => 800C5F30:0000000000000001 TObj_FloatingCardMaterial_Dark +02D2 => 800C5F7C:0000000000000001 TObj_FloatingCardMaterial_Hero +02D3 => 800B9528:0000000000000001 TObjCardCityMapWarp(0) +02D4 => 800B8C40:0000000000000001 TObjCardCityDoor(0) +02D5 => 800B8BF0:0000000000000001 TObjCardCityDoor(1) +02D6 => 80278E08:0000000000000002 TObjKazariGeyserMizu +02D7 => 802BCE80:0000000000000002 TObjSetCardColi +02D8 => 800B8BA0:0000000000000001 TObjCardCityDoor(2) +02D9 => 800B94D8:0000000000000001 TObjCardCityMapWarp(1) +02DA => 802DFD18:0000000000000001 TOFlyMekaHero +02DB => 802DFAAC:0000000000000001 TOFlyMekaDark +02DC => 800B884C:0000000000000001 TObjCardCityDoor_Closed(0) +02DD => 800B87FC:0000000000000001 TObjCardCityDoor_Closed(1) +02DE => 800B87AC:0000000000000001 TObjCardCityDoor_Closed(2) +02DF => 800B8B50:0000000000000001 TObjCardCityDoor(3) +02E0 => 800B8B00:0000000000000001 TObjCardCityDoor(4) +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +02E1 => 800B875C:0000000000000001 TObjCardCityDoor_Closed(3) +02E2 => 800B870C:0000000000000001 TObjCardCityDoor_Closed(4) +02E3 => 800B9488:0000000000000001 TObjCardCityMapWarp(2) +02E4 => 80309608:0000000000008001 TObjSinBoardCard +02E5 => 8030DE8C:0000000000000001 TObjCityMoji +02E6 => 8030DB4C:0000000000000001 TObjCityWarpOff +02E7 => 80310BEC:0000000000000001 TObjFlyCom +02E8 => 8019A638:0000000000000001 __UNKNOWN_02E8__ +0300 => 00661158:00005FF000000000 __EP4_LIGHT__ +0301 => 0067612C:00004FF000000000 __WILDS_CRATER_CACTUS__ +0302 => 00675748:00004FF000000000 __WILDS_CRATER_BROWN_ROCK__ +0303 => 00675BF8:00004FF000000000 __WILDS_CRATER_BROWN_ROCK_DESTRUCTIBLE__ +0340 => 00673FB8:0000400000000000 __UNKNOWN_0340__ +0341 => 00674118:0000400000000000 __UNKNOWN_0341__ +0380 => 0067927C:00004E0000000000 __POISON_PLANT__ +0381 => 00679678:00004E0000000000 __UNKNOWN_0381__ +0382 => 0067A264:00004E0000000000 __UNKNOWN_0382__ +0383 => 006781EC:00004E0000000000 __DESERT_OOZE_PLANT__ +0385 => 006785C8:00004E0000000000 __UNKNOWN_0385__ +0386 => 00677DE4:00004FF000000000 __WILDS_CRATER_BLACK_ROCKS__ +0387 => 006119E4:00004E0000000000 __UNKNOWN_0387__ +0388 => 00635D1C:00004E0000000000 __UNKNOWN_0388__ +0389 => 0063810C:0000400000000000 __GAME_FLAG_SET_CLEAR_ZONE__ +038A => 00619604:0000400000000000 __HP_DRAIN_ZONE__ +038B => 00679F58:00004E0000000000 __FALLING_STALACTITE__ +038C => 0067A548:00004E0000000000 __DESERT_PLANT_SOLID__ +038D => 00677610:00004E0000000000 __DESERT_CRYSTALS_BOX__ +038E => 00677A80:0000400000000000 __EP4_TEST_DOOR__ +038F => 00676ADC:00004E0000000000 __BEEHIVE__ +0390 => 00678C00:00004E0000000000 __EP4_TEST_PARTICLE__ +0391 => 005C2820:00004E0000000000 __HEAT__ +03C0 => 0076FB74:0000500000000000 __EP4_BOSS_EGG__ +03C1 => 00770028:0000500000000000 __EP4_BOSS_ROCK_SPAWNER__ ENEMIES -./newserv address-translator files/pso-executables 59NL "parse-dat-enemy-constructor-tables 59NL:009FBA60:2F 3OE1:804948C8:24 3SE0:80436900:24 1OJ1:8C241A28:10:names 1OJ2:8C254748:10:names 1OEF:8C293958:10:names 2OEF:8C2FA308:12" - -0001 => 8C10C8A8:00 8C0FAB14:00 8C0FDFCC:00 8C124380:00 80149C20:00 800A6AE0:00 00609164:00,2D TObjNpcFemaleBase -0002 => 8C10CB2C:00 8C0FAD98:00 8C0FE250:00 8C124534:00 80149DF8:00 800A6CBC:00 00609448:00,2D TObjNpcFemaleChild -0003 => 8C10CDB0:00 8C0FB01C:00 8C0FE4D4:00 8C1246E8:00 80149FD0:00,12 800A6E98:00 0060972C:00,12,2D TObjNpcFemaleDwarf -0004 => 8C10D034:00 8C0FB2A0:00 8C0FE758:00 8C12489C:00 8014A1A8:00 800A7074:00 00609A10:00,2D TObjNpcFemaleFat -0005 => 8C10D2B8:00 8C0FB524:00 8C0FE9DC:00 8C124A50:00 8014A380:00 800A7250:00 00609CF4:00,2D TObjNpcFemaleMacho -0006 => 8C10D53C:00 8C0FB7A8:00 8C0FEC60:00 8C124C04:00 8014A558:00,12 800A742C:00 00609FD8:00,12,2D TObjNpcFemaleOld -0007 => 8C10D7C0:00 8C0FBA2C:00 8C0FEEE4:00 8C124DB8:00 8014A730:00 800A7608:00 0060A2BC:00,2D TObjNpcFemaleTall -0008 => 8C107F14:00,0F 8C0F623C:00,0F 8C0F9650:00,0F 8C11FBC0:00,0F 8014B7E4:00,0F 800A7D84:00,0F 0060C9AC:00,0F,2D TObjNpcMaleBase -0009 => 8C108198:00 8C0F64C0:00 8C0F98D4:00 8C11FD74:00 8014B9BC:00,12 800A7F60:00 0060CC90:00,12,2D TObjNpcMaleChild -000A => 8C10841C:00 8C0F6744:00 8C0F9B58:00 8C11FF28:00 8014BB94:00 800A813C:00 0060CF74:00,2D TObjNpcMaleDwarf -000B => 8C1086A0:00 8C0F69C8:00 8C0F9DDC:00 8C1200DC:00 8014BD6C:00,12 800A8318:00 0060D258:00,12,2D TObjNpcMaleFat -000C => 8C108924:00 8C0F6C4C:00 8C0FA060:00 8C120290:00 8014BF44:00 800A84F4:00 0060D53C:00,2D TObjNpcMaleMacho -000D => 8C108BA8:00 8C0F6ED0:00 8C0FA2E4:00 8C120444:00 8014C11C:00,12 800A86D0:00 0060D820:00,12,2D TObjNpcMaleOld -000E => 8C107B5C:00 8C0F5E98:00 8C0F92AC:00 8C11F8FC:00 8014C2F4:00,12 800A88AC:00 0060DB04:00,12,2D TObjNpcMaleTall -0019 => 8C1134D4:00 8C1010F8:00 8C1045FC:00 8C12B27C:00 8014D60C:00,12 800A91D8:00 0061097C:00,12,24-2D TObjNpcSoldierBase -001A => 8C142D58:00 8C12E684:00 8C13165C:00 8C15DFB4:00 8014D7E4:00 800A93B4:00 00610C60:00,2D TObjNpcSoldierMacho -001B => 8C142874:00 8C12E1A0:00 8C131178:00 8C15DBAC:00 8014AA04:00,12 8030681C:00 0060A6D4:00,12,2D TObjNpcGovernorBase -001C => 8C17F860:00 8C161904:00 8C169270:00 8C1A278C:00 80149758:00,12 00607ACC:00,12,2D TObjNpcConnoisseur -001D => 8C17EE00:00,05 8C160ECC:00,05 8C168838:00,05 8C1A2064:00,05 80149578:00,05,12 006077E8:00,05,12,2D TObjNpcCloakroomBase -001E => 8C17F0BC:00 8C161150:00 8C168ABC:00 8C1A2258:00 8014994C:00 00608D4C:00,2D TObjNpcExpertBase -001F => 8C17F340:00 8C1613D4:00 8C168D40:00 8C1A240C:00 8014D25C:00,12 006103B4:00,12,2D TObjNpcNurseBase -0020 => 8C17F5C4:00 8C161658:00 8C168FC4:00 8C1A25C0:00 8014D434:00,12 802FC090:00 00610698:00,12,2D TObjNpcSecretaryBase -0021 => 8C181D14:00 8C163D60:00 8C16B760:00 8C1A4A70:00 8014AF84:00 800A7AB4:00 0060AF08:00,2D TObjNpcHHM00 -0022 => 8C181450:00 8C1634B0:00 8C16AEB0:00 8C1A4424:00 8014CEB4:00 800A9004:00 0060FEA4:00,2D TObjNpcNHW00 -0024 => 8C181FA4:00 8C163FF0:00 8C16B9F0:00 8C1A4C30:00 8014B158:00 0060B770:00,2D TObjNpcHRM00 -0025 => 8C182754:00 8C1647A0:00 8C16C1A0:00 8C1A5170:00 80147BBC:00,12 00605CDC:00,12,2D TObjNpcARM00 -0026 => 8C1816E0:00 8C163740:00 8C16B140:00 8C1A45E4:00 80147DC8:00,12 800A50B0:00 00605F88:00,12,2D TObjNpcARW00 -0027 => 8C181A84:00 8C163AD0:00 8C16B4D0:00 8C1A48B0:00 8014ABDC:00,12 800A78E0:00 0060A9D8:00,12,2D TObjNpcHFW00 -0028 => 8C182234:00 8C164280:00 8C16BC80:00 8C1A4DF0:00 8014C764:00,12 800A8A88:00 0060E430:00,12,2D TObjNpcNFM00 -0029 => 8C1824C4:00 8C164510:00 8C16BF10:00 8C1A4FB0:00 8014CB0C:00 800A8E30:00 0060E960:00,2A-2D TObjNpcNFW00 -002B => 8C1A1B50:00 8C17C84C:00 8C187830:00 8C1C4C28:00 8014D088:00 0061013C:00,2D TObjNpcNHW01 -002C => 8C1A2590:00 8C17D28C:00 8C188270:00 8C1C5328:00 801479A8:00 006024B4:00,2D TObjNpcAHM01 -002D => 8C1A1DE0:00 8C17CADC:00 8C187AC0:00 8C1C4DE8:00 8014B32C:00 0060BA08:00,2D TObjNpcHRM01 -0030 => 8C1A2834:00 8C17D51C:00 8C188500:00 8C1C54FC:00 8014ADB0:00 0060AC70:00,2D TObjNpcHFW01 -0031 => 8C1A2300:00 8C17CFFC:00 8C187FE0:00 8C1C5168:00 8014C938:00,12 800A8C5C:00 0060E6C8:00,12,2D TObjNpcNFM01 -0032 => 8C1A2070:00 8C17CD6C:00 8C187D50:00 8C1C4FA8:00 8014CCE0:00 0060EBF8:00,2A-2B,2D TObjNpcNFW01 -0033 => 802D635C:00-23 801A5064:00,0F 00607DD8:00-23,2D TObjNpcEnemy -0040 => 8C0329EC:02 8C02D348:02 8C02DEB0:02 8C038A7C:02,10-11 800AF2A8:02,10-11,13-14 00515388:02,10-11,13-14 TObjEneMoja -0041 => 8C047E68:01-02 8C0404F4:01-02 8C041194:01-02 8C05041C:01-02 800C1548:01-02,13-14 00526CC4:01-02,13-14,24-2B,2E TObjEneLappy -TYPE => 1OEF---------- 1OJ1---------- 1OJ2---------- 2OEF---------------- 3OE1---------------------- 3SE0---------- 59NL------------------------- NAME -0042 => 8C04EE6C:01-02 8C04740C:01-02 8C048128:01-02 8C057F5C:01-02 800B3FF4:01-02,13-14 00519144:01-02,13-14 TObjEneBm3FlyNest -0043 => 8C0576DC:01-02 8C04F61C:01-02 8C05076C:01-02 8C060C88:01-02 800B84C0:01-02,15-16 0051B26C:01-02,15-16 TObjEneBm5Wolf -0044 => 8C0D1194:01-02 8C0C1C3C:01-02 8C0C4E40:01-02 8C0E5BD0:01-02 8009214C:01,01-02 00535E50:01,01-02 TObjEneBeast -0045 => 8C142AAC:01-02 8C12E3D8:01-02 8C1313B0:01-02 8C15DE84:01-02 8014B524:01-02,17-1B,22 0060C518:01-02,17-1B,22,24-2B TObjNpcLappy -0046 => 8C1594F8:02 8C141FBC:02 8C146560:02 8C17808C:02 8014C5A0:02 0060DE48:02 TObjNpcMoja -0047 => 8C250DDC:02 TObjNpcRico -0060 => 8C045028:03-04 8C03DC6C:03-04 8C03E894:03-04 8C04D054:03-04,10-11 800BF3E4:03-04,10-11,13-14 005248FC:03-04,10-11,13-14 TObjGrass -0061 => 8C053898:03-05 8C04BD74:03-05 8C04CBD8:03-05 8C05CCD0:03-05 800C42E0:03-05,13-14,23 00529330:03-05,13-14,23 TObjEneRe2Flower -0062 => 8C0AC690:03-05 8C09F1E0:03-05 8C0A1D68:03-05 8C0C0068:03-05 800DBDF0:03-05 0057F5E4:03-05 TObjEneNanoDrago -0063 => 8C031A0C:03-05 8C02C38C:03-05 8C02CF04:03-05 8C03794C:03-05,10-11 800AC028:03-05,10-11 00512B04:03-05,10-11 TObjEneShark -0064 => 8C0E24F8:04-05 8C0D1D4C:04-05 8C0D5524:04-05 8C0F7F3C:04-05 800EBC2C:04-05 0059594C:04-05 TObjEneSlime -0065 => 8C10320C:03,05 8C0F18D8:03,05 8C0F4AF4:03,05 8C11ADA0:03,05 800DF548:03,05,15-16 00582E44:03,05,15-16 TObjEnePanarms -0080 => 8C0BA6C4:06-07 8C0AD024:06-07 8C0AFC98:06-07 8C0CE4C4:06-07 800AA4E4:06-07,15-16 00556600:06-07,15-16 TObjEneDubchik -0081 => 8C0F1D60:06-07 8C0E0910:06-07 8C0E446C:06-07 8C108FD4:06-07 800D39A0:06-07,15 0056F8F4:06-07,15 TObjEneGyaranzo -0082 => 8C0C0ABC:06-07 8C0B3030:06-07 8C0B5D3C:06-07 8C0D4B24:06-07,10-11 800E79DC:06-07,10-11 0058D314:06-07,10-11 TObjEneMe3ShinowaReal -0083 => 8C080CB8:06-07 8C07623C:06-07 8C078640:06-07 8C0907D8:06-07 8009F360:06-07 0053E770:06-07 TObjEneMe1Canadin -0084 => 8C085948:06-07 8C07AE10:06-07 8C07D1E4:06-07 8C0954C0:06-07 8009B6C8:06-07 005419FC:06-07 TObjEneMe1CanadinLeader -0085 => 8C17DAA0:06-07 8C15FBE0:06-07 8C167548:06-07 8C1A0E64:06-07 8015D170:06-07,15-16 00618A68:06-07,15-16 TOCtrlDubchik -00A0 => 8C0A99C4:08-09 8C09C83C:08-09 8C09F3DC:08-09 8C0BCFC0:08-09,10-11 800A6E98:08-09,10-11,15-16 005500C0:08-09,10-11,15-16 TObjEneSaver -00A1 => 8C0B5470:08,0A 8C0A7F78:08,0A 8C0AAB3C:08,0A 8C0C8EE4:08,0A 800F0280:08,0A,16 0059B1A4:08,0A,16 TObjEneRe4Sorcerer -00A2 => 8C06B49C:09-0A 8C062A40:09-0A 8C063D98:09-0A 8C0795CC:09-0A 800A2B70:09-0A 00545E54:09-0A TObjEneDarkGunner -00A3 => 8C06D7A8:09-0A 8C064A1C:09-0A 8C066054:09-0A 8C07B950:09-0A 800A0C70:09-0A 00543AB8:09-0A TObjEneDarkGunCenter -00A4 => 8C0DF3C8:09-0A 8C0CED50:09-0A 8C0D2494:09-0A 8C0F4BE8:09-0A,10-11 800999E4:09-0A,10-11 0053A3D8:09-0A,10-11 TObjEneDf2Bringer -00A5 => 8C0BDA70:08,0A 8C0B0094:08,0A 8C0B2D90:08,0A 8C0D1940:08,0A 80095814:08,0A,13-14 00536B80:08,0A,13-14 TObjEneRe7Berura -00A6 => 8C0D1D50:08-0A 8C0C27DC:08-0A 8C0C59C8:08-0A 8C0E68F4:08-0A 800A7E28:08-0A,13-14 00551C70:08-0A,13-14 TObjEneDimedian -00A7 => 8C10DB94:08-0A 8C0FBE00:08-0A 8C0FF2B8:08-0A 8C125234:08-0A 8008FF78:08-0A 00533F90:08-0A TObjEneBalClawBody -00A8 => 8C110678:08-0A 8C0FE4D8:08-0A 8C101984:08-0A 8C127D2C:08-0A 800917D8:08-0A 00535408:08-0A __TObjEneBalClawClaw_SUBCLASS__ -00A9 => 8C1597E4:09-0A 8C1422A8:09-0A 8C14684C:09-0A 8C17836C:09-0A 8014934C:09-0A 006074C8:09-0A TObjNpcBringer -00C0 => 8C05C454:0B 8C054250:0B 8C055350:0B 8C065EB8:0B 8002A434:0B 80065C7C:1E 00419190:0B 004A6744:1E TBoss1Dragon/TBoss5Gryphon -00C1 => 8C12A28C:0C 8C1169E4:0C 8C11A144:0C 8C143870:0C 80035D10:0C 0042ACD0:0C TBoss2DeRolLe -00C2 => 8C120130:0D 8C10D34C:0D 8C1108C4:0D 8C138714:0D 8003EDB0:0D 0043E338:0D TBoss3Volopt -00C3 => 8C1235AC:0D 8C1102F8:0D 8C113940:0D 8C13C67C:0D 80043FC4:0D 00443B88:0D TBoss3VoloptP01 -00C4 => 8C121C24:0D 8C10EADC:0D 8C1120B4:0D 8C13ACB0:0D 80040818:0D 0043FE30:0D TBoss3VoloptCore/SUBCLASS -00C5 => 8C137998:0D 8C123B30:0D 8C127570:0D 8C152298:0D 80047E0C:0D 00448380:0D __TObjEnemyCustom_SUBCLASS__ -00C6 => 8C136D60:0D 8C122F18:0D 8C126960:0D 8C15162C:0D 800424FC:0D 00441EA0:0D TBoss3VoloptMonitor -00C7 => 8C136114:0D 8C122330:0D 8C125D64:0D 8C1509E0:0D 80041854:0D 00441144:0D TBoss3VoloptHiraisin -00C8 => 8C18B6FC:0E 8C16C518:0E 8C1747C8:0E 8C1AD7FC:0E 8004C16C:0E 0044C88C:0E TBoss4DarkFalz -00CA => 802AB714:1F 0048D764:1F TBoss6PlotFalz -00CB => 802ECB38:20 004AF5B8:20 TBoss7DeRolLeC -TYPE => 1OEF---------- 1OJ1---------- 1OJ2---------- 2OEF---------------- 3OE1---------------------- 3SE0---------- 59NL------------------------- NAME -00CC => 802FC03C:21 004CB404:21 TBoss8Dragon -00D0 => 80287EB8:00,12 0060BC80:00,12,2D TObjNpcKenkyu -00D1 => 80288090:00,12 00610F44:00,12,2D TObjNpcSoutokufu -00D2 => 802A247C:12 0060B180:12 TObjNpcHosa -00D3 => 802A2654:12 0060C250:12,24-27 TObjNpcKenkyuW -00D4 => 800F5230:17-1B 802E00F8:00 0059E01C:17-1B TObjEneMe3StelthReal -00D5 => 800D6ACC:17-1B,22 802E00F8:00 00575DA4:17-1B,22 TObjEneMerillLia -00D6 => 802CFABC:17-1B,23 802E6DD8:00 00572B84:17-1B,23 TObjEneBm9Mericarol -00D7 => 800D17AC:17-1B,22 802E6DD8:00 005649E8:17-1B,22 TObjEneBm5GibonU -00D8 => 802DA0E0:17-1B,23 00563134:17-1B,23 TObjEneGibbles -00D9 => 800CC768:17-1B,22 0055C974:17-1B,22 TObjEneMe1Gee -00DA => 802CBF30:17-1B,23 0056BDE8:17-1B,23 TObjEneMe1GiGue -00DB => 803141F0:1C-1D 00549900:1C-1D TObjEneDelDepth -00DC => 80304E1C:1C-1D,23 0054A6A0:1C-1D,23 TObjEneDellBiter -00DD => 80300C5C:1C-1D,22 00553BB0:1C-1D,22 TObjEneDolmOlm -00DE => 80333584:1C-1D 0057A0B8:1C-1D TObjEneMorfos -00DF => 8031E7A0:1C-1D,22-23 00588520:1C-1D,22-23 TObjEneRecobox -00E0 => 803197AC:1C-1D 80360610:23 00558530:23 005914D0:1C-1D TObjEneMe3SinowZoaReal/TObjEneEpsilonBody -00E1 => 8036685C:23 0052E380:23 TObjEneIllGill -00F0 => 802FD220:12 0060B468:12 TObjNpcHosa2 -00F1 => 802FD048:12 0060BF68:12 TObjNpcKenkyu2 -00F2 => 803575E8:12 0060EE80:12 TObjNpcNgcBase -00F3 => 80357560:12 0060F074:12,24-2D TObjNpcNgcBase -00F4 => 803574D8:12,1C-1D 0060F164:12,1C-1D,24-2D TObjNpcNgcBase -00F5 => 80357450:12 0060F254:12 TObjNpcNgcBase -00F6 => 803573C8:12,17-1B,23 0060F344:12,17-1B,23 TObjNpcNgcBase -00F7 => 80357340:12 0060F434:12 TObjNpcNgcBase -00F8 => 803572B8:12 0060F524:12 TObjNpcNgcBase -00F9 => 80357230:12 0060F614:12 TObjNpcNgcBase -00FA => 803571A8:12 0060F704:12 TObjNpcNgcBase -00FB => 80357120:12 0060F7F4:12 TObjNpcNgcBase -00FC => 80357098:12 0060F8E4:12 TObjNpcNgcBase -00FD => 80357010:12,17-1B,22 0060F9D4:12,17-1B,22 TObjNpcNgcBase -00FE => 80356F88:12 0060FAC4:12 TObjNpcNgcBase -00FF => 80356F00:12 0060FBB4:12 TObjNpcNgcBase -0100 => 0060E128:00,12,2D __UNKNOWN_NPC_0100__ -0110 => 80271DB0:00 005A3D60:24-28,2E __ASTARK__/TObjNpcWalkingMeka_Hero -0111 => 80271790:00 005AE7CC:24-2B,2E __YOWIE__/__SATELLITE_LIZARD__/TObjNpcWalkingMeka_Dark -0112 => 802F4888:00 005B6B24:29-2B,2E __MERISSA_A__/TObjNpcHeroAide -TYPE => 1OEF---------- 1OJ1---------- 1OJ2---------- 2OEF---------------- 3OE1---------------------- 3SE0---------- 59NL------------------------- NAME -0113 => 005AB9AC:29-2B,2E __GIRTABLULU__ -0114 => 005B47B8:24-2B,2E __ZU__ -0115 => 005A5C08:24-28,2E __BOOTA_FAMILY__ -0116 => 005A673C:24-28,2E __DORPHON__ -0117 => 005ADAC4:29-2B,2E __GORAN_FAMILY__ -0118 => 00602A14:24-2E __UNKNOWN_0118__ -0119 => 0076A86C:2C __EPISODE_4_BOSS__ +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +0001 => 8C0FAB14:0000000000000001 8C0FDFCC:0000000000000001 8C10C8A8:0000000000000001 8C124380:0000000000000001 80149C20:0000000000000001 800A6AE0:0000000000000001 0019CA60:0000000000000001 00609164:0000200000000001 TObjNpcFemaleBase +0002 => 8C0FAD98:0000000000000001 8C0FE250:0000000000000001 8C10CB2C:0000000000000001 8C124534:0000000000000001 80149DF8:0000000000000001 800A6CBC:0000000000000001 0019CC10:0000000000000001 00609448:0000200000000001 TObjNpcFemaleChild +0003 => 8C0FB01C:0000000000000001 8C0FE4D4:0000000000000001 8C10CDB0:0000000000000001 8C1246E8:0000000000000001 80149FD0:0000000000040001 800A6E98:0000000000000001 0019CDC0:0000000000040001 0060972C:0000200000040001 TObjNpcFemaleDwarf +0004 => 8C0FB2A0:0000000000000001 8C0FE758:0000000000000001 8C10D034:0000000000000001 8C12489C:0000000000000001 8014A1A8:0000000000000001 800A7074:0000000000000001 0019CF70:0000000000000001 00609A10:0000200000000001 TObjNpcFemaleFat +0005 => 8C0FB524:0000000000000001 8C0FE9DC:0000000000000001 8C10D2B8:0000000000000001 8C124A50:0000000000000001 8014A380:0000000000000001 800A7250:0000000000000001 0019D120:0000000000000001 00609CF4:0000200000000001 TObjNpcFemaleMacho +0006 => 8C0FB7A8:0000000000000001 8C0FEC60:0000000000000001 8C10D53C:0000000000000001 8C124C04:0000000000000001 8014A558:0000000000040001 800A742C:0000000000000001 0019D2D0:0000000000040001 00609FD8:0000200000040001 TObjNpcFemaleOld +0007 => 8C0FBA2C:0000000000000001 8C0FEEE4:0000000000000001 8C10D7C0:0000000000000001 8C124DB8:0000000000000001 8014A730:0000000000000001 800A7608:0000000000000001 0019D480:0000000000000001 0060A2BC:0000200000000001 TObjNpcFemaleTall +0008 => 8C0F623C:0000000000008001 8C0F9650:0000000000008001 8C107F14:0000000000008001 8C11FBC0:0000000000008001 8014B7E4:0000000000008001 800A7D84:0000000000008001 0019EB50:0000000000008001 0060C9AC:0000200000008001 TObjNpcMaleBase +0009 => 8C0F64C0:0000000000000001 8C0F98D4:0000000000000001 8C108198:0000000000000001 8C11FD74:0000000000000001 8014B9BC:0000000000040001 800A7F60:0000000000000001 0019ED00:0000000000040001 0060CC90:0000200000040001 TObjNpcMaleChild +000A => 8C0F6744:0000000000000001 8C0F9B58:0000000000000001 8C10841C:0000000000000001 8C11FF28:0000000000000001 8014BB94:0000000000000001 800A813C:0000000000000001 0019EEB0:0000000000000001 0060CF74:0000200000000001 TObjNpcMaleDwarf +000B => 8C0F69C8:0000000000000001 8C0F9DDC:0000000000000001 8C1086A0:0000000000000001 8C1200DC:0000000000000001 8014BD6C:0000000000040001 800A8318:0000000000000001 0019F060:0000000000040001 0060D258:0000200000040001 TObjNpcMaleFat +000C => 8C0F6C4C:0000000000000001 8C0FA060:0000000000000001 8C108924:0000000000000001 8C120290:0000000000000001 8014BF44:0000000000000001 800A84F4:0000000000000001 0019F210:0000000000000001 0060D53C:0000200000000001 TObjNpcMaleMacho +000D => 8C0F6ED0:0000000000000001 8C0FA2E4:0000000000000001 8C108BA8:0000000000000001 8C120444:0000000000000001 8014C11C:0000000000040001 800A86D0:0000000000000001 0019F3C0:0000000000040001 0060D820:0000200000040001 TObjNpcMaleOld +000E => 8C0F5E98:0000000000000001 8C0F92AC:0000000000000001 8C107B5C:0000000000000001 8C11F8FC:0000000000000001 8014C2F4:0000000000040001 800A88AC:0000000000000001 0019F570:0000000000040001 0060DB04:0000200000040001 TObjNpcMaleTall +0019 => 8C1010F8:0000000000000001 8C1045FC:0000000000000001 8C1134D4:0000000000000001 8C12B27C:0000000000000001 8014D60C:0000000000040001 800A91D8:0000000000000001 001A1000:0000000000040001 0061097C:00003FF000040001 TObjNpcSoldierBase +001A => 8C12E684:0000000000000001 8C13165C:0000000000000001 8C142D58:0000000000000001 8C15DFB4:0000000000000001 8014D7E4:0000000000000001 800A93B4:0000000000000001 001A11B0:0000000000000001 00610C60:0000200000000001 TObjNpcSoldierMacho +001B => 8C12E1A0:0000000000000001 8C131178:0000000000000001 8C142874:0000000000000001 8C15DBAC:0000000000000001 8014AA04:0000000000040001 8030681C:0000000000000001 0019D690:0000000000040001 0060A6D4:0000200000040001 TObjNpcGovernorBase +001C => 8C161904:0000000000000001 8C169270:0000000000000001 8C17F860:0000000000000001 8C1A278C:0000000000000001 80149758:0000000000040001 0019C0D0:0000000000040001 00607ACC:0000200000040001 TObjNpcConnoisseur +001D => 8C160ECC:0000000000000021 8C168838:0000000000000021 8C17EE00:0000000000000021 8C1A2064:0000000000000021 80149578:0000000000040021 0019BEE0:0000000000040021 006077E8:0000200000040021 TObjNpcCloakroomBase +001E => 8C161150:0000000000000001 8C168ABC:0000000000000001 8C17F0BC:0000000000000001 8C1A2258:0000000000000001 8014994C:0000000000000001 0019C880:0000000000000001 00608D4C:0000200000000001 TObjNpcExpertBase +001F => 8C1613D4:0000000000000001 8C168D40:0000000000000001 8C17F340:0000000000000001 8C1A240C:0000000000000001 8014D25C:0000000000040001 001A0CA0:0000000000040001 006103B4:0000200000040001 TObjNpcNurseBase +0020 => 8C161658:0000000000000001 8C168FC4:0000000000000001 8C17F5C4:0000000000000001 8C1A25C0:0000000000000001 8014D434:0000000000040001 802FC090:0000000000000001 001A0E50:0000000000040001 00610698:0000200000040001 TObjNpcSecretaryBase +0021 => 8C163D60:0000000000000001 8C16B760:0000000000000001 8C181D14:0000000000000001 8C1A4A70:0000000000000001 8014AF84:0000000000000001 800A7AB4:0000000000000001 0019DBA0:0000000000000001 0060AF08:0000200000000001 TObjNpcHHM00 +0022 => 8C1634B0:0000000000000001 8C16AEB0:0000000000000001 8C181450:0000000000000001 8C1A4424:0000000000000001 8014CEB4:0000000000000001 800A9004:0000000000000001 001A0940:0000000000000001 0060FEA4:0000200000000001 TObjNpcNHW00 +0024 => 8C163FF0:0000000000000001 8C16B9F0:0000000000000001 8C181FA4:0000000000000001 8C1A4C30:0000000000000001 8014B158:0000000000000001 0019E0B0:0000000000000001 0060B770:0000200000000001 TObjNpcHRM00 +0025 => 8C1647A0:0000000000000001 8C16C1A0:0000000000000001 8C182754:0000000000000001 8C1A5170:0000000000000001 80147BBC:0000000000040001 0019A8E0:0000000000040001 00605CDC:0000200000040001 TObjNpcARM00 +0026 => 8C163740:0000000000000001 8C16B140:0000000000000001 8C1816E0:0000000000000001 8C1A45E4:0000000000000001 80147DC8:0000000000040001 800A50B0:0000000000000001 0019AAC0:0000000000040001 00605F88:0000200000040001 TObjNpcARW00 +0027 => 8C163AD0:0000000000000001 8C16B4D0:0000000000000001 8C181A84:0000000000000001 8C1A48B0:0000000000000001 8014ABDC:0000000000040001 800A78E0:0000000000000001 0019D840:0000000000040001 0060A9D8:0000200000040001 TObjNpcHFW00 +0028 => 8C164280:0000000000000001 8C16BC80:0000000000000001 8C182234:0000000000000001 8C1A4DF0:0000000000000001 8014C764:0000000000040001 800A8A88:0000000000000001 0019F9C0:0000000000040001 0060E430:0000200000040001 TObjNpcNFM00 +0029 => 8C164510:0000000000000001 8C16BF10:0000000000000001 8C1824C4:0000000000000001 8C1A4FB0:0000000000000001 8014CB0C:0000000000000001 800A8E30:0000000000000001 0019FD20:0000000000000001 0060E960:00003C0000000001 TObjNpcNFW00 +002B => 8C17C84C:0000000000000001 8C187830:0000000000000001 8C1A1B50:0000000000000001 8C1C4C28:0000000000000001 8014D088:0000000000000001 001A0AF0:0000000000000001 0061013C:0000200000000001 TObjNpcNHW01 +002C => 8C17D28C:0000000000000001 8C188270:0000000000000001 8C1A2590:0000000000000001 8C1C5328:0000000000000001 801479A8:0000000000000001 0019A710:0000000000000001 006024B4:0000200000000001 TObjNpcAHM01 +002D => 8C17CADC:0000000000000001 8C187AC0:0000000000000001 8C1A1DE0:0000000000000001 8C1C4DE8:0000000000000001 8014B32C:0000000000000001 0019E260:0000000000000001 0060BA08:0000200000000001 TObjNpcHRM01 +0030 => 8C17D51C:0000000000000001 8C188500:0000000000000001 8C1A2834:0000000000000001 8C1C54FC:0000000000000001 8014ADB0:0000000000000001 0019D9F0:0000000000000001 0060AC70:0000200000000001 TObjNpcHFW01 +0031 => 8C17CFFC:0000000000000001 8C187FE0:0000000000000001 8C1A2300:0000000000000001 8C1C5168:0000000000000001 8014C938:0000000000040001 800A8C5C:0000000000000001 0019FB70:0000000000040001 0060E6C8:0000200000040001 TObjNpcNFM01 +0032 => 8C17CD6C:0000000000000001 8C187D50:0000000000000001 8C1A2070:0000000000000001 8C1C4FA8:0000000000000001 8014CCE0:0000000000000001 0019FED0:0000000000000001 0060EBF8:00002C0000000001 TObjNpcNFW01 +0033 => 802D635C:0000000FFFFFFFFF 801A5064:0000000000008001 0019C150:0000000FFFFFFFFF 00607DD8:0000200FFFFFFFFF TObjNpcEnemy +0040 => 8C02D348:0000000000000004 8C02DEB0:0000000000000004 8C0329EC:0000000000000004 8C038A7C:0000000000030004 800AF2A8:00000000001B0004 00151B80:00000000001B0004 00515388:00000000001B0004 TObjEneMoja +0041 => 8C0404F4:0000000000000006 8C041194:0000000000000006 8C047E68:0000000000000006 8C05041C:0000000000000006 800C1548:0000000000180006 00162E70:0000000000180006 00526CC4:00004FF000180006 TObjEneLappy +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +0042 => 8C04740C:0000000000000006 8C048128:0000000000000006 8C04EE6C:0000000000000006 8C057F5C:0000000000000006 800B3FF4:0000000000180006 001570A0:0000000000180006 00519144:0000000000180006 TObjEneBm3FlyNest +0043 => 8C04F61C:0000000000000006 8C05076C:0000000000000006 8C0576DC:0000000000000006 8C060C88:0000000000000006 800B84C0:0000000000600006 00158D40:0000000000600006 0051B26C:0000000000600006 TObjEneBm5Wolf +0044 => 8C0C1C3C:0000000000000006 8C0C4E40:0000000000000006 8C0D1194:0000000000000006 8C0E5BD0:0000000000000006 8009214C:0000000000000006 000ECEF0:0000000000000006 00535E50:0000000000000006 TObjEneBeast +0045 => 8C12E3D8:0000000000000006 8C1313B0:0000000000000006 8C142AAC:0000000000000006 8C15DE84:0000000000000006 8014B524:000000040F800006 0019E950:000000040F800006 0060C518:00000FF40F800006 TObjNpcLappy +0046 => 8C141FBC:0000000000000004 8C146560:0000000000000004 8C1594F8:0000000000000004 8C17808C:0000000000000004 8014C5A0:0000000000000004 0019F750:0000000000000004 0060DE48:0000000000000004 TObjNpcMoja +0047 => 8C250DDC:0000000000000004 TObjNpcRico +0060 => 8C03DC6C:0000000000000018 8C03E894:0000000000000018 8C045028:0000000000000018 8C04D054:0000000000030018 800BF3E4:00000000001B0018 0015F700:00000000001B0018 005248FC:00000000001B0018 TObjGrass +0061 => 8C04BD74:0000000000000038 8C04CBD8:0000000000000038 8C053898:0000000000000038 8C05CCD0:0000000000000038 800C42E0:0000000800180038 001648C0:0000000800180038 00529330:0000000800180038 TObjEneRe2Flower +0062 => 8C09F1E0:0000000000000038 8C0A1D68:0000000000000038 8C0AC690:0000000000000038 8C0C0068:0000000000000038 800DBDF0:0000000000000038 0012EAF0:0000000000000038 0057F5E4:0000000000000038 TObjEneNanoDrago +0063 => 8C02C38C:0000000000000038 8C02CF04:0000000000000038 8C031A0C:0000000000000038 8C03794C:0000000000030038 800AC028:0000000000030038 00150E40:0000000000030038 00512B04:0000000000030038 TObjEneShark +0064 => 8C0D1D4C:0000000000000030 8C0D5524:0000000000000030 8C0E24F8:0000000000000030 8C0F7F3C:0000000000000030 800EBC2C:0000000000000030 001442F0:0000000000000030 0059594C:0000000000000030 TObjEneSlime +0065 => 8C0F18D8:0000000000000028 8C0F4AF4:0000000000000028 8C10320C:0000000000000028 8C11ADA0:0000000000000028 800DF548:0000000000600028 00131840:0000000000600028 00582E44:0000000000600028 TObjEnePanarms +0080 => 8C0AD024:00000000000000C0 8C0AFC98:00000000000000C0 8C0BA6C4:00000000000000C0 8C0CE4C4:00000000000000C0 800AA4E4:00000000006000C0 0010A890:00000000006000C0 00556600:00000000006000C0 TObjEneDubchik +0081 => 8C0E0910:00000000000000C0 8C0E446C:00000000000000C0 8C0F1D60:00000000000000C0 8C108FD4:00000000000000C0 800D39A0:00000000002000C0 00121130:00000000002000C0 0056F8F4:00000000002000C0 TObjEneGyaranzo +0082 => 8C0B3030:00000000000000C0 8C0B5D3C:00000000000000C0 8C0C0ABC:00000000000000C0 8C0D4B24:00000000000300C0 800E79DC:00000000000300C0 0013C4B0:00000000000300C0 0058D314:00000000000300C0 TObjEneMe3ShinowaReal +0083 => 8C07623C:00000000000000C0 8C078640:00000000000000C0 8C080CB8:00000000000000C0 8C0907D8:00000000000000C0 8009F360:00000000000000C0 000F4980:00000000000000C0 0053E770:00000000000000C0 TObjEneMe1Canadin +0084 => 8C07AE10:00000000000000C0 8C07D1E4:00000000000000C0 8C085948:00000000000000C0 8C0954C0:00000000000000C0 8009B6C8:00000000000000C0 000F8200:00000000000000C0 005419FC:00000000000000C0 TObjEneMe1CanadinLeader +0085 => 8C15FBE0:00000000000000C0 8C167548:00000000000000C0 8C17DAA0:00000000000000C0 8C1A0E64:00000000000000C0 8015D170:00000000006000C0 001A8BC0:00000000006000C0 00618A68:00000000006000C0 TOCtrlDubchik +00A0 => 8C09C83C:0000000000000300 8C09F3DC:0000000000000300 8C0A99C4:0000000000000300 8C0BCFC0:0000000000030300 800A6E98:0000000000630300 00103ED0:0000000000630300 005500C0:0000000000630300 TObjEneSaver +00A1 => 8C0A7F78:0000000000000500 8C0AAB3C:0000000000000500 8C0B5470:0000000000000500 8C0C8EE4:0000000000000500 800F0280:0000000000400500 001493E0:0000000000400500 0059B1A4:0000000000400500 TObjEneRe4Sorcerer +00A2 => 8C062A40:0000000000000600 8C063D98:0000000000000600 8C06B49C:0000000000000600 8C0795CC:0000000000000600 800A2B70:0000000000000600 000FA5F0:0000000000000600 00545E54:0000000000000600 TObjEneDarkGunner +00A3 => 8C064A1C:0000000000000600 8C066054:0000000000000600 8C06D7A8:0000000000000600 8C07B950:0000000000000600 800A0C70:0000000000000600 000F98E0:0000000000000600 00543AB8:0000000000000600 TObjEneDarkGunCenter +00A4 => 8C0CED50:0000000000000600 8C0D2494:0000000000000600 8C0DF3C8:0000000000000600 8C0F4BE8:0000000000030600 800999E4:0000000000030600 000F1170:0000000000030600 0053A3D8:0000000000030600 TObjEneDf2Bringer +00A5 => 8C0B0094:0000000000000500 8C0B2D90:0000000000000500 8C0BDA70:0000000000000500 8C0D1940:0000000000000500 80095814:0000000000180500 000ED9D0:0000000000180500 00536B80:0000000000180500 TObjEneRe7Berura +00A6 => 8C0C27DC:0000000000000700 8C0C59C8:0000000000000700 8C0D1D50:0000000000000700 8C0E68F4:0000000000000700 800A7E28:0000000000180700 00107570:0000000000180700 00551C70:0000000000180700 TObjEneDimedian +00A7 => 8C0FBE00:0000000000000700 8C0FF2B8:0000000000000700 8C10DB94:0000000000000700 8C125234:0000000000000700 8008FF78:0000000000000700 000E8A90:0000000000000700 00533F90:0000000000000700 TObjEneBalClawBody +00A8 => 8C0FE4D8:0000000000000700 8C101984:0000000000000700 8C110678:0000000000000700 8C127D2C:0000000000000700 800917D8:0000000000000700 000EB270:0000000000000700 00535408:0000000000000700 TObjEneBalClawClaw +00A9 => 8C1422A8:0000000000000600 8C14684C:0000000000000600 8C1597E4:0000000000000600 8C17836C:0000000000000600 8014934C:0000000000000600 0019BD30:0000000000000600 006074C8:0000000000000600 TObjNpcBringer +00C0 => 8C054250:0000000000000800 8C055350:0000000000000800 8C05C454:0000000000000800 8C065EB8:0000000000000800 8002A434:0000000000000800 0003F8A0:0000000000000800 00419190:0000000000000800 TBoss1Dragon +00C0 => 80065C7C:0000000040000000 000780C0:0000000040000000 004A6744:0000000040000000 TBoss5Gryphon +00C1 => 8C1169E4:0000000000001000 8C11A144:0000000000001000 8C12A28C:0000000000001000 8C143870:0000000000001000 80035D10:0000000000001000 0004C5C0:0000000000001000 0042ACD0:0000000000001000 TBoss2DeRolLe +00C2 => 8C10D34C:0000000000002000 8C1108C4:0000000000002000 8C120130:0000000000002000 8C138714:0000000000002000 8003EDB0:0000000000002000 000593A0:0000000000002000 0043E338:0000000000002000 TBoss3Volopt +00C3 => 8C1102F8:0000000000002000 8C113940:0000000000002000 8C1235AC:0000000000002000 8C13C67C:0000000000002000 80043FC4:0000000000002000 0005E5F0:0000000000002000 00443B88:0000000000002000 TBoss3VoloptP01 +00C4 => 8C10EADC:0000000000002000 8C1120B4:0000000000002000 8C121C24:0000000000002000 8C13ACB0:0000000000002000 80040818:0000000000002000 0005B580:0000000000002000 0043FE30:0000000000002000 TBoss3VoloptCore +00C5 => 8C123B30:0000000000002000 8C127570:0000000000002000 8C137998:0000000000002000 8C152298:0000000000002000 80047E0C:0000000000002000 00060090:0000000000002000 00448380:0000000000002000 TBoss3VoloptP02 +00C6 => 8C122F18:0000000000002000 8C126960:0000000000002000 8C136D60:0000000000002000 8C15162C:0000000000002000 800424FC:0000000000002000 0005D9E0:0000000000002000 00441EA0:0000000000002000 TBoss3VoloptMonitor +00C7 => 8C122330:0000000000002000 8C125D64:0000000000002000 8C136114:0000000000002000 8C1509E0:0000000000002000 80041854:0000000000002000 0005CD20:0000000000002000 00441144:0000000000002000 TBoss3VoloptHiraisin +00C8 => 8C16C518:0000000000004000 8C1747C8:0000000000004000 8C18B6FC:0000000000004000 8C1AD7FC:0000000000004000 8004C16C:0000000000004000 00065B70:0000000000004000 0044C88C:0000000000004000 TBoss4DarkFalz +00CA => 802AB714:0000000080000000 0008B910:0000000080000000 0048D764:0000000080000000 TBoss6PlotFalz +00CB => 802ECB38:0000000100000000 0009D5A0:0000000100000000 004AF5B8:0000000100000000 TBoss7DeRolLeC +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +00CC => 802FC03C:0000000200000000 000A8CD0:0000000200000000 004CB404:0000000200000000 TBoss8Dragon +00D0 => 80287EB8:0000000000040001 0019E410:0000000000040001 0060BC80:0000200000040001 TObjNpcKenkyu +00D1 => 80288090:0000000000040001 001A1360:0000000000040001 00610F44:0000200000040001 TObjNpcSoutokufu +00D2 => 802A247C:0000000000040000 0019DD50:0000000000040000 0060B180:0000000000040000 TObjNpcHosa +00D3 => 802A2654:0000000000040000 0019E770:0000000000040000 0060C250:000000F000040000 TObjNpcKenkyuW +00D4 => 800F5230:000000000F800000 802E00F8:0000000000000001 0014C1A0:000000000F800000 0059E01C:000000000F800000 TObjEneMe3StelthReal/TObjNpcHeroScientist +00D5 => 800D6ACC:000000040F800000 802E00F8:0000000000000001 001272F0:000000040F800000 00575DA4:000000040F800000 TObjEneMerillLia/TObjNpcHeroScientist +00D6 => 802CFABC:000000080F800000 802E6DD8:0000000000000001 00123DA0:000000080F800000 00572B84:000000080F800000 TObjEneBm9Mericarol/TObjNpcHeroGovernor +00D7 => 800D17AC:000000040F800000 802E6DD8:0000000000000001 00118CD0:000000040F800000 005649E8:000000040F800000 TObjEneBm5GibonU/TObjNpcHeroGovernor +00D8 => 802DA0E0:000000080F800000 001154B0:000000080F800000 00563134:000000080F800000 TObjEneGibbles +00D9 => 800CC768:000000040F800000 001119A0:000000040F800000 0055C974:000000040F800000 TObjEneMe1Gee +00DA => 802CBF30:000000080F800000 0011D870:000000080F800000 0056BDE8:000000080F800000 TObjEneMe1GiGue +00DB => 803141F0:0000000030000000 000FD2D0:0000000030000000 00549900:0000000030000000 TObjEneDelDepth +00DC => 80304E1C:0000000830000000 00100010:0000000830000000 0054A6A0:0000000830000000 TObjEneDellBiter +00DD => 80300C5C:0000000430000000 00108550:0000000430000000 00553BB0:0000000430000000 TObjEneDolmOlm +00DE => 80333584:0000000030000000 0012BAB0:0000000030000000 0057A0B8:0000000030000000 TObjEneMorfos +00DF => 8031E7A0:0000000C30000000 00137C80:0000000C30000000 00588520:0000000C30000000 TObjEneRecobox +00E0 => 803197AC:0000000030000000 001401D0:0000000030000000 005914D0:0000000030000000 TObjEneMe3SinowZoaReal/TObjEneEpsilonBody +00E0 => 80360610:0000000800000000 0010DA60:0000000800000000 00558530:0000000800000000 TObjEneMe3SinowZoaReal/TObjEneEpsilonBody +00E1 => 8036685C:0000000800000000 000E52B0:0000000800000000 0052E380:0000000800000000 TObjEneIllGill +00F0 => 802FD220:0000000000040000 0019DF00:0000000000040000 0060B468:0000000000040000 TObjNpcHosa2 +00F1 => 802FD048:0000000000040000 0019E5C0:0000000000040000 0060BF68:0000000000040000 TObjNpcKenkyu2 +00F2 => 803575E8:0000000000040000 001A0100:0000000000040000 0060EE80:0000000000040000 TObjNpcNgcBase(0x00F2) +00F3 => 80357560:0000000000040000 001A0180:0000000000040000 0060F074:00003FF000040000 TObjNpcNgcBase(0x00F3) +00F4 => 803574D8:0000000030040000 001A0200:0000000030040000 0060F164:00003FF030040000 TObjNpcNgcBase(0x00F4) +00F5 => 80357450:0000000000040000 001A0280:0000000000040000 0060F254:0000000000040000 TObjNpcNgcBase(0x00F5) +00F6 => 803573C8:000000080F840000 001A0300:000000080F840000 0060F344:000000080F840000 TObjNpcNgcBase(0x00F6) +00F7 => 80357340:0000000000040000 001A0380:0000000000040000 0060F434:0000000000040000 TObjNpcNgcBase(0x00F7) +00F8 => 803572B8:0000000000040000 001A0400:0000000000040000 0060F524:0000000000040000 TObjNpcNgcBase(0x00F8) +00F9 => 80357230:0000000000040000 001A0480:0000000000040000 0060F614:0000000000040000 TObjNpcNgcBase(0x00F9) +00FA => 803571A8:0000000000040000 001A0500:0000000000040000 0060F704:0000000000040000 TObjNpcNgcBase(0x00FA) +00FB => 80357120:0000000000040000 001A0580:0000000000040000 0060F7F4:0000000000040000 TObjNpcNgcBase(0x00FB) +00FC => 80357098:0000000000040000 001A0600:0000000000040000 0060F8E4:0000000000040000 TObjNpcNgcBase(0x00FC) +00FD => 80357010:000000040F840000 001A0680:000000040F840000 0060F9D4:000000040F840000 TObjNpcNgcBase(0x00FD) +00FE => 80356F88:0000000000040000 001A0700:0000000000040000 0060FAC4:0000000000040000 TObjNpcNgcBase(0x00FE) +00FF => 80356F00:0000000000040000 001A0780:0000000000040000 0060FBB4:0000000000040000 TObjNpcNgcBase(0x00FF) +0100 => 0060E128:0000200000040001 __MOMOKA__ +0110 => 80271DB0:0000000000000001 005A3D60:000041F000000000 __ASTARK__/TObjNpcWalkingMeka_Hero +0111 => 80271790:0000000000000001 005AE7CC:00004FF000000000 __YOWIE__/__SATELLITE_LIZARD__/TObjNpcWalkingMeka_Dark +0112 => 802F4888:0000000000000001 005B6B24:00004E0000000000 __MERISSA_A__/TObjNpcHeroAide +TYPE => 1OJ1--------------------- 1OJ2--------------------- 1OEF--------------------- 2OEF--------------------- 3OE1--------------------- 3SE0--------------------- 4OEU--------------------- 59NL--------------------- NAME +0113 => 005AB9AC:00004E0000000000 __GIRTABLULU__ +0114 => 005B47B8:00004FF000000000 __ZU__ +0115 => 005A5C08:000041F000000000 __BOOTA_FAMILY__ +0116 => 005A673C:000041F000000000 __DORPHON__ +0117 => 005ADAC4:00004E0000000000 __GORAN_FAMILY__ +0118 => 00602A14:00007FF000000000 __QUEST_NPC__ +0119 => 0076A86C:0000100000000000 __EPISODE_4_BOSS__ diff --git a/src/AddressTranslator.cc b/src/AddressTranslator.cc index 9ecc71d9..744b6553 100644 --- a/src/AddressTranslator.cc +++ b/src/AddressTranslator.cc @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -213,6 +214,32 @@ public: } } + struct ParseDATConstructorTableSpec { + string src_name; + uint32_t index_addr; + size_t num_areas; + bool has_names; + vector x86_constructor_calls; + + ParseDATConstructorTableSpec(const phosg::JSON& json) { + this->src_name = json.at("SourceName").as_string(); + this->index_addr = json.at("IndexAddress").as_int(); + this->num_areas = json.at("AreaCount").as_int(); + this->has_names = json.at("HasNames").as_bool(); + for (const auto& z : json.at("X86ConstructorCalls").as_list()) { + this->x86_constructor_calls.emplace_back(z->as_int()); + } + } + + static vector from_json_list(const phosg::JSON& json) { + vector ret; + for (const auto& z : json.as_list()) { + ret.emplace_back(*z); + } + return ret; + } + }; + template struct DATConstructorTableEntry { static constexpr bool IsBE = BE; @@ -240,20 +267,54 @@ public: template map>>> parse_dat_constructor_table_t( - shared_ptr& mem, uint32_t address, size_t num_areas) { + shared_ptr& mem, + const ParseDATConstructorTableSpec& spec) { if (!mem) { throw runtime_error("no file selected"); } + // On some of the x86 builds of the game (PCv2 and Xbox), the constructor + // tables aren't entirely static in the data sections - some parts are + // written during static initialization instead. To handle this, we make a + // copy of the immutable MemoryContext and run the static initialization + // functions using resource_dasm's emulator before parsing the constructor + // table. + shared_ptr effective_mem = mem; + if (!spec.x86_constructor_calls.empty()) { + auto constructed_mem = make_shared(mem->duplicate()); + uint32_t esp = constructed_mem->allocate(0x1000) + 0x1000; + for (uint32_t constructor_addr : spec.x86_constructor_calls) { + ResourceDASM::X86Emulator emu(constructed_mem); + + // Uncomment for debugging + // auto debugger = make_shared>(); + // debugger->bind(emu); + // debugger->state.mode = ResourceDASM::DebuggerMode::TRACE; + + auto& regs = emu.registers(); + regs.eip = constructor_addr; + regs.esp().u = esp - 4; + constructed_mem->write_u32l(esp - 4, 0xFFFFFFFF); // Return addr + try { + emu.execute(); + } catch (const out_of_range&) { + if (regs.eip != 0xFFFFFFFF) { + throw; + } + } + } + effective_mem = constructed_mem; + } + map>>> table; - auto index_r = mem->reader(address, num_areas * sizeof(uint32_t)); - for (size_t area = 0; area < num_areas; area++) { + auto index_r = effective_mem->reader(spec.index_addr, spec.num_areas * sizeof(uint32_t)); + for (size_t area = 0; area < spec.num_areas; area++) { uint32_t entries_addr = EntryT::IsBE ? index_r.get_u32b() : index_r.get_u32l(); if (!entries_addr) { continue; } - auto entries_r = mem->reader(entries_addr, 0x4000); // 0x4000 is probably enough + auto entries_r = effective_mem->reader(entries_addr, 0x4000); // 0x4000 is probably enough while (!entries_r.eof()) { const auto& entry = entries_r.get(); if (entry.type == 0xFFFF) { @@ -274,17 +335,25 @@ public: return table; } - void parse_dat_constructor_table(uint32_t index_addr, size_t num_areas, bool has_names) { + static uint64_t area_mask_for_ranges(const vector>& ranges) { + uint64_t ret = 0; + for (const auto& [start, end] : ranges) { + for (size_t z = start; z <= end; z++) { + ret |= static_cast(1ULL << z); + } + } + return ret; + } + + void parse_dat_constructor_table(const ParseDATConstructorTableSpec& spec) { map>>> table; - if (this->ppc_mems.count(this->src_mem)) { - table = this->parse_dat_constructor_table_t>( - this->src_mem, index_addr, num_areas); - } else if (!has_names) { - table = this->parse_dat_constructor_table_t>( - this->src_mem, index_addr, num_areas); + auto spec_mem = this->mems.at(spec.src_name); + if (this->ppc_mems.count(spec_mem)) { + table = this->parse_dat_constructor_table_t>(spec_mem, spec); + } else if (!spec.has_names) { + table = this->parse_dat_constructor_table_t>(spec_mem, spec); } else { - table = this->parse_dat_constructor_table_t>( - this->src_mem, index_addr, num_areas); + table = this->parse_dat_constructor_table_t>(spec_mem, spec); } for (const auto& [type, constructor_to_area_ranges] : table) { @@ -306,24 +375,26 @@ public: } } - void parse_dat_constructor_table_multi(const vector>& specs, bool is_enemies) { + void parse_dat_constructor_table_multi( + const vector& specs, bool is_enemies, bool print_area_masks) { map>>>> all_tables; - for (const auto& [src_name, index_addr, num_areas, has_names] : specs) { - auto src_mem = this->mems.at(src_name); + for (const auto& spec : specs) { map>>> table; - if (this->ppc_mems.count(src_mem)) { - table = this->parse_dat_constructor_table_t>(src_mem, index_addr, num_areas); - } else if (!has_names) { - table = this->parse_dat_constructor_table_t>(src_mem, index_addr, num_areas); + auto spec_mem = this->mems.at(spec.src_name); + if (this->ppc_mems.count(spec_mem)) { + table = this->parse_dat_constructor_table_t>(spec_mem, spec); + } else if (!spec.has_names) { + table = this->parse_dat_constructor_table_t>(spec_mem, spec); } else { - table = this->parse_dat_constructor_table_t>(src_mem, index_addr, num_areas); + table = this->parse_dat_constructor_table_t>(spec_mem, spec); } - all_tables.emplace(src_name, std::move(table)); + all_tables.emplace(spec.src_name, std::move(table)); } map version_widths; map> formatted_cells_for_type; - for (const auto& [src_name, table] : all_tables) { + for (const auto& spec : specs) { + const auto& table = all_tables.at(spec.src_name); size_t max_width = 0; for (const auto& [type, constructor_to_area_ranges] : table) { @@ -333,42 +404,47 @@ public: cell_data.push_back(' '); } cell_data += phosg::string_printf("%08" PRIX32, constructor); - bool is_first = true; - for (const auto& [start, end] : area_ranges) { - cell_data.push_back(is_first ? ':' : ','); - if (start == end) { - cell_data += phosg::string_printf("%02zX", start); - } else { - cell_data += phosg::string_printf("%02zX-%02zX", start, end); + if (print_area_masks) { + cell_data += phosg::string_printf(":%016" PRIX64, this->area_mask_for_ranges(area_ranges)); + } else { + bool is_first = true; + for (const auto& [start, end] : area_ranges) { + cell_data.push_back(is_first ? ':' : ','); + if (start == end) { + cell_data += phosg::string_printf("%02zX", start); + } else { + cell_data += phosg::string_printf("%02zX-%02zX", start, end); + } + is_first = false; } - is_first = false; } } max_width = max(max_width, cell_data.size()); - formatted_cells_for_type[type][src_name] = std::move(cell_data); + formatted_cells_for_type[type][spec.src_name] = std::move(cell_data); } - version_widths[src_name] = max_width; + version_widths[spec.src_name] = max_width; } vector formatted_lines; string header_line = "TYPE =>"; - for (const auto& [version, width] : version_widths) { + for (const auto& spec : specs) { + size_t width = version_widths.at(spec.src_name); header_line.push_back(' '); - header_line += version; - if (width > version.size()) { - header_line.resize(header_line.size() + (width - version.size()), '-'); + header_line += spec.src_name; + if (width > spec.src_name.size()) { + header_line.resize(header_line.size() + (width - spec.src_name.size()), '-'); } } header_line += " NAME"; for (const auto& [type, formatted_cells] : formatted_cells_for_type) { string line = phosg::string_printf("%04" PRIX32 " =>", type); - for (const auto& [src_name, width] : version_widths) { + for (const auto& spec : specs) { + size_t width = version_widths.at(spec.src_name); try { - const auto& cell_data = formatted_cells.at(src_name); + const auto& cell_data = formatted_cells.at(spec.src_name); line.push_back(' '); line += cell_data; - size_t width = version_widths[src_name]; if (width > cell_data.size()) { line.resize(line.size() + (width - cell_data.size()), ' '); } @@ -763,16 +839,8 @@ public: } else if ((tokens[0] == "parse-dat-object-constructor-tables") || (tokens[0] == "parse-dat-enemy-constructor-tables")) { bool is_enemies = (tokens[0] == "parse-dat-enemy-constructor-tables"); - vector> specs; - for (size_t z = 1; z < tokens.size(); z++) { - auto subtokens = phosg::split(tokens[z], ':'); - specs.emplace_back(make_tuple( - subtokens.at(0), - stoul(subtokens.at(1), nullptr, 16), - stoul(subtokens.at(2), nullptr, 16), - (subtokens.size() > 3 && subtokens.at(3) == "names"))); - } - this->parse_dat_constructor_table_multi(specs, is_enemies); + auto specs = ParseDATConstructorTableSpec::from_json_list(phosg::JSON::parse(phosg::load_file(tokens.at(1)))); + this->parse_dat_constructor_table_multi(specs, is_enemies, true); } else if (!tokens[0].empty()) { throw runtime_error("unknown command"); } diff --git a/src/ChatCommands.cc b/src/ChatCommands.cc index cba1b67c..3368e25d 100644 --- a/src/ChatCommands.cc +++ b/src/ChatCommands.cc @@ -2846,20 +2846,21 @@ static void whatobj_whatene_fn(const ServerArgs& a, bool include_objs, bool incl // set, and print the object if not. if (nearest_ene) { const auto* set_entry = nearest_ene->super_ene->version(a.c->version()).set_entry; + string type_name = MapFile::name_for_enemy_type(set_entry->base_type, a.c->version(), area); send_text_message_printf(a.c, "$C5E-%03zX\n$C6%s\n$C2%s\n$C7X:%.2f Z:%.2f", nearest_ene->e_id, phosg::name_for_enum(nearest_ene->type(a.c->version(), l->episode, l->event)), - MapFile::name_for_enemy_type(set_entry->base_type), - nearest_worldspace_pos.x.load(), nearest_worldspace_pos.z.load()); - auto set_str = set_entry->str(); + type_name.c_str(), nearest_worldspace_pos.x.load(), nearest_worldspace_pos.z.load()); + auto set_str = set_entry->str(a.c->version(), area); a.c->log.info("Enemy found via $whatobj: E-%03zX %s at x=%g y=%g z=%g", nearest_ene->e_id, set_str.c_str(), nearest_worldspace_pos.x.load(), nearest_worldspace_pos.y.load(), nearest_worldspace_pos.z.load()); } else if (nearest_obj) { + const auto* set_entry = nearest_obj->super_obj->version(a.c->version()).set_entry; + auto type_name = nearest_obj->type_name(a.c->version()); send_text_message_printf(a.c, "$C5K-%03zX\n$C6%s\n$C7X:%.2f Z:%.2f", - nearest_obj->k_id, nearest_obj->type_name(a.c->version()), - nearest_worldspace_pos.x.load(), nearest_worldspace_pos.z.load()); - auto set_str = nearest_obj->super_obj->version(a.c->version()).set_entry->str(); + nearest_obj->k_id, type_name.c_str(), nearest_worldspace_pos.x.load(), nearest_worldspace_pos.z.load()); + auto set_str = set_entry->str(a.c->version(), area); a.c->log.info("Object found via $whatobj: K-%03zX %s at x=%g y=%g z=%g", nearest_obj->k_id, set_str.c_str(), nearest_worldspace_pos.x.load(), nearest_worldspace_pos.y.load(), nearest_worldspace_pos.z.load()); diff --git a/src/Main.cc b/src/Main.cc index faca929b..b3cc1e18 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -1540,7 +1540,7 @@ Action a_disassemble_quest_map( *data = prs_decompress(*data); } bool reassembly = args.get("reassembly"); - string result = MapFile(data).disassemble(reassembly); + string result = MapFile(data).disassemble(reassembly, get_cli_version(args, Version::UNKNOWN)); write_output_data(args, result.data(), result.size(), "txt"); }); Action a_disassemble_free_map( @@ -1571,11 +1571,11 @@ Action a_disassemble_free_map( bool reassembly = args.get("reassembly"); string result; if (is_objects) { - result = MapFile(floor, data, nullptr, nullptr).disassemble(reassembly); + result = MapFile(floor, data, nullptr, nullptr).disassemble(reassembly, get_cli_version(args, Version::UNKNOWN)); } else if (is_enemies) { - result = MapFile(floor, nullptr, data, nullptr).disassemble(reassembly); + result = MapFile(floor, nullptr, data, nullptr).disassemble(reassembly, get_cli_version(args, Version::UNKNOWN)); } else if (is_events) { - result = MapFile(floor, nullptr, nullptr, data).disassemble(reassembly); + result = MapFile(floor, nullptr, nullptr, data).disassemble(reassembly, get_cli_version(args, Version::UNKNOWN)); } else { throw logic_error("unhandled input type"); } diff --git a/src/Map.cc b/src/Map.cc index 0b45cd47..e3e739d6 100644 --- a/src/Map.cc +++ b/src/Map.cc @@ -571,2600 +571,2627 @@ static const vector>> map_file_info = { //////////////////////////////////////////////////////////////////////////////// // DAT file structure -const char* MapFile::name_for_object_type(uint16_t type) { - static const unordered_map names({ - // This is newserv's canonical definition of map object types. Enemy and - // NPC types are documented in name_for_enemy_type instead. - - // Objects defined in map files take arguments in the form of an - // ObjectSetEntry structure (see Map.hh). Most objects take parameters - // only in param1-3 (floats) and param4-6 (ints), but a few of them use - // the angle fields as additional int parameters. All objects are - // available on all versions of the game (except Episode 3) unless - // otherwise noted, but most objects are available only on specific - // floors unless an omnispawn patch is used. (TODO: Add default floor - // availability information in the notes here.) - - // Defines where a player should start when entering a floor. Params: - // param1 = client ID - // param4 = source type: - // 0 = use this set when advancing from a lower floor - // 1 = use this set when returning from a higher floor - // anything else = set is unused - {0x0000, "TObjPlayerSet"}, - - // Displays a particle effect. This object is not constructed in - // split-screen mode. Params: - // param1 = particle type (truncated to int, clamped to nonnegative) - // param3 = TODO - // param4 = if equal to 1, increase draw distance from 200 to 1500; if - // any other value, no effect - // param5 = TODO - // param6 = TODO - {0x0001, "TObjParticle"}, - - // Standard (triangular) cross-floor warp object. Params: - // param4 = destination floor - // param6 = color (0 = blue, 1 = red); if this is 0 in Challenge mode, - // the warp is destroyed immediately - {0x0002, "TObjAreaWarpForest"}, - - // Standard (triangular) intra-floor warp object. Params: - // param1-3 = destination coordinates (x, y, z); players are supposed - // to be offset from this location in different directions depending - // on their client ID, but there is a bug that causes all players to - // use the same offsets: x + 10 and z + 10 - // param4 = destination angle (about y axis) - {0x0003, "TObjMapWarpForest"}, - - // Light collision. Params: - // param1 = TODO (in range 0-10000; if above 10000, (param1 - 10000) is - // used and a flag is set) - // param2 = TODO (in range 0-10000; if above 10000, (param2 - 10000) is - // used and a flag is set) - // param3 = TODO - // param4 = TODO - // param5 = TODO - // param6 = TODO - {0x0004, "TObjLight"}, - - // Arbitrary item. The parameters specify the item data; see - // ItemCreator::base_item_for_specialized_box for how the encoding works. - // Availability: v1/v2 only - {0x0005, "TItem"}, - - // Environmental sound. This object is not constructed in offline multi - // mode. Params: - // param3 = audibility radius (if <= 0 uses default of 200) - // param4 = sound ID: - // Pioneer 2 / Lab (volume param is ignored on this floor): - // 00 = distant crowd noises (GC: 4004B200) - // 01 = ship passing by (GC: 4004C101) - // 02 = siren passing by (GC: 4004CB02) - // Forest: - // 00 = waterfall (GC: 0004A801) - // 01 = stream (GC: 0004B202) - // 02 = birds chirping (GC: 0004BC00) - // 03 = light rain on ground (GC: 00043704) - // 04 = light rain on water (GC: 0004BC05) - // 05 = wind (GC: 0004AD06) - // Caves: - // 00 = nothing? (GC: 00046400) - // 01 = volcano? (GC: 00042A01) - // 02 = lava flow (GC: 00042F02) - // 03 = stream (GC: 00043C03) - // 04 = waterfall (GC: 00043C04) - // 05 = echoing drips (GC: 00042D05) - // Mines: - // 00 = mechanical whir (GC: 4004B715) - // 01 = rotary machine (GC: 4004BC16) - // Ruins: - // 00 = wind/water (GC: 4004B200) - // 01 = swishing (GC: 4004CB01) - // 02 = repeating sliding? (GC: 4004BC02) - // 03 = repeating punching? (GC: 4004BC03) - // 04 = hissing (GC: 4004C604) - // 05 = heartbeat (GC: 4004AA05) - // 06 = squishing heartbeat (GC: 4004C606) - // Battle 1 (Spaceship): - // 00 = low beeping (GC: 4004B40C) - // 01 = high beeping (GC: 4004B40D) - // 02 = robot arm movement 1 (GC: 4004C10E) - // 03 = robot arm movement 2 (GC: 4004C10F) - // Battle 2 (Temple): - // 00 = waterfall (GC: 0004CB0C) - // 01 = waves (GC: 0004BC0D) - // 02 = bubbles (GC: 0004BC0E) - // VR Temple: - // 00 = waterfall (GC: 0004CB0C) - // 01 = waves (GC: 0004BC0D) - // 02 = bubbles GC: (0004BC0E0 - // VR Spaceship: - // 00 = low beeping (GC: 4004B40C) - // 01 = high beeping (GC: 4004B40D) - // 02 = robot arm movement 1 (GC: 4004C10E) - // 03 = robot arm movement 2 (GC: 4004C10F) - // Central Control Area: - // 00 = wind (GC: 0004CB05) - // 01 = waterfall (GC: 0004D506) - // 02 = stream (GC: 0004BC07) - // 03 = waves crashing (GC: 0004C60A) - // 04 = ocean wind (GC: 0004CB0B) - // 05 = higher wind (GC: 0004CB0C) - // 06 = light ocean wind (GC: 0004CB0D) - // 07 = ominous mechanical sound (GC: 0004BC0E) - // Seabed and Olga Flow: - // 00 = water leak (GC: 4004BC00) - // 01 = water drip (GC: 4004BC01) - // 02 = waterfall (GC: 4004C603) - // 03 = light waterfall (GC: 4004D504) - // 04 = creaking metal 1 (GC: 4004B205) - // 05 = creaking metal 2 (GC: 4004B206) - // 06 = creaking metal 3 (GC: 4004AD07) - // 07 = creaking metal 4 (GC: 4004B208) - // 08 = creaking metal 5 (GC: 4004AD09) - // 09 = gas leak (GC: 4004B20A) - // 0A = distant metallic thud (GC: 4004B20B) - // Crater: - // 00 = TODO (BB: 000005FD) - // 01 = TODO (BB: 000005FE) - // 02 = TODO (BB: 000005FF) - // 03 = TODO (BB: 00000600) - // 04 = TODO (BB: 00000601) - // 05 = TODO (BB: 00000602) - // 06 = TODO (BB: 00000603) - // 07 = TODO (BB: 00000604) - // 08 = TODO (BB: 00000605) - // 09 = TODO (BB: 00000606) - // 0A = TODO (BB: 00000607) - // Crater Interior: - // 00 = TODO (BB: 00000658) - // 01 = TODO (BB: 00000659) - // 02 = TODO (BB: 0000065A) - // 03 = TODO (BB: 0000065B) - // 04 = TODO (BB: 0000065C) - // 05 = TODO (BB: 0000065D) - // 06 = TODO (BB: 0000065E) - // 07 = TODO (BB: 0000065F) - // 08 = TODO (BB: 00000660) - // 09 = TODO (BB: 00000661) - // 0A = TODO (BB: 00000662) - // Desert: - // 00 = TODO (BB: 000006AE) - // 01 = TODO (BB: 000006AF) - // 02 = TODO (BB: 000006B0) - // 03 = TODO (BB: 000006B1) - // 04 = TODO (BB: 000006B2) - // 05 = TODO (BB: 000006B3) - // 06 = TODO (BB: 000006B4) - // 07 = TODO (BB: 000006B5) - // 08 = TODO (BB: 000006B6) - // 09 = TODO (BB: 000006B7) - // 0A = TODO (BB: 000006B8) - // 0B = TODO (BB: 000006B9) - // 0C = TODO (BB: 000006BA) - // 0D = TODO (BB: 000006BB) - // 0E = TODO (BB: 000006BC) - // 0F = TODO (BB: 000006BD) - // 10 = TODO (BB: 000006BE) - // param5 = volume (in range -0x7F to 0x7F) - {0x0006, "TObjEnvSound"}, - - // Fog collision object. Params: - // param1 = radius - // param4 = fog entry number; if lower than the existing fog number, - // does nothing (if param4 is >= 0x1000, the game subtracts 0x1000 - // from it, but only after comparing it to the current fog number; - // this can be used to override a later fog with an earlier fog) - // param5 = transition type (0 = fade in, 1 = instantly switch) - {0x0007, "TObjFogCollision"}, - - // Event collision object. This object triggers a wave event (W-XXX) when - // any local player (in split-screen play, there may be multiple) steps - // within its radius. The object is inactive for 3 frames after it is - // constructed, and will not detect any player during that time. - // Curiously, the frame counter does not appear to be bounded, so if the - // player waits approximately 828 days, the counter will overflow to a - // positive number and the object won't be able to trigger for another - // 828 days until it gets to zero again. It is unlikely this has ever - // happened for any player. Params: - // param1 = radius - // param4 = event ID - {0x0008, "TObjEvtCollision"}, - - // TODO: Describe this object. Params: - // param1 = TODO - // param2 = TODO - // param3 = TODO (it only matters whether this is negative or not) - {0x0009, "TObjCollision"}, - - // Elemental trap. Params: - // param1 = trigger radius delta (actual radius is param1 / 2 + 30) - // param2 = explosion radius delta (actual radius is param2 / 2 + 60) - // param3 = trap group number: - // negative = trap triggers and explodes alone - // 00 = trap follows player who triggered it (online only; when - // offline, these act as if the group number were negative, and - // param6 is overwritten with 30 (1 second)) - // positive = trap is part of a group that all trigger and explode - // simultaneously - // param4 = trap power (clamped below to 0), scaled by difficulty: - // Normal: power = param4 * 1 - // Hard: power = param4 * 3 - // Very Hard: power = param4 * 5 - // Ultimate: power = param4 * 14 - // param5 = damage type (clamped to [0, 5]) - // 00 = direct damage (damage = power / 5) - // 01 = fire (damage = power * (100 - EFR) / 500) - // 02 = cold (can freeze; damage = power * (100 - EIC) / 500) - // chance of freezing = ((((power - 250) / 40) + 5) / 40) clamped - // to [0, 0.4], or to [0.2, 0.4] on Ultimate - // 03 = electric (can shock; damage = power * (100 - EIC) / 500) - // chance of shock = 1/15, or 1/40 on Ultimate - // 04 = light (damage = power * (100 - ELT) / 500) - // 05 = dark (instantly kills with chance (power - EDK) / 100); if - // used in a boss arena and in non-Ultimate mode, cannot kill - // param6 = number of frames between trigger and explosion - {0x000A, "TOMineIcon01"}, - - // Status trap. Params: - // param1 = trigger radius delta (actual radius is param1 / 2 + 30) - // param2 = explosion radius delta (actual radius is param2 / 2 + 60) - // param3 = trap group number (same as in TOMineIcon01) - // param4 = trap power (same as in TOMineIcon01) - // param5 = trap type (clamped to [0x0F, 0x12]) - // 0F = poison - // 10 = paralysis - // 11 = slow - // 12 = confuse - // param6 = number of frames between trigger and explosion - {0x000B, "TOMineIcon02"}, - - // Heal trap. Params: - // param1 = trigger radius delta (actual radius is param1 / 2 + 30) - // param2 = explosion radius delta (actual radius is param2 / 2 + 60) - // param3 = trap group number (same as in TOMineIcon01) - // param4 = trap power (same as in TOMineIcon01) - // param5 = trap type (clamped to [6, 8]) - // 06 = heal HP (amount = power) - // 07 = clear negative status effects - // 08 = does nothing? (TODO: calls player->vtable[0x40], but that - // function does nothing on v3. Did this do something in v1 or v2?) - // param6 = number of frames between trigger and explosion - {0x000C, "TOMineIcon03"}, - - // Large elemental trap. Params: - // param1 = trigger radius delta (actual radius is param1 / 2 + 60) - // param2 = explosion radius delta (actual radius is param2 / 2 + 120) - // param3 = trap group number (same as in TOMineIcon01) - // param4 = trap power (same as in TOMineIcon01) - // param5 = trap type (same as in TOMineIcon01) - // param6 = number of frames between trigger and explosion - {0x000D, "TOMineIcon04"}, - - // Room ID. Params: - // param1 = radius (actual radius = (param1 * 10) + 30) - // param2 = next room ID - // param3 = previous room ID - // param5 = angle - // param6 = TODO (debug info calls this "BLOCK ID"; seems it only - // matters whether this is 0x10000 or not) - {0x000E, "TObjRoomId"}, - - // Sensor of some kind (TODO). Params: - // param1 = activation radius delta (actual radius = param1 + 50) - // param4 = switch flag number - // param5 = update mode switch (TODO; param5 < 0 sets update_mode = - // PERMANENTLY_ON, otherwise TEMPORARY; see TOSensor_vF) - {0x000F, "TOSensorGeneral01"}, - - // Lens flare effect. This object is not constructed in offline multi - // mode. Params: - // param1 = visibility radius (if negative, visible everywhere) - {0x0011, "TEF_LensFlare"}, - - // Quest script trigger. Starts a quest thread at a specific label when - // the local player goes near the object. Params: - // param1 = radius - // param4 = label number to call when local player is within radius - {0x0012, "TObjQuestCol"}, - - // Healing ring. Removes all negative status conditions and adds 9 HP and - // 9 TP per frame until max HP/TP are both reached or the player leaves - // the radius. The radius is a fixed size. - {0x0013, "TOHealGeneral"}, - - // Invisible map collision. Params: - // param1-3 = box dimensions (x, y, z; rotated by angle fields) - // param4 = wall type: - // 00 = custom (see param5) - // 01 = blocks enemies only (as if param5 = 00008000) - // 02 = blocks enemies and players (as if param5 = 0x00008900) - // 03 = blocks enemies and players, but enemies can see targets - // through the collision (as if param5 = 0x00000800) - // 04 = blocks players only (as if param5 = 00002000) - // 05 = undefined behavior due to missing bounds check - // anything else = same as 01 - // param5 = flags (bit field; used if param4 = 0) (TODO: describe bits) - {0x0014, "TObjMapCsn"}, - - // Like TObjQuestCol, but requires the player to press a controller - // button to trigger the call. Parameters are the same as for - // TObjQuestCol. - {0x0015, "TObjQuestColA"}, - - // TODO: Describe this object. Params: - // param1 = radius (if negative, 30 is used) - {0x0016, "TObjItemLight"}, - - // Radar collision. Params: - // param1 = radius - // param4 = TODO - {0x0017, "TObjRaderCol"}, - - // Fog collision. Same params as 0x0007 (TObjFogCollision), but also: - // param3 = if >= 1, fog is on when switch flag is on; otherwise, fog - // is on when switch flag is off - // param6 = switch flag number - {0x0018, "TObjFogCollisionSwitch"}, - - // Boss teleporter. The destination cannot be changed; it always - // teleports the player to the boss arena for the current area. In - // Challenge mode, the game uses the current area number to determine the - // destination floor, but in other modes, it uses the current episode - // number and floor number (not area number). Assuming areas haven't been - // reassigned from the defaults in non-Challenge mode, the mapping is: - // Challenge (indexed by area number, not floor number): - // Episode 1: - // Pioneer 2, boss arenas, lobby, battle areas => Pioneer 2 - // Forest 1 and 2 => Dragon - // Cave 1, 2, and 3 => De Rol Le - // Mine 1 and 2 => Vol Opt - // Ruins 1, 2, and 3 => Dark Falz - // Episode 2: - // Lab, boss arenas, Seaside Night, Tower => Lab - // VR Temple A and B => Barba Ray - // VR Spaceship A and B => Gol Dragon - // Central Control Area (but not Seaside Night) => Gal Gryphon - // Seabed => Olga Flow - // Episode 4: - // Pioneer 2, boss arena => Pioneer 2 - // Crater, Desert, test map => Saint-Milion arena - // Params: - // param5 = switch flag number required to activate warp (>= 0x100 = no - // switch flag required; ignored if on Pioneer 2) - {0x0019, "TObjWarpBossMulti(off)/TObjWarpBoss(on)"}, - - // Sign board. This shows the loaded image from a quest (via load_pvr). - // Params: - // param1-3 = scale factors (x, y, z) - {0x001A, "TObjSinBoard"}, - - // Quest floor warp. This appears similar to TObjAreaWarpForest except - // that the object is not destroyed immediately if it's blue and the game - // is Challenge mode. Params: - // param1 = player set ID (TODO: what exactly does this do? Looks like it - // does nothing unless it's >= 2) - // param4 = destination floor - // param6 = color (0 = blue, 1 = red) - {0x001B, "TObjAreaWarpQuest"}, - - // Ending movie warp (used in final boss arenas after the boss is - // defeated). Params: - // param6 = color (0 = blue, 1 = red) - {0x001C, "TObjAreaWarpEnding"}, - - // Star light effect. - // This object renders from -100 to 740 over x and -100 to 580 over y. - // Params: - // param1 = TODO - // param2 = TODO - // param3 = TODO - // param4 = TODO - // param5 = TODO - // param6 = TODO - {0x001D, "TEffStarLight2D_Base"}, - - // VR Temple Beta / Barba Ray lens flare effect. - // This object renders from -10 to 650 over x and -10 to 490 over y. - {0x001E, "__LENS_FLARE__"}, - - // Hides the area map when the player is near this object. Params: - // param1 = radius - // TODO: Test this. - {0x001F, "TObjRaderHideCol"}, - - // Item-detecting floor switch. Params: - // param1 = radius - // param4 = switch flag number - // param5 = item type: - // 0 or any value not listed below = any item - // 1 = weapon - // 2 = armor - // 3 = shield - // 4 = unit - // 5 = mag - // 6 = tool - // 7 = meseta - // param6 = item amount required minus 1 (0 = 1 item, 1 = 2 items, etc.); - // for tools and meseta, each dropped item counts for its stack size - {0x0020, "TOSwitchItem"}, - - // Symbol chat collision object. This object triggers symbol chats when - // the players are nearby and certain switch flags are NOT set. If a - // player is within the radius, the object checks the switch flags in - // reverse order, and triggers the symbol chat for the latest one that is - // NOT set. So, the logic is: - // - If all 3 switch flags are not set, the symbol chat in spec1 is used - // - If the switch flag in spec1 is set and those in spec2 and spec3 are - // not set, the symbol chat in spec2 is used - // - If the switch flag in spec2 is set and the flag in spec3 is not set, - // the symbol chat in spec3 is used regardless of whether the switch - // flags in spec1 is set - // - If the switch flags in spec3 is set, no symbol chat appears at all - // regardless of the values of the other two switch flags - // Each spec is a 32-bit integer consisting of two 16-bit fields. The - // high 16 bits are a switch flag number (0-255), and the low 16 bits are - // an entry index from symbolchatcolli.prs. The entry index is ignored if - // the corresponding data label from the F8A6 quest opcode is not null - // (and the data from the label is used instead). Quest scripts don't - // have a good way to pass null for regsA[7-9], so the logic that looks - // up entries in symbolchatcolli.prs can be ignored in quests. - // Default symbol chat numbers (from qedit.info): - // 00 = Drop Meseta - // 01 = Meseta has been dropped - // 02 = Drop 1 weapon - // 03 = Drop 4 weapons - // 04 = Drop 1 shield - // 05 = Drop 4 shields - // 06 = Drop 1 mag - // 07 = Drop 4 mags - // 08 = Drop tool item - // 09 = ???? - // 0A = XXXX - // 0B = All circles like OK - // 0C = Key with Yes - // 0D = Key with Cool - // 0E = Key with ... - // 0F = Go right - // 10 = Go left - // 11 = Push button with gun - // 12 = Key icons - // 13 = Key has been pressed - // 14 = Run/go - // 15 = Push 1 button on - // 16 = Push 2 button on - // 17 = Clock (hurry) - // Params: - // param1 = radius - // param4 = spec1 - // param5 = spec2 - // param6 = spec3 - // This object can also be created by the quest opcode F8A6; see the - // description of that opcode in QuestScript.cc for more information. - {0x0021, "TOSymbolchatColli"}, - - // Invisible collision switch. Params: - // param1 = radius delta (actual radius is param1 + 10) - // param4 = switch flag number - // param5 = sticky flag (if negative, switch flag is unset when player - // leaves; if zero or positive, switch flag remains on) - {0x0022, "TOKeyCol"}, - - // Attackable collision. Params: - // param1 = enable switch flag (the object is only attackable if this - // switch flag is enabled); any value > 0xFF disables this behavior - // so the object is always attackable - // param2 = if negative, no target reticle appears; if zero or - // positive, a reticle appears - // param3 = switch flag number to set when required number of hits is - // taken (ignored if param6 is nonzero) - // param4 = number of hits required to activate, minus 1 (so e.g. a - // value of 4 here means 5 hits needed) - // param5 = object number (if outside the range [100, 999], uses the - // free play script when looking up param6 instead of the quest) - // param6 = quest label to call when required number of hits is taken - // (if zero, switch flag in param3 is set instead) - {0x0023, "TOAttackableCol"}, - - // Damage effect. Params: - // angle.x = effect type (in range [0x00, 0x14]; TODO: list these) - // param1 = damage radius - // param2 = damage value, scaled by difficulty: - // Normal: param2 * 2 - // Hard: param2 * 4 - // Very Hard: param2 * 6 - // Ultimate: param2 * 8 - // param3 = effect visual size - // param4 = enable switch flag number (effect is off unless this flag - // is set) - // param5 = disable switch flag number (effect is off if this flag is - // set, even if the enable switch flag is also set), or >= 0x100 if - // this functionality isn't needed - // param6 = persistence flag (if nonzero, effect stays on once enabled) - {0x0024, "TOSwitchAttack"}, - - // Switch flag timer. This object watches for a switch flag to be - // activated, then once it is, waits for a specified time, then disables - // that switch flag and activates up to three other switch flags. Note - // that this object just provides the timer functionality; the trigger - // switch flag must be activated by some other object. Params: - // angle.x = trigger mode: - // 0 = disable watched switch flag when timer expires - // any other value = enable up to 3 other switch flags when timer - // expires and don't disable watched switch flag - // angle.y = if this is 1, play tick sound effect every second after - // activation (if any other value, no tick sound is played) - // angle.z = timer duration in frames - // param4 = switch flag to watch for activation in low 16 bits, switch - // flag 1 to activate when timer expires (if angle.x = 0) in high 16 - // bits (>= 0x100 if not needed) - // param5 = switch flag 2 to activate when timer expires (if - // angle.x = 0) in high 16 bits (>= 0x100 if not needed) - // param6 = switch flag 3 to activate when timer expires (if - // angle.x = 0) in high 16 bits (>= 0x100 if not needed) - {0x0025, "TOSwitchTimer"}, - - // Chat sensor. This object watches for chat messages said by players - // within its radius, optionally filtering for specific words. When a - // message matches, it either activates a switch flag or calls a quest - // function. When created via the F801 quest opcode, param5 is ignored, - // and the string specified by the quest is always used. Params: - // angle.x = activation type (0 = quest function, 1 = switch flag) - // angle.y = match mode: - // 0 = match a specific string (defined by param5) - // 1 = match any string - // anything else = never match anything - // param1 = radius - // param4 = switch flag number or quest label number - // param5 = trigger string - // 0 = any string (TODO: Is this true?) - // 1 = "YES" - // 2 = "COOL" - // 3 = "NO" - {0x0026, "TOChatSensor"}, - - // Radar map icon. Shows an icon on the map that is optionally locked or - // unlocked, depending on the values of one or more sequential switch - // flags. The icon is considered unlocked if all of the specified switch - // flags are set. There can be at most 12 switch flags used with this - // object and the switch flag numbers cannot wrap around from 0xFF to 0. - // Params: - // param1 = scale (1.0 = normal size) - // param4 = check switch flags for color: - // positive value = ignore param6; color is red (FFFF0000) if any of - // the switch flags are off, or green (FF00FF00) if all are on - // zero or negative = ignore param5; always render in the color - // specified by param6 - // param5 = switch flag spec; upper 16 bits are number of switch flags, - // lower 16 bits are first switch flag number - // param6 = color as ARGB8888 - {0x0027, "TObjRaderIcon"}, - - // Environmental sound. This object is not constructed in offline multi - // mode. This is essentially identical to TObjEnvSound, except the sound - // fades in and out instead of abruptly starting or stopping when - // entering or leaving its radius. Params: - // param2 = volume fade speed (units per frame) - // param3 = audibility radius (same as for TObjEnvSound) - // param4 = sound ID (same as for TObjEnvSound) - // param5 = volume (same as for TObjEnvSound) - {0x0028, "TObjEnvSoundEx"}, - - // Environmental sound. This object is not constructed in offline multi - // mode. This is essentially identical to TObjEnvSound, except there is - // no radius: the sound is audible everywhere. Params: - // param4 = sound ID (same as for TObjEnvSound) - // param5 = volume (same as for TObjEnvSound) - {0x0029, "TObjEnvSoundGlobal"}, - - // Counter sequence activator. Used for Hunter's Guild, shops, bank, etc. - // Params: - // param4 = shop sequence number: - // Episodes 1, 2, and 4: - // 00 = weapon shop - // 01 = medical center - // 02 = armor shop - // 03 = tool shop - // 04 = Hunter's Guild - // 05 = check room - // 06 = tekker - // 07 = government counter (BB only) - // 08 = "GIVEAWAY" (BB only) - // Episode 3: - // 00 = unused (DUMMY0) - // 01 = unused (DUMMY1) - // 02 = unused (DUMMY2) - // 03 = unused (DUMMY3) - // 04 = unused (DUMMY4) - // 05 = unused (DUMMY5) - // 06 = unused (DUMMY6) - // 07 = deck edit counter - // 08 = entry counter - // 09 = left-side card trade kiosk - // 0A = right-side card trade kiosk - // 0B = auction counter - // 0C = hidden entry counter - // 0D = Pinz's Shop - {0x0040, "TShopGenerator"}, - - // Telepipe city location. Params: - // param4 = owner client ID (0-3) - {0x0041, "TObjLuker"}, - - // BGM collision. Changes the background music when the player enters the - // object's radius. Params: - // param1 = radius - // param4 = which music to play: - // 00 = SHOP.adx - // 01 = GUILD.adx - // 02 = MEDICAL.adx - // 03 = soutoku.adx - // 04 = city.adx - // 05 = labo.adx - // anything else = value is taken modulo 6 and used as above - {0x0042, "TObjBgmCol"}, - - // Main warp to other floors from Pioneer 2. - // Certain floors are available by default, determined by checking the - // game's mode and quest flags. A different set of flags is checked on BB - // than on other versions, presumably since government quests are used to - // unlock areas instead of offline story progression. On later versions - // of BB, all floors are available by default; this table reflects the - // behavior before that change. - // Required flag for mode: Online/multi Offline BB flag - // Episode 1: - // Forest 1: Always open Always open Always open - // Cave 1: 0x17 0x18 0x1F9 - // Mine 1: 0x20 0x21 0x201 - // Ruins 1: 0x30 0x2A 0x207 - // Episode 2: - // VR Temple Alpha: Always open Always open Always open - // VR Spaceship Alpha: 0x4C 0x4D 0x21B - // CCA: 0x4F 0x50 0x225 - // Seabed Upper: 0x52 0x53 0x22F - // Episode 4: - // Crater East Always open - // Crater West 0x2BD - // Crater South 0x2BE - // Crater North 0x2BF - // Crater Interior 0x2C0 - // Subterranean Desert 1 0x2C1 - // Params: - // param5 = main warp type: - // 00 = Episode 1 / Episode 4 - // 01 = Ep2 VR Temple / VR Spaceship (CCA and Seabed not available) - // 02 = Ep2 CCA (VR Temple and Spaceship not available) - {0x0043, "TObjCityMainWarp"}, - - // Lobby teleporter. When used, this object immediately ends the current - // game and sends the player back to the lobby. If constructed offline, - // this object will do nothing and not render. - // This object takes no parameters. - {0x0044, "TObjCityAreaWarp"}, - - // Warp to another location on the same map. Used for the Principal's - // office warp. This warp is visible in all game modes, but cannot be - // used in Battle or Challenge mode. Params: - // param1-3 = destination (same as for TObjMapWarpForest) - // param4 = destination angle (same as for TObjMapWarpForest) - // param6 = destination text (clamped to [0, 2]): - // 00 = "The Principal" - // 01 = "Pioneer 2" - // 02 = "Lab" - {0x0045, "TObjCityMapWarp"}, - - // City doors. None of these take any parameters. - {0x0046, "TObjCityDoor_Shop"}, // Door to shop area - {0x0047, "TObjCityDoor_Guild"}, // Door to Hunter's Guild - {0x0048, "TObjCityDoor_Warp"}, // Door to Ragol warp - {0x0049, "TObjCityDoor_Med"}, // Door to Medical Center - - // TODO: Describe this object. There appear to be no parameters. - {0x004A, "__ELEVATOR__"}, // Not named in the client - - // Holiday event decorations. There appear to be no parameters, except - // TObjCity_Season_SonicAdv2, which takes param4 = model index (clamped - // to [0, 3]). - {0x004B, "TObjCity_Season_EasterEgg"}, - {0x004C, "TObjCity_Season_ValentineHeart"}, - {0x004D, "TObjCity_Season_XmasTree"}, - {0x004E, "TObjCity_Season_XmasWreath"}, - {0x004F, "TObjCity_Season_HalloweenPumpkin"}, - {0x0050, "TObjCity_Season_21_21"}, - {0x0051, "TObjCity_Season_SonicAdv2"}, - {0x0052, "TObjCity_Season_Board"}, - - // Fireworks effect. Params: - // param1 = area width - // param2 = base height - // param3 = area depth - // param4 = launch frequency (when a firework is launched, the game - // generates a random number R in range [0, 0x7FFF] and waits - // ((param4 + 60) * (r / 0x8000) * 3.0)) frames before launching the - // next firework) - {0x0053, "TObjCity_Season_FireWorkCtrl"}, - - // Door that blocks the lobby teleporter in offline mode. There appear to - // be no parameters. - {0x0054, "TObjCityDoor_Lobby"}, - - // Version of the main warp for Challenge mode? This object seems to - // behave similarly to boss teleporters; it shows the player a Yes/No - // confirmation menu and sends 6x6A to synchronize state. There is a - // global named last_set_mainwarp_value which is set to param4 when this - // object is constructed, but may be changed by a set_mainwarp quest - // opcode after that. If that happens, this object replaces its - // dest_floor with the floor specified in the last set_mainwarp quest - // opcode. Params: - // param4 = destination floor - // param5 = switch flag number - // Availability: v2+ only - // TODO: This thing has a lot of code; figure out if there are any other - // parameters - {0x0055, "TObjCityMainWarpChallenge"}, - - // Episode 2 Lab door. Params: - // param4 = switch flag number and activation mode: - // negative value = always unlocked - // value in [0x00, 0x100] = unlocked by a switch flag (the bounds - // check appears to be a bug; the range should be [0x00, 0xFF] but - // the game has an off-by-one error) - // value > 0x100 = always locked - // param5 = model (green or red; clamped to [0, 1]) - // param6 = if negative, all switches must be active simultaneously to - // unlock the door; if zero or positive, they may be activated - // sequentially instead (in offline solo mode, this is ignored and - // the sequential behavior is always used); this is somewhat obviated - // for this door type since it can have only one switch flag, but - // other door types may have multiple, for which this is relevant - // Availability: v3+ only - {0x0056, "TODoorLabo"}, - - // Enables the Trade Window when the player is near this object. Both - // players must be near a TObjTradeCollision object (not necessarily the - // same one) to be able to use the Trade Window with each other. Params: - // param1 = radius - // Availability: v3+ only - {0x0057, "TObjTradeCollision"}, - - // TODO: Describe this object. Presumably similar to TObjTradeCollision - // but enables the deck edit counter? Params: - // param1 = radius - // Availability: Ep3 only - {0x0058, "TObjDeckCollision"}, - - // Forest door. Params: - // param4 = switch flag number (low byte) and number to appear on door - // (second-lowest byte, modulo 0x0A) - // param6 = TODO (expected to be 0 or 1) - {0x0080, "TObjDoor"}, - - // Forest switch. Params: - // param4 = switch flag number - // param6 = color (clamped to range [0, 9]) - {0x0081, "TObjDoorKey"}, - - // Laser fence and square laser fence. Params: - // param1 = color (range [0, 3]) - // param4 = switch flag number - // param6 = model (TODO) - {0x0082, "TObjLazerFenceNorm"}, - {0x0083, "TObjLazerFence4"}, - - // Forest laser fence switch. Params: - // param4 = switch flag number - // param6 = color - {0x0084, "TLazerFenceSw"}, - - // Light rays. Params: - // param1 = TODO - // param2 = vertical scale (y) - // param3 = horizontal scale (x, z) - {0x0085, "TKomorebi"}, - - // Butterfly. Params: - // param1-3 = TODO - {0x0086, "TButterfly"}, - - // TODO: Describe this object. Params: - // param1 = model number - {0x0087, "TMotorcycle"}, - - // Item box. Params: - // param1 = if positive, box is specialized to drop a specific item or - // type of item; if zero or negative, box drops any common item or - // none at all (and param3-6 are all ignored) - // param3 = if zero, then bonuses, grinds, etc. are applied to the item - // after it's generated; if nonzero, the item is not randomized at - // all and drops exactly as specified in param4-6 - // param4-6 = item definition. see base_item_for_specialized_box in - // ItemCreator.cc for how these values are decoded - // In the non-specialized case (param1 <= 0), param3-6 are still sent via - // the 6xA2 command when the box is opened on v3 and later, and the - // server may choose to use those parameters for some purpose. The client - // implementation ignores them when param1 <= 0, and newserv does too. - {0x0088, "TObjContainerBase2"}, - - // Elevated cylindrical tank. Params: - // param1-3 = TODO - {0x0089, "TObjTank"}, - - // TODO: Describe this object. Params: - // param1-3 = TODO - // Availability: vv1/v2+ only - {0x008A, "TObjBattery"}, - - // Forest console. Params: - // param4 = quest label to call when activated (inherited from - // TObjMesBase) - // param5 = model (clamped to [0, 1]) - // param6 = type (clamped to [0, 1]; 0 = "QUEST", 1 = "RICO") - // (inherited from TObjMesBase) - {0x008B, "TObjComputer"}, - - // Black sliding door. Params: - // param1 = total distance (divided evenly by the number of switch - // flags, from param4) - // param2 = speed - // param4 = base switch flag (the actual switch flags used are param4, - // param4 + 1, param4 + 2, etc.) - // param5 = number of switch flags (clamped to [1, 4]) - // param6 = TODO (only matters if this is zero or nonzero) - {0x008C, "TObjContainerIdo"}, - - // Rico message pod. This object immediately destroys itself in Challenge - // mode or split-screen mode. Params: - // param4 = enable condition: - // negative = enabled when player is within 70 units - // range [0x00, 0xFF] = enabled by corresponding switch flag - // 0x100 and above = never enabled - // param5 = message number (used with message quest opcode; TODO: has - // the same [100, 999] check as some other objects) - // param6 = quest label to call when activated - {0x008D, "TOCapsuleAncient01"}, - - // Energy barrier. Params: - // param4 = switch flag number and activation mode (same as for - // TODoorLabo) - {0x008E, "TOBarrierEnergy01"}, - - // Forest rising bridge. Once enabled (risen), this object cannot be - // disabled; that is, there is no way to make the bridge retract. When - // disabled, the bridge is 30 units below its initial position; when - // enabled, it rises to its initial position. Params: - // param2 = rise speed in units per frame - // param4 = switch flag number - {0x008F, "TObjHashi"}, - - // Generic switch. Visually, this is the type usually used for objects - // other than doors, such as lights, poison rooms, and the Forest 1 - // bridge. Params: - // param1 = activation mode: - // negative = temporary (TODO: test this) - // zero or positive = permanent (normal) - // param4 = switch flag number - {0x0090, "TOKeyGenericSw"}, - - // Box that triggers a wave event when opened. Params: - // param4 = event number - {0x0091, "TObjContainerEnemy"}, - - // Large box (usually used for specialized drops). Same parameters as - // 0x0088 (TObjContainerBase2) - {0x0092, "TObjContainerBase"}, - - // Large enemy box. Same parameters as 0x0091 (TObjContainerEnemy). - {0x0093, "TObjContainerAbeEnemy"}, - - // Always-empty box. - // Availability: v2+ only - {0x0095, "TObjContainerNoItem"}, - - // Laser fence. This object is only available in v2 and later. Params: - // param1 = color (clamped to [0, 3]) - // param2 = depth of collision box (transverse to lasers) - // param3 = length of collision box (parallel to lasers) - // param4 = switch flag number - // param6 = model: - // 0 = short fence - // 1 = long fence - // anything else = invisible - // Availability: v2+ only - {0x0096, "TObjLazerFenceExtra"}, - - // Caves floor button. The activation radius is always 10 units. Params: - // param4 = switch flag number - // param5 = activation mode: - // negative = temporary (disables flag when player leaves) - // zero or positive = permanent - {0x00C0, "TOKeyCave01"}, - - // Caves multiplayer door. Params: - // param4 = base switch flag number (the actual switch flags used are - // param4, param4 + 1, param4 + 2, etc.; if this is negative, the - // door is always unlocked) - // param5 = 4 - number of switch flags (so if e.g. door should require - // only 3 switch flags, set param5 to 1) - // param6 = synchronization mode: - // negative = when all switch flags are enabled, door is permanently - // unlocked via 6x0B even if some switch flags are disabled later - // zero or positive = door only stays unlocked while all of the - // switch flags are active and locks again when any are disabled - // (no effect in single-player offline mode; the negative behavior - // is used instead) - {0x00C1, "TODoorCave01"}, - - // Caves standard door. Params: - // param4 = switch flag number (negative = always unlocked; >0x100 = - // always locked) - {0x00C2, "TODoorCave02"}, - - // Caves ceiling piston trap. There are three types of this object, which - // can be choseby via param6. If param6 is not 0, 1, or 2, no object is - // created. - // Params for TOHangceilingCave01Normal (param6 = 0): - // param1 = TODO (radius delta? value is param1 + 29) - // param2 = TODO (value is 1 - param2) - // param3 = TODO (value is param3 + 100) - // Params for TOHangceilingCave01Key (param6 = 1): - // param1-3 = same as for TOHangceilingCave01Normal - // param4 = switch flag number (drops when switch flag is activated; - // when it has finished dropping, it disables the switch flag) - // Params for TOHangceilingCave01KeyQuick (param6 = 2): - // param1-4 = same as for TOHangceilingCave01Key, but unlike that - // 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 is 1 / (param4 + 30)) - // param6 = visibility radius? (TODO; value 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"}, - - // Caves cake shop. There appear to be no parameters. - {0x00D0, "TOCakeshopCave01"}, - - // Various solid rock objects used in the Cave areas. There are small, - // medium, and large variations of each, and for the 02 variations, there - // are also "Simple" variations (00D7-00D9). None of these objects take - // any parameters. - {0x00D1, "TORockCaveS01"}, - {0x00D2, "TORockCaveM01"}, - {0x00D3, "TORockCaveL01"}, - {0x00D4, "TORockCaveS02"}, - {0x00D5, "TORockCaveM02"}, - {0x00D6, "TORockCaveL02"}, - {0x00D7, "TORockCaveSS02"}, - {0x00D8, "TORockCaveSM02"}, - {0x00D9, "TORockCaveSL02"}, - {0x00DA, "TORockCaveS03"}, - {0x00DB, "TORockCaveM03"}, - {0x00DC, "TORockCaveL03"}, - - // Caves floor button 2. Params: - // param1-3 = scale factors (visual only) - // param4 = switch flag number - // param5 high word = sound delay in frames after activate/deactivate - // param5 low word = model index for VR Temple / VR Spaceship? (there - // are only two: this word may be zero or nonzero) - // param6 high word = sound activation mode: - // 1 = play sound only when switch activated - // anything else = play sound when activated and when deactivated - // param6 low word = sound to play (1-6) (TODO: Describe these): - // 1 => 4005281F (GC) - // 2 => 00053F06 (GC) - // 3 => 00052812 (GC) - // 4 => 00052813 (GC) - // 5 => 4001C112 (GC) - // 6 => 4002A60B (GC) - // TODO: Are there more sounds available here on BB? - // Availability: v2+ only - {0x00DE, "TODummyKeyCave01"}, - - // Breakable rocks, in small, medium, and large variations. All of these - // take the following parameter: - // param4 = switch flag number - // Availability: v2+ only - {0x00DF, "TORockCaveBL01"}, - {0x00E0, "TORockCaveBL02"}, - {0x00E1, "TORockCaveBL03"}, - - // Mines multi-switch door. Params: - // param4 = base switch flag number (the actual switch flags used are - // param4, param4 + 1, param4 + 2, etc.; if this is negative, the - // door is always unlocked) - // param5 = 4 - number of switch flags (so if e.g. door should require - // only 3 switch flags, set param5 to 1) - {0x0100, "TODoorMachine01"}, - - // Mines floor button. The activation radius is always 10 units. Params: - // param4 = switch flag number - // param5 = activation mode: - // negative = temporary (disables flag when player leaves) - // zero or positive = permanent - {0x0101, "TOKeyMachine01"}, - - // Mines single-switch door. Params: - // param4 = switch flag number - {0x0102, "TODoorMachine02"}, - - // Large cryo-tube. There appear to be no parameters. - {0x0103, "TOCapsuleMachine01"}, - - // Computer. Same parameters as 0x008D (TOCapsuleAncient01). - {0x0104, "TOComputerMachine01"}, - - // Green monitor. Params: - // param4 = initial state? (clamped to [0, 3]; appears to cycle through - // those 4 values on its own) - {0x0105, "TOMonitorMachine01"}, - - // Floating robot. Same params as 0x00CD (TODragonflyCave01), though it - // appears that some may have different scale factors or offsets (TODO). - {0x0106, "TODragonflyMachine01"}, - - // Floating blue light. Params: - // param4 = TODO - // param5 = TODO - // param6 = TODO - {0x0107, "TOLightMachine01"}, - - // Self-destructing objects. Params: - // param1 = radius delta (actual radius is param1 + 30) - {0x0108, "TOExplosiveMachine01"}, - {0x0109, "TOExplosiveMachine02"}, - {0x010A, "TOExplosiveMachine03"}, - - // Spark machine. Params: - // param1 = TODO (value is param1 - 0.98) - // param2 = TODO (seems it only matters if this is <= 0 or not) - {0x010B, "TOSparkMachine01"}, - - // Large flashing box. Params: - // param2 = TODO (seems it only matters if this is < 0 or not) - {0x010C, "TOHangerMachine01"}, - - // Ruins entrance door (after Vol Opt). This object reads quest flags - // 0x2C, 0x2D, and 0x2E to determine the state of each seal on the door - // (for Forest, Caves, and Mines respectively). It then checks quest flag - // 0x2F; if this flag is set, then all seals are unlocked regardless of - // the preceding three flags' values. Curiously, it seems that these - // flags are checked every frame, even though it's normally impossible to - // change their values in the area where this object appears. - // No parameters. - {0x0130, "TODoorVoShip"}, - - // Ruins floor warp. Params: - // param4 = destination floor - // param6 = color (negative = red, zero or positive = blue); if this is - // >= 0 in Challenge mode, the warp is destroyed immediately - {0x0140, "TObjGoalWarpAncient"}, - - // Ruins intra-area warp. Same parameters as 0x0003 (TObjMapWarpForest), - // but also: - // param5 = type (negative = one-way, zero or positive = normal) - {0x0141, "TObjMapWarpAncient"}, - - // Ruins switch. Same parameters as 0x00C0 (TOKeyCave01). - {0x0142, "TOKeyAncient02"}, - - // Ruins floor button. Same parameters as 0x00C0 (TOKeyCave01). - {0x0143, "TOKeyAncient03"}, - - // Ruins doors. These all take the same params as 0x00C2 (TODoorCave02). - {0x0144, "TODoorAncient01"}, // Usually used in Ruins 1 - {0x0145, "TODoorAncient03"}, // Usually used in Ruins 3 - {0x0146, "TODoorAncient04"}, // Usually used in Ruins 2 - {0x0147, "TODoorAncient05"}, // Usually used in Ruins 1 - {0x0148, "TODoorAncient06"}, // Usually used in Ruins 2 - {0x0149, "TODoorAncient07"}, // Usually used in Ruins 3 - - // Ruins 4-player door. Params: - // param4 = base switch flag number (the actual switch flags used are - // param4, param4 + 1, param4 + 2, and param4 + 3); param4 is clamped - // to [0, 0xFC] - // param6 = activation mode; same as for 0x00C1 (TODoorCave01) - {0x014A, "TODoorAncient08"}, - - // Ruins 2-player door. Params: - // param4 = base switch flag number (the actual switch flags used are - // param4 and param4 + 1); param4 is clamped to [0, 0xFE] - // param6 = activation mode; same as for 0x00C1 (TODoorCave01) - {0x014B, "TODoorAncient09"}, - - // Ruins sensor. Params: - // param1 = activation radius delta (actual radius is param1 + 50) - // param4 = switch flag number - // param5 = if negative, sensor is always on - // param6 = TODO (clamped to [0, 1] - model index?) - {0x014C, "TOSensorAncient01"}, - - // Ruins laser fence switch. Params: - // param1 = if negative, switch's effect is temporary; if zero or - // positive, it's permanent - // param4 = switch flag number - // param5 = color (clamped to [0, 3]) - {0x014D, "TOKeyAncient01"}, - - // Ruins fence objects. Params: - // param4 = switch flag number (negative = always unlocked) - // param5 = color (clamped to [0, 3]) - {0x014E, "TOFenceAncient01"}, // 4x2 - {0x014F, "TOFenceAncient02"}, // 6x2 - {0x0150, "TOFenceAncient03"}, // 4x4 - {0x0151, "TOFenceAncient04"}, // 6x4 - - // Ruins poison-spewing blob. This object is technically an item box, and - // drops an item when destroyed. Unlike most other item boxes, it cannot - // be specialized (ignore_def is always true). Params: - // param1 = TODO (value is param1 + 299) - // param2 = TODO (value is param2 + 209) - // param3 = TODO (value is param3 + 399) - // param6 = TODO (value is param6 + 4) - {0x0152, "TContainerAncient01"}, - - // Ruins falling trap. Trap power seems to be scaled by difficulty - // (Normal = x1, Hard = x2, Very Hard = x3, Ultimate = x6). Params: - // param1 = trigger radius delta (value is (param1 / 2) + 30) - // param2 = TODO (clamped below to 0) - // param3 = TODO (clamped below to 1) - // param4 = TODO (seems it only matters if this is negative or not in - // the base class (TOTrap), but TOTrapAncient01 clamps it below to 0) - // param5 = TODO (clamped to [0, 5]; calls player->vtable[0x19] on - // explode unless this is 5) - // param6 = TODO (value is param6 + 30, multipled by 0.33 if offline) - {0x0153, "TOTrapAncient01"}, - - // Ruins pop-up trap. Params: - // param1 = trigger radius delta (value is (param1 / 2) + 30) - // param4 = delay (value is param4 + 30; clamped below to 0) - // angle.z = TODO (seems it only matters if angle.z is > 0 or not) - {0x0154, "TOTrapAncient02"}, - - // Ruins crystal monument. Same parameters as TOCapsuleAncient01. - {0x0155, "TOMonumentAncient01"}, - - // Non-Ruins monument. Sets a quest flag when activated. The quest flag - // depends on which area the object appears in: - // Mine 2 = 0x2E - // Cave 2 = 0x2D - // Any other area = 0x2C - // When all three of the above quest flags are active, this object also - // sets quest flag 0x2F. - // There appear to be no parameters. - {0x0156, "TOMonumentAncient02"}, - - // Ruins rocks. None of these take any parameters. - {0x0159, "TOWreckAncient01"}, - {0x015A, "TOWreckAncient02"}, - {0x015B, "TOWreckAncient03"}, - {0x015C, "TOWreckAncient04"}, - {0x015D, "TOWreckAncient05"}, - {0x015E, "TOWreckAncient06"}, - {0x015F, "TOWreckAncient07"}, - - // This ID constructs different objects depending on where it's used. On - // floor 0D (Vol Opt), it constructs TObjWarpBoss03; on other floors - // where it's valid, it constructs TObjFogCollisionPoison. - // TObjFogCollisionPoison creates a switchable, foggy area that's visible - // and hurts the player if the switch flag isn't on. Params are the same - // as for 0x0018 (TObjFogCollisionSwitch), but there is also: - // param2 = poison power (scaled by difficulty: Normal = x1, Hard = x2, - // Very Hard = x3, Ultimate = x6) - // TObjWarpBoss03 creates an invisible warp. This is used for the warp - // behind the door to Ruins after defeating Vol Opt. Params: - // param4 = destination floor - {0x0160, "TObjFogCollisionPoison/TObjWarpBoss03"}, - - // Ruins specialized box. Same parameters as 0x0088 (TObjContainerBase2). - {0x0161, "TOContainerAncientItemCommon"}, - - // Ruins random box. Same parameters as 0x0088 (TObjContainerBase2). - {0x0162, "TOContainerAncientItemRare"}, - - // Ruins enemy boxes, disguised as either of the above two objects. - // Params: - // param4 = event number - {0x0163, "TOContainerAncientEnemyCommon"}, - {0x0164, "TOContainerAncientEnemyRare"}, - - // Ruins always-empty box. No parameters. - // Availability: v2+ only - {0x0165, "TOContainerAncientItemNone"}, - - // Ruins breakable rock. Params: - // param4 = switch flag number (when enabled, destroys this object) - // Availability: v2+ only - {0x0166, "TOWreckAncientBrakable05"}, - - // Ruins pop-up trap with techs. Params: - // param1 = trigger radius delta (value is (param1 / 2) + 30) - // param2 = number of hits to destroy trap (clamped to [1, 256]) - // param3 = tech level modifier: - // Normal: level = param3 + 1 (clamped to [0, 14]) - // Hard: level = (param3 * 2) + 1 (clamped to [0, 14]) - // Very Hard: level = (param3 * 4) + 1 (clamped to [0, 14]) - // Ultimate: level = (param3 * 6) + 1 (clamped to [0, 29]) - // (Note: level is offset by 1, so a value of 0 means tech level 1) - // param4 = delay (value is param4 + 30; clamped below to 0) - // param5 = switch flag number (negative = always active) - // param6 = tech number: - // 0 = Foie - // 1 = Gizonde - // 2 = Gibarta - // 3 = Megid - // anything else = Gifoie - // angle.z = TODO (seems it only matters if angle.z is > 0 or not) - // Availability: v2+ only - {0x0167, "TOTrapAncient02R"}, - - // Flying white bird. Params: - // param1 = TODO (value is param1 + 1) - // param2 = TODO (value is param2 + 50) - // param3 = TODO (value is param3 + 100) - // param4 = number of birds? (value is param4 + 3, clamped to [1, 6]) - // param5 = TODO (value is (param5 / 10) + 1) - // param6 = TODO (value is (param6 / 10) + 1) - {0x0170, "TOBoss4Bird"}, - - // Dark Falz obelisk. There appear to be no parameters. - {0x0171, "TOBoss4Tower"}, - - // Floating rocks. Params: - // param1 = x/z range delta? (value is param1 + 50) - // param2 = TODO (value is abs(param2)) - // param4 = number of rocks? (clamped to [1, 8]) - {0x0172, "TOBoss4Rock"}, - - // Floating soul. Params: - // param1 = TODO - // param2 = TODO - // param3 = TODO - // param4 = TODO (seems it only matters if this is negative or not) - // param5 = TODO - // param6 = TODO - // Availability: v1/v2 only - {0x0173, "TOSoulDF"}, - - // Butterfly. This is a subclass of TODragonfly and takes the same params - // as 0x00CD (TODragonflyCave01), but also: - // param6 = model number? (clamped to [0, 2]) - // Availability: v1/v2 only - {0x0174, "TOButterflyDF"}, - - // Lobby information counter (game menu) collision. Params: - // param1 = radius - {0x0180, "TObjInfoCol"}, - - // Warp between lobbies (not warp out of game to lobby). Params: - // param5 = hide beams (beams shown if <= 0, hidden if > 0) - {0x0181, "TObjWarpLobby"}, - - // Lobby 1 event object (tree). Params: - // param4 = default decorations when there is no event: - // 0x01 = flowers (Lobby 2) - // 0x02 = fountains (Lobby 4) - // 0x03 = very tall aquariums (Lobby 5) - // 0x04 = green trees (Lobby 1) - // 0x05 = stained glass windows (Lobby 9) - // 0x06 = snowy evergreen trees (Lobby 10) - // 0x07 = windmills (Lobby 3) - // 0x08 = spectral columns (Lobby 8) - // 0x09 = planetary models (Lobby 7) - // Anything else = grass (Lobby 6) - // Availability: v3+ only - {0x0182, "TObjLobbyMain"}, - - // Lobby pigeon. Params: - // param4 = model number? (clamped to [0, 2]) - // param5 = TODO (3 different behaviors: <= 0, == 1, or >= 2) - // param6 = TODO (it only matters if this is > 0 or not) - // Visibility depends on the current season event in a complicated way: - // If param5 <= 0, visible only when there's no season event - // If param5 == 1 and param6 <= 0, visible during Wedding event - // If param5 == 2 and param6 <= 0, visible during Valentine's Day and - // White Day events - // If none of the above, visible during Halloween event - // Availability: v3+ only - {0x0183, "__LOBBY_PIGEON__"}, // Formerly __TObjPathObj_subclass_0183__ - - // Lobby butterfly. Params: - // param4 = model number (only two models; <= 0 or > 0) - // TODO: Is this object's visibility affected by season events? It may - // only be affected by the event when the object loads, and not when the - // season is changed via the DA command. - // Availability: v3+ only - {0x0184, "TObjButterflyLobby"}, - - // Lobby rainbow. Visible only when there is no season event. There are - // no parameters. - // Availability: v3+ only - {0x0185, "TObjRainbowLobby"}, - - // Lobby pumpkin. Visible only during Halloween season event. There are - // no parameters. - // Availability: v3+ only - {0x0186, "TObjKabochaLobby"}, - - // Lobby stained-glass windows. Params: - // param4 = event flag: - // zero or negative = visible only when no season event is active - // positive = visible only during Christmas season event - // Availability: v3+ only - {0x0187, "TObjStendGlassLobby"}, - - // Lobby red and white striped curtain. Visible only during the spring - // and summer season events (12 and 13). No parameters. - // Availability: v3+ only - {0x0188, "TObjCurtainLobby"}, - - // Lobby wedding arch. Visible only during the wedding season event. No - // parameters. - // Availability: v3+ only - {0x0189, "TObjWeddingLobby"}, - - // Lobby snowy evergreen tree (Lobby 10). No parameters. - // Availability: v3+ only - {0x018A, "TObjTreeLobby"}, - - // Lobby aquarium (Lobby 5). Visible only when there is no season event. - // No parameters. - // Availability: v3+ only - {0x018B, "TObjSuisouLobby"}, - - // Lobby particles. Params: - // param1 = TODO (clamped to [0, 575]) - // param3 = same as param3 from 0001 (TObjParticle) - // param4 = particle type (0-9; any other value treated as 0) - // param5 = same as param4 (not param5!) from 0001 (TObjParticle) - // param6 = same as param5 (not param6!) from 0001 (TObjParticle) - // Availability: v3+ only - {0x018C, "TObjParticleLobby"}, - - // Episode 3 lobby battle table. Params: - // param4 = player count (1-4); only 2 and 4 are used in-game - // param5 = table number (used in E4 and E5 commands) - // Availability: Episode 3 only - {0x018D, "TObjLobbyTable"}, - - // Episode 3 lobby jukebox. No parameters. - // Availability: Episode 3 only - {0x018E, "TObjJukeBox"}, - - // TODO: Describe this object. There appear to be no parameters. - // Availability: v2+ only - {0x0190, "TObjCamera"}, - - // Short Spaceship wall. There appear to be no parameters. - // Availability: v2+ only - {0x0191, "TObjTuitate"}, - - // Spaceship door. Params: - // param4 = switch flag number (if this is negative, the door is always - // unlocked) - // Availability: v2+ only - {0x0192, "TObjDoaEx01"}, - - // Tall Spaceship wall. There appear to be no parameters. - // Availability: v2+ only - {0x0193, "TObjBigTuitate"}, - - // Temple door. Params: - // param4 = switch flag number (if this is negative, the door is always - // unlocked) - // Availability: v2+ only - {0x01A0, "TODoorVS2Door01"}, - - // Temple rubble. None of these take any parameters. - // Availability: v2+ only - {0x01A1, "TOVS2Wreck01"}, // Partly-broken wall (like breakable wall) - {0x01A2, "TOVS2Wreck02"}, // Broken column - {0x01A3, "TOVS2Wreck03"}, // Broken wall pieces lying flat - {0x01A4, "TOVS2Wreck04"}, // Column - {0x01A5, "TOVS2Wreck05"}, // Broken toppled column - {0x01A6, "TOVS2Wreck06"}, // Truncated conic monument - - // Temple breakable wall, which looks like 0x01A1 (TOVS2Wreck01). Params: - // param4 = number of hits, minus 256 for some reason (for example, for - // a 6-hit wall, this should be -250, or 0xFFFFFF06) - // Availability: v2+ only - {0x01A7, "TOVS2Wall01"}, - - // Lens flare enable/disable switch. This object triggers when the local - // player is within 20 units, and sets a global which determines whether - // objects of type 0x001E (__LENS_FLARE__) should render anything. - // Params: - // param1 = if > 0, enable lens flare rendering; if <= 0, disable it - // This object isn't constructed in split-screen mode. - // Availability: v2+ only - {0x01A8, "__LENS_FLARE_SWITCH_COLLISION__"}, - - // Rising bridges. Similar to 0x008F (TObjHashi). Params: - // param1 = extra depth when lowered (this is added to TObjHashiBase's - // 30 unit displacement if the bridge is lowered when constructed) - // param2 = rise speed in units per frame - // param4 = switch flag number - // Availability: v2+ only - {0x01A9, "TObjHashiVersus1"}, // Small brown rising bridge - {0x01AA, "TObjHashiVersus2"}, // Long rising bridge - - // Multiplayer Temple/Spaceship doors. Params: - // param4 = base switch flag number (the actual switch flags used are - // param4, param4 + 1, param4 + 2, etc.; if this is negative, the - // door is always unlocked) - // param5 = number of switch flags - // param6 = synchronization mode: - // negative = when all switch flags are enabled, door is permanently - // unlocked via 6x0B even if some switch flags are disabled later - // zero or positive = door only stays unlocked while all of the - // switch flags are active and locks again when any are disabled - // (no effect in single-player offline mode; the negative behavior - // is used instead) - // Availability: v3+ only - {0x01AB, "TODoorFourLightRuins"}, // Temple - {0x01C0, "TODoorFourLightSpace"}, // Spaceship - - // CCA item box. It seems this box type cannot be specialized. There are - // no parameters. - // Availability: v3+ only - {0x0200, "TObjContainerJung"}, - - // CCA cross-floor warp. Params: - // param4 = destination floor - // param6 = color (0 = blue, 1 = red); if this is 0 in Challenge mode, - // the warp is destroyed immediately - // Availability: v3+ only - {0x0201, "TObjWarpJung"}, - - // CCA door. Params: - // param4 = base switch flag number (the actual switch flags used are - // param4, param4 + 1, param4 + 2, etc.; if this is negative, the - // door is always unlocked) - // param5 = number of switch flags - // Availability: v3+ only - {0x0202, "TObjDoorJung"}, - - // CCA item box. Same parameters as 0x0088 (TObjContainerBase2). - // Availability: v3+ only - {0x0203, "TObjContainerJungEx"}, - - // CCA main door. This door checks quest flags 0x0046, 0x0047, and 0x0048 - // and opens when all are enabled. There are no parameters. - // Availability: v3+ only - {0x0204, "TODoorJungleMain"}, - - // CCA main door switch. This switch sets one of the quest flags checked - // by 0x0204 (TODoorJungleMain). Params: - // param4 = quest flag index (0 = 0x0046, 1 = 0x0047, 2 = 0x0048) - // Availability: v3+ only - {0x0205, "TOKeyJungleMain"}, - - // Jungle breakable rocks. Params: - // param4 = switch flag number (object is passable when enabled) - // Availability: v3+ only - {0x0206, "TORockJungleS01"}, // Small rock - {0x0207, "TORockJungleM01"}, // Small 3-rock wall - - // Jungle large 3-rock wall. Unlike the above, this takes no parameters - // and cannot be opened. - // Availability: v3+ only - {0x0208, "TORockJungleL01"}, - - // Jungle plant. Params: - // param4 = model number? (clamped to [0, 1]) - // Availability: v3+ only - {0x0209, "TOGrassJungle"}, - - // CCA warp outside main gate. Unlike other warps on Ragol, this one - // presents the player with a choice of areas: Jungle North (6), Mountain - // (8), or Seaside (9). Params: - // param6 = color (0 = blue, 1 = red); if this is 0 in Challenge mode, - // the warp is destroyed immediately - // Availability: v3+ only - {0x020A, "TObjWarpJungMain"}, - - // Background lightning generator. Each strike lasts for 11 frames and - // strikes at a random angle around the player. Params: - // param1 = lightning distance from player - // param2 = lightning height - // param3 = TODO (value is ((param3 / 32768) * 0.3) + 1) - // param4 = minimum frames between strikes - // param5 = interval randomness (after each strike, a random number is - // chosen between param4 and (param4 + param5) to determine how many - // frames to wait until the next strike) - // Availability: v3+ only - {0x020B, "TBGLightningCtrl"}, - - // Bird objects. Params: - // param4 = model number? (clamped to [0, 2]) - // Availability: v3+ only - {0x020C, "__WHITE_BIRD__"}, // Formerly __TObjPathObj_subclass_020C__ - {0x020D, "__ORANGE_BIRD__"}, // Formerly __TObjPathObj_subclass_020D__ - - // Jungle box that triggers a wave event when opened. Params: - // param4 = event number - // param5 = model number (clamped to [0, 1]) - // Availability: v3+ only - {0x020E, "TObjContainerJungEnemy"}, - - // Chain saw damage trap. Params: - // param2 = base damage (multiplied by difficulty: Normal = x1/5, Hard - // = x2/5, Very Hard = x3/5, Ultimate = x6/5) - // param3 = model number (<= 0 for small saw, > 0 for large saw) - // param4 = switch flag number (disabled when switch flag is enabled) - // param5 high word = rotation range (16-bit angle) - // param5 low word = rotation speed (angle units per frame) - // param6 high word = if nonzero, ignore rotation range and rotate in a - // full circle instead - // param6 low word = delay between cycles (seconds) - // Availability: v3+ only - {0x020F, "TOTrapChainSawDamage"}, - - // Laser detector trap. Params: - // param3 = model number (<= for small laser, > 0 for large laser) - // param4 = switch flag number (enables this flag when triggered) - // param5-6: same as 0x020F (TOTrapChainSawDamage) - // Availability: v3+ only - {0x0210, "TOTrapChainSawKey"}, - - // TODO: Describe this object. It's a subclass of TODragonfly and has the - // same params as 0x00CD (TODragonflyCave01), though it appears that some - // may have different scale factors or offsets. - // Availability: v3+ only - {0x0211, "TOBiwaMushi"}, - - // Seagull. Params: - // param4 = model number? (clamped to [0, 2]) - // Availability: v3+ only - {0x0212, "__SEAGULL__"}, // Formerly __TObjPathObj_subclass_0212__ - - // TODO: Describe this object. Params: - // param4 = model number (clamped to [0, 2]) - // Availability: v3+ only - {0x0213, "TOJungleDesign"}, - - // Fish. This object is not constructed in split-screen mode. Params: - // param1-3 = TODO (Vector3F) - // param4 = TODO - // param5 = TODO - // param6 = TODO - // Availability: v3+ only - {0x0220, "TObjFish"}, - - // Seabed multiplayer door. Params: - // param4 = base switch flag number (the actual switch flags used are - // param4, param4 + 1, param4 + 2, etc.; if this is negative, the - // door is always unlocked) - // param5 = number of switch flags (clamped to [0, 4]) - // param6 = synchronization mode: - // negative = when all switch flags are enabled, door is permanently - // unlocked via 6x0B even if some switch flags are disabled later - // zero or positive = door only stays unlocked while all of the - // switch flags are active and locks again when any are disabled - // (no effect in single-player offline mode; the negative behavior - // is used instead) - // Availability: v3+ only - {0x0221, "TODoorFourLightSeabed"}, // Blue edges - {0x0222, "TODoorFourLightSeabedU"}, - - // Small cryotube. Params: - // param4 = model number (clamped to [0, 3]) - // Availability: v3+ only - {0x0223, "TObjSeabedSuiso_CH"}, - - // Breakable glass wall. Params: - // param4 = switch flag number - // param5 = model number (clamped to [0, 2]) - // Availability: v3+ only - {0x0224, "TObjSeabedSuisoBrakable"}, - - // Small floating robots. These are subclasses of TODragonfly and have - // the same params as 0x00CD (TODragonflyCave01), though it appears that - // some may have different scale factors or offsets (TODO). - // Availability: v3+ only - {0x0225, "TOMekaFish00"}, // Blue - {0x0226, "TOMekaFish01"}, // Red - - // Dolphin. Params: - // param4 = model number (clamped to [0, 4]) - // Availability: v3+ only - {0x0227, "__DOLPHIN__"}, // Formerly __TObjPathObj_subclass_0227__ - - // Seabed capturing trap, similar to 0x0153 (TOTrapAncient01) in - // function. Triggers when a player is within 15 units. Params: - // param1 = TODO (clamped to [0.1, 10]) - // param4 = hold time after trigger (in seconds; clamped to [1, 60]) - // param5 = hide in split-screen: - // zero or negative = always visible - // positive = invisible in split-screen mode - // param6 = same as param5 from 0x0153 (TOTrapAncient01) - // Availability: v3+ only - {0x0228, "TOTrapSeabed01"}, - - // VR link object. This object is destroyed immediately in Challenge mode - // and split-screen mode. Same parameters as 0x008D (TOCapsuleAncient01). - // Availability: v3+ only - {0x0229, "TOCapsuleLabo"}, - - // Alias for 0x0001 (TObjParticle). The constructor function is exactly - // the same as for 0x0001, so this object has all the same paarameters - // and behavior as that object. - // Availability: v3+ only - {0x0240, "TObjParticle"}, - - // Teleporter after Barba Ray. This object behaves exactly the same as - // 0x0002 (TObjAreaWarpForest), except it's invisible until the boss is - // defeated. - // Availability: v3+ only - {0x0280, "__BARBA_RAY_TELEPORTER__"}, // Formerly __TObjAreaWarpForest_subclass_0280__ - - // TODO: Describe this object. There appear to be no parameters. - // Availability: v3+ only - {0x02A0, "TObjLiveCamera"}, - - // Gee nest. This object is technically an item box, and drops an item - // when destroyed. Unlike most other item boxes, it cannot be specialized - // (ignore_def is always true). Params are the same as for 0x0152 - // (TContainerAncient01), but there is also: - // angle.z = number of hits to destroy - // Availability: v3+ only - {0x02B0, "TContainerAncient01R"}, - - // Lab objects. None of these take any parameters. - // Availability: v3+ only - {0x02B1, "TObjLaboDesignBase(0)"}, // Computer console - {0x02B2, "TObjLaboDesignBase(1)"}, // Computer console (alternate colors) - {0x02B3, "TObjLaboDesignBase(2)"}, // Chair - {0x02B4, "TObjLaboDesignBase(3)"}, // Orange wall - {0x02B5, "TObjLaboDesignBase(4)"}, // Gray/blue wall - {0x02B6, "TObjLaboDesignBase(5)"}, // Long table - - // Game Boy Advance. Params: - // param4 = quest label to call when activated (inherited from - // TObjMesBase) - // param6 = type (clamped to [0, 1]; 0 = "QUEST", 1 = "RICO") - // (inherited from TObjMesBase) - // Availability: GC only - {0x02B7, "TObjGbAdvance"}, - - // Like TObjQuestColA (TODO: In what ways is it different?). Parameters - // are the same as for TObjQuestCol, but also: - // param2 = TODO - // param5 = quest script manager to use (zero or negative = quest, - // positive = free play) - // Availability: v3+ only - {0x02B8, "TObjQuestColALock2"}, - - // Like 0x0003 (TObjMapWarpForest), but is invisible and automatically - // warps players when they enter its radius. This is used to simulate - // floor warps in the Control Tower. Has the same parameters as - // TObjMapWarpForest, but also: - // param5 = destination "floor" number (this is an intra-map warp and - // doesn't actually change floors; the "floor" number is only visual) - // param6 = if <= 0, shows "floor" number (param5 formatted as "%xF") - // after warp; if > 0, param5 is ignored - // Availability: v3+ only - {0x02B9, "TObjMapForceWarp"}, - - // Behaves like 0x0012 (TObjQuestCol), but also has the param5 behavior - // from 0x02B8 (TObjQuestColALock2). - // Availability: v3+ only - {0x02BA, "TObjQuestCol2"}, - - // Episode 2 Lab door with glass window. Same parameters as - // TODoorLaboNormal, except param5 is unused. - // Availability: v3+ only - {0x02BB, "TODoorLaboNormal"}, - - // Episode 2 ending movie warp (used in final boss arenas after the boss - // is defeated). Same params as 0x001C (TObjAreaWarpEnding). - // Availability: v3+ only - {0x02BC, "TObjAreaWarpEndingJung"}, - - // Warp to another location on the same map. Used for the Lab/city warp. - // This warp is visible in all game modes, but cannot be used in Episode - // 1, Battle mode, or Challenge mode. Params: - // param1-3 = destination (same as for TObjMapWarpForest) - // param4 = destination angle (same as for TObjMapWarpForest) - // param6 = destination text (clamped to [0, 2]): - // 00 = "The Principal" - // 01 = "Pioneer 2" - // 02 = "Lab" - // Availability: v3+ only - {0x02BD, "TObjLaboMapWarp"}, - - // This object is used internally by Episode 3 during battles as the - // visual implementation for some overlay tiles. - // Params: - // param1-3 = TODO - // param4 = model number: - // 00 = TODO (iwa.bml) - // 01 = TODO (l_kusa.bml) - // 02 = TODO (s_kusa.bml) - // 03 = TODO (crash_car.bml) - // 04 = TODO (crash_warp.bml) - // 05 = TODO (new_marker.bml) - // 06 = TODO (r_guard.bml) - // 07 = TODO (ryuuboku.bml) - // 08 = TODO (ryuuboku_l.bml) - // 09 = Rock (overlay = 0x10; new_iwa_1.bml) - // 0A = TODO (new_iwa_2.bml) - // 0B = Purple warp (overlay = 0x30; warp_p.bml) - // 0C = Red warp (overlay = 0x31; warp_r.bml) - // 0D = Green warp (overlay = 0x32; warp_g.bml) - // 0E = Blue warp (overlay = 0x33; warp_b.bml) - // 0F = Fence (overlay = 0x20; shareobj_new_guard.bml) - // param6 second-low byte = TODO - // param6 low byte = TODO - // Availability: Ep3 in-battle only - {0x02D0, "TObjKazariCard"}, - - // TODO: Describe these objects. There appear to be no parameters. - // Availability: Ep3 Morgue only - {0x02D1, "TObj_FloatingCardMaterial_Dark"}, - {0x02D2, "TObj_FloatingCardMaterial_Hero"}, - - // Morgue warps. These don't actually do anything; they just look like a - // warp. The actual warping is done by another object (TObjCityAreaWarp - // for the lobby teleporter, or TShopGenerator for the battle counter). - // TObjCardCityMapWarp takes no parameters. - // Availability: Ep3 Morgue only - {0x02D3, "TObjCardCityMapWarp(0)"}, // Battle counter warp (blue lines) - {0x02D9, "TObjCardCityMapWarp(1)"}, // TODO - {0x02E3, "TObjCardCityMapWarp(2)"}, // Lobby warp (yellow lines) - - // Morgue doors. None of these take any parameters. Unsurprisingly, the - // _Closed variants don't open. - // Availability: Ep3 Morgue only - {0x02D4, "TObjCardCityDoor(0)"}, // Yellow (to deck edit room) - {0x02D5, "TObjCardCityDoor(1)"}, // Blue (to battle entry counter) - {0x02D8, "TObjCardCityDoor(2)"}, // TODO - {0x02DF, "TObjCardCityDoor(3)"}, // Solid (always closed in normal Morgue) - {0x02E0, "TObjCardCityDoor(4)"}, // Gray (to chief) - {0x02DC, "TObjCardCityDoor_Closed(0)"}, // TODO - {0x02DD, "TObjCardCityDoor_Closed(1)"}, // TODO - {0x02DE, "TObjCardCityDoor_Closed(2)"}, // TODO - {0x02E1, "TObjCardCityDoor_Closed(3)"}, // TODO - {0x02E2, "TObjCardCityDoor_Closed(4)"}, // TODO - - // Mortis Fons geyser. Params: - // param1-3 = TODO - // param4 = mode (value is param4 % 0x0B): - // 00 = MIZUMODE_NONE - // 01 = MIZUMODE_LOW - // 02 = MIZUMODE_MIDDLE - // 03 = MIZUMODE_HIGH - // 04 = MIZUMODE_RAIN - // 05 = MIZUMODE_WAVE - // 06 = MIZUMODE_HIGHTYNY - // 07 = MIZUMODE_REFLECT - // 08 = MIZUMODE_FOG - // 09 = MIZUMODE_FOG2 - // 0A = MIZUMODE_LIGHT - // param5 = TODO (value is param5 % 7) - // Availability: Ep3 in-battle only - {0x02D6, "TObjKazariGeyserMizu"}, - - // TODO: Describe this object. It appears to be created by many creatures - // and probably SCs as well, but it's not obvious what it's used for, - // since the logic of tiles being blocked or free is implemented in - // TCardServer, which doesn't interact with this object. Further research - // is needed here. Params: - // param1-3 = TODO - // param4 = TODO (expected to be 0 or 1) - // Availability: Ep3 in-battle only - {0x02D7, "TObjSetCardColi"}, - - // Floating robots, presumably. These are both subclasses of 0x0106 - // (TODragonflyMachine01) and take all the same params as that object. - // Availability: Ep3 Morgue only - {0x02DA, "TOFlyMekaHero"}, - {0x02DB, "TOFlyMekaDark"}, - - // Lobby banner or model display object. This implements display of media - // sent with the B9 command. Params: - // param1-3 = scale factors (x, y, z) - // param4 = index into location bit field (0-31 where 0 is the least- - // significant bit; see Episode3LobbyBanners in config.example.json - // for the bits' meanings) - // param5 = TODO - // Availability: Ep3 lobby only - {0x02E4, "TObjSinBoardCard"}, - - // TODO: Describe this object. Params: - // param4 = model number (0 or 1) - // Availability: Ep3 Morgue only - {0x02E5, "TObjCityMoji"}, - - // Like TObjCardCityMapWarp(2) (the warp to the lobby from the Morgue) - // but doesn't render the circles. Used in offline mode where that warp - // is disabled. No parameters. - // Availability: Ep3 Morgue only - {0x02E6, "TObjCityWarpOff"}, - - // Small flying robot. There appear to be no parameters. - // Availability: Ep3 Morgue only - {0x02E7, "TObjFlyCom"}, - - // TODO: Describe this object. Params: - // param4 = TODO (used in vtable[0x0E]) - // Availability: Ep3 Morgue only - {0x02E8, "__UNKNOWN_02E8__"}, - - // Episode 4 light source. - // TODO: Find and document this object's parameters. - // Availability: v4 only - {0x0300, "__EP4_LIGHT__"}, - - // Wilds/Crater cactus. Params: - // param1 = horizontal scale (x, z) - // param2 = vertical scale (y) - // param4 = model number (0-2, not bounds-checked) - // param5 = TODO - // Availability: v4 only - {0x0301, "__WILDS_CRATER_CACTUS__"}, - - // Wilds/Crater brown rock. Params: - // param1-3 = scale factors (x, y, z); z factor also scales hitbox size - // param4 = model number (0-2, not bounds-checked) - // Availability: v4 only - {0x0302, "__WILDS_CRATER_BROWN_ROCK__"}, - - // Wilds/Crater destructible brown rock. Params: - // param4 = switch flag number - // Availability: v4 only - {0x0303, "__WILDS_CRATER_BROWN_ROCK_DESTRUCTIBLE__"}, - - // TODO: Construct this object and see what it is. Params: - // param4 = object identifier (must be in range [0, 15]; used in 6xD4 - // command) - // Availability: v4 only - {0x0340, "__UNKNOWN_0340__"}, - - // TODO: Construct this object and see what it is. It looks like some - // kind of child object of 0340. Params: - // param4 = object identifier (must be in range [0, 15]; used in 6xD4 - // command; looks like it should match an existing 0340's identifier) - // param5 = child index? (must be in range [0, 3]) - // Availability: v4 only - {0x0341, "__UNKNOWN_0341__"}, - - // Poison plant. Base damage is 10 (Normal), 20 (Hard), 30 (Very Hard), - // or 60 (Ultimate). There appear to be no parameters. - // Availability: v4 only - {0x0380, "__POISON_PLANT__"}, - - // TODO: Describe this object. Params: - // param4 = model number (clamped to [0, 1]) - // Availability: v4 only - {0x0381, "__UNKNOWN_0381__"}, - - // TODO: Describe this object. There appear to be no parameters. - // Availability: v4 only - {0x0382, "__UNKNOWN_0382__"}, - - // Desert ooze plant. Params: - // param1 = animation speed? - // param2 = scale factor - // param4 = model number (clamped to [0, 1]) - // Availability: v4 only - {0x0383, "__DESERT_OOZE_PLANT__"}, - - // TODO: Describe this object. Params: - // param1 = animation speed? - // param4 = TODO (clamped to [0, 1]) - // Availability: v4 only - {0x0385, "__UNKNOWN_0385__"}, - - // Wilds/Crater black rocks. Params: - // param4 = model number (0-2, not bounds-checked) - // Availability: v4 only - {0x0386, "__WILDS_CRATER_BLACK_ROCKS__"}, - - // TODO: Describe this object. Params (names come from debug strings): - // angle.x = dest x - // angle.y = dest y - // angle.z = dest z - // param1 = area radius - // param2 = area power (value is param2 * 0.8) - // param4 = hole radius (value is param4 / 100) - // param5 = hole power (value is param5 / 100) - // Availability: v4 only - {0x0387, "__UNKNOWN_0387__"}, - - // TODO: Describe this object. Params: - // param1 = hitbox width (x; only used if param6 == 0) - // param2 = hitbox radius (only used if param6 != 0) - // param3 = hitbox depth (z; only used if param6 == 0) - // param4 = TODO (value is param4 / 100) - // param6 = hitbox type (0 = rectangular, anything else = cylindrical) - // Availability: v4 only - {0x0388, "__UNKNOWN_0388__"}, - - // Game flag set/clear zone. This sets and clears game flags (the flags - // sent in 6x0A) when the player enters the object's hitbox. Params: - // param1-3 = same as for 0x0388 - // param4 = game flags to set (low 8 bits only) - // param5 = game flags to clear (low 8 bits only) - // param6 = same as for 0x0388 - // There appears to be a bug that causes the game to always set all 8 of - // the low game flags, regardless of the value of param4. The clearing - // logic (param5) appears to work correctly. - // Availability: v4 only - {0x0389, "__GAME_FLAG_SET_CLEAR_ZONE__"}, - - // HP drain zone. When a player is within this object's hitbox, it - // subtracts 0.66% of the player's current HP at a regular interval. The - // amount of damage per interval is capped below at 1 HP, so it will - // always do a nonzero amount of damage each time. Params: - // param1-3 = same as for 0x0388 - // param5 = interval (in frames) between damage applications - // param6 = same as for 0x0388 - // Availability: v4 only - {0x038A, "__HP_DRAIN_ZONE__"}, - - // Falling stalactite. Activates when any player is within 50 units. Base - // damage is 100 on Normal, 200 on Hard, 300 on Very Hard, or 600 on - // Ultimate. There appear to be no parameters. - // Availability: v4 only - {0x038B, "__FALLING_STALACTITE__"}, - - // Solid desert plant. Params: - // param1 = horizontal scale factor (x, z) - // param2 = vertical scale factor (y) - // Availability: v4 only - {0x038C, "__DESERT_PLANT_SOLID__"}, - - // Desert crystals-style box. Params: - // param1 = contents type: - // 0 = always empty - // 1 = standard random item (ignore_def = 1) - // 2 = customized item (ignore_def = 0) - // 3 = trigger set event - // If param1 is 0 or 1, no other parameters are used. (In the case of 1, - // param3-6 are sent to the server in the 6xA2 command; however, the - // standard implementation ignores them.) - // If param1 is 2, the other parameters have the same meanings as for - // 0x0088 (TObjContainerBase2). - // If param1 is 3, the event number is specified in param4. - // Availability: v4 only - {0x038D, "__DESERT_CRYSTALS_BOX__"}, - - // Episode 4 test door. param4 and param6 are the same as for 0x0056 - // (TODoorLabo). - // Availability: v4 only - {0x038E, "__EP4_TEST_DOOR__"}, - - // Beehive. Params: - // param1 = horizontal scale factor (x, z) - // param2 = vertical scale factor (y) - // param4 = model number (clamped to [0, 1]) - // Availability: v4 only - {0x038F, "__BEEHIVE__"}, - - // Episode 4 test particles. Generates particles at a specific location - // (TODO) at a regular interval. Params: - // angle.x = TODO - // angle.y = TODO - // param1 = particle distance? (TODO) - // param2 = TODO - // param4 = frames between effects - // Availability: v4 only - {0x0390, "__EP4_TEST_PARTICLE__"}, - - // Heat (implemented as a type of poison fog). Has the same parameters as - // TObjFogCollisionPoison. - // Availability: v4 only - {0x0391, "__HEAT__"}, - - // Episode 4 boss egg. There appear to be no parameters. - // Availability: v4 only - {0x03C0, "__EP4_BOSS_EGG__"}, - - // Episode 4 boss rock spawner. Params: - // param4 = type (clamped to [0, 2]) - // Availability: v4 only - {0x03C1, "__EP4_BOSS_ROCK_SPAWNER__"}, - }); - try { - return names.at(type); - } catch (const out_of_range&) { - return "__UNKNOWN__"; +struct DATEntityDefinition { + uint16_t type; + uint16_t version_flags; + uint64_t area_flags; + const char* name; +}; + +// TODO: Figure out whether GC NTE should be included in the various groups. +static_assert(NUM_VERSIONS == 14, "Don\'t forget to update the DATEntityDefinition tables"); +static constexpr uint16_t F_V0_V1 = 0x001C; +static constexpr uint16_t F_V0_V2 = 0x01FC; +static constexpr uint16_t F_V0_V4 = 0x33FC; +static constexpr uint16_t F_V1_V4 = 0x33F0; +static constexpr uint16_t F_V2 = 0x01E0; +static constexpr uint16_t F_V2_V4 = 0x33E0; +static constexpr uint16_t F_V3_V4 = 0x3200; +static constexpr uint16_t F_V4 = 0x2000; +static constexpr uint16_t F_GC = 0x0F00; +static constexpr uint16_t F_EP3 = 0x0C00; + +static const vector dat_object_definitions({ + // This is newserv's canonical list of map object types. + + // Objects defined in map files take arguments in the form of an + // ObjectSetEntry structure (see Map.hh). Most objects take parameters + // only in param1-3 (floats) and param4-6 (ints), but a few of them use + // the angle fields as additional int parameters. All objects are + // available on all versions of the game (except Episode 3) unless + // otherwise noted, but most objects are available only on specific + // floors unless an omnispawn patch is used. + + // Defines where a player should start when entering a floor. Params: + // param1 = client ID + // param4 = source type: + // 0 = use this set when advancing from a lower floor + // 1 = use this set when returning from a higher floor + // anything else = set is unused + {0x0000, F_V0_V4, 0x00007FFFFFFFFFFF, "TObjPlayerSet"}, + {0x0000, F_EP3, 0x0000000000008001, "TObjPlayerSet"}, + + // Displays a particle effect. This object is not constructed in + // split-screen mode. Params: + // param1 = particle type (truncated to int, clamped to nonnegative) + // param3 = TODO + // param4 = if equal to 1, increase draw distance from 200 to 1500; if + // any other value, no effect + // param5 = TODO + // param6 = TODO + {0x0001, F_V0_V4, 0x00006FFFFFFFFFFF, "TObjParticle"}, + {0x0001, F_EP3, 0x0000000000008003, "TObjParticle"}, + + // Standard (triangular) cross-floor warp object. Params: + // param4 = destination floor + // param6 = color (0 = blue, 1 = red); if this is 0 in Challenge mode, + // the warp is destroyed immediately + {0x0002, F_V0_V4, 0x00007FF3C07C78FF, "TObjAreaWarpForest"}, + + // Standard (triangular) intra-floor warp object. Params: + // param1-3 = destination coordinates (x, y, z); players are supposed + // to be offset from this location in different directions depending + // on their client ID, but there is a bug that causes all players to + // use the same offsets: x + 10 and z + 10 + // param4 = destination angle (about y axis) + {0x0003, F_V0_V4, 0x00007FFC3FFF78FF, "TObjMapWarpForest"}, + + // Light collision. Params: + // param1 = TODO (in range 0-10000; if above 10000, (param1 - 10000) is + // used and a flag is set) + // param2 = TODO (in range 0-10000; if above 10000, (param2 - 10000) is + // used and a flag is set) + // param3 = TODO + // param4 = TODO + // param5 = TODO + // param6 = TODO + {0x0004, F_V0_V4, 0x00006FFC3FFF87FF, "TObjLight"}, + {0x0004, F_EP3, 0x0000000000008003, "TObjLight"}, + + // Arbitrary item. The parameters specify the item data; see + // ItemCreator::base_item_for_specialized_box for how the encoding works. + {0x0005, F_V0_V2, 0x000000000000073F, "TItem"}, + + // Environmental sound. This object is not constructed in offline multi + // mode. Params: + // param3 = audibility radius (if <= 0 uses default of 200) + // param4 = sound ID: + // Pioneer 2 / Lab (volume param is ignored on this floor): + // 00 = distant crowd noises (GC: 4004B200) + // 01 = ship passing by (GC: 4004C101) + // 02 = siren passing by (GC: 4004CB02) + // Forest: + // 00 = waterfall (GC: 0004A801) + // 01 = stream (GC: 0004B202) + // 02 = birds chirping (GC: 0004BC00) + // 03 = light rain on ground (GC: 00043704) + // 04 = light rain on water (GC: 0004BC05) + // 05 = wind (GC: 0004AD06) + // Caves: + // 00 = nothing? (GC: 00046400) + // 01 = volcano? (GC: 00042A01) + // 02 = lava flow (GC: 00042F02) + // 03 = stream (GC: 00043C03) + // 04 = waterfall (GC: 00043C04) + // 05 = echoing drips (GC: 00042D05) + // Mines: + // 00 = mechanical whir (GC: 4004B715) + // 01 = rotary machine (GC: 4004BC16) + // Ruins: + // 00 = wind/water (GC: 4004B200) + // 01 = swishing (GC: 4004CB01) + // 02 = repeating sliding? (GC: 4004BC02) + // 03 = repeating punching? (GC: 4004BC03) + // 04 = hissing (GC: 4004C604) + // 05 = heartbeat (GC: 4004AA05) + // 06 = squishing heartbeat (GC: 4004C606) + // Battle 1 (Spaceship): + // 00 = low beeping (GC: 4004B40C) + // 01 = high beeping (GC: 4004B40D) + // 02 = robot arm movement 1 (GC: 4004C10E) + // 03 = robot arm movement 2 (GC: 4004C10F) + // Battle 2 (Temple): + // 00 = waterfall (GC: 0004CB0C) + // 01 = waves (GC: 0004BC0D) + // 02 = bubbles (GC: 0004BC0E) + // VR Temple: + // 00 = waterfall (GC: 0004CB0C) + // 01 = waves (GC: 0004BC0D) + // 02 = bubbles GC: (0004BC0E0 + // VR Spaceship: + // 00 = low beeping (GC: 4004B40C) + // 01 = high beeping (GC: 4004B40D) + // 02 = robot arm movement 1 (GC: 4004C10E) + // 03 = robot arm movement 2 (GC: 4004C10F) + // Central Control Area: + // 00 = wind (GC: 0004CB05) + // 01 = waterfall (GC: 0004D506) + // 02 = stream (GC: 0004BC07) + // 03 = waves crashing (GC: 0004C60A) + // 04 = ocean wind (GC: 0004CB0B) + // 05 = higher wind (GC: 0004CB0C) + // 06 = light ocean wind (GC: 0004CB0D) + // 07 = ominous mechanical sound (GC: 0004BC0E) + // Seabed and Olga Flow: + // 00 = water leak (GC: 4004BC00) + // 01 = water drip (GC: 4004BC01) + // 02 = waterfall (GC: 4004C603) + // 03 = light waterfall (GC: 4004D504) + // 04 = creaking metal 1 (GC: 4004B205) + // 05 = creaking metal 2 (GC: 4004B206) + // 06 = creaking metal 3 (GC: 4004AD07) + // 07 = creaking metal 4 (GC: 4004B208) + // 08 = creaking metal 5 (GC: 4004AD09) + // 09 = gas leak (GC: 4004B20A) + // 0A = distant metallic thud (GC: 4004B20B) + // Crater: + // 00 = TODO (BB: 000005FD) + // 01 = TODO (BB: 000005FE) + // 02 = TODO (BB: 000005FF) + // 03 = TODO (BB: 00000600) + // 04 = TODO (BB: 00000601) + // 05 = TODO (BB: 00000602) + // 06 = TODO (BB: 00000603) + // 07 = TODO (BB: 00000604) + // 08 = TODO (BB: 00000605) + // 09 = TODO (BB: 00000606) + // 0A = TODO (BB: 00000607) + // Crater Interior: + // 00 = TODO (BB: 00000658) + // 01 = TODO (BB: 00000659) + // 02 = TODO (BB: 0000065A) + // 03 = TODO (BB: 0000065B) + // 04 = TODO (BB: 0000065C) + // 05 = TODO (BB: 0000065D) + // 06 = TODO (BB: 0000065E) + // 07 = TODO (BB: 0000065F) + // 08 = TODO (BB: 00000660) + // 09 = TODO (BB: 00000661) + // 0A = TODO (BB: 00000662) + // Desert: + // 00 = TODO (BB: 000006AE) + // 01 = TODO (BB: 000006AF) + // 02 = TODO (BB: 000006B0) + // 03 = TODO (BB: 000006B1) + // 04 = TODO (BB: 000006B2) + // 05 = TODO (BB: 000006B3) + // 06 = TODO (BB: 000006B4) + // 07 = TODO (BB: 000006B5) + // 08 = TODO (BB: 000006B6) + // 09 = TODO (BB: 000006B7) + // 0A = TODO (BB: 000006B8) + // 0B = TODO (BB: 000006B9) + // 0C = TODO (BB: 000006BA) + // 0D = TODO (BB: 000006BB) + // 0E = TODO (BB: 000006BC) + // 0F = TODO (BB: 000006BD) + // 10 = TODO (BB: 000006BE) + // param5 = volume (in range -0x7F to 0x7F) + {0x0006, F_V0_V2, 0x0000000000037FFF, "TObjEnvSound"}, + {0x0006, F_V3_V4, 0x00006FF0BFFF27FF, "TObjEnvSound"}, + {0x0006, F_EP3, 0x0000000000000001, "TObjEnvSound"}, + + // Fog collision object. Params: + // param1 = radius + // param4 = fog entry number; if lower than the existing fog number, + // does nothing (if param4 is >= 0x1000, the game subtracts 0x1000 + // from it, but only after comparing it to the current fog number; + // this can be used to override a later fog with an earlier fog) + // param5 = transition type (0 = fade in, 1 = instantly switch) + {0x0007, F_V0_V4, 0x00006FFFFFFF7FFF, "TObjFogCollision"}, + {0x0007, F_EP3, 0x0000000000000001, "TObjFogCollision"}, + + // Event collision object. This object triggers a wave event (W-XXX) when + // any local player (in split-screen play, there may be multiple) steps + // within its radius. The object is inactive for 3 frames after it is + // constructed, and will not detect any player during that time. + // Curiously, the frame counter does not appear to be bounded, so if the + // player waits approximately 828 days, the counter will overflow to a + // positive number and the object won't be able to trigger for another + // 828 days until it gets to zero again. It is unlikely this has ever + // happened for any player. Params: + // param1 = radius + // param4 = event ID + {0x0008, F_V0_V4, 0x00007FFFFFFF7FFF, "TObjEvtCollision"}, + {0x0008, F_EP3, 0x0000000000000001, "TObjEvtCollision"}, + + // TODO: Describe this object. Params: + // param1 = TODO + // param2 = TODO + // param3 = TODO (it only matters whether this is negative or not) + {0x0009, F_V0_V4, 0x000060000004073F, "TObjCollision"}, + {0x0009, F_EP3, 0x0000000000000001, "TObjCollision"}, + + // Elemental trap. Params: + // param1 = trigger radius delta (actual radius is param1 / 2 + 30) + // param2 = explosion radius delta (actual radius is param2 / 2 + 60) + // param3 = trap group number: + // negative = trap triggers and explodes alone + // 00 = trap follows player who triggered it (online only; when + // offline, these act as if the group number were negative, and + // param6 is overwritten with 30 (1 second)) + // positive = trap is part of a group that all trigger and explode + // simultaneously + // param4 = trap power (clamped below to 0), scaled by difficulty: + // Normal: power = param4 * 1 + // Hard: power = param4 * 3 + // Very Hard: power = param4 * 5 + // Ultimate: power = param4 * 14 + // param5 = damage type (clamped to [0, 5]) + // 00 = direct damage (damage = power / 5) + // 01 = fire (damage = power * (100 - EFR) / 500) + // 02 = cold (can freeze; damage = power * (100 - EIC) / 500) + // chance of freezing = ((((power - 250) / 40) + 5) / 40) clamped + // to [0, 0.4], or to [0.2, 0.4] on Ultimate + // 03 = electric (can shock; damage = power * (100 - EIC) / 500) + // chance of shock = 1/15, or 1/40 on Ultimate + // 04 = light (damage = power * (100 - ELT) / 500) + // 05 = dark (instantly kills with chance (power - EDK) / 100); if + // used in a boss arena and in non-Ultimate mode, cannot kill + // param6 = number of frames between trigger and explosion + {0x000A, F_V0_V4, 0x00005FFC3FFB07FE, "TOMineIcon01"}, + + // Status trap. Params: + // param1 = trigger radius delta (actual radius is param1 / 2 + 30) + // param2 = explosion radius delta (actual radius is param2 / 2 + 60) + // param3 = trap group number (same as in TOMineIcon01) + // param4 = trap power (same as in TOMineIcon01) + // param5 = trap type (clamped to [0x0F, 0x12]) + // 0F = poison + // 10 = paralysis + // 11 = slow + // 12 = confuse + // param6 = number of frames between trigger and explosion + {0x000B, F_V0_V4, 0x00005FFC3FFB07FE, "TOMineIcon02"}, + + // Heal trap. Params: + // param1 = trigger radius delta (actual radius is param1 / 2 + 30) + // param2 = explosion radius delta (actual radius is param2 / 2 + 60) + // param3 = trap group number (same as in TOMineIcon01) + // param4 = trap power (same as in TOMineIcon01) + // param5 = trap type (clamped to [6, 8]) + // 06 = heal HP (amount = power) + // 07 = clear negative status effects + // 08 = does nothing? (TODO: calls player->vtable[0x40], but that + // function does nothing on v3. Did this do something in v1 or v2?) + // param6 = number of frames between trigger and explosion + {0x000C, F_V0_V4, 0x00005FFC3FFB07FE, "TOMineIcon03"}, + + // Large elemental trap. Params: + // param1 = trigger radius delta (actual radius is param1 / 2 + 60) + // param2 = explosion radius delta (actual radius is param2 / 2 + 120) + // param3 = trap group number (same as in TOMineIcon01) + // param4 = trap power (same as in TOMineIcon01) + // param5 = trap type (same as in TOMineIcon01) + // param6 = number of frames between trigger and explosion + {0x000D, F_V0_V4, 0x00005FFC3FFB07FE, "TOMineIcon04"}, + + // Room ID. Params: + // param1 = radius (actual radius = (param1 * 10) + 30) + // param2 = next room ID + // param3 = previous room ID + // param5 = angle + // param6 = TODO (debug info calls this "BLOCK ID"; seems it only + // matters whether this is 0x10000 or not) + {0x000E, F_V0_V4, 0x00005FFFFFF83FFE, "TObjRoomId"}, + + // Sensor of some kind (TODO). Params: + // param1 = activation radius delta (actual radius = param1 + 50) + // param4 = switch flag number + // param5 = update mode switch (TODO; param5 < 0 sets update_mode = + // PERMANENTLY_ON, otherwise TEMPORARY; see TOSensor_vF) + {0x000F, F_V0_V4, 0x00004000000000F6, "TOSensorGeneral01"}, + + // Lens flare effect. This object is not constructed in offline multi + // mode. Params: + // param1 = visibility radius (if negative, visible everywhere) + {0x0011, F_V0_V4, 0x000040000000411E, "TEF_LensFlare"}, + + // Quest script trigger. Starts a quest thread at a specific label when + // the local player goes near the object. Params: + // param1 = radius + // param4 = label number to call when local player is within radius + {0x0012, F_V0_V4, 0x00006FFFFFFC7FFF, "TObjQuestCol"}, + {0x0012, F_EP3, 0x0000000000000001, "TObjQuestCol"}, + + // Healing ring. Removes all negative status conditions and adds 9 HP and + // 9 TP per frame until max HP/TP are both reached or the player leaves + // the radius. The radius is a fixed size. + {0x0013, F_V0_V4, 0x00004FFC3FF807FE, "TOHealGeneral"}, + + // Invisible map collision. Params: + // param1-3 = box dimensions (x, y, z; rotated by angle fields) + // param4 = wall type: + // 00 = custom (see param5) + // 01 = blocks enemies only (as if param5 = 00008000) + // 02 = blocks enemies and players (as if param5 = 0x00008900) + // 03 = blocks enemies and players, but enemies can see targets + // through the collision (as if param5 = 0x00000800) + // 04 = blocks players only (as if param5 = 00002000) + // 05 = undefined behavior due to missing bounds check + // anything else = same as 01 + // param5 = flags (bit field; used if param4 = 0) (TODO: describe bits) + {0x0014, F_V0_V4, 0x0000600C3F87073F, "TObjMapCsn"}, + {0x0014, F_EP3, 0x0000000000000001, "TObjMapCsn"}, + + // Like TObjQuestCol, but requires the player to press a controller + // button to trigger the call. Parameters are the same as for + // TObjQuestCol. + {0x0015, F_V0_V4, 0x00006FFFFFFC7FFF, "TObjQuestColA"}, + {0x0015, F_EP3, 0x0000000000000001, "TObjQuestColA"}, + + // TODO: Describe this object. Params: + // param1 = radius (if negative, 30 is used) + {0x0016, F_V0_V4, 0x00006FFFFFFCFFFF, "TObjItemLight"}, + {0x0016, F_EP3, 0x0000000000008001, "TObjItemLight"}, + + // Radar collision. Params: + // param1 = radius + // param4 = TODO + {0x0017, F_V0_V4, 0x00004FFFFFF8FFFE, "TObjRaderCol"}, + {0x0017, F_EP3, 0x0000000000008000, "TObjRaderCol"}, + + // Fog collision. Same params as 0x0007 (TObjFogCollision), but also: + // param3 = if >= 1, fog is on when switch flag is on; otherwise, fog + // is on when switch flag is off + // param6 = switch flag number + {0x0018, F_V0_V4, 0x00004FFFFFF87FFE, "TObjFogCollisionSwitch"}, + + // Boss teleporter. The destination cannot be changed; it always + // teleports the player to the boss arena for the current area. In + // Challenge mode, the game uses the current area number to determine the + // destination floor, but in other modes, it uses the current episode + // number and floor number (not area number). Assuming areas haven't been + // reassigned from the defaults in non-Challenge mode, the mapping is: + // Challenge (indexed by area number, not floor number): + // Episode 1: + // Pioneer 2, boss arenas, lobby, battle areas => Pioneer 2 + // Forest 1 and 2 => Dragon + // Cave 1, 2, and 3 => De Rol Le + // Mine 1 and 2 => Vol Opt + // Ruins 1, 2, and 3 => Dark Falz + // Episode 2: + // Lab, boss arenas, Seaside Night, Tower => Lab + // VR Temple A and B => Barba Ray + // VR Spaceship A and B => Gol Dragon + // Central Control Area (but not Seaside Night) => Gal Gryphon + // Seabed => Olga Flow + // Episode 4: + // Pioneer 2, boss arena => Pioneer 2 + // Crater, Desert, test map => Saint-Milion arena + // Params: + // param5 = switch flag number required to activate warp (>= 0x100 = no + // switch flag required; ignored if on Pioneer 2) + // In offline mode, this object constructs TObjWarpBossMulti instead. + {0x0019, F_V0_V4, 0x00006FFC3FFC04A5, "TObjWarpBoss"}, + + // Sign board. This shows the loaded image from a quest (via load_pvr). + // Params: + // param1-3 = scale factors (x, y, z) + {0x001A, F_V1_V4, 0x0000600000040001, "TObjSinBoard"}, + {0x001A, F_EP3, 0x0000000000000001, "TObjSinBoard"}, + + // Quest floor warp. This appears similar to TObjAreaWarpForest except + // that the object is not destroyed immediately if it's blue and the game + // is Challenge mode. Params: + // param1 = player set ID (TODO: what exactly does this do? Looks like it + // does nothing unless it's >= 2) + // param4 = destination floor + // param6 = color (0 = blue, 1 = red) + {0x001B, F_V1_V4, 0x00005000000078FE, "TObjAreaWarpQuest"}, + + // Ending movie warp (used in final boss arenas after the boss is + // defeated). Params: + // param6 = color (0 = blue, 1 = red) + {0x001C, F_V1_V4, 0x0000500080004000, "TObjAreaWarpEnding"}, + + // Star light effect. + // This object renders from -100 to 740 over x and -100 to 580 over y. + // Params: + // param1 = TODO + // param2 = TODO + // param3 = TODO + // param4 = TODO + // param5 = TODO + // param6 = TODO + {0x001D, F_V2_V4, 0x0000400000000002, "TEffStarLight2D_Base"}, + + // VR Temple Beta / Barba Ray lens flare effect. + // This object renders from -10 to 650 over x and -10 to 490 over y. + {0x001E, F_V2_V4, 0x000041F1001A0006, "__LENS_FLARE__"}, + + // Hides the area map when the player is near this object. Params: + // param1 = radius + // TODO: Test this. + {0x001F, F_V2_V4, 0x00004FFC3FFB07FE, "TObjRaderHideCol"}, + + // Item-detecting floor switch. Params: + // param1 = radius + // param4 = switch flag number + // param5 = item type: + // 0 or any value not listed below = any item + // 1 = weapon + // 2 = armor + // 3 = shield + // 4 = unit + // 5 = mag + // 6 = tool + // 7 = meseta + // param6 = item amount required minus 1 (0 = 1 item, 1 = 2 items, etc.); + // for tools and meseta, each dropped item counts for its stack size + {0x0020, F_V2_V4, 0x00006FFC3FFF07FF, "TOSwitchItem"}, + + // Symbol chat collision object. This object triggers symbol chats when + // the players are nearby and certain switch flags are NOT set. If a + // player is within the radius, the object checks the switch flags in + // reverse order, and triggers the symbol chat for the latest one that is + // NOT set. So, the logic is: + // - If all 3 switch flags are not set, the symbol chat in spec1 is used + // - If the switch flag in spec1 is set and those in spec2 and spec3 are + // not set, the symbol chat in spec2 is used + // - If the switch flag in spec2 is set and the flag in spec3 is not set, + // the symbol chat in spec3 is used regardless of whether the switch + // flags in spec1 is set + // - If the switch flags in spec3 is set, no symbol chat appears at all + // regardless of the values of the other two switch flags + // Each spec is a 32-bit integer consisting of two 16-bit fields. The + // high 16 bits are a switch flag number (0-255), and the low 16 bits are + // an entry index from symbolchatcolli.prs. The entry index is ignored if + // the corresponding data label from the F8A6 quest opcode is not null + // (and the data from the label is used instead). Quest scripts don't + // have a good way to pass null for regsA[7-9], so the logic that looks + // up entries in symbolchatcolli.prs can be ignored in quests. + // Default symbol chat numbers (from qedit.info): + // 00 = Drop Meseta + // 01 = Meseta has been dropped + // 02 = Drop 1 weapon + // 03 = Drop 4 weapons + // 04 = Drop 1 shield + // 05 = Drop 4 shields + // 06 = Drop 1 mag + // 07 = Drop 4 mags + // 08 = Drop tool item + // 09 = ???? + // 0A = XXXX + // 0B = All circles like OK + // 0C = Key with Yes + // 0D = Key with Cool + // 0E = Key with ... + // 0F = Go right + // 10 = Go left + // 11 = Push button with gun + // 12 = Key icons + // 13 = Key has been pressed + // 14 = Run/go + // 15 = Push 1 button on + // 16 = Push 2 button on + // 17 = Clock (hurry) + // Params: + // param1 = radius + // param4 = spec1 + // param5 = spec2 + // param6 = spec3 + // This object can also be created by the quest opcode F8A6; see the + // description of that opcode in QuestScript.cc for more information. + {0x0021, F_V2_V4, 0x00006FFC3FFF07FF, "TOSymbolchatColli"}, + + // Invisible collision switch. Params: + // param1 = radius delta (actual radius is param1 + 10) + // param4 = switch flag number + // param5 = sticky flag (if negative, switch flag is unset when player + // leaves; if zero or positive, switch flag remains on) + {0x0022, F_V2_V4, 0x00004FFC3FFB07FE, "TOKeyCol"}, + + // Attackable collision. Params: + // param1 = enable switch flag (the object is only attackable if this + // switch flag is enabled); any value > 0xFF disables this behavior + // so the object is always attackable + // param2 = if negative, no target reticle appears; if zero or + // positive, a reticle appears + // param3 = switch flag number to set when required number of hits is + // taken (ignored if param6 is nonzero) + // param4 = number of hits required to activate, minus 1 (so e.g. a + // value of 4 here means 5 hits needed) + // param5 = object number (if outside the range [100, 999], uses the + // free play script when looking up param6 instead of the quest) + // param6 = quest label to call when required number of hits is taken + // (if zero, switch flag in param3 is set instead) + {0x0023, F_V2_V4, 0x00004FFC3FFB07FE, "TOAttackableCol"}, + + // Damage effect. Params: + // angle.x = effect type (in range [0x00, 0x14]; TODO: list these) + // param1 = damage radius + // param2 = damage value, scaled by difficulty: + // Normal: param2 * 2 + // Hard: param2 * 4 + // Very Hard: param2 * 6 + // Ultimate: param2 * 8 + // param3 = effect visual size + // param4 = enable switch flag number (effect is off unless this flag + // is set) + // param5 = disable switch flag number (effect is off if this flag is + // set, even if the enable switch flag is also set), or >= 0x100 if + // this functionality isn't needed + // param6 = persistence flag (if nonzero, effect stays on once enabled) + {0x0024, F_V2_V4, 0x0000600FFF9F07FF, "TOSwitchAttack"}, + + // Switch flag timer. This object watches for a switch flag to be + // activated, then once it is, waits for a specified time, then disables + // that switch flag and activates up to three other switch flags. Note + // that this object just provides the timer functionality; the trigger + // switch flag must be activated by some other object. Params: + // angle.x = trigger mode: + // 0 = disable watched switch flag when timer expires + // any other value = enable up to 3 other switch flags when timer + // expires and don't disable watched switch flag + // angle.y = if this is 1, play tick sound effect every second after + // activation (if any other value, no tick sound is played) + // angle.z = timer duration in frames + // param4 = switch flag to watch for activation in low 16 bits, switch + // flag 1 to activate when timer expires (if angle.x = 0) in high 16 + // bits (>= 0x100 if not needed) + // param5 = switch flag 2 to activate when timer expires (if + // angle.x = 0) in high 16 bits (>= 0x100 if not needed) + // param6 = switch flag 3 to activate when timer expires (if + // angle.x = 0) in high 16 bits (>= 0x100 if not needed) + {0x0025, F_V2_V4, 0x00006FFC3FFF07FF, "TOSwitchTimer"}, + + // Chat sensor. This object watches for chat messages said by players + // within its radius, optionally filtering for specific words. When a + // message matches, it either activates a switch flag or calls a quest + // function. When created via the F801 quest opcode, param5 is ignored, + // and the string specified by the quest is always used. Params: + // angle.x = activation type (0 = quest function, 1 = switch flag) + // angle.y = match mode: + // 0 = match a specific string (defined by param5) + // 1 = match any string + // anything else = never match anything + // param1 = radius + // param4 = switch flag number or quest label number + // param5 = trigger string + // 0 = any string (TODO: Is this true?) + // 1 = "YES" + // 2 = "COOL" + // 3 = "NO" + {0x0026, F_V2_V4, 0x00006FFC3FFF07FF, "TOChatSensor"}, + + // Radar map icon. Shows an icon on the map that is optionally locked or + // unlocked, depending on the values of one or more sequential switch + // flags. The icon is considered unlocked if all of the specified switch + // flags are set. There can be at most 12 switch flags used with this + // object and the switch flag numbers cannot wrap around from 0xFF to 0. + // Params: + // param1 = scale (1.0 = normal size) + // param4 = check switch flags for color: + // positive value = ignore param6; color is red (FFFF0000) if any of + // the switch flags are off, or green (FF00FF00) if all are on + // zero or negative = ignore param5; always render in the color + // specified by param6 + // param5 = switch flag spec; upper 16 bits are number of switch flags, + // lower 16 bits are first switch flag number + // param6 = color as ARGB8888 + {0x0027, F_V3_V4, 0x00004FFFFFFC0000, "TObjRaderIcon"}, + + // Environmental sound. This object is not constructed in offline multi + // mode. This is essentially identical to TObjEnvSound, except the sound + // fades in and out instead of abruptly starting or stopping when + // entering or leaving its radius. Params: + // param2 = volume fade speed (units per frame) + // param3 = audibility radius (same as for TObjEnvSound) + // param4 = sound ID (same as for TObjEnvSound) + // param5 = volume (same as for TObjEnvSound) + {0x0028, F_V3_V4, 0x00006FFCBFFF27F7, "TObjEnvSoundEx"}, + {0x0028, F_EP3, 0x0000000000000001, "TObjEnvSoundEx"}, + + // Environmental sound. This object is not constructed in offline multi + // mode. This is essentially identical to TObjEnvSound, except there is + // no radius: the sound is audible everywhere. Params: + // param4 = sound ID (same as for TObjEnvSound) + // param5 = volume (same as for TObjEnvSound) + {0x0029, F_V3_V4, 0x00006FFCBFFF27F7, "TObjEnvSoundGlobal"}, + {0x0029, F_EP3, 0x0000000000000001, "TObjEnvSoundGlobal"}, + + // Counter sequence activator. Used for Hunter's Guild, shops, bank, etc. + // Params: + // param4 = shop sequence number: + // Episodes 1, 2, and 4: + // 00 = weapon shop + // 01 = medical center + // 02 = armor shop + // 03 = tool shop + // 04 = Hunter's Guild + // 05 = check room + // 06 = tekker + // 07 = government counter (BB only) + // 08 = "GIVEAWAY" (BB only) + // Episode 3: + // 00 = unused (DUMMY0) + // 01 = unused (DUMMY1) + // 02 = unused (DUMMY2) + // 03 = unused (DUMMY3) + // 04 = unused (DUMMY4) + // 05 = unused (DUMMY5) + // 06 = unused (DUMMY6) + // 07 = deck edit counter + // 08 = entry counter + // 09 = left-side card trade kiosk + // 0A = right-side card trade kiosk + // 0B = auction counter + // 0C = hidden entry counter + // 0D = Pinz's Shop + {0x0040, F_V0_V4, 0x0000600000040001, "TShopGenerator"}, + {0x0040, F_EP3, 0x0000000000000001, "TShopGenerator"}, + + // Telepipe city location. Params: + // param4 = owner client ID (0-3) + {0x0041, F_V0_V4, 0x0000600000040001, "TObjLuker"}, + {0x0041, F_EP3, 0x0000000000000001, "TObjLuker"}, + + // BGM collision. Changes the background music when the player enters the + // object's radius. Params: + // param1 = radius + // param4 = which music to play: + // 00 = SHOP.adx + // 01 = GUILD.adx + // 02 = MEDICAL.adx + // 03 = soutoku.adx + // 04 = city.adx + // 05 = labo.adx + // anything else = value is taken modulo 6 and used as above + {0x0042, F_V0_V4, 0x0000600000040001, "TObjBgmCol"}, + {0x0042, F_EP3, 0x0000000000000001, "TObjBgmCol"}, + + // Main warp to other floors from Pioneer 2. + // Certain floors are available by default, determined by checking the + // game's mode and quest flags. A different set of flags is checked on BB + // than on other versions, presumably since government quests are used to + // unlock areas instead of offline story progression. On later versions + // of BB, all floors are available by default; this table reflects the + // behavior before that change. + // Required flag for mode: Online/multi Offline BB flag + // Episode 1: + // Forest 1: Always open Always open Always open + // Cave 1: 0x17 0x18 0x1F9 + // Mine 1: 0x20 0x21 0x201 + // Ruins 1: 0x30 0x2A 0x207 + // Episode 2: + // VR Temple Alpha: Always open Always open Always open + // VR Spaceship Alpha: 0x4C 0x4D 0x21B + // CCA: 0x4F 0x50 0x225 + // Seabed Upper: 0x52 0x53 0x22F + // Episode 4: + // Crater East Always open + // Crater West 0x2BD + // Crater South 0x2BE + // Crater North 0x2BF + // Crater Interior 0x2C0 + // Subterranean Desert 1 0x2C1 + // Params: + // param5 = main warp type: + // 00 = Episode 1 / Episode 4 + // 01 = Ep2 VR Temple / VR Spaceship (CCA and Seabed not available) + // 02 = Ep2 CCA (VR Temple and Spaceship not available) + {0x0043, F_V0_V4, 0x0000600000040001, "TObjCityMainWarp"}, + + // Lobby teleporter. When used, this object immediately ends the current + // game and sends the player back to the lobby. If constructed offline, + // this object will do nothing and not render. + // This object takes no parameters. + {0x0044, F_V0_V4, 0x0000600000040001, "TObjCityAreaWarp"}, + {0x0044, F_EP3, 0x0000000000000001, "TObjCityAreaWarp"}, + + // Warp to another location on the same map. Used for the Principal's + // office warp. This warp is visible in all game modes, but cannot be + // used in Battle or Challenge mode. Params: + // param1-3 = destination (same as for TObjMapWarpForest) + // param4 = destination angle (same as for TObjMapWarpForest) + // param6 = destination text (clamped to [0, 2]): + // 00 = "The Principal" + // 01 = "Pioneer 2" + // 02 = "Lab" + {0x0045, F_V0_V4, 0x0000600000040001, "TObjCityMapWarp"}, + + // City doors. None of these take any parameters. + {0x0046, F_V0_V4, 0x0000600000000001, "TObjCityDoor_Shop"}, // Door to shop area + {0x0047, F_V0_V4, 0x0000600000000001, "TObjCityDoor_Guild"}, // Door to Hunter's Guild + {0x0048, F_V0_V4, 0x0000600000000001, "TObjCityDoor_Warp"}, // Door to Ragol warp + {0x0049, F_V0_V4, 0x0000600000000001, "TObjCityDoor_Med"}, // Door to Medical Center + + // TODO: Describe this object. There appear to be no parameters. + {0x004A, F_V0_V4, 0x0000600000000001, "__ELEVATOR__"}, + + // Holiday event decorations. There appear to be no parameters, except + // TObjCity_Season_SonicAdv2, which takes param4 = model index (clamped + // to [0, 3]). + {0x004B, F_V0_V4, 0x0000600000040001, "TObjCity_Season_EasterEgg"}, + {0x004C, F_V0_V4, 0x0000600000040001, "TObjCity_Season_ValentineHeart"}, + {0x004D, F_V0_V4, 0x0000600000040001, "TObjCity_Season_XmasTree"}, + {0x004E, F_V0_V4, 0x0000600000040001, "TObjCity_Season_XmasWreath"}, + {0x004F, F_V0_V4, 0x0000600000040001, "TObjCity_Season_HalloweenPumpkin"}, + {0x0050, F_V0_V4, 0x0000600000040001, "TObjCity_Season_21_21"}, + {0x0051, F_V0_V4, 0x0000600000040001, "TObjCity_Season_SonicAdv2"}, + {0x0052, F_V0_V4, 0x0000600000040001, "TObjCity_Season_Board"}, + + // Fireworks effect. Params: + // param1 = area width + // param2 = base height + // param3 = area depth + // param4 = launch frequency (when a firework is launched, the game + // generates a random number R in range [0, 0x7FFF] and waits + // ((param4 + 60) * (r / 0x8000) * 3.0)) frames before launching the + // next firework) + {0x0053, F_V0_V4, 0x0000600400040001, "TObjCity_Season_FireWorkCtrl"}, + + // Door that blocks the lobby teleporter in offline mode. There appear to + // be no parameters. + {0x0054, F_V0_V4, 0x0000600000000001, "TObjCityDoor_Lobby"}, + + // Version of the main warp for Challenge mode? This object seems to + // behave similarly to boss teleporters; it shows the player a Yes/No + // confirmation menu and sends 6x6A to synchronize state. There is a + // global named last_set_mainwarp_value which is set to param4 when this + // object is constructed, but may be changed by a set_mainwarp quest + // opcode after that. If that happens, this object replaces its + // dest_floor with the floor specified in the last set_mainwarp quest + // opcode. Params: + // param4 = destination floor + // param5 = switch flag number + // TODO: This thing has a lot of code; figure out if there are any other + // parameters + {0x0055, F_V2_V4, 0x0000600000040001, "TObjCityMainWarpChallenge"}, + + // Episode 2 Lab door. Params: + // param4 = switch flag number and activation mode: + // negative value = always unlocked + // value in [0x00, 0x100] = unlocked by a switch flag (the bounds + // check appears to be a bug; the range should be [0x00, 0xFF] but + // the game has an off-by-one error) + // value > 0x100 = always locked + // param5 = model (green or red; clamped to [0, 1]) + // param6 = if negative, all switches must be active simultaneously to + // unlock the door; if zero or positive, they may be activated + // sequentially instead (in offline solo mode, this is ignored and + // the sequential behavior is always used); this is somewhat obviated + // for this door type since it can have only one switch flag, but + // other door types may have multiple, for which this is relevant + {0x0056, F_V3_V4, 0x0000400000040000, "TODoorLabo"}, + + // Enables the Trade Window when the player is near this object. Both + // players must be near a TObjTradeCollision object (not necessarily the + // same one) to be able to use the Trade Window with each other. Params: + // param1 = radius + {0x0057, F_V3_V4, 0x0000600000040001, "TObjTradeCollision"}, + {0x0057, F_EP3, 0x0000000000000001, "TObjTradeCollision"}, + + // TODO: Describe this object. Presumably similar to TObjTradeCollision + // but enables the deck edit counter? Params: + // param1 = radius + {0x0058, F_EP3, 0x0000000000000001, "TObjDeckCollision"}, + + // Forest door. Params: + // param4 = switch flag number (low byte) and number to appear on door + // (second-lowest byte, modulo 0x0A) + // param6 = TODO (expected to be 0 or 1) + {0x0080, F_V0_V4, 0x0000400000000006, "TObjDoor"}, + + // Forest switch. Params: + // param4 = switch flag number + // param6 = color (clamped to range [0, 9]) + {0x0081, F_V0_V4, 0x00004FF00078003E, "TObjDoorKey"}, + + // Laser fence and square laser fence. Params: + // param1 = color (range [0, 3]) + // param4 = switch flag number + // param6 = model (TODO) + {0x0082, F_V0_V4, 0x00004FF0000300FE, "TObjLazerFenceNorm"}, + {0x0083, F_V0_V4, 0x00004FF03FFB00FE, "TObjLazerFence4"}, + + // Forest laser fence switch. Params: + // param4 = switch flag number + // param6 = color + {0x0084, F_V0_V4, 0x00004FFC3FFB00FE, "TLazerFenceSw"}, + + // Light rays. Params: + // param1 = TODO + // param2 = vertical scale (y) + // param3 = horizontal scale (x, z) + {0x0085, F_V0_V4, 0x00004E000F800006, "TKomorebi"}, + + // Butterfly. Params: + // param1-3 = TODO + {0x0086, F_V0_V4, 0x00004E0000000006, "TButterfly"}, + + // TODO: Describe this object. Params: + // param1 = model number + {0x0087, F_V0_V4, 0x0000400000000006, "TMotorcycle"}, + + // Item box. Params: + // param1 = if positive, box is specialized to drop a specific item or + // type of item; if zero or negative, box drops any common item or + // none at all (and param3-6 are all ignored) + // param3 = if zero, then bonuses, grinds, etc. are applied to the item + // after it's generated; if nonzero, the item is not randomized at + // all and drops exactly as specified in param4-6 + // param4-6 = item definition. see base_item_for_specialized_box in + // ItemCreator.cc for how these values are decoded + // In the non-specialized case (param1 <= 0), param3-6 are still sent via + // the 6xA2 command when the box is opened on v3 and later, and the + // server may choose to use those parameters for some purpose. The client + // implementation ignores them when param1 <= 0, and newserv does too. + {0x0088, F_V0_V4, 0x00004FF0B00000FE, "TObjContainerBase2"}, + {0x0088, F_EP3, 0x0000000000000002, "TObjContainerBase2"}, + + // Elevated cylindrical tank. Params: + // param1-3 = TODO + {0x0089, F_V0_V4, 0x0000400000000006, "TObjTank"}, + + // TODO: Describe this object. Params: + // param1-3 = TODO + {0x008A, F_V0_V2, 0x0000000000000006, "TObjBattery"}, + + // Forest console. Params: + // param4 = quest label to call when activated (inherited from + // TObjMesBase) + // param5 = model (clamped to [0, 1]) + // param6 = type (clamped to [0, 1]; 0 = "QUEST", 1 = "RICO") + // (inherited from TObjMesBase) + {0x008B, F_V0_V1, 0x0000000000000406, "TObjComputer"}, + {0x008B, F_V2_V4, 0x00004FFC3FFB07FE, "TObjComputer"}, + + // Black sliding door. Params: + // param1 = total distance (divided evenly by the number of switch + // flags, from param4) + // param2 = speed + // param4 = base switch flag (the actual switch flags used are param4, + // param4 + 1, param4 + 2, etc.) + // param5 = number of switch flags (clamped to [1, 4]) + // param6 = TODO (only matters if this is zero or nonzero) + {0x008C, F_V0_V1, 0x0000000000000006, "TObjContainerIdo"}, + {0x008C, F_V2_V4, 0x000040000000000E, "TObjContainerIdo"}, + + // Rico message pod. This object immediately destroys itself in Challenge + // mode or split-screen mode. Params: + // param4 = enable condition: + // negative = enabled when player is within 70 units + // range [0x00, 0xFF] = enabled by corresponding switch flag + // 0x100 and above = never enabled + // param5 = message number (used with message quest opcode; TODO: has + // the same [100, 999] check as some other objects) + // param6 = quest label to call when activated + {0x008D, F_V0_V4, 0x00004000000027FE, "TOCapsuleAncient01"}, + + // Energy barrier. Params: + // param4 = switch flag number and activation mode (same as for + // TODoorLabo) + {0x008E, F_V0_V4, 0x00004FF0000000F6, "TOBarrierEnergy01"}, + + // Forest rising bridge. Once enabled (risen), this object cannot be + // disabled; that is, there is no way to make the bridge retract. When + // disabled, the bridge is 30 units below its initial position; when + // enabled, it rises to its initial position. Params: + // param2 = rise speed in units per frame + // param4 = switch flag number + {0x008F, F_V0_V4, 0x0000400000000006, "TObjHashi"}, + + // Generic switch. Visually, this is the type usually used for objects + // other than doors, such as lights, poison rooms, and the Forest 1 + // bridge. Params: + // param1 = activation mode: + // negative = temporary (TODO: test this) + // zero or positive = permanent (normal) + // param4 = switch flag number + {0x0090, F_V0_V4, 0x00004FFC3FFB00C6, "TOKeyGenericSw"}, + + // Box that triggers a wave event when opened. Params: + // param4 = event number + {0x0091, F_V0_V4, 0x00004FF0300000FE, "TObjContainerEnemy"}, + + // Large box (usually used for specialized drops). Same parameters as + // 0x0088 (TObjContainerBase2) + {0x0092, F_V0_V4, 0x00005E00B00078FE, "TObjContainerBase"}, + + // Large enemy box. Same parameters as 0x0091 (TObjContainerEnemy). + {0x0093, F_V0_V4, 0x00004FF0300000FE, "TObjContainerAbeEnemy"}, + + // Always-empty box. There are no parameters. + {0x0095, F_V0_V4, 0x00004FF0000000FE, "TObjContainerNoItem"}, + + // Laser fence. This object is only available in v2 and later. Params: + // param1 = color (clamped to [0, 3]) + // param2 = depth of collision box (transverse to lasers) + // param3 = length of collision box (parallel to lasers) + // param4 = switch flag number + // param6 = model: + // 0 = short fence + // 1 = long fence + // anything else = invisible + {0x0096, F_V0_V4, 0x00004FFC3FFB07FE, "TObjLazerFenceExtra"}, + + // Caves floor button. The activation radius is always 10 units. Params: + // param4 = switch flag number + // param5 = activation mode: + // negative = temporary (disables flag when player leaves) + // zero or positive = permanent + {0x00C0, F_V0_V4, 0x00004FFC3FFB0038, "TOKeyCave01"}, + + // Caves multiplayer door. Params: + // param4 = base switch flag number (the actual switch flags used are + // param4, param4 + 1, param4 + 2, etc.; if this is negative, the + // door is always unlocked) + // param5 = 4 - number of switch flags (so if e.g. door should require + // only 3 switch flags, set param5 to 1) + // param6 = synchronization mode: + // negative = when all switch flags are enabled, door is permanently + // unlocked via 6x0B even if some switch flags are disabled later + // zero or positive = door only stays unlocked while all of the + // switch flags are active and locks again when any are disabled + // (no effect in single-player offline mode; the negative behavior + // is used instead) + {0x00C1, F_V0_V4, 0x0000400000000038, "TODoorCave01"}, + + // Caves standard door. Params: + // param4 = switch flag number (negative = always unlocked; >0x100 = + // always locked) + {0x00C2, F_V0_V4, 0x0000400000000038, "TODoorCave02"}, + + // Caves ceiling piston trap. There are three types of this object, which + // can be chosen via param6. If param6 is not 0, 1, or 2, no object is + // created. + // Params for TOHangceilingCave01Normal (param6 = 0): + // param1 = TODO (radius delta? value is param1 + 29) + // param2 = TODO (value is 1 - param2) + // param3 = TODO (value is param3 + 100) + // Params for TOHangceilingCave01Key (param6 = 1): + // param1-3 = same as for TOHangceilingCave01Normal + // param4 = switch flag number (drops when switch flag is activated; + // when it has finished dropping, it disables the switch flag) + // Params for TOHangceilingCave01KeyQuick (param6 = 2): + // param1-4 = same as for TOHangceilingCave01Key, but unlike that + // object, does not disable the switch flag automatically + {0x00C3, F_V0_V4, 0x0000400800780038, "TOHangceilingCave01*"}, + + // Caves signs. There appear to be no parameters. + {0x00C4, F_V0_V4, 0x0000400000000030, "TOSignCave01"}, + {0x00C5, F_V0_V4, 0x0000400000000030, "TOSignCave02"}, + {0x00C6, F_V0_V4, 0x0000400000000030, "TOSignCave03"}, + + // Hexagonal tank. There appear to be no parameters. + {0x00C7, F_V0_V4, 0x0000400000000030, "TOAirconCave01"}, + + // Brown platform. There appear to be no parameters. + {0x00C8, F_V0_V4, 0x0000400000000030, "TOAirconCave02"}, + + // Revolving warning light. Params: + // param1 = rotation speed in degrees per frame + {0x00C9, F_V0_V4, 0x000041F000000030, "TORevlightCave01"}, + + // Caves rainbow. Params: + // param1-3 = scale factors (x, y, z) + // param4 = TODO (value is 1 / (param4 + 30)) + // param6 = visibility radius? (TODO; value is param6 + 40000) + {0x00CB, F_V0_V4, 0x0000400000000010, "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, F_V0_V4, 0x0000400030000010, "TOKurage"}, + + // Floating dragonfly. Params: + // param1 = TODO + // param2 = TODO + // param3 = max distance from home? + // param4 = TODO + // param5 = TODO + {0x00CD, F_V0_V4, 0x00004E0000610010, "TODragonflyCave01"}, + + // Caves door. Params: + // param4 = switch flag number + {0x00CE, F_V0_V4, 0x0000400000000038, "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, F_V0_V4, 0x00004008000000F8, "TOBind"}, + + // Caves cake shop. There appear to be no parameters. + {0x00D0, F_V0_V4, 0x0000400000000020, "TOCakeshopCave01"}, + + // Various solid rock objects used in the Cave areas. There are small, + // medium, and large variations of each, and for the 02 variations, there + // are also "Simple" variations (00D7-00D9). None of these objects take + // any parameters. + {0x00D1, F_V0_V4, 0x0000400000000008, "TORockCaveS01"}, + {0x00D2, F_V0_V4, 0x0000400000000008, "TORockCaveM01"}, + {0x00D3, F_V0_V4, 0x00004FF000000008, "TORockCaveL01"}, + {0x00D4, F_V0_V4, 0x0000000000000010, "TORockCaveS02"}, + {0x00D5, F_V0_V4, 0x0000000000000010, "TORockCaveM02"}, + {0x00D6, F_V0_V4, 0x0000000000000010, "TORockCaveL02"}, + {0x00D7, F_V0_V4, 0x0000000000000010, "TORockCaveSS02"}, + {0x00D8, F_V0_V4, 0x0000000000000010, "TORockCaveSM02"}, + {0x00D9, F_V0_V4, 0x0000000000000010, "TORockCaveSL02"}, + {0x00DA, F_V0_V4, 0x0000000000000020, "TORockCaveS03"}, + {0x00DB, F_V0_V4, 0x0000000000000020, "TORockCaveM03"}, + {0x00DC, F_V0_V4, 0x0000000000000020, "TORockCaveL03"}, + + // Caves floor button 2. Params: + // param1-3 = scale factors (visual only) + // param4 = switch flag number + // param5 high word = sound delay in frames after activate/deactivate + // param5 low word = model index for VR Temple / VR Spaceship? (there + // are only two: this word may be zero or nonzero) + // param6 high word = sound activation mode: + // 1 = play sound only when switch activated + // anything else = play sound when activated and when deactivated + // param6 low word = sound to play (1-6) (TODO: Describe these): + // 1 => 4005281F (GC) + // 2 => 00053F06 (GC) + // 3 => 00052812 (GC) + // 4 => 00052813 (GC) + // 5 => 4001C112 (GC) + // 6 => 4002A60B (GC) + // TODO: Are there more sounds available here on BB? + {0x00DE, F_V2_V4, 0x00004FFC3FFB07FE, "TODummyKeyCave01"}, + + // Breakable rocks, in small, medium, and large variations. All of these + // take the following parameter: + // param4 = switch flag number + {0x00DF, F_V2_V4, 0x0000400000000008, "TORockCaveBL01"}, + {0x00E0, F_V2_V4, 0x0000400000000010, "TORockCaveBL02"}, + {0x00E1, F_V2_V4, 0x0000400000000020, "TORockCaveBL03"}, + + // Mines multi-switch door. Params: + // param4 = base switch flag number (the actual switch flags used are + // param4, param4 + 1, param4 + 2, etc.; if this is negative, the + // door is always unlocked) + // param5 = 4 - number of switch flags (so if e.g. door should require + // only 3 switch flags, set param5 to 1) + {0x0100, F_V0_V4, 0x00004000000000C0, "TODoorMachine01"}, + + // Mines floor button. The activation radius is always 10 units. Params: + // param4 = switch flag number + // param5 = activation mode: + // negative = temporary (disables flag when player leaves) + // zero or positive = permanent + {0x0101, F_V0_V1, 0x00000000000000C0, "TOKeyMachine01"}, + {0x0101, F_V2_V4, 0x00004FF0007B00C6, "TOKeyMachine01"}, + + // Mines single-switch door, or Ep4 test door if in Episode 4. Params (for + // both object types): + // param4 = switch flag number + {0x0102, F_V0_V4, 0x00000000000000C0, "TODoorMachine02"}, + {0x0102, F_V4, 0x00004E0000000000, "__EP4_TEST_DOOR__"}, + + // Large cryo-tube. There appear to be no parameters. + {0x0103, F_V0_V4, 0x00004008000000C0, "TOCapsuleMachine01"}, + + // Computer. Same parameters as 0x008D (TOCapsuleAncient01). + {0x0104, F_V0_V4, 0x00004008000000C0, "TOComputerMachine01"}, + + // Green monitor. Params: + // param4 = initial state? (clamped to [0, 3]; appears to cycle through + // those 4 values on its own) + {0x0105, F_V0_V4, 0x00004008000000C0, "TOMonitorMachine01"}, + + // Floating robot. Same params as 0x00CD (TODragonflyCave01), though it + // appears that some may have different scale factors or offsets (TODO). + {0x0106, F_V0_V4, 0x00004000000000C0, "TODragonflyMachine01"}, + + // Floating blue light. Params: + // param4 = TODO + // param5 = TODO + // param6 = TODO + {0x0107, F_V0_V4, 0x00004000000000C0, "TOLightMachine01"}, + + // Self-destructing objects. Params: + // param1 = radius delta (actual radius is param1 + 30) + {0x0108, F_V0_V4, 0x00004000000000C0, "TOExplosiveMachine01"}, + {0x0109, F_V0_V4, 0x00004000000000C0, "TOExplosiveMachine02"}, + {0x010A, F_V0_V4, 0x00004000000000C0, "TOExplosiveMachine03"}, + + // Spark machine. Params: + // param1 = TODO (value is param1 - 0.98) + // param2 = TODO (seems it only matters if this is <= 0 or not) + {0x010B, F_V0_V4, 0x00004000000000C0, "TOSparkMachine01"}, + + // Large flashing box. Params: + // param2 = TODO (seems it only matters if this is < 0 or not) + {0x010C, F_V0_V4, 0x00004000000000C0, "TOHangerMachine01"}, + + // Ruins entrance door (after Vol Opt). This object reads quest flags + // 0x2C, 0x2D, and 0x2E to determine the state of each seal on the door + // (for Forest, Caves, and Mines respectively). It then checks quest flag + // 0x2F; if this flag is set, then all seals are unlocked regardless of + // the preceding three flags' values. Curiously, it seems that these + // flags are checked every frame, even though it's normally impossible to + // change their values in the area where this object appears. + // No parameters. + {0x0130, F_V0_V4, 0x0000400000002000, "TODoorVoShip"}, + + // Ruins floor warp. Params: + // param4 = destination floor + // param6 = color (negative = red, zero or positive = blue); if this is + // >= 0 in Challenge mode, the warp is destroyed immediately + {0x0140, F_V0_V4, 0x0000400000000700, "TObjGoalWarpAncient"}, + + // Ruins intra-area warp. Same parameters as 0x0003 (TObjMapWarpForest), + // but also: + // param5 = type (negative = one-way, zero or positive = normal) + {0x0141, F_V0_V4, 0x0000400000000700, "TObjMapWarpAncient"}, + + // Ruins switch. Same parameters as 0x00C0 (TOKeyCave01). + {0x0142, F_V0_V4, 0x0000400000000700, "TOKeyAncient02"}, + + // Ruins floor button. Same parameters as 0x00C0 (TOKeyCave01). + {0x0143, F_V0_V4, 0x0000400000000700, "TOKeyAncient03"}, + + // Ruins doors. These all take the same params as 0x00C2 (TODoorCave02). + {0x0144, F_V0_V4, 0x0000400000000100, "TODoorAncient01"}, // Usually used in Ruins 1 + {0x0145, F_V0_V4, 0x0000400000000400, "TODoorAncient03"}, // Usually used in Ruins 3 + {0x0146, F_V0_V4, 0x0000400000000200, "TODoorAncient04"}, // Usually used in Ruins 2 + {0x0147, F_V0_V4, 0x0000400000000100, "TODoorAncient05"}, // Usually used in Ruins 1 + {0x0148, F_V0_V4, 0x0000400000000200, "TODoorAncient06"}, // Usually used in Ruins 2 + {0x0149, F_V0_V4, 0x0000400000000400, "TODoorAncient07"}, // Usually used in Ruins 3 + + // Ruins 4-player door. Params: + // param4 = base switch flag number (the actual switch flags used are + // param4, param4 + 1, param4 + 2, and param4 + 3); param4 is clamped + // to [0, 0xFC] + // param6 = activation mode; same as for 0x00C1 (TODoorCave01) + {0x014A, F_V0_V4, 0x0000400000000700, "TODoorAncient08"}, + + // Ruins 2-player door. Params: + // param4 = base switch flag number (the actual switch flags used are + // param4 and param4 + 1); param4 is clamped to [0, 0xFE] + // param6 = activation mode; same as for 0x00C1 (TODoorCave01) + {0x014B, F_V0_V4, 0x0000400000000700, "TODoorAncient09"}, + + // Ruins sensor. Params: + // param1 = activation radius delta (actual radius is param1 + 50) + // param4 = switch flag number + // param5 = if negative, sensor is always on + // param6 = TODO (clamped to [0, 1] - model index?) + {0x014C, F_V0_V4, 0x0000400000000700, "TOSensorAncient01"}, + + // Ruins laser fence switch. Params: + // param1 = if negative, switch's effect is temporary; if zero or + // positive, it's permanent + // param4 = switch flag number + // param5 = color (clamped to [0, 3]) + {0x014D, F_V0_V4, 0x0000400000000700, "TOKeyAncient01"}, + + // Ruins fence objects. Params: + // param4 = switch flag number (negative = always unlocked) + // param5 = color (clamped to [0, 3]) + {0x014E, F_V0_V4, 0x00004FF000000700, "TOFenceAncient01"}, // 4x2 + {0x014F, F_V0_V4, 0x00004FF000000700, "TOFenceAncient02"}, // 6x2 + {0x0150, F_V0_V4, 0x0000400000000700, "TOFenceAncient03"}, // 4x4 + {0x0151, F_V0_V4, 0x0000400000000700, "TOFenceAncient04"}, // 6x4 + + // Ruins poison-spewing blob. This object is technically an item box, and + // drops an item when destroyed. Unlike most other item boxes, it cannot + // be specialized (ignore_def is always true). Params: + // param1 = TODO (value is param1 + 299) + // param2 = TODO (value is param2 + 209) + // param3 = TODO (value is param3 + 399) + // param6 = TODO (value is param6 + 4) + {0x0152, F_V0_V4, 0x00004E000F800700, "TContainerAncient01"}, + + // Ruins falling trap. Trap power seems to be scaled by difficulty + // (Normal = x1, Hard = x2, Very Hard = x3, Ultimate = x6). Params: + // param1 = trigger radius delta (value is (param1 / 2) + 30) + // param2 = TODO (clamped below to 0) + // param3 = TODO (clamped below to 1) + // param4 = TODO (seems it only matters if this is negative or not in + // the base class (TOTrap), but TOTrapAncient01 clamps it below to 0) + // param5 = TODO (clamped to [0, 5]; calls player->vtable[0x19] on + // explode unless this is 5) + // param6 = TODO (value is param6 + 30, multipled by 0.33 if offline) + {0x0153, F_V0_V4, 0x0000400000780700, "TOTrapAncient01"}, + + // Ruins pop-up trap. Params: + // param1 = trigger radius delta (value is (param1 / 2) + 30) + // param4 = delay (value is param4 + 30; clamped below to 0) + // angle.z = TODO (seems it only matters if angle.z is > 0 or not) + {0x0154, F_V0_V4, 0x0000400000000700, "TOTrapAncient02"}, + + // Ruins crystal monument. Same parameters as TOCapsuleAncient01. + {0x0155, F_V0_V4, 0x0000400000000700, "TOMonumentAncient01"}, + + // Non-Ruins monument. Sets a quest flag when activated. The quest flag + // depends on which area the object appears in: + // Mine 2 = 0x2E + // Cave 2 = 0x2D + // Any other area = 0x2C + // When all three of the above quest flags are active, this object also + // sets quest flag 0x2F. + // There appear to be no parameters. + {0x0156, F_V0_V4, 0x0000400000000094, "TOMonumentAncient02"}, + + // Ruins rocks. None of these take any parameters. + {0x0159, F_V0_V4, 0x0000400000000700, "TOWreckAncient01"}, + {0x015A, F_V0_V4, 0x0000400000000700, "TOWreckAncient02"}, + {0x015B, F_V0_V4, 0x0000400000000700, "TOWreckAncient03"}, + {0x015C, F_V0_V4, 0x0000400000000700, "TOWreckAncient04"}, + {0x015D, F_V0_V4, 0x0000400000000700, "TOWreckAncient05"}, + {0x015E, F_V0_V4, 0x0000400000000700, "TOWreckAncient06"}, + {0x015F, F_V0_V4, 0x0000400000000700, "TOWreckAncient07"}, + + // This ID constructs different objects depending on where it's used. On + // floor 0D (Vol Opt), it constructs TObjWarpBoss03; on other floors + // where it's valid, it constructs TObjFogCollisionPoison. + // TObjFogCollisionPoison creates a switchable, foggy area that's visible + // and hurts the player if the switch flag isn't on. Params are the same + // as for 0x0018 (TObjFogCollisionSwitch), but there is also: + // param2 = poison power (scaled by difficulty: Normal = x1, Hard = x2, + // Very Hard = x3, Ultimate = x6) + // TObjWarpBoss03 creates an invisible warp. This is used for the warp + // behind the door to Ruins after defeating Vol Opt. Params: + // param4 = destination floor + {0x0160, F_V0_V4, 0x0000400000002000, "TObjWarpBoss03"}, + {0x0160, F_V0_V4, 0x00004FF030600700, "TObjFogCollisionPoison"}, + + // Ruins specialized box. Same parameters as 0x0088 (TObjContainerBase2). + {0x0161, F_V0_V4, 0x00004003007B0700, "TOContainerAncientItemCommon"}, + + // Ruins random box. Same parameters as 0x0088 (TObjContainerBase2). + {0x0162, F_V0_V4, 0x00004003007B0700, "TOContainerAncientItemRare"}, + + // Ruins enemy boxes, disguised as either of the above two objects. + // Params: + // param4 = event number + {0x0163, F_V0_V4, 0x00004000007B0700, "TOContainerAncientEnemyCommon"}, + {0x0164, F_V0_V4, 0x00004000007B0700, "TOContainerAncientEnemyRare"}, + + // Ruins always-empty box. There are no parameters. + {0x0165, F_V2_V4, 0x00004000007B0700, "TOContainerAncientItemNone"}, + + // Ruins breakable rock. Params: + // param4 = switch flag number (when enabled, destroys this object) + {0x0166, F_V2_V4, 0x0000400000000700, "TOWreckAncientBrakable05"}, + + // Ruins pop-up trap with techs. Params: + // param1 = trigger radius delta (value is (param1 / 2) + 30) + // param2 = number of hits to destroy trap (clamped to [1, 256]) + // param3 = tech level modifier: + // Normal: level = param3 + 1 (clamped to [0, 14]) + // Hard: level = (param3 * 2) + 1 (clamped to [0, 14]) + // Very Hard: level = (param3 * 4) + 1 (clamped to [0, 14]) + // Ultimate: level = (param3 * 6) + 1 (clamped to [0, 29]) + // (Note: level is offset by 1, so a value of 0 means tech level 1) + // param4 = delay (value is param4 + 30; clamped below to 0) + // param5 = switch flag number (negative = always active) + // param6 = tech number: + // 0 = Foie + // 1 = Gizonde + // 2 = Gibarta + // 3 = Megid + // anything else = Gifoie + // angle.z = TODO (seems it only matters if angle.z is > 0 or not) + {0x0167, F_V2_V4, 0x0000400C3FF807C0, "TOTrapAncient02R"}, + + // Flying white bird. Params: + // param1 = TODO (value is param1 + 1) + // param2 = TODO (value is param2 + 50) + // param3 = TODO (value is param3 + 100) + // param4 = number of birds? (value is param4 + 3, clamped to [1, 6]) + // param5 = TODO (value is (param5 / 10) + 1) + // param6 = TODO (value is (param6 / 10) + 1) + {0x0170, F_V0_V4, 0x0000400000614000, "TOBoss4Bird"}, + + // Dark Falz obelisk. There appear to be no parameters. + {0x0171, F_V0_V4, 0x0000400000004000, "TOBoss4Tower"}, + + // Floating rocks. Params: + // param1 = x/z range delta? (value is param1 + 50) + // param2 = TODO (value is abs(param2)) + // param4 = number of rocks? (clamped to [1, 8]) + {0x0172, F_V0_V4, 0x0000400000004000, "TOBoss4Rock"}, + + // Floating soul. Params: + // param1 = TODO + // param2 = TODO + // param3 = TODO + // param4 = TODO (seems it only matters if this is negative or not) + // param5 = TODO + // param6 = TODO + {0x0173, F_V0_V2, 0x0000000000004000, "TOSoulDF"}, + + // Butterfly. This is a subclass of TODragonfly and takes the same params + // as 0x00CD (TODragonflyCave01), but also: + // param6 = model number? (clamped to [0, 2]) + {0x0174, F_V0_V2, 0x0000000000004000, "TOButterflyDF"}, + + // Lobby information counter (game menu) collision. Params: + // param1 = radius + {0x0180, F_V0_V4, 0x0000400000008000, "TObjInfoCol"}, + {0x0180, F_EP3, 0x0000000000008000, "TObjInfoCol"}, + + // Warp between lobbies (not warp out of game to lobby). Params: + // param5 = hide beams (beams shown if <= 0, hidden if > 0) + {0x0181, F_V0_V4, 0x0000400000008000, "TObjWarpLobby"}, + {0x0181, F_EP3, 0x0000000000008000, "TObjWarpLobby"}, + + // Lobby 1 event object (tree). Params: + // param4 = default decorations when there is no event: + // 0x01 = flowers (Lobby 2) + // 0x02 = fountains (Lobby 4) + // 0x03 = very tall aquariums (Lobby 5) + // 0x04 = green trees (Lobby 1) + // 0x05 = stained glass windows (Lobby 9) + // 0x06 = snowy evergreen trees (Lobby 10) + // 0x07 = windmills (Lobby 3) + // 0x08 = spectral columns (Lobby 8) + // 0x09 = planetary models (Lobby 7) + // Anything else = grass (Lobby 6) + {0x0182, F_V3_V4, 0x0000400000008000, "TObjLobbyMain"}, + {0x0182, F_EP3, 0x0000000000008000, "TObjLobbyMain"}, + + // Lobby pigeon. Params: + // param4 = model number? (clamped to [0, 2]) + // param5 = TODO (3 different behaviors: <= 0, == 1, or >= 2) + // param6 = TODO (it only matters if this is > 0 or not) + // Visibility depends on the current season event in a complicated way: + // If param5 <= 0, visible only when there's no season event + // If param5 == 1 and param6 <= 0, visible during Wedding event + // If param5 == 2 and param6 <= 0, visible during Valentine's Day and + // White Day events + // If none of the above, visible during Halloween event + {0x0183, F_V3_V4, 0x0000400000008000, "__LOBBY_PIGEON__"}, + {0x0183, F_EP3, 0x0000000000008002, "__LOBBY_PIGEON__"}, + + // Lobby butterfly. Params: + // param4 = model number (only two models; <= 0 or > 0) + // TODO: Is this object's visibility affected by season events? It may + // only be affected by the event when the object loads, and not when the + // season is changed via the DA command. + {0x0184, F_V3_V4, 0x0000400000008000, "TObjButterflyLobby"}, + {0x0184, F_EP3, 0x0000000000008002, "TObjButterflyLobby"}, + + // Lobby rainbow. Visible only when there is no season event. There are + // no parameters. + {0x0185, F_V3_V4, 0x0000400000008000, "TObjRainbowLobby"}, + {0x0185, F_EP3, 0x0000000000008002, "TObjRainbowLobby"}, + + // Lobby pumpkin. Visible only during Halloween season event. There are + // no parameters. + {0x0186, F_V3_V4, 0x0000400000008000, "TObjKabochaLobby"}, + {0x0186, F_EP3, 0x0000000000008000, "TObjKabochaLobby"}, + + // Lobby stained-glass windows. Params: + // param4 = event flag: + // zero or negative = visible only when no season event is active + // positive = visible only during Christmas season event + {0x0187, F_V3_V4, 0x0000400000008000, "TObjStendGlassLobby"}, + {0x0187, F_EP3, 0x0000000000008000, "TObjStendGlassLobby"}, + + // Lobby red and white striped curtain. Visible only during the spring + // and summer season events (12 and 13). No parameters. + {0x0188, F_V3_V4, 0x0000400000008000, "TObjCurtainLobby"}, + {0x0188, F_EP3, 0x0000000000008000, "TObjCurtainLobby"}, + + // Lobby wedding arch. Visible only during the wedding season event. No + // parameters. + {0x0189, F_V3_V4, 0x0000400000008000, "TObjWeddingLobby"}, + {0x0189, F_EP3, 0x0000000000008000, "TObjWeddingLobby"}, + + // Lobby snowy evergreen tree (Lobby 10). No parameters. + {0x018A, F_V3_V4, 0x0000400000008000, "TObjTreeLobby"}, + {0x018A, F_EP3, 0x0000000000008000, "TObjTreeLobby"}, + + // Lobby aquarium (Lobby 5). Visible only when there is no season event. + // No parameters. + {0x018B, F_V3_V4, 0x0000400000008000, "TObjSuisouLobby"}, + {0x018B, F_EP3, 0x0000000000008000, "TObjSuisouLobby"}, + + // Lobby particles. Params: + // param1 = TODO (clamped to [0, 575]) + // param3 = same as param3 from 0001 (TObjParticle) + // param4 = particle type (0-9; any other value treated as 0) + // param5 = same as param4 (not param5!) from 0001 (TObjParticle) + // param6 = same as param5 (not param6!) from 0001 (TObjParticle) + {0x018C, F_V3_V4, 0x0000400000008000, "TObjParticleLobby"}, + {0x018C, F_EP3, 0x0000000000008000, "TObjParticleLobby"}, + + // Episode 3 lobby battle table. Params: + // param4 = player count (1-4); only 2 and 4 are used in-game + // param5 = table number (used in E4 and E5 commands) + {0x018D, F_EP3, 0x0000000000008000, "TObjLobbyTable"}, + + // Episode 3 lobby jukebox. No parameters. + {0x018E, F_EP3, 0x0000000000008000, "TObjJukeBox"}, + + // TODO: Describe this object. There appear to be no parameters. + {0x0190, F_V2_V4, 0x0000400000610000, "TObjCamera"}, + + // Short Spaceship wall. There appear to be no parameters. + {0x0191, F_V2_V4, 0x0000400800610000, "TObjTuitate"}, + + // Spaceship door. Params: + // param4 = switch flag number (if this is negative, the door is always + // unlocked) + {0x0192, F_V2_V4, 0x0000400000610000, "TObjDoaEx01"}, + + // Tall Spaceship wall. There appear to be no parameters. + {0x0193, F_V2_V4, 0x0000400800610000, "TObjBigTuitate"}, + + // Temple door. Params: + // param4 = switch flag number (if this is negative, the door is always + // unlocked) + {0x01A0, F_V2_V4, 0x00004000001A0000, "TODoorVS2Door01"}, + + // Temple rubble. None of these take any parameters. + {0x01A1, F_V2_V4, 0x00004000001A0000, "TOVS2Wreck01"}, // Partly-broken wall (like breakable wall) + {0x01A2, F_V2_V4, 0x00004000001A0000, "TOVS2Wreck02"}, // Broken column + {0x01A3, F_V2_V4, 0x00004000001A0000, "TOVS2Wreck03"}, // Broken wall pieces lying flat + {0x01A4, F_V2_V4, 0x00004000001A0000, "TOVS2Wreck04"}, // Column + {0x01A5, F_V2_V4, 0x00004000001A0000, "TOVS2Wreck05"}, // Broken toppled column + {0x01A6, F_V2_V4, 0x00004000001A0000, "TOVS2Wreck06"}, // Truncated conic monument + + // Temple breakable wall, which looks like 0x01A1 (TOVS2Wreck01). Params: + // param4 = number of hits, minus 256 for some reason (for example, for + // a 6-hit wall, this should be -250, or 0xFFFFFF06) + {0x01A7, F_V2_V4, 0x00004000001A0000, "TOVS2Wall01"}, + + // Lens flare enable/disable switch. This object triggers when the local + // player is within 20 units, and sets a global which determines whether + // objects of type 0x001E (__LENS_FLARE__) should render anything. + // Params: + // param1 = if > 0, enable lens flare rendering; if <= 0, disable it + // This object isn't constructed in split-screen mode. + {0x01A8, F_V2_V4, 0x000041F1001A0000, "__LENS_FLARE_SWITCH_COLLISION__"}, + + // Rising bridges. Similar to 0x008F (TObjHashi). Params: + // param1 = extra depth when lowered (this is added to TObjHashiBase's + // 30 unit displacement if the bridge is lowered when constructed) + // param2 = rise speed in units per frame + // param4 = switch flag number + {0x01A9, F_V2_V4, 0x00004000001A0000, "TObjHashiVersus1"}, // Small brown rising bridge + {0x01AA, F_V2_V4, 0x00004000001A0000, "TObjHashiVersus2"}, // Long rising bridge + + // Multiplayer Temple/Spaceship doors. Params: + // param4 = base switch flag number (the actual switch flags used are + // param4, param4 + 1, param4 + 2, etc.; if this is negative, the + // door is always unlocked) + // param5 = number of switch flags + // param6 = synchronization mode: + // negative = when all switch flags are enabled, door is permanently + // unlocked via 6x0B even if some switch flags are disabled later + // zero or positive = door only stays unlocked while all of the + // switch flags are active and locks again when any are disabled + // (no effect in single-player offline mode; the negative behavior + // is used instead) + {0x01AB, F_V3_V4, 0x0000400000180000, "TODoorFourLightRuins"}, // Temple + {0x01C0, F_V3_V4, 0x0000000000600000, "TODoorFourLightSpace"}, // Spaceship + + // CCA item box. It seems this box type cannot be specialized. There are + // no parameters. + {0x0200, F_V3_V4, 0x000041FC4F800000, "TObjContainerJung"}, + + // CCA cross-floor warp. Params: + // param4 = destination floor + // param6 = color (0 = blue, 1 = red); if this is 0 in Challenge mode, + // the warp is destroyed immediately + {0x0201, F_V3_V4, 0x0000400CFF800000, "TObjWarpJung"}, + + // CCA door. Params: + // param4 = base switch flag number (the actual switch flags used are + // param4, param4 + 1, param4 + 2, etc.; if this is negative, the + // door is always unlocked) + // param5 = number of switch flags + {0x0202, F_V3_V4, 0x0000400C0F800000, "TObjDoorJung"}, + + // CCA item box. Same parameters as 0x0088 (TObjContainerBase2). + // In the Episode 4 Crater areas, this object constructs 0x92 + // (TObjContainerBase) instead. + {0x0203, F_V3_V4, 0x0000400C4F800000, "TObjContainerJungEx"}, + {0x0203, F_V4, 0x000001F000000000, "TObjContainerBase(0203)"}, + + // CCA main door. This door checks quest flags 0x0046, 0x0047, and 0x0048 + // and opens when all are enabled. There are no parameters. + {0x0204, F_V3_V4, 0x0000400000800000, "TODoorJungleMain"}, + + // CCA main door switch. This switch sets one of the quest flags checked + // by 0x0204 (TODoorJungleMain). Params: + // param4 = quest flag index (0 = 0x0046, 1 = 0x0047, 2 = 0x0048) + {0x0205, F_V3_V4, 0x0000400C0F800000, "TOKeyJungleMain"}, + + // Jungle breakable rocks. Params: + // param4 = switch flag number (object is passable when enabled) + {0x0206, F_V3_V4, 0x000040040F800000, "TORockJungleS01"}, // Small rock + {0x0207, F_V3_V4, 0x000040040F800000, "TORockJungleM01"}, // Small 3-rock wall + + // Jungle large 3-rock wall. Unlike the above, this takes no parameters + // and cannot be opened. + {0x0208, F_V3_V4, 0x000040040F800000, "TORockJungleL01"}, + + // Jungle plant. Params: + // param4 = model number? (clamped to [0, 1]) + {0x0209, F_V3_V4, 0x000040040F800000, "TOGrassJungle"}, + + // CCA warp outside main gate. Unlike other warps on Ragol, this one + // presents the player with a choice of areas: Jungle North (6), Mountain + // (8), or Seaside (9). Params: + // param6 = color (0 = blue, 1 = red); if this is 0 in Challenge mode, + // the warp is destroyed immediately + {0x020A, F_V3_V4, 0x0000400C0F800000, "TObjWarpJungMain"}, + + // Background lightning generator. Each strike lasts for 11 frames and + // strikes at a random angle around the player. Params: + // param1 = lightning distance from player + // param2 = lightning height + // param3 = TODO (value is ((param3 / 32768) * 0.3) + 1) + // param4 = minimum frames between strikes + // param5 = interval randomness (after each strike, a random number is + // chosen between param4 and (param4 + param5) to determine how many + // frames to wait until the next strike) + {0x020B, F_V3_V4, 0x0000400040800000, "TBGLightningCtrl"}, + + // Bird objects. Params: + // param4 = model number? (clamped to [0, 2]) + {0x020C, F_V3_V4, 0x00004E0C0B000000, "__WHITE_BIRD__"}, // Formerly __TObjPathObj_subclass_020C__ + {0x020D, F_V3_V4, 0x000040080B000000, "__ORANGE_BIRD__"}, // Formerly __TObjPathObj_subclass_020D__ + + // Jungle box that triggers a wave event when opened. Params: + // param4 = event number + // param5 = model number (clamped to [0, 1]) + {0x020E, F_V3_V4, 0x0000400C0F800000, "TObjContainerJungEnemy"}, + + // Chain saw damage trap. Params: + // param2 = base damage (multiplied by difficulty: Normal = x1/5, Hard + // = x2/5, Very Hard = x3/5, Ultimate = x6/5) + // param3 = model number (<= 0 for small saw, > 0 for large saw) + // param4 = switch flag number (disabled when switch flag is enabled) + // param5 high word = rotation range (16-bit angle) + // param5 low word = rotation speed (angle units per frame) + // param6 high word = if nonzero, ignore rotation range and rotate in a + // full circle instead + // param6 low word = delay between cycles (seconds) + {0x020F, F_V3_V4, 0x0000400C3F800000, "TOTrapChainSawDamage"}, + + // Laser detector trap. Params: + // param3 = model number (<= for small laser, > 0 for large laser) + // param4 = switch flag number (enables this flag when triggered) + // param5-6: same as 0x020F (TOTrapChainSawDamage) + {0x0210, F_V3_V4, 0x0000400C3F800000, "TOTrapChainSawKey"}, + + // TODO: Describe this object. It's a subclass of TODragonfly and has the + // same params as 0x00CD (TODragonflyCave01), though it appears that some + // may have different scale factors or offsets. + {0x0211, F_V3_V4, 0x00004E0003800000, "TOBiwaMushi"}, + {0x0211, F_EP3, 0x0000000000000002, "TOBiwaMushi"}, + + // Seagull. Params: + // param4 = model number? (clamped to [0, 2]) + {0x0212, F_V3_V4, 0x000040080F800000, "__SEAGULL__"}, + {0x0212, F_EP3, 0x0000000000000002, "__SEAGULL__"}, + + // TODO: Describe this object. Params: + // param4 = model number (clamped to [0, 2]) + {0x0213, F_V3_V4, 0x00004E040F000000, "TOJungleDesign"}, + + // Fish. This object is not constructed in split-screen mode. Params: + // param1-3 = TODO (Vector3F) + // param4 = TODO + // param5 = TODO + // param6 = TODO + {0x0220, F_V3_V4, 0x0000400439008000, "TObjFish"}, + {0x0220, F_EP3, 0x0000000000008002, "TObjFish"}, + + // Seabed multiplayer door. Params: + // param4 = base switch flag number (the actual switch flags used are + // param4, param4 + 1, param4 + 2, etc.; if this is negative, the + // door is always unlocked) + // param5 = number of switch flags (clamped to [0, 4]) + // param6 = synchronization mode: + // negative = when all switch flags are enabled, door is permanently + // unlocked via 6x0B even if some switch flags are disabled later + // zero or positive = door only stays unlocked while all of the + // switch flags are active and locks again when any are disabled + // (no effect in single-player offline mode; the negative behavior + // is used instead) + {0x0221, F_V3_V4, 0x0000400030000000, "TODoorFourLightSeabed"}, // Blue edges + {0x0222, F_V3_V4, 0x0000400030000000, "TODoorFourLightSeabedU"}, + + // Small cryotube. Params: + // param4 = model number (clamped to [0, 3]) + {0x0223, F_V3_V4, 0x0000400830000000, "TObjSeabedSuiso_CH"}, + + // Breakable glass wall. Params: + // param4 = switch flag number + // param5 = model number (clamped to [0, 2]) + {0x0224, F_V3_V4, 0x0000400030000000, "TObjSeabedSuisoBrakable"}, + + // Small floating robots. These are subclasses of TODragonfly and have + // the same params as 0x00CD (TODragonflyCave01), though it appears that + // some may have different scale factors or offsets (TODO). + {0x0225, F_V3_V4, 0x0000400030000000, "TOMekaFish00"}, // Blue + {0x0226, F_V3_V4, 0x0000400030000000, "TOMekaFish01"}, // Red + + // Dolphin. Params: + // param4 = model number (clamped to [0, 4]) + {0x0227, F_V3_V4, 0x0000400030000000, "__DOLPHIN__"}, + + // Seabed capturing trap, similar to 0x0153 (TOTrapAncient01) in + // function. Triggers when a player is within 15 units. Params: + // param1 = TODO (clamped to [0.1, 10]) + // param4 = hold time after trigger (in seconds; clamped to [1, 60]) + // param5 = hide in split-screen: + // zero or negative = always visible + // positive = invisible in split-screen mode + // param6 = same as param5 from 0x0153 (TOTrapAncient01) + {0x0228, F_V3_V4, 0x0000400C3F800000, "TOTrapSeabed01"}, + + // VR link object. This object is destroyed immediately in Challenge mode + // and split-screen mode. Same parameters as 0x008D (TOCapsuleAncient01). + {0x0229, F_V3_V4, 0x0000400FFFF80000, "TOCapsuleLabo"}, + + // Alias for 0x0001 (TObjParticle). The constructor function is exactly + // the same as for 0x0001, so this object has all the same paarameters + // and behavior as that object. + {0x0240, F_V3_V4, 0x0000400040000000, "TObjParticle"}, + + // Teleporter after Barba Ray. This object behaves exactly the same as + // 0x0002 (TObjAreaWarpForest), except it's invisible until the boss is + // defeated. + {0x0280, F_V3_V4, 0x0000400100000000, "__BARBA_RAY_TELEPORTER__"}, + + // TODO: Describe this object. There appear to be no parameters. + {0x02A0, F_V3_V4, 0x0000400200000000, "TObjLiveCamera"}, + + // Gee nest. This object is technically an item box, and drops an item + // when destroyed. Unlike most other item boxes, it cannot be specialized + // (ignore_def is always true). Params are the same as for 0x0152 + // (TContainerAncient01), but there is also: + // angle.z = number of hits to destroy + {0x02B0, F_V3_V4, 0x00004E0C0F800700, "TContainerAncient01R"}, + + // Lab objects. None of these take any parameters. + {0x02B1, F_V3_V4, 0x0000400000040000, "TObjLaboDesignBase(0)"}, // Computer console + {0x02B1, F_EP3, 0x0000000000000001, "TObjLaboDesignBase(0)"}, // Computer console + {0x02B2, F_V3_V4, 0x0000400000040000, "TObjLaboDesignBase(1)"}, // Computer console (alternate colors) + {0x02B2, F_EP3, 0x0000000000000001, "TObjLaboDesignBase(1)"}, // Computer console (alternate colors) + {0x02B3, F_V3_V4, 0x0000400000040000, "TObjLaboDesignBase(2)"}, // Chair + {0x02B3, F_EP3, 0x0000000000000001, "TObjLaboDesignBase(2)"}, // Chair + {0x02B4, F_V3_V4, 0x0000400000040000, "TObjLaboDesignBase(3)"}, // Orange wall + {0x02B4, F_EP3, 0x0000000000000001, "TObjLaboDesignBase(3)"}, // Orange wall + {0x02B5, F_V3_V4, 0x0000400000040000, "TObjLaboDesignBase(4)"}, // Gray/blue wall + {0x02B5, F_EP3, 0x0000000000000001, "TObjLaboDesignBase(4)"}, // Gray/blue wall + {0x02B6, F_V3_V4, 0x0000400000040000, "TObjLaboDesignBase(5)"}, // Long table + {0x02B6, F_EP3, 0x0000000000000001, "TObjLaboDesignBase(5)"}, // Long table + + // Game Boy Advance. Params: + // param4 = quest label to call when activated (inherited from + // TObjMesBase) + // param6 = type (clamped to [0, 1]; 0 = "QUEST", 1 = "RICO") + // (inherited from TObjMesBase) + {0x02B7, F_GC, 0x0000000000040001, "TObjGbAdvance"}, + + // Like TObjQuestColA (TODO: In what ways is it different?). Parameters + // are the same as for TObjQuestCol, but also: + // param2 = TODO + // param5 = quest script manager to use (zero or negative = quest, + // positive = free play) + {0x02B8, F_V3_V4, 0x00006FFFFFFC7FFF, "TObjQuestColALock2"}, + {0x02B8, F_EP3, 0x0000000000000001, "TObjQuestColALock2"}, + + // Like 0x0003 (TObjMapWarpForest), but is invisible and automatically + // warps players when they enter its radius. This is used to simulate + // floor warps in the Control Tower. Has the same parameters as + // TObjMapWarpForest, but also: + // param5 = destination "floor" number (this is an intra-map warp and + // doesn't actually change floors; the "floor" number is only visual) + // param6 = if <= 0, shows "floor" number (param5 formatted as "%xF") + // after warp; if > 0, param5 is ignored + {0x02B9, F_V3_V4, 0x00007FFC3FFF78FF, "TObjMapForceWarp"}, + {0x02B9, F_EP3, 0x0000000000000001, "TObjMapForceWarp"}, + + // Behaves like 0x0012 (TObjQuestCol), but also has the param5 behavior + // from 0x02B8 (TObjQuestColALock2). + {0x02BA, F_V3_V4, 0x00006FFFFFFC7FFF, "TObjQuestCol2"}, + {0x02BA, F_EP3, 0x0000000000000001, "TObjQuestCol2"}, + + // Episode 2 Lab door with glass window. Same parameters as + // TODoorLaboNormal, except param5 is unused. + {0x02BB, F_V3_V4, 0x0000400000040000, "TODoorLaboNormal"}, + + // Episode 2 ending movie warp (used in final boss arenas after the boss + // is defeated). Same params as 0x001C (TObjAreaWarpEnding). + {0x02BC, F_V3_V4, 0x0000400080000000, "TObjAreaWarpEndingJung"}, + + // Warp to another location on the same map. Used for the Lab/city warp. + // This warp is visible in all game modes, but cannot be used in Episode + // 1, Battle mode, or Challenge mode. Params: + // param1-3 = destination (same as for TObjMapWarpForest) + // param4 = destination angle (same as for TObjMapWarpForest) + // param6 = destination text (clamped to [0, 2]): + // 00 = "The Principal" + // 01 = "Pioneer 2" + // 02 = "Lab" + {0x02BD, F_V3_V4, 0x0000400000040000, "TObjLaboMapWarp"}, + + // This object is used internally by Episode 3 during battles as the + // visual implementation for some overlay tiles. + // Params: + // param1-3 = TODO + // param4 = model number: + // 00 = TODO (iwa.bml) + // 01 = TODO (l_kusa.bml) + // 02 = TODO (s_kusa.bml) + // 03 = TODO (crash_car.bml) + // 04 = TODO (crash_warp.bml) + // 05 = TODO (new_marker.bml) + // 06 = TODO (r_guard.bml) + // 07 = TODO (ryuuboku.bml) + // 08 = TODO (ryuuboku_l.bml) + // 09 = Rock (overlay = 0x10; new_iwa_1.bml) + // 0A = TODO (new_iwa_2.bml) + // 0B = Purple warp (overlay = 0x30; warp_p.bml) + // 0C = Red warp (overlay = 0x31; warp_r.bml) + // 0D = Green warp (overlay = 0x32; warp_g.bml) + // 0E = Blue warp (overlay = 0x33; warp_b.bml) + // 0F = Fence (overlay = 0x20; shareobj_new_guard.bml) + // param6 second-low byte = TODO + // param6 low byte = TODO + {0x02D0, F_EP3, 0x0000000000000002, "TObjKazariCard"}, + + // TODO: Describe these objects. There appear to be no parameters. + {0x02D1, F_EP3, 0x0000000000000001, "TObj_FloatingCardMaterial_Dark"}, + {0x02D2, F_EP3, 0x0000000000000001, "TObj_FloatingCardMaterial_Hero"}, + + // Morgue warps. These don't actually do anything; they just look like a + // warp. The actual warping is done by another object (TObjCityAreaWarp + // for the lobby teleporter, or TShopGenerator for the battle counter). + // TObjCardCityMapWarp takes no parameters. + {0x02D3, F_EP3, 0x0000000000000001, "TObjCardCityMapWarp(0)"}, // Battle counter warp (blue lines) + {0x02D9, F_EP3, 0x0000000000000001, "TObjCardCityMapWarp(1)"}, // TODO + {0x02E3, F_EP3, 0x0000000000000001, "TObjCardCityMapWarp(2)"}, // Lobby warp (yellow lines) + + // Morgue doors. None of these take any parameters. Unsurprisingly, the + // _Closed variants don't open. + {0x02D4, F_EP3, 0x0000000000000001, "TObjCardCityDoor(0)"}, // Yellow (to deck edit room) + {0x02D5, F_EP3, 0x0000000000000001, "TObjCardCityDoor(1)"}, // Blue (to battle entry counter) + {0x02D8, F_EP3, 0x0000000000000001, "TObjCardCityDoor(2)"}, // TODO + {0x02DF, F_EP3, 0x0000000000000001, "TObjCardCityDoor(3)"}, // Solid (always closed in normal Morgue) + {0x02E0, F_EP3, 0x0000000000000001, "TObjCardCityDoor(4)"}, // Gray (to chief) + {0x02DC, F_EP3, 0x0000000000000001, "TObjCardCityDoor_Closed(0)"}, // TODO + {0x02DD, F_EP3, 0x0000000000000001, "TObjCardCityDoor_Closed(1)"}, // TODO + {0x02DE, F_EP3, 0x0000000000000001, "TObjCardCityDoor_Closed(2)"}, // TODO + {0x02E1, F_EP3, 0x0000000000000001, "TObjCardCityDoor_Closed(3)"}, // TODO + {0x02E2, F_EP3, 0x0000000000000001, "TObjCardCityDoor_Closed(4)"}, // TODO + + // Mortis Fons geyser. Params: + // param1-3 = TODO + // param4 = mode (value is param4 % 0x0B): + // 00 = MIZUMODE_NONE + // 01 = MIZUMODE_LOW + // 02 = MIZUMODE_MIDDLE + // 03 = MIZUMODE_HIGH + // 04 = MIZUMODE_RAIN + // 05 = MIZUMODE_WAVE + // 06 = MIZUMODE_HIGHTYNY + // 07 = MIZUMODE_REFLECT + // 08 = MIZUMODE_FOG + // 09 = MIZUMODE_FOG2 + // 0A = MIZUMODE_LIGHT + // param5 = TODO (value is param5 % 7) + {0x02D6, F_EP3, 0x0000000000000002, "TObjKazariGeyserMizu"}, + + // TODO: Describe this object. It appears to be created by many creatures + // and probably SCs as well, but it's not obvious what it's used for, + // since the logic of tiles being blocked or free is implemented in + // TCardServer, which doesn't interact with this object. Further research + // is needed here. Params: + // param1-3 = TODO + // param4 = TODO (expected to be 0 or 1) + {0x02D7, F_EP3, 0x0000000000000002, "TObjSetCardColi"}, + + // Floating robots, presumably. These are both subclasses of 0x0106 + // (TODragonflyMachine01) and take all the same params as that object. + {0x02DA, F_EP3, 0x0000000000000001, "TOFlyMekaHero"}, + {0x02DB, F_EP3, 0x0000000000000001, "TOFlyMekaDark"}, + + // Lobby banner or model display object. This implements display of media + // sent with the B9 command. Params: + // param1-3 = scale factors (x, y, z) + // param4 = index into location bit field (0-31 where 0 is the least- + // significant bit; see Episode3LobbyBanners in config.example.json + // for the bits' meanings) + // param5 = TODO + {0x02E4, F_EP3, 0x0000000000008001, "TObjSinBoardCard"}, + + // TODO: Describe this object. Params: + // param4 = model number (0 or 1) + {0x02E5, F_EP3, 0x0000000000000001, "TObjCityMoji"}, + + // Like TObjCardCityMapWarp(2) (the warp to the lobby from the Morgue) + // but doesn't render the circles. Used in offline mode where that warp + // is disabled. No parameters. + {0x02E6, F_EP3, 0x0000000000000001, "TObjCityWarpOff"}, + + // Small flying robot. There appear to be no parameters. + {0x02E7, F_EP3, 0x0000000000000001, "TObjFlyCom"}, + + // TODO: Describe this object. Params: + // param4 = TODO (used in vtable[0x0E]) + {0x02E8, F_EP3, 0x0000000000000001, "__UNKNOWN_02E8__"}, + + // Episode 4 light source. + // TODO: Find and document this object's parameters. + {0x0300, F_V4, 0x00005FF000000000, "__EP4_LIGHT__"}, + + // Wilds/Crater cactus. Params: + // param1 = horizontal scale (x, z) + // param2 = vertical scale (y) + // param4 = model number (0-2, not bounds-checked) + // param5 = TODO + {0x0301, F_V4, 0x00004FF000000000, "__WILDS_CRATER_CACTUS__"}, + + // Wilds/Crater brown rock. Params: + // param1-3 = scale factors (x, y, z); z factor also scales hitbox size + // param4 = model number (0-2, not bounds-checked) + {0x0302, F_V4, 0x00004FF000000000, "__WILDS_CRATER_BROWN_ROCK__"}, + + // Wilds/Crater destructible brown rock. Params: + // param4 = switch flag number + {0x0303, F_V4, 0x00004FF000000000, "__WILDS_CRATER_BROWN_ROCK_DESTRUCTIBLE__"}, + + // TODO: Construct this object and see what it is. Params: + // param4 = object identifier (must be in range [0, 15]; used in 6xD4 + // command) + {0x0340, F_V4, 0x0000400000000000, "__UNKNOWN_0340__"}, + + // TODO: Construct this object and see what it is. It looks like some + // kind of child object of 0340. Params: + // param4 = object identifier (must be in range [0, 15]; used in 6xD4 + // command; looks like it should match an existing 0340's identifier) + // param5 = child index? (must be in range [0, 3]) + {0x0341, F_V4, 0x0000400000000000, "__UNKNOWN_0341__"}, + + // Poison plant. Base damage is 10 (Normal), 20 (Hard), 30 (Very Hard), + // or 60 (Ultimate). There appear to be no parameters. + {0x0380, F_V4, 0x00004E0000000000, "__POISON_PLANT__"}, + + // TODO: Describe this object. Params: + // param4 = model number (clamped to [0, 1]) + {0x0381, F_V4, 0x00004E0000000000, "__UNKNOWN_0381__"}, + + // TODO: Describe this object. There appear to be no parameters. + {0x0382, F_V4, 0x00004E0000000000, "__UNKNOWN_0382__"}, + + // Desert ooze plant. Params: + // param1 = animation speed? + // param2 = scale factor + // param4 = model number (clamped to [0, 1]) + {0x0383, F_V4, 0x00004E0000000000, "__DESERT_OOZE_PLANT__"}, + + // TODO: Describe this object. Params: + // param1 = animation speed? + // param4 = TODO (clamped to [0, 1]) + {0x0385, F_V4, 0x00004E0000000000, "__UNKNOWN_0385__"}, + + // Wilds/Crater black rocks. Params: + // param4 = model number (0-2, not bounds-checked) + {0x0386, F_V4, 0x00004FF000000000, "__WILDS_CRATER_BLACK_ROCKS__"}, + + // TODO: Describe this object. Params (names come from debug strings): + // angle.x = dest x + // angle.y = dest y + // angle.z = dest z + // param1 = area radius + // param2 = area power (value is param2 * 0.8) + // param4 = hole radius (value is param4 / 100) + // param5 = hole power (value is param5 / 100) + {0x0387, F_V4, 0x00004E0000000000, "__UNKNOWN_0387__"}, + + // TODO: Describe this object. Params: + // param1 = hitbox width (x; only used if param6 == 0) + // param2 = hitbox radius (only used if param6 != 0) + // param3 = hitbox depth (z; only used if param6 == 0) + // param4 = TODO (value is param4 / 100) + // param6 = hitbox type (0 = rectangular, anything else = cylindrical) + {0x0388, F_V4, 0x00004E0000000000, "__UNKNOWN_0388__"}, + + // Game flag set/clear zone. This sets and clears game flags (the flags + // sent in 6x0A) when the player enters the object's hitbox. Params: + // param1-3 = same as for 0x0388 + // param4 = game flags to set (low 8 bits only) + // param5 = game flags to clear (low 8 bits only) + // param6 = same as for 0x0388 + // There appears to be a bug that causes the game to always set all 8 of + // the low game flags, regardless of the value of param4. The clearing + // logic (param5) appears to work correctly. + {0x0389, F_V4, 0x0000400000000000, "__GAME_FLAG_SET_CLEAR_ZONE__"}, + + // HP drain zone. When a player is within this object's hitbox, it + // subtracts 0.66% of the player's current HP at a regular interval. The + // amount of damage per interval is capped below at 1 HP, so it will + // always do a nonzero amount of damage each time. Params: + // param1-3 = same as for 0x0388 + // param5 = interval (in frames) between damage applications + // param6 = same as for 0x0388 + {0x038A, F_V4, 0x0000400000000000, "__HP_DRAIN_ZONE__"}, + + // Falling stalactite. Activates when any player is within 50 units. Base + // damage is 100 on Normal, 200 on Hard, 300 on Very Hard, or 600 on + // Ultimate. There appear to be no parameters. + {0x038B, F_V4, 0x00004E0000000000, "__FALLING_STALACTITE__"}, + + // Solid desert plant. Params: + // param1 = horizontal scale factor (x, z) + // param2 = vertical scale factor (y) + {0x038C, F_V4, 0x00004E0000000000, "__DESERT_PLANT_SOLID__"}, + + // Desert crystals-style box. Params: + // param1 = contents type: + // 0 = always empty + // 1 = standard random item (ignore_def = 1) + // 2 = customized item (ignore_def = 0) + // 3 = trigger set event + // If param1 is 0 or 1, no other parameters are used. (In the case of 1, + // param3-6 are sent to the server in the 6xA2 command; however, the + // standard implementation ignores them.) + // If param1 is 2, the other parameters have the same meanings as for + // 0x0088 (TObjContainerBase2). + // If param1 is 3, the event number is specified in param4. + {0x038D, F_V4, 0x00004E0000000000, "__DESERT_CRYSTALS_BOX__"}, + + // Episode 4 test door. param4 and param6 are the same as for 0x0056 + // (TODoorLabo). + {0x038E, F_V4, 0x0000400000000000, "__EP4_TEST_DOOR__"}, + + // Beehive. Params: + // param1 = horizontal scale factor (x, z) + // param2 = vertical scale factor (y) + // param4 = model number (clamped to [0, 1]) + {0x038F, F_V4, 0x00004E0000000000, "__BEEHIVE__"}, + + // Episode 4 test particles. Generates particles at a specific location + // (TODO) at a regular interval. Params: + // angle.x = TODO + // angle.y = TODO + // param1 = particle distance? (TODO) + // param2 = TODO + // param4 = frames between effects + {0x0390, F_V4, 0x00004E0000000000, "__EP4_TEST_PARTICLE__"}, + + // Heat (implemented as a type of poison fog). Has the same parameters as + // TObjFogCollisionPoison. + {0x0391, F_V4, 0x00004E0000000000, "__HEAT__"}, + + // Episode 4 boss egg. There appear to be no parameters. + {0x03C0, F_V4, 0x0000500000000000, "__EP4_BOSS_EGG__"}, + + // Episode 4 boss rock spawner. Params: + // param4 = type (clamped to [0, 2]) + {0x03C1, F_V4, 0x0000500000000000, "__EP4_BOSS_ROCK_SPAWNER__"}, +}); + +static const vector dat_enemy_definitions({ + // This is newserv's canonical definition of map enemy and NPC types. + + // Enemies and NPCs take a similar arguments structure as objects: + // objects use ObjectSetEntry, enemies use EnemySetEntry. Unlike objects, + // some IDs are reused across game versions, so the same ID can generate + // a completely different entity on different game versions. Where this + // happens is noted in the comments below. + + // Some enemies have params that the game's code references, but only in + // places where their effects can't be seen (for example, in normally- + // unused debug menus). These may have been used to test frame-by-frame + // animations for some enemies; see TObjEneMe3Shinowa_v76 for an example + // of this usage. The enemies with params like this are: + // - TObjEneMe3ShinowaReal (param3, param4) + // - TObjEneDf2Bringer (param1, param2) + // - TObjEneRe7Berura (param1, param2) + // - TBoss1Dragon (param1, param2) + // - TBoss5Gryphon (param1, param2) + // - TBoss2DeRolLe (param1, param2) + // - TBoss8Dragon (param1, param2) + // - TObjEneBm5GibonU (param4, param5; these params also have non-debug + // meanings) + // - TObjEneMorfos (oaram1, param2; these params also have non-debug + // meanings) + // TODO: Add more enemies to this list as they are found + + // NPCs. Params: + // param1 = action parameter (depends on param6; see below) + // param2 = visibility register number (if this is > 0, the NPC will + // only be visible when this register is nonzero; if this is >= 1000, + // the effective register is param2 - 1000 and register values for + // both param2 and param3 are read from the free play script + // environment instead of the quest script environment) + // param3 = hide override register number (if this is > 0, the NPC will + // not be visible when this register is nonzero, regardless of the + // state of the register specified by param2; if this is >= 1000, the + // effective register is param3 - 1000 and register values for both + // param2 and param3 are read from the free play script environment + // instead of the quest script environment) + // param4 = object number ("character ID" in qedit; if this is outside + // the range [100, 999], the quest label in param5 is called in the + // free play script instead of the quest script) + // param5 = quest label to call when interacted with (if zero, NPC does + // nothing upon interaction) + // param6 = specifies what NPC does when idle: + // 0 = stand still (param1 is ignored) + // 1 = walk around randomly (param1 = max walk distance from home) + // 2 = TODO (Ep3 only; appears to be unused) + // 3 = TODO (Ep3 only; appears to be unused) + // TODO: setting param4 to 0 changes something else about the NPC; figure + // out what this does (see TObjNpcBase_v57_set_config_from_params) + {0x0001, F_V0_V4, 0x0000200000000001, "TObjNpcFemaleBase"}, // Woman with red hair and purple outfit + {0x0001, F_EP3, 0x0000000000000001, "TObjNpcFemaleBase"}, // Woman with red hair and purple outfit + {0x0002, F_V0_V4, 0x0000200000000001, "TObjNpcFemaleChild"}, // Shorter version of the above + {0x0002, F_EP3, 0x0000000000000001, "TObjNpcFemaleChild"}, // Shorter version of the above + {0x0003, F_V0_V4, 0x0000200000040001, "TObjNpcFemaleDwarf"}, // Woman wearing green outfit + {0x0003, F_EP3, 0x0000000000000001, "TObjNpcFemaleDwarf"}, // Woman wearing green outfit + {0x0004, F_V0_V4, 0x0000200000000001, "TObjNpcFemaleFat"}, // Woman outside Hunter's Guild + {0x0004, F_EP3, 0x0000000000000001, "TObjNpcFemaleFat"}, // Woman outside Hunter's Guild + {0x0005, F_V0_V4, 0x0000200000000001, "TObjNpcFemaleMacho"}, // Tool shop woman + {0x0005, F_EP3, 0x0000000000000001, "TObjNpcFemaleMacho"}, // Tool shop woman + {0x0006, F_V0_V4, 0x0000200000040001, "TObjNpcFemaleOld"}, // Older woman with yellow/red outfit + {0x0006, F_EP3, 0x0000000000000001, "TObjNpcFemaleOld"}, // Older woman with yellow/red outfit + {0x0007, F_V0_V4, 0x0000200000000001, "TObjNpcFemaleTall"}, // Woman walking around inside shop area + {0x0007, F_EP3, 0x0000000000000001, "TObjNpcFemaleTall"}, // Woman walking around inside shop area + {0x0008, F_V0_V4, 0x0000200000008001, "TObjNpcMaleBase"}, // Similar appearance to weapon shop man + {0x0008, F_EP3, 0x0000000000008001, "TObjNpcMaleBase"}, // Similar appearance to weapon shop man + {0x0009, F_V0_V4, 0x0000200000040001, "TObjNpcMaleChild"}, // Kid wearing purple + {0x0009, F_EP3, 0x0000000000000001, "TObjNpcMaleChild"}, // Kid wearing purple + {0x000A, F_V0_V4, 0x0000200000000001, "TObjNpcMaleDwarf"}, // Man outside Medical Center + {0x000A, F_EP3, 0x0000000000000001, "TObjNpcMaleDwarf"}, // Man outside Medical Center + {0x000B, F_V0_V4, 0x0000200000040001, "TObjNpcMaleFat"}, // Armor shop man + {0x000B, F_EP3, 0x0000000000000001, "TObjNpcMaleFat"}, // Armor shop man + {0x000C, F_V0_V4, 0x0000200000000001, "TObjNpcMaleMacho"}, // Weapon shop man + {0x000C, F_EP3, 0x0000000000000001, "TObjNpcMaleMacho"}, // Weapon shop man + {0x000D, F_V0_V4, 0x0000200000040001, "TObjNpcMaleOld"}, // Man near telepipe locations + {0x000D, F_EP3, 0x0000000000000001, "TObjNpcMaleOld"}, // Man near telepipe locations + {0x000E, F_V0_V4, 0x0000200000040001, "TObjNpcMaleTall"}, // Man wearing turquoise + {0x000E, F_EP3, 0x0000000000000001, "TObjNpcMaleTall"}, // Man wearing turquoise + {0x0019, F_V0_V4, 0x00003FF000040001, "TObjNpcSoldierBase"}, // Man right of the Ragol warp door + {0x0019, F_EP3, 0x0000000000000001, "TObjNpcSoldierBase"}, // Man right of the Ragol warp door + {0x001A, F_V0_V4, 0x0000200000000001, "TObjNpcSoldierMacho"}, // Man left of the Ragol warp door + {0x001A, F_EP3, 0x0000000000000001, "TObjNpcSoldierMacho"}, // Man left of the Ragol warp door + {0x001B, F_V0_V4, 0x0000200000040001, "TObjNpcGovernorBase"}, // Principal Tyrell + {0x001B, F_EP3, 0x0000000000000001, "TObjNpcGovernorBase"}, // Principal Tyrell + {0x001C, F_V0_V4, 0x0000200000040001, "TObjNpcConnoisseur"}, // Tekker + {0x001D, F_V0_V4, 0x0000200000040021, "TObjNpcCloakroomBase"}, // Bank woman + {0x001E, F_V0_V4, 0x0000200000000001, "TObjNpcExpertBase"}, // Man in front of bank + {0x001F, F_V0_V4, 0x0000200000040001, "TObjNpcNurseBase"}, // Nurses in Medical Center + {0x0020, F_V0_V4, 0x0000200000040001, "TObjNpcSecretaryBase"}, // Irene + {0x0020, F_EP3, 0x0000000000000001, "TObjNpcSecretaryBase"}, // Karen + {0x0021, F_V0_V4, 0x0000200000000001, "TObjNpcHHM00"}, // TODO + {0x0021, F_EP3, 0x0000000000000001, "TObjNpcHHM00"}, // TODO + {0x0022, F_V0_V4, 0x0000200000000001, "TObjNpcNHW00"}, // TODO + {0x0022, F_EP3, 0x0000000000000001, "TObjNpcNHW00"}, // TODO + {0x0024, F_V0_V4, 0x0000200000000001, "TObjNpcHRM00"}, // TODO + {0x0025, F_V0_V4, 0x0000200000040001, "TObjNpcARM00"}, // TODO + {0x0026, F_V0_V4, 0x0000200000040001, "TObjNpcARW00"}, // TODO + {0x0026, F_EP3, 0x0000000000000001, "TObjNpcARW00"}, // TODO + {0x0027, F_V0_V4, 0x0000200000040001, "TObjNpcHFW00"}, // TODO + {0x0027, F_EP3, 0x0000000000000001, "TObjNpcHFW00"}, // TODO + {0x0028, F_V0_V4, 0x0000200000040001, "TObjNpcNFM00"}, // TODO + {0x0028, F_EP3, 0x0000000000000001, "TObjNpcNFM00"}, // TODO + {0x0029, F_V0_V4, 0x00003C0000000001, "TObjNpcNFW00"}, // TODO + {0x0029, F_EP3, 0x0000000000000001, "TObjNpcNFW00"}, // TODO + {0x002B, F_V0_V4, 0x0000200000000001, "TObjNpcNHW01"}, // TODO + {0x002C, F_V0_V4, 0x0000200000000001, "TObjNpcAHM01"}, // TODO + {0x002D, F_V0_V4, 0x0000200000000001, "TObjNpcHRM01"}, // TODO + {0x0030, F_V0_V4, 0x0000200000000001, "TObjNpcHFW01"}, // TODO + {0x0031, F_V0_V4, 0x0000200000040001, "TObjNpcNFM01"}, // TODO + {0x0031, F_EP3, 0x0000000000000001, "TObjNpcNFM01"}, // TODO + {0x0032, F_V0_V4, 0x00002C0000000001, "TObjNpcNFW01"}, // TODO + {0x0045, F_V0_V4, 0x00000FF40F800006, "TObjNpcLappy"}, // Rappy NPC + {0x0046, F_V0_V4, 0x0000000000000004, "TObjNpcMoja"}, // Small Hildebear NPC + {0x0047, F_V2, 0x0000000000000004, "TObjNpcRico"}, // Rico + {0x00A9, F_V0_V4, 0x0000000000000600, "TObjNpcBringer"}, // Dark Bringer NPC + {0x00D0, F_V3_V4, 0x0000200000040001, "TObjNpcKenkyu"}, // Ep2 armor shop man + {0x00D1, F_V3_V4, 0x0000200000040001, "TObjNpcSoutokufu"}, // Natasha Milarose + {0x00D2, F_V3_V4, 0x0000000000040000, "TObjNpcHosa"}, // Dan + {0x00D3, F_V3_V4, 0x000000F000040000, "TObjNpcKenkyuW"}, // Ep2 tool shop woman + {0x00D6, F_EP3, 0x0000000000000001, "TObjNpcHeroGovernor"}, // Morgue Chief + {0x00D7, F_EP3, 0x0000000000000001, "TObjNpcHeroGovernor"}, // Morgue Chief (direct alias of 00D6) + {0x00F0, F_V3_V4, 0x0000000000040000, "TObjNpcHosa2"}, // Man next to room with warp to Lab + {0x00F1, F_V3_V4, 0x0000000000040000, "TObjNpcKenkyu2"}, // Ep2 weapon shop man + {0x00F2, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00F2)"}, // TODO + {0x00F3, F_V3_V4, 0x00003FF000040000, "TObjNpcNgcBase(0x00F3)"}, // TODO + {0x00F4, F_V3_V4, 0x00003FF030040000, "TObjNpcNgcBase(0x00F4)"}, // TODO + {0x00F5, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00F5)"}, // TODO + {0x00F6, F_V3_V4, 0x000000080F840000, "TObjNpcNgcBase(0x00F6)"}, // TODO + {0x00F7, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00F7)"}, // Nol + {0x00F8, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00F8)"}, // Elly + {0x00F9, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00F9)"}, // Woman with cyan hair down the ramp from Ep2 Medical Center + {0x00FA, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00FA)"}, // Woman with bright red hair down the ramp from Ep2 Medical Center + {0x00FB, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00FB)"}, // Man with blue hair near the Ep2 Medical Center + {0x00FC, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00FC)"}, // Man in room next to Ep2 Hunter's Guild + {0x00FD, F_V3_V4, 0x000000040F840000, "TObjNpcNgcBase(0x00FD)"}, // TODO + {0x00FE, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00FE)"}, // Episode 2 Hunter's Guild woman + {0x00FF, F_V3_V4, 0x0000000000040000, "TObjNpcNgcBase(0x00FF)"}, // Woman near room with teleporter to VR areas + {0x0100, F_V4, 0x0000200000040001, "__MOMOKA__"}, // Momoka (v4 only) + {0x0110, F_EP3, 0x0000000000000001, "TObjNpcWalkingMeka_Hero"}, // Small talking robot in Morgue + {0x0111, F_EP3, 0x0000000000000001, "TObjNpcWalkingMeka_Dark"}, // Small talking robot in Morgue + + // Episode 3 scientist and aide NPCs. These NPC take all the same params as + // the NPCs defined above, but also: + // angle.x = model number (clamped to [0, 3] for scientists, [0, 2] for + // aides) + // The two type values for scientists (00D4 and 00D5) are direct aliases + // for each other; there is no difference between their in-game appearance + // or behavior. + {0x00D4, F_EP3, 0x0000000000000001, "TObjNpcHeroScientist"}, + {0x00D5, F_EP3, 0x0000000000000001, "TObjNpcHeroScientist"}, + {0x0112, F_EP3, 0x0000000000000001, "TObjNpcHeroAide"}, + + // Quest NPC. Params are the same as for the standard NPCs above, except: + // param6 low byte = flags (bit field): + // 01 = same as param6 above (0 = stand still; 1 = walk around) + // 10 = TODO + // param6 high byte = NPC index in npcplayerchar.dat + {0x0118, F_V4, 0x00007FF000000000, "__QUEST_NPC__"}, + + // Enemy that behaves like an NPC. Has all the same params as the + // standard NPC types, but also: + // angle.x = definition index + // The definition index is an integer from 0 to 15 (decimal) specifying + // which model, animations, and hitbox to use. The available choices + // depend on which assets are loaded, which in turn depend on the area + // the NPC appears in. + // TODO: Make a list of all of the choices for each area here + {0x0033, F_V3_V4, 0x0000200FFFFFFFFF, "TObjNpcEnemy"}, + {0x0033, F_EP3, 0x0000000000008001, "TObjNpcEnemy"}, + + // Hildebear. Params: + // param1 = initial location (clamped to [0, 1]; 0 = ground, 1 = sky) + // param2 = chance to use tech (value is param3 + 0.6, clamped to [0, + // 1]; TODO: it's not clear when exactly the decision points are) + // param3 = chance to jump when more than 150 units away (value is + // param2 + 0.3, clamped to [0, 1]) + // param6 = if >= 1, always rare + {0x0040, F_V0_V4, 0x00000000001B0004, "TObjEneMoja"}, + + // Rappy. Params: + // param1 = TODO (clamped to [0, 1]; overwritten with 1 if wave_number + // is > 0; could be spawn location like for Hildebear?) + // param6 = rare flag (on v1-v3, rappy is rare if param6 != 0; on v4, + // rappy is rare if (param6 & 1) != 0) + // param7 = TODO + // Exactly which rappy is constructed depends on param6 (or the random + // rare check) and the current season event: + // Ep1/Ep2 non-rare = Rag Rappy + // Ep4 non-rare = Sand Rappy (Crater or Desert variation) + // Ep1 rare = Al Rappy + // Ep2 rare, Christmas = Saint Rappy + // Ep2 rare, Easter = Egg Rappy + // Ep2 rare, Halloween = Hallo Rappy + // Ep2 rare, any other season event (or none) = Love Rappy + // Ep4 rare = Del Rappy (Crater or Desert variation) + {0x0041, F_V0_V4, 0x00004FF000180006, "TObjEneLappy"}, + + // Monest (and Mothmants). Params: + // param2 = number of Mothmants to expel at start (clamped to [0, 6]) + // param3 = total Mothmants (clamped to [0, min(30, num_children)] + // where num_children comes from the EnemySetEntry; if this is less + // than param2, then param2 will take precedence but no further + // Mothmants will emerge after the first group) + // Note: In map_forest01_02e.dat in the vanilla map files there is a + // Monest that has param1 = 3 and param2 = 10. This looks like just an + // off-by-one error on Sega's part where they accidentally shifted the + // parameters down by one place. As described above, this Monest expels + // 6 Mothmants, then no more after they are killed. + {0x0042, F_V0_V4, 0x0000000000180006, "TObjEneBm3FlyNest"}, + + // Savage Wolf or Barbarous Wolf. Params: + // param1 = group number (when a Barbarous Wolf dies, all wolves with + // the same group number howl and trigger their buffs or weaknesses) + // param2 = if less than 1, this is a Savage Wolf; otherwise it's a + // Barbarous Wolf + {0x0043, F_V0_V4, 0x0000000000600006, "TObjEneBm5Wolf"}, + + // Booma, Gobooma, or Gigobooma. Params: + // param1 = TODO (fraction of max HP; see TObjEnemyV8048ee80_v5A) + // param2 = idle walk radius (when there's no target, it will walk + // around its spawn location within this radius; if this is zero, it + // stands still instead) + // param6 = type (0 = Booma, 1 = Gobooma, 2 = Gigobooma) + // param7 = group ID (if nonzero, it looks like this is used to cause + // groups of enemies to band together and all attack the same player, + // chosen by the highest-ranking enemy (by param6) in the group; + // TODO: this explanation is unverified and param7 was never used by + // Sega; see client code at 3OE1:800F6F3C) + {0x0044, F_V0_V4, 0x0000000000000006, "TObjEneBeast"}, + + // Grass Assassin. Params: + // param1 = TODO + // param2 = TODO (some state is set based on whather this is <= 0 or + // not, but the value is also used directly in some places) + // param3 = TODO (see TObjGrass_update_case8) + // param4 = TODO (see TObjGrass_update_case8) + {0x0060, F_V0_V4, 0x00000000001B0018, "TObjGrass"}, + + // Poison Lily or Del Lily. Del Lily is constructed if the current area + // is 0x23 (Control Tower); otherwise, Poison Lily is constructed. There + // appear to be no parameters. + {0x0061, F_V0_V4, 0x0000000800180038, "TObjEneRe2Flower"}, + + // Nano Dragon. Params: + // param1 = TODO (seems it only matters if this is 1 or not) + // param2 = TODO (defaults to 50 if param2 < 1) + // param7 = TODO (set in init) + {0x0062, F_V0_V4, 0x0000000000000038, "TObjEneNanoDrago"}, + + // Evil Shark, Pal Shark, or Guil Shark. Same params as 0x0044 + // (TObjEneBeast), except: + // param6 = type (0 = Evil Shark, 1 = Pal Shark, 2 = Guil Shark) + {0x0063, F_V0_V4, 0x0000000000030038, "TObjEneShark"}, + + // Pofuilly Slime. num_children is clamped to [0, 4]. Params: + // param7 = rare flag (if the lowest bit is set, this is a Pouilly + // Slime instead; on BB, this is ignored) + {0x0064, F_V0_V4, 0x0000000000000030, "TObjEneSlime"}, + + // Pan Arms (Hidoom + Migium). There appear to be no parameters. + {0x0065, F_V0_V4, 0x0000000000600028, "TObjEnePanarms"}, + + // Gillchic or Dubchic. Params: + // param1 = rapid fire count (number of lasers fired before moving + // again; if this is 0, the default of 2 is used) + // param6 = type (0 = Dubchic, 1 = Gillchic) + // param7 = TODO + {0x0080, F_V0_V4, 0x00000000006000C0, "TObjEneDubchik"}, + + // Garanz. There appear to be no parameters. + // TODO: There is some behavior difference if wave_number is 0 vs. any + // other value. Figure out what exactly this does. + {0x0081, F_V0_V4, 0x00000000002000C0, "TObjEneGyaranzo"}, + + // Sinow Beat. Params: + // param1 = disable mirage effect if >= 1.0 + // param2 = is Sinow Gold if >= 1.0 + // Note: All params are on the base class (TObjEneMe3Shinowa). + {0x0082, F_V0_V4, 0x00000000000300C0, "TObjEneMe3ShinowaReal"}, + + // Canadine. Params: + // param1 = behavior (0 = in fighter, 1 = out fighter; this controls + // whether the Canadine will use its direct attack or stay high off + // the ground instead) + {0x0083, F_V0_V4, 0x00000000000000C0, "TObjEneMe1Canadin"}, + + // Canane. There appear to be no parameters. There are always 8 followers + // arranged in a ring around the Canane. + {0x0084, F_V0_V4, 0x00000000000000C0, "TObjEneMe1CanadinLeader"}, + + // Dubwitch. Destroying a Dubwitch destroys all Dubchics in the same + // room. There appear to be no parameters. + {0x0085, F_V0_V4, 0x00000000006000C0, "TOCtrlDubchik"}, + + // Delsaber. Params: + // param1 = jump distance delta (value used is param1 + 100) + // param2 = prejudice flag (these values directly correspond to the + // bits in PlayerVisualConfig::class_flags; see below for details): + // 0 = males + // 1 = females + // 2 = humans + // 3 = newmans + // 4 = androids + // 5 = hunters + // 6 = rangers + // 7 = forces + // 8 = no prejudice + // If any player is within 30 units of a Delsaber, it will target that + // player. Otherwise, the Delsaber will target the nearest player that + // matches its prejudice flag; if no player matches this flag, it will + // target the nearest player. + {0x00A0, F_V0_V4, 0x0000000000630300, "TObjEneSaver"}, + + // Chaos Sorceror. There appear to be no parameters. + {0x00A1, F_V0_V4, 0x0000000000400500, "TObjEneRe4Sorcerer"}, + + // Dark Gunner. Params: + // param1 = group number (there should be between 1 and 16 Dark Gunners + // and one control enemy with the same group number in the same room) + // param2 = TODO (number within group? possibly unused?) + // param7 = TODO + {0x00A2, F_V0_V4, 0x0000000000000600, "TObjEneDarkGunner"}, + + // Dark Gunner control enemy. This enemy doesn't actually exist in-game; + // it only has logic for choosing a Dark Gunner from its group to be the + // leader, and then changing this leader periodically. Params: + // param1 = group number (see above) + {0x00A3, F_V0_V4, 0x0000000000000600, "TObjEneDarkGunCenter"}, + + // Dark Bringer. There appear to be no parameters. + {0x00A4, F_V0_V4, 0x0000000000030600, "TObjEneDf2Bringer"}, + + // Dark Belra. There appear to be no parameters. + {0x00A5, F_V0_V4, 0x0000000000180500, "TObjEneRe7Berura"}, + + // Dimenian / La Dimenian / So Dimenian. Same parameters as 0x0044 + // (TObjEneBeast), except: + // param6 = type (0 = Dimenian, 1 = La Dimenian, 2 = So Dimenian) + {0x00A6, F_V0_V4, 0x0000000000180700, "TObjEneDimedian"}, + + // Bulclaw. There appear to be no parameters. + {0x00A7, F_V0_V4, 0x0000000000000700, "TObjEneBalClawBody"}, + + // Claw. There appear to be no parameters. + {0x00A8, F_V0_V4, 0x0000000000000700, "TObjEneBalClawClaw"}, + + // Dragon (if in Episode 1) or Gal Gryphon (if in Episode 2). There + // appear to be no parameters. + {0x00C0, F_V0_V4, 0x0000000000000800, "TBoss1Dragon"}, + {0x00C0, F_V3_V4, 0x0000000040000000, "TBoss5Gryphon"}, + + // De Rol Le. There appear to be no parameters. + {0x00C1, F_V0_V4, 0x0000000000001000, "TBoss2DeRolLe"}, + + // Vol Opt and various pieces thereof. Generally only TBoss3Volopt and + // TBoss3VoloptP02 should be specified in map files; the other enemies + // are automatically created by TBoss3Volopt. None of these take any + // parameters. + {0x00C2, F_V0_V4, 0x0000000000002000, "TBoss3Volopt"}, // Main control object + {0x00C3, F_V0_V4, 0x0000000000002000, "TBoss3VoloptP01"}, // Phase 1 (x6; one for each big monitor) + {0x00C4, F_V0_V4, 0x0000000000002000, "TBoss3VoloptCore"}, // Core + {0x00C5, F_V0_V4, 0x0000000000002000, "TBoss3VoloptP02"}, // Phase 2 + {0x00C6, F_V0_V4, 0x0000000000002000, "TBoss3VoloptMonitor"}, // Monitor (x24; 4 for each wall) + {0x00C7, F_V0_V4, 0x0000000000002000, "TBoss3VoloptHiraisin"}, // Pillar (lightning rod) + + // Dark Falz. There appear to be no parameters. + {0x00C8, F_V0_V4, 0x0000000000004000, "TBoss4DarkFalz"}, + + // Other episode 2 bosses. None of these take any parameters. + {0x00CA, F_V3_V4, 0x0000000080000000, "TBoss6PlotFalz"}, // Olga Flow + {0x00CB, F_V3_V4, 0x0000000100000000, "TBoss7DeRolLeC"}, // Barba Ray + {0x00CC, F_V3_V4, 0x0000000200000000, "TBoss8Dragon"}, // Gol Dragon + + // Sinow Berill or Sinow Spigell. Params: + // param1 = spawn type: + // 0 = invisible + ground + // 1 = invisible + ceiling + // 2 = visible + ground + // 3 = visible + ceiling + // param2 = chance to enable stealth (value used is param2 + 0.3) + // param3 = chance to cast technique (value used is param3 + 0.4) + // param4 = chance to teleport (value used is param4 + 0.5) + // param5 = chance to disable stealth (value used is param5 + 0.1; + // applies when hit, but (TODO) also some other events) + // param6 = type: + // zero or negative = Sinow Berill + // positive = Sinow Spigell + // param2, param3, and param4 are evaluated in that order after the Sinow + // jumps back. That is, the game first generates a random float between 0 + // and 1, and compares it to param2 to decide whether to enable stealth. + // If it does, the other params are ignored. If it doesn't, the game then + // checks param3 in the same manner to determine whether to cast a tech; + // if that doesn't happen either, the game checks param4 to determine + // whether to teleport. If none of those happen, the Sinow just walks + // forward again and attacks. + {0x00D4, F_V3_V4, 0x000000000F800000, "TObjEneMe3StelthReal"}, + + // Merillia / Meriltas. Params: + // param1 = chance to run away after being hit (value used is param1 - + // 0.2, clamped below to 0) + // param3 = chance to do poison attack after being hit (value used is + // param3 - 0.2, clamped below to 0) + // param4 = distance to run away (value used is param4 + 300) + // param5 = wakeup radius delta (value used is param5 + 100, clamped + // below to 15; enemy will wake up when any player is nearby) + // param6 = type (0 = Merillia, 1 = Meriltas) + {0x00D5, F_V3_V4, 0x000000040F800000, "TObjEneMerillLia"}, + + // Mericarol / Mericus / Merikle / Mericarand. Params: + // param1 = chance of doing run attack after being hit when HP is less + // than half of max (value used is param1 + 0.5) + // param2 = speed during run attack (units per frame; value used is + // param2 + 3, clamped below to 1) + // param3 = chance of doing spit attack when player is nearby (actual + // probability is param3 + 0.1; if the check fails, it will do the + // slash attack instead) + // param6 = subtype: + // 0 = Mericarol + // 1 = Mericus + // 2 = Merikle + // anything else = Mericarand (see below) + // If this is a Mericarand, it is "randomly" chosen to be one of the + // three subtypes at construction time. On v1-v3, the client chooses + // randomly (but consistently, based on the entity ID) between Mericarol + // (80%), Mericus (10%) or Merikle (10%). On v4, if the entity ID isn't + // marked rare by the server, the Mericarand becomes a Mericarol; + // otherwise, it becomes a Mericus if its entity ID is even or a Merikle + // if it's odd. + {0x00D6, F_V3_V4, 0x000000080F800000, "TObjEneBm9Mericarol"}, + + // Ul Gibbon / Zol Gibbon. Params: + // param1 = group number + // param2 = appear type (<1 = spot appear; >=1 = jump appear) + // param3 = chance of jumping forward or back at each decision point + // (value used is param3 + 0.4) + // param4 = chance of casting a tech when not near any player (value + // used is param4 + 0.3) + // param5 = chance of casting a tech immediately after jumping forward + // or back (value used is param5 + 0.3; does not apply after jumps + // that are attacks) + // param6 = type (zero or negative = Ul Gibbon, positive = Zol Gibbon) + {0x00D7, F_V3_V4, 0x000000040F800000, "TObjEneBm5GibonU"}, + + // Gibbles. Params: + // param1 = jump distance delta (value used is param1 + 100) + // param2 = prejudice flag (see 0x00A0 (TObjEneSaver); the behavior + // here is exactly the same) + // param3 = chance to jump at each decision point (0-1) + // param4 = chance to jump after being hit (0-1) + {0x00D8, F_V3_V4, 0x000000080F800000, "TObjEneGibbles"}, + + // Gee. Params: + // param1 = in fighter / out fighter setting (see TObjEneMe1Canadin) + // param2 = appear height (0 = low, 1 = high) + // param3 = appear speed (value is param3 + 1, clamped below to 1) + // param4 = needle speed (value is param4 + 6, clamped below to 0.01) + // Note: The client's debug strings say "APPEAR SPEED(+1.f Min:0.01f)" + // for param3 and "NEEDLE SPEED(+6.f Min:1.f)" for param4. The "Min:" + // parts of those strings are incorrect; the comments above are correct. + {0x00D9, F_V3_V4, 0x000000040F800000, "TObjEneMe1Gee"}, + + // Gi Gue. Params: + // param1 = TODO (only matters if >= 1 or not) + // param2 = TODO (only used if param1 >= 1; defaults to 50 if param2 < + // 1; maybe same as Nano Dragon's param2?) + // param3 = TODO (value is param3 + 150) + // param4 = TODO (value is param4 + 0.5) + // param5 = TODO (value is param5 + 0.5) + // param7 = TODO + {0x00DA, F_V3_V4, 0x000000080F800000, "TObjEneMe1GiGue"}, + + // Deldepth. Params: + // param1 = TODO (value is param1 + 0.6, clamped below to 0; seems to + // be unused?) + {0x00DB, F_V3_V4, 0x0000000030000000, "TObjEneDelDepth"}, + + // Delbiter. Params: + // param1 = chance to howl (value is param1 + 0.3) + // param2 = chance to cause confusion via howl (value is param2 + 0.3) + // param3 = maximum distance at which howl can cause confusion (value + // is param3 + 30, clamped below to 10) + // param4 = chance to fire laser (value is param4 + 0.3) + // param5 = chance to charge (value is param5 + 0.5) + // param6 = type (0 = stand, 1 = run) + {0x00DC, F_V3_V4, 0x0000000830000000, "TObjEneDellBiter"}, + + // Dolmolm / Dolmdarl. Same parameters as TObjEneBeast, but also: + // param3 = TODO (value is param3 + 0.3; probability of some sort) + // param4 = TODO (value is param4 + 0.3; probability of some sort) + // param6 = type (zero or negative = Dolmolm; positive = Dolmdarl) + {0x00DD, F_V3_V4, 0x0000000430000000, "TObjEneDolmOlm"}, + + // Morfos. Params: + // param1 = TODO (value is param1 + 0.28) + // param2 = TODO (value is param2 + 20) + // param3 = TODO (value is param3 + 0.1; probability; used when current + // HP is less than half of max) + // param4 = TODO (value is param4 + 0.1; probability; used when current + // HP is less than half of max) + // param6 = TODO + {0x00DE, F_V3_V4, 0x0000000030000000, "TObjEneMorfos"}, + + // Recobox. Params: + // param1 = Recon floating height (value used for each Recon is 45 + + // rand(-2, 2) + param1) + // param2 = Recon target radius (distance from target; value used for + // each Recon is 50 + rand(-5, 5) + param2; param2 is clamped below + // to -30) + // param4 = maximum number of concurrently-active Recons (clamped to + // [0, min(6, num_children - 1)]) + // param6 = type: + // zero or negative = floor (Recons exit upward) + // 1 = ceiling (Recons exit downward) + // 2 or greater = wall (Recons exit horizontally) + // Note: The debug strings in TObjEneRecobox_v6A seem to imply that the + // total Recon count in the box is (param7 + 1); however, this is not + // true. The total Recon count in the box is actually (num_children - 1). + {0x00DF, F_V3_V4, 0x0000000C30000000, "TObjEneRecobox"}, + + // Sinow Zoa / Sinow Zele, or Epsilon (depending on the current area). It + // appears that the Sinows take the same params as TObjEneMe3StelthReal + // (Sinow Berill / Sinow Spigell), except (of course): + // param6 = type: + // zero or negative = Sinow Zoa + // positive = Sinow Zele + // Params for Epsilon: + // param1 = TODO (value is param1 + 0.5, clamped below to 0) + // param2 = TODO (value is param2 + 512; it appears this was supposed + // to be clamped below to 0, but due to a copy/paste error it isn't) + // param3 = TODO (value is (param3 + 20) * 5, clamped below to 150) + // param4 = TODO (value is (param4 + 20) * 5, clamped below to 150) + {0x00E0, F_V3_V4, 0x0000000030000000, "TObjEneMe3SinowZoaReal"}, + {0x00E0, F_V3_V4, 0x0000000800000000, "TObjEneEpsilonBody"}, + + // Ill Gill. Params: + // param1 = TODO (seems it only matters if this is zero or not; are there other uses?) + // param2 = TODO (used in TObjEneIllGill_update phase 3) + {0x00E1, F_V3_V4, 0x0000000800000000, "TObjEneIllGill"}, + + // TODO: Describe the rest of the enemy types. + {0x0110, F_V4, 0x000041F000000000, "__ASTARK__"}, // Constructor in 59NL: 005A3D60 + {0x0111, F_V4, 0x00004FF000000000, "__YOWIE__/__SATELLITE_LIZARD__"}, // Constructor in 59NL: 005AE7CC + {0x0112, F_V4, 0x00004E0000000000, "__MERISSA_A__"}, // Constructor in 59NL: 005B6B24 + {0x0113, F_V4, 0x00004E0000000000, "__GIRTABLULU__"}, // Constructor in 59NL: 005AB9AC + {0x0114, F_V4, 0x00004FF000000000, "__ZU__"}, // Constructor in 59NL: 005B47B8 + {0x0115, F_V4, 0x000041F000000000, "__BOOTA_FAMILY__"}, // Constructor in 59NL: 005A5C08 // TODO: probably a subclass of TObjEnemyV8048ee80; check if there are any others in BB + {0x0116, F_V4, 0x000041F000000000, "__DORPHON__"}, // Constructor in 59NL: 005A673C + {0x0117, F_V4, 0x00004E0000000000, "__GORAN_FAMILY__"}, // Constructor in 59NL: 005ADAC4 + {0x0119, F_V4, 0x0000100000000000, "__EPISODE_4_BOSS__"}, // Constructor in 59NL: 0076A86C +}); + +static string name_for_entity_type( + unordered_multimap& index, + const vector& defs, + uint16_t type, + Version version, + uint8_t area) { + + if (index.size() == 0) { + for (const auto& def : defs) { + index.emplace(def.type, &def); + } } + + auto its = index.equal_range(type); + uint16_t version_mask = (1 << static_cast(version)); + uint64_t area_mask = static_cast(1ULL << area); + + if ((version != Version::UNKNOWN) && (area != 0xFF)) { + for (auto [it, end_it] = its; it != end_it; it++) { + const auto* def = it->second; + if ((def->area_flags & area_mask) && (def->version_flags & version_mask)) { + return def->name; + } + } + } + + // When matching only by type or by (type, version), we can expect multiple + // matches + if (version != Version::UNKNOWN) { + string ret; + for (auto [it, end_it] = its; it != end_it; it++) { + const auto* def = it->second; + if (def->version_flags & version_mask) { + if (!ret.empty()) { + ret.push_back('/'); + } + ret += def->name; + } + } + if (!ret.empty()) { + return ret; + } + } + + string ret; + for (auto [it, end_it] = its; it != end_it; it++) { + const auto* def = it->second; + if (!ret.empty()) { + ret.push_back('/'); + } + ret += def->name; + } + + return ret.empty() + ? phosg::string_printf("__UNKNOWN_ENTITY_%04hX__", type) + : ret; } -const char* MapFile::name_for_enemy_type(uint16_t type) { - static const unordered_map names({ - // This is newserv's canonical definition of map enemy and NPC types. - // Object types are documented in name_for_object_type instead. - - // Enemies and NPCs take a similar arguments structure as objects: - // objects use ObjectSetEntry, enemies use EnemySetEntry. Unlike objects, - // some IDs are reused across game versions, so the same ID can generate - // a completely different entity on different game versions. Where this - // happens is noted in the comments below. - - // TODO: Add default floor availability information in the notes here. - - // Some enemies have params that the game's code references, but only in - // places where their effects can't be seen (for example, in normally- - // unused debug menus). These may have been used to test frame-by-frame - // animations for some enemies; see TObjEneMe3Shinowa_v76 for an example - // of this usage. The enemies with params like this are: - // - TObjEneMe3ShinowaReal (param3, param4) - // - TObjEneDf2Bringer (param1, param2) - // - TObjEneRe7Berura (param1, param2) - // - TBoss1Dragon (param1, param2) - // - TBoss5Gryphon (param1, param2) - // - TBoss2DeRolLe (param1, param2) - // - TBoss8Dragon (param1, param2) - // - TObjEneBm5GibonU (param4, param5; these params also have non-debug - // meanings) - // - TObjEneMorfos (oaram1, param2; these params also have non-debug - // meanings) - // TODO: Add more enemies to this list as they are found - - // NPCs. Params: - // param1 = action parameter (depends on param6; see below) - // param2 = visibility register number (if this is > 0, the NPC will - // only be visible when this register is nonzero; if this is >= 1000, - // the effective register is param2 - 1000 and register values for - // both param2 and param3 are read from the free play script - // environment instead of the quest script environment) - // param3 = hide override register number (if this is > 0, the NPC will - // not be visible when this register is nonzero, regardless of the - // state of the register specified by param2; if this is >= 1000, the - // effective register is param3 - 1000 and register values for both - // param2 and param3 are read from the free play script environment - // instead of the quest script environment) - // param4 = object number ("character ID" in qedit; if this is outside - // the range [100, 999], the quest label in param5 is called in the - // free play script instead of the quest script) - // param5 = quest label to call when interacted with (if zero, NPC does - // nothing upon interaction) - // param6 = specifies what NPC does when idle: - // 0 = stand still (param1 is ignored) - // 1 = walk around randomly (param1 = max walk distance from home) - // 2 = TODO (Ep3 only; appears to be unused) - // 3 = TODO (Ep3 only; appears to be unused) - // TODO: setting param4 to 0 changes something else about the NPC; figure - // out what this does (see TObjNpcBase_v57_set_config_from_params) - {0x0001, "TObjNpcFemaleBase"}, // Woman with red hair and purple outfit - {0x0002, "TObjNpcFemaleChild"}, // Shorter version of the above - {0x0003, "TObjNpcFemaleDwarf"}, // Woman wearing green outfit - {0x0004, "TObjNpcFemaleFat"}, // Woman outside Hunter's Guild - {0x0005, "TObjNpcFemaleMacho"}, // Tool shop woman - {0x0006, "TObjNpcFemaleOld"}, // Older woman with yellow/red outfit - {0x0007, "TObjNpcFemaleTall"}, // Woman walking around inside shop area - {0x0008, "TObjNpcMaleBase"}, // Similar appearance to weapon shop man - {0x0009, "TObjNpcMaleChild"}, // Kid wearing purple - {0x000A, "TObjNpcMaleDwarf"}, // Man outside Medical Center - {0x000B, "TObjNpcMaleFat"}, // Armor shop man - {0x000C, "TObjNpcMaleMacho"}, // Weapon shop man - {0x000D, "TObjNpcMaleOld"}, // Man near telepipe locations - {0x000E, "TObjNpcMaleTall"}, // Man wearing turquoise - {0x0019, "TObjNpcSoldierBase"}, // Man right of the Ragol warp door - {0x001A, "TObjNpcSoldierMacho"}, // Man left of the Ragol warp door - {0x001B, "TObjNpcGovernorBase"}, // Principal Tyrell - {0x001C, "TObjNpcConnoisseur"}, // Tekker - {0x001D, "TObjNpcCloakroomBase"}, // Bank woman - {0x001E, "TObjNpcExpertBase"}, // Man in front of bank - {0x001F, "TObjNpcNurseBase"}, // Nurses in Medical Center - {0x0020, "TObjNpcSecretaryBase"}, // Irene - {0x0021, "TObjNpcHHM00"}, // TODO - {0x0022, "TObjNpcNHW00"}, // TODO - {0x0024, "TObjNpcHRM00"}, // TODO - {0x0025, "TObjNpcARM00"}, // TODO - {0x0026, "TObjNpcARW00"}, // TODO - {0x0027, "TObjNpcHFW00"}, // TODO - {0x0028, "TObjNpcNFM00"}, // TODO - {0x0029, "TObjNpcNFW00"}, // TODO - {0x002B, "TObjNpcNHW01"}, // TODO - {0x002C, "TObjNpcAHM01"}, // TODO - {0x002D, "TObjNpcHRM01"}, // TODO - {0x0030, "TObjNpcHFW01"}, // TODO - {0x0031, "TObjNpcNFM01"}, // TODO - {0x0032, "TObjNpcNFW01"}, // TODO - {0x0045, "TObjNpcLappy"}, // Rappy - {0x0046, "TObjNpcMoja"}, // Small Hildebear - {0x0047, "TObjNpcRico"}, // Rico (v2 only; not available on v1 or v3+) - {0x00A9, "TObjNpcBringer"}, // Dark Bringer - {0x00D0, "TObjNpcKenkyu"}, // Ep2 armor shop man (v3+ only) - {0x00D1, "TObjNpcSoutokufu"}, // Natasha Milarose (v3+ only) - {0x00D2, "TObjNpcHosa"}, // Dan (v3+ only) - {0x00D3, "TObjNpcKenkyuW"}, // Ep2 tool shop woman (v3+ only) - {0x00F0, "TObjNpcHosa2"}, // Man next to room with warp to Lab (v3+ only) - {0x00F1, "TObjNpcKenkyu2"}, // Ep2 weapon shop man (v3+ only) - {0x00F2, "TObjNpcNgcBase(0x00F2)"}, // TODO (v3+ only) - {0x00F3, "TObjNpcNgcBase(0x00F3)"}, // TODO (v3+ only) - {0x00F4, "TObjNpcNgcBase(0x00F4)"}, // TODO (v3+ only) - {0x00F5, "TObjNpcNgcBase(0x00F5)"}, // TODO (v3+ only) - {0x00F6, "TObjNpcNgcBase(0x00F6)"}, // TODO (v3+ only) - {0x00F7, "TObjNpcNgcBase(0x00F7)"}, // Nol (v3+ only) - {0x00F8, "TObjNpcNgcBase(0x00F8)"}, // Elly (v3+ only) - {0x00F9, "TObjNpcNgcBase(0x00F9)"}, // Woman with cyan hair down the ramp from Ep2 Medical Center (v3+ only) - {0x00FA, "TObjNpcNgcBase(0x00FA)"}, // Woman with bright red hair down the ramp from Ep2 Medical Center (v3+ only) - {0x00FB, "TObjNpcNgcBase(0x00FB)"}, // Man with blue hair near the Ep2 Medical Center (v3+ only) - {0x00FC, "TObjNpcNgcBase(0x00FC)"}, // Man in room next to Ep2 Hunter's Guild (v3+ only) - {0x00FD, "TObjNpcNgcBase(0x00FD)"}, // TODO (v3+ only) - {0x00FE, "TObjNpcNgcBase(0x00FE)"}, // Episode 2 Hunter's Guild woman (v3+ only) - {0x00FF, "TObjNpcNgcBase(0x00FF)"}, // Woman near room with teleporter to VR areas (v3+ only) - {0x0100, "__MOMOKA__"}, // Momoka (v4 only) - - // Quest NPC. Params are the same as for the standard NPCs above, except: - // param6 low byte = flags (bit field): - // 01 = same as param6 above (0 = stand still; 1 = walk around) - // 10 = TODO - // param6 high byte = NPC index in npcplayerchar.dat - // Availability: v4 only - {0x0118, "__QUEST_NPC__"}, - - // Enemy that behaves like an NPC. Has all the same params as the - // standard NPC types, but also: - // angle.x = definition index - // The definition index is an integer from 0 to 15 (decimal) specifying - // which model, animations, and hitbox to use. The available choices - // depend on which assets are loaded, which in turn depend on the area - // the NPC appears in. - // TODO: Make a list of all of the choices for each area here - // Availability: v3+ only - {0x0033, "TObjNpcEnemy"}, - - // Hildebear. Params: - // param1 = initial location (clamped to [0, 1]; 0 = ground, 1 = sky) - // param2 = chance to use tech (value is param3 + 0.6, clamped to [0, - // 1]; TODO: it's not clear when exactly the decision points are) - // param3 = chance to jump when more than 150 units away (value is - // param2 + 0.3, clamped to [0, 1]) - // param6 = if >= 1, always rare - {0x0040, "TObjEneMoja"}, - - // Rappy. Params: - // param1 = TODO (clamped to [0, 1]; overwritten with 1 if wave_number - // is > 0; could be spawn location like for Hildebear?) - // param6 = rare flag (on v1-v3, rappy is rare if param6 != 0; on v4, - // rappy is rare if (param6 & 1) != 0) - // param7 = TODO - // Exactly which rappy is constructed depends on param6 (or the random - // rare check) and the current season event: - // Ep1/Ep2 non-rare = Rag Rappy - // Ep4 non-rare = Sand Rappy (Crater or Desert variation) - // Ep1 rare = Al Rappy - // Ep2 rare, Christmas = Saint Rappy - // Ep2 rare, Easter = Egg Rappy - // Ep2 rare, Halloween = Hallo Rappy - // Ep2 rare, any other season event (or none) = Love Rappy - // Ep4 rare = Del Rappy (Crater or Desert variation) - {0x0041, "TObjEneLappy"}, - - // Monest (and Mothmants). Params: - // param2 = number of Mothmants to expel at start (clamped to [0, 6]) - // param3 = total Mothmants (clamped to [0, min(30, num_children)] - // where num_children comes from the EnemySetEntry; if this is less - // than param2, then param2 will take precedence but no further - // Mothmants will emerge after the first group) - // Note: In map_forest01_02e.dat in the vanilla map files there is a - // Monest that has param1 = 3 and param2 = 10. This looks like just an - // off-by-one error on Sega's part where they accidentally shifted the - // parameters down by one place. As described above, this Monest expels - // 6 Mothmants, then no more after they are killed. - {0x0042, "TObjEneBm3FlyNest"}, - - // Savage Wolf or Barbarous Wolf. Params: - // param1 = group number (when a Barbarous Wolf dies, all wolves with - // the same group number howl and trigger their buffs or weaknesses) - // param2 = if less than 1, this is a Savage Wolf; otherwise it's a - // Barbarous Wolf - {0x0043, "TObjEneBm5Wolf"}, - - // Booma, Gobooma, or Gigobooma. Params: - // param1 = TODO (fraction of max HP; see TObjEnemyV8048ee80_v5A) - // param2 = idle walk radius (when there's no target, it will walk - // around its spawn location within this radius; if this is zero, it - // stands still instead) - // param6 = type (0 = Booma, 1 = Gobooma, 2 = Gigobooma) - // param7 = group ID (if nonzero, it looks like this is used to cause - // groups of enemies to band together and all attack the same player, - // chosen by the highest-ranking enemy (by param6) in the group; - // TODO: this explanation is unverified and param7 was never used by - // Sega; see client code at 3OE1:800F6F3C) - {0x0044, "TObjEneBeast"}, - - // Grass Assassin. Params: - // param1 = TODO - // param2 = TODO (some state is set based on whather this is <= 0 or - // not, but the value is also used directly in some places) - // param3 = TODO (see TObjGrass_update_case8) - // param4 = TODO (see TObjGrass_update_case8) - {0x0060, "TObjGrass"}, - - // Poison Lily or Del Lily. Del Lily is constructed if the current area - // is 0x23 (Control Tower); otherwise, Poison Lily is constructed. There - // appear to be no parameters. - {0x0061, "TObjEneRe2Flower"}, - - // Nano Dragon. Params: - // param1 = TODO (seems it only matters if this is 1 or not) - // param2 = TODO (defaults to 50 if param2 < 1) - // param7 = TODO (set in init) - {0x0062, "TObjEneNanoDrago"}, - - // Evil Shark, Pal Shark, or Guil Shark. Same params as 0x0044 - // (TObjEneBeast), except: - // param6 = type (0 = Evil Shark, 1 = Pal Shark, 2 = Guil Shark) - {0x0063, "TObjEneShark"}, - - // Pofuilly Slime. num_children is clamped to [0, 4]. Params: - // param7 = rare flag (if the lowest bit is set, this is a Pouilly - // Slime instead; on BB, this is ignored) - {0x0064, "TObjEneSlime"}, - - // Pan Arms (Hidoom + Migium). There appear to be no parameters. - {0x0065, "TObjEnePanarms"}, - - // Gillchic or Dubchic. Params: - // param1 = rapid fire count (number of lasers fired before moving - // again; if this is 0, the default of 2 is used) - // param6 = type (0 = Dubchic, 1 = Gillchic) - // param7 = TODO - {0x0080, "TObjEneDubchik"}, - - // Garanz. There appear to be no parameters. - // TODO: There is some behavior difference if wave_number is 0 vs. any - // other value. Figure out what exactly this does. - {0x0081, "TObjEneGyaranzo"}, - - // Sinow Beat. Params: - // param1 = disable mirage effect if >= 1.0 - // param2 = is Sinow Gold if >= 1.0 - // Note: All params are on the base class (TObjEneMe3Shinowa). - {0x0082, "TObjEneMe3ShinowaReal"}, - - // Canadine. Params: - // param1 = behavior (0 = in fighter, 1 = out fighter; this controls - // whether the Canadine will use its direct attack or stay high off - // the ground instead) - {0x0083, "TObjEneMe1Canadin"}, - - // Canane. There appear to be no parameters. There are always 8 followers - // arranged in a ring around the Canane. - {0x0084, "TObjEneMe1CanadinLeader"}, - - // Dubwitch. Destroying a Dubwitch destroys all Dubchics in the same - // room. There appear to be no parameters. - {0x0085, "TOCtrlDubchik"}, - - // Delsaber. Params: - // param1 = jump distance delta (value used is param1 + 100) - // param2 = prejudice flag (these values directly correspond to the - // bits in PlayerVisualConfig::class_flags; see below for details): - // 0 = males - // 1 = females - // 2 = humans - // 3 = newmans - // 4 = androids - // 5 = hunters - // 6 = rangers - // 7 = forces - // 8 = no prejudice - // If any player is within 30 units of a Delsaber, it will target that - // player. Otherwise, the Delsaber will target the nearest player that - // matches its prejudice flag; if no player matches this flag, it will - // target the nearest player. - {0x00A0, "TObjEneSaver"}, - - // Chaos Sorceror. There appear to be no parameters. - {0x00A1, "TObjEneRe4Sorcerer"}, - - // Dark Gunner. Params: - // param1 = group number (there should be between 1 and 16 Dark Gunners - // and one control enemy with the same group number in the same room) - // param2 = TODO (number within group? possibly unused?) - // param7 = TODO - {0x00A2, "TObjEneDarkGunner"}, - - // Dark Gunner control enemy. This enemy doesn't actually exist in-game; - // it only has logic for choosing a Dark Gunner from its group to be the - // leader, and then changing this leader periodically. Params: - // param1 = group number (see above) - {0x00A3, "TObjEneDarkGunCenter"}, - - // Dark Bringer. There appear to be no parameters. - {0x00A4, "TObjEneDf2Bringer"}, - - // Dark Belra. There appear to be no parameters. - {0x00A5, "TObjEneRe7Berura"}, - - // Dimenian / La Dimenian / So Dimenian. Same parameters as 0x0044 - // (TObjEneBeast), except: - // param6 = type (0 = Dimenian, 1 = La Dimenian, 2 = So Dimenian) - {0x00A6, "TObjEneDimedian"}, - - // Bulclaw. There appear to be no parameters. - {0x00A7, "TObjEneBalClawBody"}, - - // Claw. There appear to be no parameters. - {0x00A8, "TObjEneBalClawClaw"}, - - // Dragon (if in Episode 1) or Gal Gryphon (if in Episode 2). There - // appear to be no parameters. - {0x00C0, "TBoss1Dragon/TBoss5Gryphon"}, - - // De Rol Le. There appear to be no parameters. - {0x00C1, "TBoss2DeRolLe"}, - - // Vol Opt and various pieces thereof. Generally only TBoss3Volopt and - // TBoss3VoloptP02 should be specified in map files; the other enemies - // are automatically created by TBoss3Volopt. None of these take any - // parameters. - {0x00C2, "TBoss3Volopt"}, // Main control object - {0x00C3, "TBoss3VoloptP01"}, // Phase 1 (x6; one for each big monitor) - {0x00C4, "TBoss3VoloptCore"}, // Core - {0x00C5, "TBoss3VoloptP02"}, // Phase 2 - {0x00C6, "TBoss3VoloptMonitor"}, // Monitor (x24; 4 for each wall) - {0x00C7, "TBoss3VoloptHiraisin"}, // Pillar (lightning rod) - - // Dark Falz. There appear to be no parameters. - {0x00C8, "TBoss4DarkFalz"}, - - // Other episode 2 bosses. None of these take any parameters. - // Availability: v3+ only - {0x00CA, "TBoss6PlotFalz"}, // Olga Flow - {0x00CB, "TBoss7DeRolLeC"}, // Barba Ray - {0x00CC, "TBoss8Dragon"}, // Gol Dragon - - // Sinow Berill (Ep2) or scientist NPCs (Ep3). The Ep3 scientist NPCs - // take all the same params as the NPCs defined at the beginning of this - // list, but also: - // angle.x = model number (clamped to [0, 3]) - // Sinow Berill's params: - // param1 = spawn type: - // 0 = invisible + ground - // 1 = invisible + ceiling - // 2 = visible + ground - // 3 = visible + ceiling - // param2 = chance to enable stealth (value used is param2 + 0.3) - // param3 = chance to cast technique (value used is param3 + 0.4) - // param4 = chance to teleport (value used is param4 + 0.5) - // param5 = chance to disable stealth (value used is param5 + 0.1; - // applies when hit, but (TODO) also some other events) - // param6 = type: - // zero or negative = Sinow Berill - // positive = Sinow Spigell - // param2, param3, and param4 are evaluated in that order after the Sinow - // jumps back. That is, the game first generates a random float between 0 - // and 1, and compares it to param2 to decide whether to enable stealth. - // If it does, the other params are ignored. If it doesn't, the game then - // checks param3 in the same manner to determine whether to cast a tech; - // if that doesn't happen either, the game checks param4 to determine - // whether to teleport. If none of those happen, the Sinow just walks - // forward again and attacks. - // Availability: v3+ only (Sinow Berill); Ep3 only (scientist NPCs) - {0x00D4, "TObjEneMe3StelthReal/TObjNpcHeroScientist"}, - - // Merillia / Meriltas (Ep2) or scientist NPCs (Ep3). On Ep3 this is a - // direct alias for 0x00D4 and not a distinct object NPC type. - // Merillia's params: - // param1 = chance to run away after being hit (value used is param1 - - // 0.2, clamped below to 0) - // param3 = chance to do poison attack after being hit (value used is - // param3 - 0.2, clamped below to 0) - // param4 = distance to run away (value used is param4 + 300) - // param5 = wakeup radius delta (value used is param5 + 100, clamped - // below to 15; enemy will wake up when any player is nearby) - // param6 = type (0 = Merillia, 1 = Meriltas) - // Availability: v3+ only (Merillia/Meriltas); Ep3 only (scientist NPCs) - {0x00D5, "TObjEneMerillLia/TObjNpcHeroScientist"}, - - // Mericarol (Ep2) or Morgue chief NPC (Ep3). The Ep3 Morgue chief NPC - // takes all the same params as the NPCs defined at the beginning of this - // list. - // Mericarol's params: - // param1 = chance of doing run attack after being hit when HP is less - // than half of max (value used is param1 + 0.5) - // param2 = speed during run attack (units per frame; value used is - // param2 + 3, clamped below to 1) - // param3 = chance of doing spit attack when player is nearby (actual - // probability is param3 + 0.1; if the check fails, it will do the - // slash attack instead) - // param6 = subtype: - // 0 = Mericarol - // 1 = Mericus - // 2 = Merikle - // anything else = Mericarand (see below) - // If this is a Mericarand, it is "randomly" chosen to be one of the - // three subtypes at construction time. On v1-v3, the client chooses - // randomly (but consistently, based on the entity ID) between Mericarol - // (80%), Mericus (10%) or Merikle (10%). On v4, if the entity ID isn't - // marked rare by the server, the Mericarand becomes a Mericarol; - // otherwise, it becomes a Mericus if its entity ID is even or a Merikle - // if it's odd. - // Availability: v3+ only (Mericarol); Ep3 only (Morgue chief NPC) - {0x00D6, "TObjEneBm9Mericarol/TObjNpcHeroGovernor"}, - - // Ul Gibbon / Zol Gibbon (Ep2) or Morgue chief NPC (Ep3). On Ep3 this is - // a direct alias for 0x00D6 and not a distinct object NPC type. - // Gibbons' params: - // param1 = group number - // param2 = appear type (<1 = spot appear; >=1 = jump appear) - // param3 = chance of jumping forward or back at each decision point - // (value used is param3 + 0.4) - // param4 = chance of casting a tech when not near any player (value - // used is param4 + 0.3) - // param5 = chance of casting a tech immediately after jumping forward - // or back (value used is param5 + 0.3; does not apply after jumps - // that are attacks) - // param6 = type (zero or negative = Ul Gibbon, positive = Zol Gibbon) - // Availability: v3+ only (Gibbons); Ep3 only (Morgue chief NPC) - {0x00D7, "TObjEneBm5GibonU/TObjNpcHeroGovernor"}, - - // Gibbles. Params: - // param1 = jump distance delta (value used is param1 + 100) - // param2 = prejudice flag (see 0x00A0 (TObjEneSaver); the behavior - // here is exactly the same) - // param3 = chance to jump at each decision point (0-1) - // param4 = chance to jump after being hit (0-1) - // Availability: v3+ only - {0x00D8, "TObjEneGibbles"}, - - // Gee. Params: - // param1 = in fighter / out fighter setting (see TObjEneMe1Canadin) - // param2 = appear height (0 = low, 1 = high) - // param3 = appear speed (value is param3 + 1, clamped below to 1) - // param4 = needle speed (value is param4 + 6, clamped below to 0.01) - // Note: The client's debug strings say "APPEAR SPEED(+1.f Min:0.01f)" - // for param3 and "NEEDLE SPEED(+6.f Min:1.f)" for param4. The "Min:" - // parts of those strings are incorrect; the comments above are correct. - // Availability: v3+ only - {0x00D9, "TObjEneMe1Gee"}, - - // Gi Gue. Params: - // param1 = TODO (only matters if >= 1 or not) - // param2 = TODO (only used if param1 >= 1; defaults to 50 if param2 < - // 1; maybe same as Nano Dragon's param2?) - // param3 = TODO (value is param3 + 150) - // param4 = TODO (value is param4 + 0.5) - // param5 = TODO (value is param5 + 0.5) - // param7 = TODO - // Availability: v3+ only - {0x00DA, "TObjEneMe1GiGue"}, - - // Deldepth. Params: - // param1 = TODO (value is param1 + 0.6, clamped below to 0; seems to - // be unused?) - // Availability: v3+ only - {0x00DB, "TObjEneDelDepth"}, - - // Delbiter. Params: - // param1 = chance to howl (value is param1 + 0.3) - // param2 = chance to cause confusion via howl (value is param2 + 0.3) - // param3 = maximum distance at which howl can cause confusion (value - // is param3 + 30, clamped below to 10) - // param4 = chance to fire laser (value is param4 + 0.3) - // param5 = chance to charge (value is param5 + 0.5) - // param6 = type (0 = stand, 1 = run) - // Availability: v3+ only - {0x00DC, "TObjEneDellBiter"}, - - // Dolmolm / Dolmdarl. Same parameters as TObjEneBeast, but also: - // param3 = TODO (value is param3 + 0.3; probability of some sort) - // param4 = TODO (value is param4 + 0.3; probability of some sort) - // param6 = type (zero or negative = Dolmolm; positive = Dolmdarl) - // Availability: v3+ only - {0x00DD, "TObjEneDolmOlm"}, - - // Morfos. Params: - // param1 = TODO (value is param1 + 0.28) - // param2 = TODO (value is param2 + 20) - // param3 = TODO (value is param3 + 0.1; probability; used when current - // HP is less than half of max) - // param4 = TODO (value is param4 + 0.1; probability; used when current - // HP is less than half of max) - // param6 = TODO - // Availability: v3+ only - {0x00DE, "TObjEneMorfos"}, - - // Recobox. Params: - // param1 = Recon floating height (value used for each Recon is 45 + - // rand(-2, 2) + param1) - // param2 = Recon target radius (distance from target; value used for - // each Recon is 50 + rand(-5, 5) + param2; param2 is clamped below - // to -30) - // param4 = maximum number of concurrently-active Recons (clamped to - // [0, min(6, num_children - 1)]) - // param6 = type: - // zero or negative = floor (Recons exit upward) - // 1 = ceiling (Recons exit downward) - // 2 or greater = wall (Recons exit horizontally) - // Note: The debug strings in TObjEneRecobox_v6A seem to imply that the - // total Recon count in the box is (param7 + 1); however, this is not - // true. The total Recon count in the box is actually (num_children - 1). - // Availability: v3+ only - {0x00DF, "TObjEneRecobox"}, - - // Sinow Zoa / Sinow Zele, or Epsilon (depending on the current area). It - // appears that the Sinows take the same params as TObjEneMe3StelthReal - // (Sinow Berill / Sinow Spigell), except (of course): - // param6 = type: - // zero or negative = Sinow Zoa - // positive = Sinow Zele - // Params for Epsilon: - // param1 = TODO (value is param1 + 0.5, clamped below to 0) - // param2 = TODO (value is param2 + 512; it appears this was supposed - // to be clamped below to 0, but due to a copy/paste error it isn't) - // param3 = TODO (value is (param3 + 20) * 5, clamped below to 150) - // param4 = TODO (value is (param4 + 20) * 5, clamped below to 150) - // Availability: v3+ only (both Sinows and Epsilon) - {0x00E0, "TObjEneMe3SinowZoaReal/TObjEneEpsilonBody"}, - - // Ill Gill. Params: - // param1 = TODO (seems it only matters if this is zero or not; are there other uses?) - // param2 = TODO (used in TObjEneIllGill_update phase 3) - // Availability: v3+ only - {0x00E1, "TObjEneIllGill"}, - - // TODO: Describe the rest of the enemy types. - {0x0110, "__ASTARK__/TObjNpcWalkingMeka_Hero"}, // Constructor in 59NL: 005A3D60; 3SE0: 80271DB0 // Ep3/v4 only // Ep3: Small talking robot in Morgue - {0x0111, "__YOWIE__/__SATELLITE_LIZARD__/TObjNpcWalkingMeka_Dark"}, // Constructor in 59NL: 005AE7CC; 3SE0: 80271790 // Ep3/v4 only // Ep3: Small talking robot in Morgue - {0x0112, "__MERISSA_A__/TObjNpcHeroAide"}, // Constructor in 59NL: 005B6B24; 3SE0: 802F4888 // Ep3/v4 only // Ep3: multiple NPCs - {0x0113, "__GIRTABLULU__"}, // Constructor in 59NL: 005AB9AC // v4 only - {0x0114, "__ZU__"}, // Constructor in 59NL: 005B47B8 // v4 only - {0x0115, "__BOOTA_FAMILY__"}, // Constructor in 59NL: 005A5C08 // v4 only // TODO: probably a subclass of TObjEnemyV8048ee80; check if there are any others in BB - {0x0116, "__DORPHON__"}, // Constructor in 59NL: 005A673C // v4 only - {0x0117, "__GORAN_FAMILY__"}, // Constructor in 59NL: 005ADAC4 // v4 only - {0x0119, "__EPISODE_4_BOSS__"}, // Constructor in 59NL: 0076A86C // v4 only - }); - try { - return names.at(type); - } catch (const out_of_range&) { - return "__UNKNOWN__"; - } +string MapFile::name_for_object_type(uint16_t type, Version version, uint8_t area) { + static unordered_multimap index; + return name_for_entity_type(index, dat_object_definitions, type, version, area); +} +string MapFile::name_for_enemy_type(uint16_t type, Version version, uint8_t area) { + static unordered_multimap index; + return name_for_entity_type(index, dat_enemy_definitions, type, version, area); } -string MapFile::ObjectSetEntry::str() const { - string name_str = MapFile::name_for_object_type(this->base_type); +string MapFile::ObjectSetEntry::str(Version version, uint8_t area) const { + string name_str = MapFile::name_for_object_type(this->base_type, version, area); return phosg::string_printf("[ObjectSetEntry type=%04hX \"%s\" set_flags=%04hX index=%04hX floor=%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(), @@ -3206,10 +3233,11 @@ uint64_t MapFile::ObjectSetEntry::semantic_hash(uint8_t floor) const { return ret; } -string MapFile::EnemySetEntry::str() const { +string MapFile::EnemySetEntry::str(Version version, uint8_t area) const { + auto type_name = MapFile::name_for_enemy_type(this->base_type, version, area); return phosg::string_printf("[EnemySetEntry 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), + type_name.c_str(), this->set_flags.load(), this->index.load(), this->num_children.load(), @@ -3853,7 +3881,7 @@ string MapFile::disassemble_action_stream(const void* data, size_t size) { return phosg::join(ret, "\n"); } -string MapFile::disassemble(bool reassembly) const { +string MapFile::disassemble(bool reassembly, Version version) const { deque ret; for (uint8_t floor = 0; floor < this->sections_for_floor.size(); floor++) { const auto& sf = this->sections_for_floor[floor]; @@ -3868,10 +3896,10 @@ string MapFile::disassemble(bool reassembly) const { } for (size_t z = 0; z < sf.object_set_count; z++) { if (reassembly) { - ret.emplace_back(sf.object_sets[z].str()); + ret.emplace_back(sf.object_sets[z].str(version)); } else { size_t k_id = z + sf.first_object_set_index; - ret.emplace_back(phosg::string_printf("/* K-%03zX */ ", k_id) + sf.object_sets[z].str()); + ret.emplace_back(phosg::string_printf("/* K-%03zX */ ", k_id) + sf.object_sets[z].str(version)); } } } @@ -3884,10 +3912,10 @@ string MapFile::disassemble(bool reassembly) const { } for (size_t z = 0; z < sf.enemy_set_count; z++) { if (reassembly) { - ret.emplace_back(sf.enemy_sets[z].str()); + ret.emplace_back(sf.enemy_sets[z].str(version)); } else { size_t s_id = z + sf.first_enemy_set_index; - ret.emplace_back(phosg::string_printf("/* S-%03zX */ ", s_id) + sf.enemy_sets[z].str()); + ret.emplace_back(phosg::string_printf("/* S-%03zX */ ", s_id) + sf.enemy_sets[z].str(version)); } } } @@ -3973,7 +4001,7 @@ string SuperMap::Object::str() const { for (Version v : ALL_NON_PATCH_VERSIONS) { const auto& def = this->version(v); if (def.relative_object_index != 0xFFFF) { - string args_str = def.set_entry->str(); + string args_str = def.set_entry->str(v); ret += phosg::string_printf( " %s:[%04hX => %s]", phosg::name_for_enum(v), def.relative_object_index, args_str.c_str()); } @@ -3999,7 +4027,7 @@ string SuperMap::Enemy::str() const { for (Version v : ALL_NON_PATCH_VERSIONS) { const auto& def = this->version(v); if (def.relative_enemy_index != 0xFFFF) { - string args_str = def.set_entry->str(); + string args_str = def.set_entry->str(v); ret += phosg::string_printf( " %s:[%04hX/%04hX => %s]", phosg::name_for_enum(v), diff --git a/src/Map.hh b/src/Map.hh index 3e246dca..b0a8b009 100644 --- a/src/Map.hh +++ b/src/Map.hh @@ -142,8 +142,8 @@ private: class MapFile : public std::enable_shared_from_this { public: - static const char* name_for_object_type(uint16_t type); - static const char* name_for_enemy_type(uint16_t type); + static std::string name_for_object_type(uint16_t type, Version version = Version::UNKNOWN, uint8_t area = 0xFF); + static std::string name_for_enemy_type(uint16_t type, Version version = Version::UNKNOWN, uint8_t area = 0xFF); struct SectionHeader { // Only used for quest DAT files enum class Type { @@ -192,7 +192,7 @@ public: /* 44 */ uint64_t semantic_hash(uint8_t floor) const; - std::string str() const; + std::string str(Version version = Version::UNKNOWN, uint8_t area = 0xFF) const; } __packed_ws__(ObjectSetEntry, 0x44); struct EnemySetEntry { // Section type 2 (ENEMY_SETS) @@ -219,7 +219,7 @@ public: /* 48 */ uint64_t semantic_hash(uint8_t floor) const; - std::string str() const; + std::string str(Version version = Version::UNKNOWN, uint8_t area = 0xFF) const; } __packed_ws__(EnemySetEntry, 0x48); struct EventsSectionHeader { // Section type 3 (EVENTS) @@ -424,7 +424,7 @@ public: size_t count_events() const; static std::string disassemble_action_stream(const void* data, size_t size); - std::string disassemble(bool reassembly = false) const; + std::string disassemble(bool reassembly = false, Version version = Version::UNKNOWN) const; protected: void link_data(std::shared_ptr data); @@ -701,10 +701,11 @@ public: this->item_drop_checked = false; } - inline const char* type_name(Version v) const { - return this->super_obj - ? MapFile::name_for_object_type(this->super_obj->version(v).set_entry->base_type) - : ""; + inline std::string type_name(Version v, uint8_t area = 0xFF) const { + if (!this->super_obj) { + return ""; + } + return MapFile::name_for_object_type(this->super_obj->version(v).set_entry->base_type, v, area); } }; diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index a468337a..ff833c96 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -1753,7 +1753,11 @@ static void on_switch_state_changed(shared_ptr c, uint8_t command, uint8 if (cmd.header.entity_id != 0xFFFF && c->config.check_flag(Client::Flag::DEBUG_ENABLED)) { const auto& obj_st = l->map_state->object_state_for_index( c->version(), cmd.switch_flag_floor, cmd.header.entity_id - 0x4000); - send_text_message_printf(c, "$C5K-%03zX A %s", obj_st->k_id, obj_st->type_name(c->version())); + auto s = c->require_server_state(); + auto sdt = s->set_data_table(c->version(), l->episode, l->mode, l->difficulty); + uint8_t area = sdt->default_area_for_floor(l->episode, c->floor); + auto type_name = obj_st->type_name(c->version(), area); + send_text_message_printf(c, "$C5K-%03zX A %s", obj_st->k_id, type_name.c_str()); } // Apparently sometimes 6x05 is sent with an invalid switch flag number. The @@ -2778,10 +2782,11 @@ DropReconcileResult reconcile_drop_request_with_map( if (!set_entry) { throw std::runtime_error("object set entry is missing"); } + string type_name = MapFile::name_for_object_type(set_entry->base_type, client_channel.version); log.info("Drop check for K-%03zX %c %s", res.obj_st->k_id, res.ignore_def ? 'G' : 'S', - MapFile::name_for_object_type(set_entry->base_type)); + type_name.c_str()); if (cmd.floor != res.obj_st->super_obj->floor) { log.warning("Floor %02hhX from command does not match object\'s expected floor %02hhX", cmd.floor, res.obj_st->super_obj->floor); @@ -2800,10 +2805,9 @@ DropReconcileResult reconcile_drop_request_with_map( res.ignore_def ? "true" : "false", object_ignore_def ? "true" : "false", set_entry->param1.load()); } if (config.check_flag(Client::Flag::DEBUG_ENABLED)) { + string type_name = MapFile::name_for_object_type(set_entry->base_type, client_channel.version); send_text_message_printf(client_channel, "$C5K-%03zX %c %s", - res.obj_st->k_id, - res.ignore_def ? 'G' : 'S', - MapFile::name_for_object_type(set_entry->base_type)); + res.obj_st->k_id, res.ignore_def ? 'G' : 'S', type_name.c_str()); } }