tp/tools/setup_profile.py

1042 lines
33 KiB
Python

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()