import click import re import sys import struct actor_method_class_name = None actor_class_size = None LayerID = { "0x00000000": "fpcLy_ROOT_e", "0xFFFFFFFD": "fpcLy_CURRENT_e", "0xFFFFFFFE": "fpcLy_SPECIAL_e", "0xFFFFFFFF": "fpcLy_NONE_e" } ListPrio = { 0xFFFD: "fpcPi_CURRENT_e", 0xFFFE: "fpcPi_SPECIAL_e", } ProcName = { 0x0000: "PROC_OVERLAP0", 0x0001: "PROC_OVERLAP1", 0x0002: "PROC_OVERLAP3", 0x0003: "PROC_OVERLAP6", 0x0004: "PROC_OVERLAP7", 0x0005: "PROC_OVERLAP8", 0x0006: "PROC_OVERLAP9", 0x0007: "PROC_OVERLAP10", 0x0008: "PROC_OVERLAP11", 0x0009: "PROC_LOGO_SCENE", 0x000A: "PROC_MENU_SCENE", 0x000B: "PROC_PLAY_SCENE", 0x000C: "PROC_OPENING_SCENE", 0x000D: "PROC_NAME_SCENE", 0x000E: "PROC_NAMEEX_SCENE", 0x000F: "PROC_WARNING_SCENE", 0x0010: "PROC_WARNING2_SCENE", 0x0011: "PROC_OVERLAP2", 0x0012: "PROC_ROOM_SCENE", 0x0013: "PROC_KANKYO", 0x0014: "PROC_ALLDIE", 0x0015: "PROC_ENVSE", 0x0016: "PROC_Obj_Swpush", 0x0017: "PROC_Obj_Swpush2", 0x0018: "PROC_Obj_Swpush5", 0x0019: "PROC_Tag_Gstart", 0x001A: "PROC_NO_CHG_ROOM", 0x001B: "PROC_Obj_Lv6ElevtA", 0x001C: "PROC_OBJ_SO", 0x001D: "PROC_Obj_Movebox", 0x001E: "PROC_Obj_SwTurn", 0x001F: "PROC_Obj_Lv6SwTurn", 0x0020: "PROC_OBJ_SEKIZOA", 0x0021: "PROC_OBJ_GRA", 0x0022: "PROC_TAG_GRA", 0x0023: "PROC_TAG_YAMI", 0x0024: "PROC_Obj_Ladder", 0x0025: "PROC_OBJ_BEF", 0x0026: "PROC_OBJ_FMOBJ", 0x0027: "PROC_OBJ_LBOX", 0x0028: "PROC_OBJ_WEB0", 0x0029: "PROC_OBJ_WEB1", 0x002A: "PROC_OBJ_CB", 0x002B: "PROC_OBJ_MAKI", 0x002C: "PROC_OBJ_BRG", 0x002D: "PROC_OBJ_GB", 0x002E: "PROC_OBJ_GM", 0x002F: "PROC_OBJ_TOBY", 0x0030: "PROC_OBJ_TP", 0x0031: "PROC_TREESH", 0x0032: "PROC_Obj_ZDoor", 0x0033: "PROC_Obj_Pillar", 0x0034: "PROC_Obj_Cdoor", 0x0035: "PROC_GRDWATER", 0x0036: "PROC_Obj_RotBridge", 0x0037: "PROC_Obj_MagLift", 0x0038: "PROC_Obj_MagLiftRot", 0x0039: "PROC_Obj_Lv1Cdl00", 0x003A: "PROC_Obj_Lv1Cdl01", 0x003B: "PROC_Obj_TvCdlst", 0x003C: "PROC_Obj_HsTarget", 0x003D: "PROC_Obj_HeavySw", 0x003E: "PROC_Obj_GoGate", 0x003F: "PROC_Obj_TaFence", 0x0040: "PROC_Obj_Saidan", 0x0041: "PROC_Obj_SpinLift", 0x0042: "PROC_Obj_BmWindow", 0x0043: "PROC_Obj_RfHole", 0x0044: "PROC_Obj_WaterPillar", 0x0045: "PROC_Obj_SyRock", 0x0046: "PROC_Obj_BsGate", 0x0047: "PROC_Obj_AmiShutter", 0x0048: "PROC_Obj_WtGate", 0x0049: "PROC_Obj_Lv2Candle", 0x004A: "PROC_Obj_TogeTrap", 0x004B: "PROC_Obj_RotTrap", 0x004C: "PROC_Obj_SwallShutter", 0x004D: "PROC_Obj_IceWall", 0x004E: "PROC_Obj_Lv5SwIce", 0x004F: "PROC_Obj_Lv5FBoard", 0x0050: "PROC_Obj_Turara", 0x0051: "PROC_Obj_TwGate", 0x0052: "PROC_Obj_Digholl", 0x0053: "PROC_Obj_Digpl", 0x0054: "PROC_Obj_TestCube", 0x0055: "PROC_Obj_Kshutter", 0x0056: "PROC_NPC_COACH", 0x0057: "PROC_NPC_THEB", 0x0058: "PROC_COACH_FIRE", 0x0059: "PROC_COACH2D", 0x005A: "PROC_BALLOON2D", 0x005B: "PROC_SKIP2D", 0x005C: "PROC_Obj_MvStair", 0x005D: "PROC_Obj_Cowdoor", 0x005E: "PROC_Obj_Swpropeller", 0x005F: "PROC_Obj_BoomShutter", 0x0060: "PROC_NPC_KS", 0x0061: "PROC_Obj_Hfuta", 0x0062: "PROC_Obj_BkDoor", 0x0063: "PROC_Obj_Cboard", 0x0064: "PROC_Obj_MGate", 0x0065: "PROC_Obj_Ikada", 0x0066: "PROC_Obj_Ice_l", 0x0067: "PROC_Obj_Ice_s", 0x0068: "PROC_Obj_E_CREATE", 0x0069: "PROC_Obj_Bhbridge", 0x006A: "PROC_Obj_Kaisou", 0x006B: "PROC_Obj_HHASHI", 0x006C: "PROC_Obj_BHASHI", 0x006D: "PROC_OCTHASHI", 0x006E: "PROC_Obj_THASHI", 0x006F: "PROC_Obj_CRVGATE", 0x0070: "PROC_Obj_CRVFENCE", 0x0071: "PROC_Obj_CRVHAHEN", 0x0072: "PROC_Obj_CRVSTEEL", 0x0073: "PROC_Obj_CRVLH_UP", 0x0074: "PROC_Obj_CRVLH_DW", 0x0075: "PROC_Obj_RIVERROCK", 0x0076: "PROC_Obj_DUST", 0x0077: "PROC_Obj_ITA", 0x0078: "PROC_Obj_Window", 0x0079: "PROC_Obj_MetalBox", 0x007A: "PROC_Obj_BBox", 0x007B: "PROC_OBJ_MSIMA", 0x007C: "PROC_OBJ_MYOGAN", 0x007D: "PROC_B_ZANTS", 0x007E: "PROC_Obj_ChainBlock", 0x007F: "PROC_Obj_ChainWall", 0x0080: "PROC_Obj_KkrGate", 0x0081: "PROC_Obj_RiderGate", 0x0082: "PROC_Obj_Onsen", 0x0083: "PROC_Obj_Chest", 0x0084: "PROC_Obj_Bemos", 0x0085: "PROC_Obj_RopeBridge", 0x0086: "PROC_Obj_WellCover", 0x0087: "PROC_Obj_GraveStone", 0x0088: "PROC_Obj_ZraRock", 0x0089: "PROC_Obj_GraRock", 0x008A: "PROC_Obj_GrzRock", 0x008B: "PROC_GRA_WALL", 0x008C: "PROC_OBJ_ONSEN_FIRE", 0x008D: "PROC_Obj_Lv6bemos", 0x008E: "PROC_Obj_Lv6bemos2", 0x008F: "PROC_Obj_BarDesk", 0x0090: "PROC_Obj_DigSnow", 0x0091: "PROC_Obj_Ytaihou", 0x0092: "PROC_Obj_Elevator", 0x0093: "PROC_Obj_Lv6TogeRoll", 0x0094: "PROC_Obj_Lv6TogeTrap", 0x0095: "PROC_Obj_Lv6Tenbin", 0x0096: "PROC_Obj_Lv6SwGate", 0x0097: "PROC_Obj_Lv6Lblock", 0x0098: "PROC_Obj_Lv6ChgGate", 0x0099: "PROC_Obj_Lv6FuriTrap", 0x009A: "PROC_Obj_Lv6SzGate", 0x009B: "PROC_Obj_Lv4EdShutter", 0x009C: "PROC_Obj_Lv4Gate", 0x009D: "PROC_Obj_Lv4PoGate", 0x009E: "PROC_Obj_Lv4SlideWall", 0x009F: "PROC_Obj_Lv4HsTarget", 0x00A0: "PROC_Obj_Lv7PropY", 0x00A1: "PROC_Obj_Lv7BsGate", 0x00A2: "PROC_Obj_Lv8OptiLift", 0x00A3: "PROC_Obj_Lv8KekkaiTrap", 0x00A4: "PROC_Obj_Lv8Lift", 0x00A5: "PROC_Obj_Lv8UdFloor", 0x00A6: "PROC_Obj_Lv9SwShutter", 0x00A7: "PROC_Obj_TobyHouse", 0x00A8: "PROC_Obj_poCandle", 0x00A9: "PROC_Obj_Lv4DigSand", 0x00AA: "PROC_Obj_FallObj", 0x00AB: "PROC_Obj_SmgDoor", 0x00AC: "PROC_Obj_SwLight", 0x00AD: "PROC_Obj_Avalanche", 0x00AE: "PROC_Obj_MirrorScrew", 0x00AF: "PROC_Obj_MirrorSand", 0x00B0: "PROC_Obj_MirrorTable", 0x00B1: "PROC_Obj_MirrorChain", 0x00B2: "PROC_Obj_Mirror6Pole", 0x00B3: "PROC_Obj_SwSpinner", 0x00B4: "PROC_Obj_TDoor", 0x00B5: "PROC_Obj_Lv7Bridge", 0x00B6: "PROC_Obj_zrTurara", 0x00B7: "PROC_Obj_TakaraDai", 0x00B8: "PROC_Obj_Table", 0x00B9: "PROC_Obj_CatDoor", 0x00BA: "PROC_Obj_Gake", 0x00BB: "PROC_CSTAF", 0x00BC: "PROC_Obj_Lv4RailWall", 0x00BD: "PROC_Obj_Lv4Sand", 0x00BE: "PROC_Obj_PushDoor", 0x00BF: "PROC_PushDoor", 0x00C0: "PROC_Obj_GanonWall2", 0x00C1: "PROC_Obj_Lv4Bridge", 0x00C2: "PROC_Obj_Lv4Floor", 0x00C3: "PROC_Tag_Spinner", 0x00C4: "PROC_Obj_SwHang", 0x00C5: "PROC_Obj_RotStair", 0x00C6: "PROC_Obj_MagneArm", 0x00C7: "PROC_Obj_KWheel00", 0x00C8: "PROC_Obj_KWheel01", 0x00C9: "PROC_Obj_Ychndlr", 0x00CA: "PROC_Obj_PRElvtr", 0x00CB: "PROC_Obj_MHasu", 0x00CC: "PROC_Obj_YIblltray", 0x00CD: "PROC_Obj_Lv6EGate", 0x00CE: "PROC_Obj_PDtile", 0x00CF: "PROC_Obj_PDwall", 0x00D0: "PROC_Obj_Lv4PRwall", 0x00D1: "PROC_Obj_KLift00", 0x00D2: "PROC_B_OH", 0x00D3: "PROC_Obj_Lv4Chan", 0x00D4: "PROC_Obj_Lv3R10Saka", 0x00D5: "PROC_Obj_Lv3Water", 0x00D6: "PROC_Obj_Lv3Water2", 0x00D7: "PROC_OBJ_LV3WATERB", 0x00D8: "PROC_Obj_HBombkoya", 0x00D9: "PROC_Obj_SZbridge", 0x00DA: "PROC_Obj_KakarikoBrg", 0x00DB: "PROC_Obj_OrdinBrg", 0x00DC: "PROC_Obj_BurnBox", 0x00DD: "PROC_Obj_KJgjs", 0x00DE: "PROC_OBJ_IHASI", 0x00DF: "PROC_Obj_IceBlock", 0x00E0: "PROC_Obj_VolcanicBall", 0x00E1: "PROC_Obj_VolcanicBomb", 0x00E2: "PROC_Obj_VolcGnd", 0x00E3: "PROC_Obj_KKanban", 0x00E4: "PROC_E_PH", 0x00E5: "PROC_NPC_ZRA", 0x00E6: "PROC_Obj_Chandelier", 0x00E7: "PROC_Obj_Stopper2", 0x00E8: "PROC_DOOR20", 0x00E9: "PROC_Tag_Hinit", 0x00EA: "PROC_Tag_Hjump", 0x00EB: "PROC_Tag_AJnot", 0x00EC: "PROC_Tag_Hstop", 0x00ED: "PROC_CANOE", 0x00EE: "PROC_HORSE", 0x00EF: "PROC_E_WB", 0x00F0: "PROC_OBJ_ITO", 0x00F1: "PROC_OBJ_SW", 0x00F2: "PROC_SPINNER", 0x00F3: "PROC_B_OB", 0x00F4: "PROC_KAGO", 0x00F5: "PROC_E_YC", 0x00F6: "PROC_B_DS", 0x00F7: "PROC_B_DR", 0x00F8: "PROC_B_ZANTZ", 0x00F9: "PROC_B_ZANT", 0x00FA: "PROC_B_ZANTM", 0x00FB: "PROC_TBOX", 0x00FC: "PROC_TBOX2", 0x00FD: "PROC_ALINK", 0x00FE: "PROC_BOOMERANG", 0x00FF: "PROC_MIDNA", 0x0100: "PROC_NPC_TK", 0x0101: "PROC_NPC_WORM", 0x0102: "PROC_PPolamp", 0x0103: "PROC_BkyRock", 0x0104: "PROC_HITOBJ", 0x0105: "PROC_EP", 0x0106: "PROC_COW", 0x0107: "PROC_PERU", 0x0108: "PROC_NI", 0x0109: "PROC_NPC_TKJ2", 0x010A: "PROC_SQ", 0x010B: "PROC_NPC_SQ", 0x010C: "PROC_DO", 0x010D: "PROC_NPC_NE", 0x010E: "PROC_NPC_TR", 0x010F: "PROC_NPC_LF", 0x0110: "PROC_OBJ_FOOD", 0x0111: "PROC_OBJ_KI", 0x0112: "PROC_OBJ_KITA", 0x0113: "PROC_OBJ_KEY", 0x0114: "PROC_OBJ_KEYHOLE", 0x0115: "PROC_Obj_Lv5Key", 0x0116: "PROC_OBJ_LP", 0x0117: "PROC_OBJ_TATIGI", 0x0118: "PROC_OBJ_ROCK", 0x0119: "PROC_OBJ_WFLAG", 0x011A: "PROC_OBJ_KAGE", 0x011B: "PROC_OBJ_KANBAN2", 0x011C: "PROC_OBJ_BALLOON", 0x011D: "PROC_OBJ_SUISYA", 0x011E: "PROC_OBJ_OILTUBO", 0x011F: "PROC_OBJ_ROTEN", 0x0120: "PROC_OBJ_SSDRINK", 0x0121: "PROC_OBJ_SSITEM", 0x0122: "PROC_TAG_SSDRINK", 0x0123: "PROC_TAG_BTLITM", 0x0124: "PROC_TAG_LV5SOUP", 0x0125: "PROC_TAG_MNLIGHT", 0x0126: "PROC_TAG_SHOPCAM", 0x0127: "PROC_TAG_SHOPITM", 0x0128: "PROC_OBJ_NDOOR", 0x0129: "PROC_OBJ_UDOOR", 0x012A: "PROC_OBJ_USAKU", 0x012B: "PROC_Obj_SM_DOOR", 0x012C: "PROC_OBJ_BED", 0x012D: "PROC_OBJ_BOUMATO", 0x012E: "PROC_OBJ_ITAMATO", 0x012F: "PROC_OBJ_NOUGU", 0x0130: "PROC_OBJ_STICK", 0x0131: "PROC_OBJ_MIE", 0x0132: "PROC_OBJ_SEKIDOOR", 0x0133: "PROC_OBJ_SEKIZO", 0x0134: "PROC_OBJ_SMTILE", 0x0135: "PROC_NPC_FISH", 0x0136: "PROC_MG_FISH", 0x0137: "PROC_FSHOP", 0x0138: "PROC_NPC_DU", 0x0139: "PROC_DISAPPEAR", 0x013A: "PROC_Obj_Mato", 0x013B: "PROC_Obj_Flag", 0x013C: "PROC_Obj_Flag2", 0x013D: "PROC_Obj_Flag3", 0x013E: "PROC_Obj_GOMIKABE", 0x013F: "PROC_Obj_Yousei", 0x0140: "PROC_Obj_Kabuto", 0x0141: "PROC_Obj_Cho", 0x0142: "PROC_Obj_Kuw", 0x0143: "PROC_Obj_Nan", 0x0144: "PROC_Obj_Dan", 0x0145: "PROC_Obj_Kam", 0x0146: "PROC_Obj_Ten", 0x0147: "PROC_Obj_Ari", 0x0148: "PROC_Obj_Kag", 0x0149: "PROC_Obj_Batta", 0x014A: "PROC_Obj_Tombo", 0x014B: "PROC_Obj_Kat", 0x014C: "PROC_Obj_H_Saku", 0x014D: "PROC_Obj_Yobikusa", 0x014E: "PROC_Obj_KazeNeko", 0x014F: "PROC_Obj_KznkArm", 0x0150: "PROC_Obj_NamePlate", 0x0151: "PROC_Obj_OnCloth", 0x0152: "PROC_Obj_LndRope", 0x0153: "PROC_Obj_ItaRope", 0x0154: "PROC_Obj_Sakuita", 0x0155: "PROC_Obj_Laundry", 0x0156: "PROC_WarpBug", 0x0157: "PROC_Izumi_Gate", 0x0158: "PROC_Obj_Fchain", 0x0159: "PROC_Obj_Wchain", 0x015A: "PROC_Tag_Attp", 0x015B: "PROC_Obj_Tornado", 0x015C: "PROC_Obj_Tornado2", 0x015D: "PROC_Obj_FirePillar", 0x015E: "PROC_Obj_FirePillar2", 0x015F: "PROC_Obj_InoBone", 0x0160: "PROC_Obj_Stopper", 0x0161: "PROC_Obj_MHole", 0x0162: "PROC_Tag_Magne", 0x0163: "PROC_Obj_BossWarp", 0x0164: "PROC_Obj_WoodPendulum", 0x0165: "PROC_Obj_WdStick", 0x0166: "PROC_Obj_StairBlock", 0x0167: "PROC_Obj_Geyser", 0x0168: "PROC_Tag_KtOnFire", 0x0169: "PROC_Obj_FireWood", 0x016A: "PROC_Obj_FireWood2", 0x016B: "PROC_Obj_GpTaru", 0x016C: "PROC_Obj_OnsenTaru", 0x016D: "PROC_Obj_KiPot", 0x016E: "PROC_TBOX_SW", 0x016F: "PROC_Obj_SwChain", 0x0170: "PROC_Obj_WoodenSword", 0x0171: "PROC_Obj_StoneMark", 0x0172: "PROC_Obj_Lv3Candle", 0x0173: "PROC_Tag_Lv4Candle", 0x0174: "PROC_Tag_Lv4CandleDm", 0x0175: "PROC_Obj_DamCps", 0x0176: "PROC_Obj_Smoke", 0x0177: "PROC_Obj_WaterFall", 0x0178: "PROC_Obj_ZoraCloth", 0x0179: "PROC_Obj_poFire", 0x017A: "PROC_Tag_poFire", 0x017B: "PROC_Obj_glowSphere", 0x017C: "PROC_Tag_LightBall", 0x017D: "PROC_SwLBall", 0x017E: "PROC_SwBall", 0x017F: "PROC_Obj_WaterEff", 0x0180: "PROC_Tag_RiverBack", 0x0181: "PROC_Tag_KagoFall", 0x0182: "PROC_Tag_Lv2PrChk", 0x0183: "PROC_Obj_Lv4Gear", 0x0184: "PROC_Obj_MasterSword", 0x0185: "PROC_Obj_WoodStatue", 0x0186: "PROC_Obj_Fan", 0x0187: "PROC_Obj_IceLeaf", 0x0188: "PROC_Obj_zrTuraraRc", 0x0189: "PROC_Tag_RetRoom", 0x018A: "PROC_Obj_WindStone", 0x018B: "PROC_Tag_WaraHowl", 0x018C: "PROC_Obj_SCannon", 0x018D: "PROC_Obj_SmWStone", 0x018E: "PROC_Obj_SCannonCrs", 0x018F: "PROC_Tag_SnowEff", 0x0190: "PROC_Tag_CstaSw", 0x0191: "PROC_Tag_Lv6CstaSw", 0x0192: "PROC_Obj_awaPlar", 0x0193: "PROC_Obj_poTbox", 0x0194: "PROC_Obj_TimeFire", 0x0195: "PROC_Obj_TMoon", 0x0196: "PROC_Obj_GanonWall", 0x0197: "PROC_Obj_Prop", 0x0198: "PROC_CSTATUE", 0x0199: "PROC_Obj_SwBallA", 0x019A: "PROC_Obj_SwBallB", 0x019B: "PROC_Obj_SnowSoup", 0x019C: "PROC_Obj_Nagaisu", 0x019D: "PROC_Obj_RCircle", 0x019E: "PROC_Obj_Picture", 0x019F: "PROC_Tag_SetBall", 0x01A0: "PROC_Tag_SmkEmt", 0x01A1: "PROC_SwTime", 0x01A2: "PROC_Obj_HFtr", 0x01A3: "PROC_Obj_HBarrel", 0x01A4: "PROC_Obj_Crystal", 0x01A5: "PROC_Obj_SCannonTen", 0x01A6: "PROC_Obj_SwBallC", 0x01A7: "PROC_SCENE_EXIT2", 0x01A8: "PROC_Obj_Hata", 0x01A9: "PROC_Obj_ToaruMaki", 0x01AA: "PROC_Tag_AttackItem", 0x01AB: "PROC_Tag_RmbitSw", 0x01AC: "PROC_Obj_Sword", 0x01AD: "PROC_Tag_Spring", 0x01AE: "PROC_Tag_Statue", 0x01AF: "PROC_E_AI", 0x01B0: "PROC_E_GS", 0x01B1: "PROC_E_GOB", 0x01B2: "PROC_E_DD", 0x01B3: "PROC_E_DN", 0x01B4: "PROC_E_S1", 0x01B5: "PROC_E_MF", 0x01B6: "PROC_E_SG", 0x01B7: "PROC_E_BS", 0x01B8: "PROC_E_SF", 0x01B9: "PROC_E_SH", 0x01BA: "PROC_E_DF", 0x01BB: "PROC_E_GM", 0x01BC: "PROC_E_MD", 0x01BD: "PROC_E_SM", 0x01BE: "PROC_E_SM2", 0x01BF: "PROC_E_ST", 0x01C0: "PROC_E_ST_LINE", 0x01C1: "PROC_E_SB", 0x01C2: "PROC_E_TH", 0x01C3: "PROC_E_CR", 0x01C4: "PROC_E_CR_EGG", 0x01C5: "PROC_E_DB", 0x01C6: "PROC_E_DB_LEAF", 0x01C7: "PROC_E_GA", 0x01C8: "PROC_E_GB", 0x01C9: "PROC_E_HB", 0x01CA: "PROC_E_HB_LEAF", 0x01CB: "PROC_E_HZELDA", 0x01CC: "PROC_E_YD", 0x01CD: "PROC_E_YH", 0x01CE: "PROC_E_YD_LEAF", 0x01CF: "PROC_E_HM", 0x01D0: "PROC_E_TK", 0x01D1: "PROC_E_TK2", 0x01D2: "PROC_E_TK_BALL", 0x01D3: "PROC_E_RB", 0x01D4: "PROC_E_RD", 0x01D5: "PROC_E_RDB", 0x01D6: "PROC_E_RDY", 0x01D7: "PROC_E_FM", 0x01D8: "PROC_E_FS", 0x01D9: "PROC_E_PM", 0x01DA: "PROC_E_PO", 0x01DB: "PROC_E_MB", 0x01DC: "PROC_E_MK", 0x01DD: "PROC_E_MM", 0x01DE: "PROC_E_FZ", 0x01DF: "PROC_E_ZS", 0x01E0: "PROC_E_KK", 0x01E1: "PROC_E_HP", 0x01E2: "PROC_E_ZH", 0x01E3: "PROC_E_ZM", 0x01E4: "PROC_E_PZ", 0x01E5: "PROC_E_FB", 0x01E6: "PROC_E_FK", 0x01E7: "PROC_E_MS", 0x01E8: "PROC_E_NEST", 0x01E9: "PROC_E_NZ", 0x01EA: "PROC_E_BA", 0x01EB: "PROC_E_BU", 0x01EC: "PROC_E_BUG", 0x01ED: "PROC_E_BEE", 0x01EE: "PROC_E_IS", 0x01EF: "PROC_E_KG", 0x01F0: "PROC_E_KR", 0x01F1: "PROC_E_SW", 0x01F2: "PROC_E_GE", 0x01F3: "PROC_Tag_WatchGe", 0x01F4: "PROC_E_YM", 0x01F5: "PROC_E_YM_TAG", 0x01F6: "PROC_E_YMB", 0x01F7: "PROC_Tag_FWall", 0x01F8: "PROC_Tag_WaterFall", 0x01F9: "PROC_E_YK", 0x01FA: "PROC_E_YR", 0x01FB: "PROC_E_YG", 0x01FC: "PROC_E_HZ", 0x01FD: "PROC_E_WS", 0x01FE: "PROC_E_OC", 0x01FF: "PROC_E_OT", 0x0200: "PROC_E_DT", 0x0201: "PROC_E_BG", 0x0202: "PROC_E_OctBg", 0x0203: "PROC_DR", 0x0204: "PROC_L7lowDr", 0x0205: "PROC_L7ODR", 0x0206: "PROC_E_TT", 0x0207: "PROC_E_DK", 0x0208: "PROC_E_VT", 0x0209: "PROC_E_WW", 0x020A: "PROC_E_GI", 0x020B: "PROC_B_BH", 0x020C: "PROC_B_BQ", 0x020D: "PROC_B_GM", 0x020E: "PROC_B_GND", 0x020F: "PROC_B_GO", 0x0210: "PROC_B_OH2", 0x0211: "PROC_B_YO", 0x0212: "PROC_B_YOI", 0x0213: "PROC_B_TN", 0x0214: "PROC_B_GG", 0x0215: "PROC_B_DRE", 0x0216: "PROC_B_MGN", 0x0217: "PROC_E_WAP", 0x0218: "PROC_ITEM", 0x0219: "PROC_Obj_SmallKey", 0x021A: "PROC_Obj_Kantera", 0x021B: "PROC_Obj_LifeContainer", 0x021C: "PROC_Obj_Shield", 0x021D: "PROC_Demo_Item", 0x021E: "PROC_ShopItem", 0x021F: "PROC_Obj_Drop", 0x0220: "PROC_OBJ_RW", 0x0221: "PROC_NBOMB", 0x0222: "PROC_TAG_CSW", 0x0223: "PROC_TAG_QS", 0x0224: "PROC_HOZELDA", 0x0225: "PROC_SWC00", 0x0226: "PROC_KNOB20", 0x0227: "PROC_DBDOOR", 0x0228: "PROC_BOSS_DOOR", 0x0229: "PROC_L1BOSS_DOOR", 0x022A: "PROC_L1MBOSS_DOOR", 0x022B: "PROC_L5BOSS_DOOR", 0x022C: "PROC_DSHUTTER", 0x022D: "PROC_SPIRAL_DOOR", 0x022E: "PROC_Tag_ChgRestart", 0x022F: "PROC_Tag_Restart", 0x0230: "PROC_ANDSW", 0x0231: "PROC_ANDSW2", 0x0232: "PROC_MYNA", 0x0233: "PROC_NPC_GND", 0x0234: "PROC_NPC_GRA", 0x0235: "PROC_NPC_GRC", 0x0236: "PROC_NPC_GRD", 0x0237: "PROC_NPC_GRM", 0x0238: "PROC_NPC_GRMC", 0x0239: "PROC_NPC_GRO", 0x023A: "PROC_NPC_GRR", 0x023B: "PROC_NPC_GRS", 0x023C: "PROC_NPC_GRZ", 0x023D: "PROC_NPC_YAMID", 0x023E: "PROC_NPC_YAMIT", 0x023F: "PROC_NPC_YAMIS", 0x0240: "PROC_NPC_BLUENS", 0x0241: "PROC_NPC_KAKASHI", 0x0242: "PROC_NPC_KDK", 0x0243: "PROC_NPC_ARU", 0x0244: "PROC_NPC_BANS", 0x0245: "PROC_NPC_BESU", 0x0246: "PROC_NPC_BOU", 0x0247: "PROC_NPC_BOU_S", 0x0248: "PROC_NPC_CLERKA", 0x0249: "PROC_NPC_CLERKB", 0x024A: "PROC_NPC_CLERKT", 0x024B: "PROC_NPC_WRESTLER", 0x024C: "PROC_Tag_Arena", 0x024D: "PROC_Tag_Instruction", 0x024E: "PROC_NPC_DOC", 0x024F: "PROC_NPC_GWOLF", 0x0250: "PROC_NPC_LEN", 0x0251: "PROC_NPC_LUD", 0x0252: "PROC_NPC_FAIRY_SEIREI", 0x0253: "PROC_NPC_FAIRY", 0x0254: "PROC_NPC_HANJO", 0x0255: "PROC_NPC_HENNA", 0x0256: "PROC_NPC_HENNA0", 0x0257: "PROC_NPC_HOZ", 0x0258: "PROC_NPC_JAGAR", 0x0259: "PROC_NPC_KKRI", 0x025A: "PROC_NPC_KN", 0x025B: "PROC_KN_BULLET", 0x025C: "PROC_NPC_KNJ", 0x025D: "PROC_NPC_KOLIN", 0x025E: "PROC_NPC_KOLINB", 0x025F: "PROC_NPC_KYURY", 0x0260: "PROC_NPC_MARO", 0x0261: "PROC_NPC_MIDP", 0x0262: "PROC_NPC_MOI", 0x0263: "PROC_NPC_RACA", 0x0264: "PROC_NPC_SARU", 0x0265: "PROC_NPC_SEIB", 0x0266: "PROC_NPC_SEIC", 0x0267: "PROC_NPC_SEID", 0x0268: "PROC_NPC_SEIRA", 0x0269: "PROC_NPC_SERA2", 0x026A: "PROC_NPC_SEIREI", 0x026B: "PROC_NPC_SHAMAN", 0x026C: "PROC_NPC_SMARO", 0x026D: "PROC_NPC_SOLA", 0x026E: "PROC_NPC_TARO", 0x026F: "PROC_NPC_PACHI_BESU", 0x0270: "PROC_NPC_PACHI_TARO", 0x0271: "PROC_NPC_PACHI_MARO", 0x0272: "PROC_TAG_PATI", 0x0273: "PROC_NPC_THE", 0x0274: "PROC_NPC_TKJ", 0x0275: "PROC_NPC_TKS", 0x0276: "PROC_NPC_TKC", 0x0277: "PROC_OBJ_TKS", 0x0278: "PROC_NPC_TOBY", 0x0279: "PROC_NPC_URI", 0x027A: "PROC_NPC_YELIA", 0x027B: "PROC_NPC_YKM", 0x027C: "PROC_NPC_YKW", 0x027D: "PROC_NPC_ZANB", 0x027E: "PROC_NPC_ZANT", 0x027F: "PROC_NPC_ZELDA", 0x0280: "PROC_NPC_ZELR", 0x0281: "PROC_NPC_ZELRO", 0x0282: "PROC_OBJ_ZRAFREEZE", 0x0283: "PROC_NPC_ZRC", 0x0284: "PROC_NPC_ZRZ", 0x0285: "PROC_ZRA_MARK", 0x0286: "PROC_MYNA2", 0x0287: "PROC_TAG_MYNA2", 0x0288: "PROC_NPC_CD3", 0x0289: "PROC_Tag_Schedule", 0x028A: "PROC_Tag_Escape", 0x028B: "PROC_NPC_CHAT", 0x028C: "PROC_NPC_SOLDIERa", 0x028D: "PROC_NPC_SOLDIERb", 0x028E: "PROC_PASSER_MNG", 0x028F: "PROC_NPC_PASSER", 0x0290: "PROC_NPC_PASSER2", 0x0291: "PROC_NPC_POST", 0x0292: "PROC_NPC_POUYA", 0x0293: "PROC_FORMATION_MNG", 0x0294: "PROC_NPC_FGUARD", 0x0295: "PROC_GUARD_MNG", 0x0296: "PROC_TAG_GUARD", 0x0297: "PROC_NPC_GUARD", 0x0298: "PROC_NPC_ASH", 0x0299: "PROC_NPC_ASHB", 0x029A: "PROC_NPC_SHAD", 0x029B: "PROC_NPC_RAFREL", 0x029C: "PROC_NPC_MOIR", 0x029D: "PROC_NPC_IMPAL", 0x029E: "PROC_NPC_SHOE", 0x029F: "PROC_NPC_DOORBOY", 0x02A0: "PROC_NPC_PRAYER", 0x02A1: "PROC_NPC_KASIHANA", 0x02A2: "PROC_NPC_KASIKYU", 0x02A3: "PROC_NPC_KASIMICH", 0x02A4: "PROC_NPC_DRSOL", 0x02A5: "PROC_NPC_CHIN", 0x02A6: "PROC_NPC_INS", 0x02A7: "PROC_NPC_SHOP0", 0x02A8: "PROC_NPC_MK", 0x02A9: "PROC_NPC_P2", 0x02AA: "PROC_KYTAG00", 0x02AB: "PROC_KYTAG01", 0x02AC: "PROC_KYTAG02", 0x02AD: "PROC_KYTAG03", 0x02AE: "PROC_KYTAG04", 0x02AF: "PROC_KYTAG05", 0x02B0: "PROC_KYTAG06", 0x02B1: "PROC_KYTAG07", 0x02B2: "PROC_KYTAG08", 0x02B3: "PROC_KYTAG09", 0x02B4: "PROC_KYTAG10", 0x02B5: "PROC_KYTAG11", 0x02B6: "PROC_KYTAG12", 0x02B7: "PROC_KYTAG13", 0x02B8: "PROC_KYTAG14", 0x02B9: "PROC_KYTAG15", 0x02BA: "PROC_KYTAG16", 0x02BB: "PROC_KYTAG17", 0x02BC: "PROC_Ykgr", 0x02BD: "PROC_TALK", 0x02BE: "PROC_Obj_Crope", 0x02BF: "PROC_Obj_Bombf", 0x02C0: "PROC_Obj_BkLeaf", 0x02C1: "PROC_Tag_Mhint", 0x02C2: "PROC_Tag_Mmsg", 0x02C3: "PROC_Tag_Mwait", 0x02C4: "PROC_Tag_Mstop", 0x02C5: "PROC_Tag_Stream", 0x02C6: "PROC_Tag_Sppath", 0x02C7: "PROC_Tag_Wljump", 0x02C8: "PROC_Tag_TWGate", 0x02C9: "PROC_Tag_Lv6Gate", 0x02CA: "PROC_Tag_Lv7Gate", 0x02CB: "PROC_Tag_Lv8Gate", 0x02CC: "PROC_Tag_TheBHint", 0x02CD: "PROC_Tag_Assist", 0x02CE: "PROC_DEMO00", 0x02CF: "PROC_TAG_CAMERA", 0x02D0: "PROC_TAG_CHKPOINT", 0x02D1: "PROC_TAG_EVENT", 0x02D2: "PROC_TAG_EVT", 0x02D3: "PROC_TAG_TELOP", 0x02D4: "PROC_TAG_HOWL", 0x02D5: "PROC_TAG_MSG", 0x02D6: "PROC_TAG_LANTERN", 0x02D7: "PROC_Tag_Mist", 0x02D8: "PROC_DMIDNA", 0x02D9: "PROC_KY_THUNDER", 0x02DA: "PROC_VRBOX", 0x02DB: "PROC_VRBOX2", 0x02DC: "PROC_BG", 0x02DD: "PROC_SET_BG_OBJ", 0x02DE: "PROC_BG_OBJ", 0x02DF: "PROC_MIRROR", 0x02E0: "PROC_MOVIE_PLAYER", 0x02E1: "PROC_TITLE", 0x02E2: "PROC_FR", 0x02E3: "PROC_ECONT", 0x02E4: "PROC_MG_ROD", 0x02E5: "PROC_E_ARROW", 0x02E6: "PROC_BULLET", 0x02E7: "PROC_SWHIT0", 0x02E8: "PROC_E_TH_BALL", 0x02E9: "PROC_TAG_EVTAREA", 0x02EA: "PROC_TAG_EVTMSG", 0x02EB: "PROC_TAG_KMSG", 0x02EC: "PROC_TAG_PUSH", 0x02ED: "PROC_E_MK_BO", 0x02EE: "PROC_E_MM_MT", 0x02EF: "PROC_OBJ_KBOX", 0x02F0: "PROC_OBJ_FW", 0x02F1: "PROC_B_GOS", 0x02F2: "PROC_OBJ_YSTONE", 0x02F3: "PROC_MANT", 0x02F4: "PROC_CROD", 0x02F5: "PROC_OBJ_PLEAF", 0x02F6: "PROC_OBJ_KBACKET", 0x02F7: "PROC_OBJ_YBAG", 0x02F8: "PROC_OBJ_PUMPKIN", 0x02F9: "PROC_OBJ_AUTOMATA", 0x02FA: "PROC_OBJ_GADGET", 0x02FB: "PROC_OBJ_KAGO", 0x02FC: "PROC_Obj_Carry", 0x02FD: "PROC_Obj_Stone", 0x02FE: "PROC_OBJ_HB", 0x02FF: "PROC_NPC_INKO", 0x0300: "PROC_BD", 0x0301: "PROC_Obj_Eff", 0x0302: "PROC_WPILLAR", 0x0303: "PROC_WMARK", 0x0304: "PROC_E_BI", 0x0305: "PROC_E_BI_LEAF", 0x0306: "PROC_START_AND_GOAL", 0x0307: "PROC_NPC_DF", 0x0308: "PROC_ARROW", 0x0309: "PROC_PATH_LINE", 0x030A: "PROC_TAG_ALLMATO", 0x030B: "PROC_Obj_Timer", 0x030C: "PROC_SCENE_EXIT", 0x030D: "PROC_CAMERA", 0x030E: "PROC_CAMERA2", 0x030F: "PROC_SUSPEND", 0x0310: "PROC_GRASS", 0x0311: "PROC_KYEFF", 0x0312: "PROC_KYEFF2", 0x0313: "PROC_MSG_OBJECT", 0x0314: "PROC_MENUWINDOW", 0x0315: "PROC_TIMER", 0x0316: "PROC_METER2", 0x0317: "PROC_GAMEOVER", } ActorType = { 0: "fopAc_ACTOR_e", 1: "fopAc_PLAYER_e", 2: "fopAc_ENEMY_e", 3: "fopAc_ENV_e", 4: "fopAc_NPC_e", 5: "fopAc_UNK_GROUP_5_e", } CullType = { 0: "fopAc_CULLBOX_0_e", 1: "fopAc_CULLBOX_1_e", 2: "fopAc_CULLBOX_2_e", 3: "fopAc_CULLBOX_3_e", 4: "fopAc_CULLBOX_4_e", 5: "fopAc_CULLBOX_5_e", 6: "fopAc_CULLBOX_6_e", 7: "fopAc_CULLBOX_7_e", 8: "fopAc_CULLBOX_8_e", 9: "fopAc_CULLBOX_9_e", 10: "fopAc_CULLBOX_10_e", 11: "fopAc_CULLBOX_11_e", 12: "fopAc_CULLBOX_12_e", 13: "fopAc_CULLBOX_13_e", 14: "fopAc_CULLBOX_CUSTOM_e", 15: "fopAc_CULLSPHERE_0_e", 16: "fopAc_CULLSPHERE_1_e", 17: "fopAc_CULLSPHERE_2_e", 18: "fopAc_CULLSPHERE_3_e", 19: "fopAc_CULLSPHERE_4_e", 20: "fopAc_CULLSPHERE_5_e", 21: "fopAc_CULLSPHERE_6_e", 22: "fopAc_CULLSPHERE_7_e", 23: "fopAc_CULLSPHERE_8_e", 24: "fopAc_CULLSPHERE_9_e", 25: "fopAc_CULLSPHERE_10_e", 26: "fopAc_CULLSPHERE_11_e", 27: "fopAc_CULLSPHERE_12_e", 28: "fopAc_CULLSPHERE_13_e", 29: "fopAc_CULLSPHERE_CUSTOM_e", } def get_profiles_from_cpp_data(filepath, actor_name): profiles = [] with open(filepath, 'r') as file: data = file.readlines() # Track iterator and member for i, line in enumerate(data): if "SECTION_DATA extern void* g_profile_" in line: start_idx = i # Extract profile name profile_name = "g_profile_"+re.search(r'g_profile_(\w+)', line).group(1) # Split remaining members by comma until }; is reached profile_members = [] loop_idx = start_idx+1 next_line = data[loop_idx] while "};" not in next_line: # Split the line on "," and strip whitespace and newline characters from each element profile_members.extend([item.strip() for item in next_line.split(",") if item.strip()]) loop_idx += 1 next_line = data[loop_idx] if len(profile_members) != 12: print("Error: Expected 12 members, got", len(profile_members)) sys.exit(1) end_idx = loop_idx # Extract remaining members mLayerID = LayerID.get(profile_members[0].strip("(void*)")) mListIDmListPrio_string = profile_members[1].replace("(void*)","") mListIDmListPrio_bytes = struct.pack(">I",int(mListIDmListPrio_string,16)) mListID = struct.unpack(">H",mListIDmListPrio_bytes[0:2])[0] mListPrio = ListPrio.get(struct.unpack(">H",mListIDmListPrio_bytes[2:4])[0]) mProcName_string = profile_members[2].replace("(void*)","") mProcName_bytes = struct.pack(">I",int(mProcName_string,16)) mProcName = ProcName.get(struct.unpack(">H",mProcName_bytes[0:2])[0]) sub_method1 = profile_members[3].replace("(void*)","")+".mBase" global actor_class_size actor_class_size = profile_members[4].replace("(void*)","") mSize = actor_class_size if actor_name is None else "sizeof("+actor_name+")" mSizeOther = profile_members[5].replace("(void*)","").replace("NULL","0") mParameters = profile_members[6].replace("(void*)","").replace("NULL","0") sub_method2 = profile_members[7].replace("(void*)","")+".base" mPriority_string = profile_members[8].replace("(void*)","") mPriority_bytes = struct.pack(">I",int(mPriority_string,16)) mPriority = struct.unpack(">H",mPriority_bytes[0:2])[0] sub_method3 = profile_members[9].replace("(void*)","") global actor_method_class_name actor_method_class_name = sub_method3.replace("&","").replace(",","") mStatus = profile_members[10].replace("(void*)","") mActorTypeCullType_string = profile_members[11].replace("(void*)","") if mActorTypeCullType_string == "NULL": mActorTypeCullType_string = "0x00000000" mActorTypeCullType_bytes = struct.pack(">I",int(mActorTypeCullType_string,16)) mActorType = ActorType.get(struct.unpack(">B",mActorTypeCullType_bytes[0:1])[0]) cullType = CullType.get(struct.unpack(">B",mActorTypeCullType_bytes[1:2])[0]) profiles.append({ "name": profile_name, "start_idx": start_idx, "end_idx": end_idx, "members": { "mLayerID": mLayerID, "mListID": mListID, "mListPrio": mListPrio, "mProcName": mProcName, "sub_method1": sub_method1, "mSize": mSize, "mSizeOther": mSizeOther, "mParameters": mParameters, "sub_method2": sub_method2, "mPriority": mPriority, "sub_method3": sub_method3, "mStatus": mStatus, "mActorType": mActorType, "cullType": cullType } }) return profiles def setup_method_class(filepath, method_class_name): with open(filepath, 'r') as file: data = file.readlines() actor_method_class_on = False new_lines = [] # Track iterator and member for i, line in enumerate(data): if method_class_name + "[" in line: line = line.replace("void*","actor_method_class") line = line.replace("SECTION_DATA ","") line = re.sub(r'\[\d+\] = {', ' = {', line) actor_method_class_on = True if actor_method_class_on: if "}" in line: actor_method_class_on = False elif "NULL" in line: # for sizing purposes, we need to replace NULL with 0 if it's in between methods if "NULL" not in data[i+1] and "};" not in data[i+1]: new_lines.append(" 0,\n") continue else: line = line.replace("(void*)","(process_method_func)") new_lines.append(line) with open(filepath, 'w') as file: file.writelines(new_lines) print(f"Setup method class {method_class_name}.") def setup_profile(file_path,actor_name=None): profiles = get_profiles_from_cpp_data(file_path,actor_name) if len(profiles) == 0: print("No profiles found that need to be setup!") return None # Open file, delete lines between start and end idx and insert new lines starting at start idx with open(file_path, 'r') as file: data = file.readlines() for profile in profiles: start_idx = profile["start_idx"] end_idx = profile["end_idx"] # Delete lines between start and end idx del data[start_idx:end_idx+1] # Insert new lines starting at start idx max_length = max(len(str(v)) for v in profile['members'].values()) data.insert(start_idx, f"extern actor_process_profile_definition {profile['name']} = {{\n") data.insert(start_idx+1, f" {profile['members']['mLayerID']},{' '*(max_length-len(str(profile['members']['mLayerID'])))} // mLayerID\n") data.insert(start_idx+2, f" {profile['members']['mListID']},{' '*(max_length-len(str(profile['members']['mListID'])))} // mListID\n") data.insert(start_idx+3, f" {profile['members']['mListPrio']},{' '*(max_length-len(str(profile['members']['mListPrio'])))} // mListPrio\n") data.insert(start_idx+4, f" {profile['members']['mProcName']},{' '*(max_length-len(str(profile['members']['mProcName'])))} // mProcName\n") data.insert(start_idx+5, f" {profile['members']['sub_method1']},{' '*(max_length-len(str(profile['members']['sub_method1'])))} // sub_method\n") data.insert(start_idx+6, f" {profile['members']['mSize']},{' '*(max_length-len(str(profile['members']['mSize'])))} // mSize\n") data.insert(start_idx+7, f" {profile['members']['mSizeOther']},{' '*(max_length-len(str(profile['members']['mSizeOther'])))} // mSizeOther\n") data.insert(start_idx+8, f" {profile['members']['mParameters']},{' '*(max_length-len(str(profile['members']['mParameters'])))} // mParameters\n") data.insert(start_idx+9, f" {profile['members']['sub_method2']},{' '*(max_length-len(str(profile['members']['sub_method2'])))} // sub_method\n") data.insert(start_idx+10, f" {profile['members']['mPriority']},{' '*(max_length-len(str(profile['members']['mPriority'])))} // mPriority\n") data.insert(start_idx+11, f" {profile['members']['sub_method3']},{' '*(max_length-len(str(profile['members']['sub_method3'])))} // sub_method\n") data.insert(start_idx+12, f" {profile['members']['mStatus']},{' '*(max_length-len(str(profile['members']['mStatus'])))} // mStatus\n") data.insert(start_idx+13, f" {profile['members']['mActorType']},{' '*(max_length-len(str(profile['members']['mActorType'])))} // mActorType\n") data.insert(start_idx+14, f" {profile['members']['cullType']},{' '*(max_length-len(str(profile['members']['cullType'])))} // cullType\n") data.insert(start_idx+15, f"}};\n") with open(file_path, 'w') as file: file.writelines(data) print(f"Setup profile {profile['name']}.") setup_method_class(file_path, actor_method_class_name) return actor_class_size @click.command() @click.option('--file-path', required=True, help='Filepath of the cpp file to parse.') def setup_profile_cli(file_path): setup_profile(file_path) if __name__ == "__main__": setup_profile_cli()