ogrebattle64/tools/data_structure.py

272 lines
7.1 KiB
Python

import struct
from collections import namedtuple
CLASS_NAME = {
0x01: "Soldier",
0x02: "Fighter",
0x03: "Lycanthrope",
0x04: "Amazon",
0x05: "Knight",
0x06: "Berserker",
0x07: "Fencer",
0x08: "Phalanx",
0x09: "BeastTamer",
0x0A: "DollMaster",
0x0B: "Ninja",
0x0C: "Wizard",
0x0D: "Archer",
0x0E: "DragonTamer",
0x0F: "Valkyrie",
0x10: "Witch",
0x11: "Sorceress",
0x12: "Cleric",
0x13: "Paladin",
0x14: "Dragoon",
0x15: "BlackKnight",
0x16: "SwordMaster",
0x17: "Cataphract",
0x18: "BeastMaster",
0x19: "Enchanter",
0x1A: "NinjaMaster",
0x1B: "Archmage",
0x1C: "Diana",
0x1D: "DragonMaster",
0x1E: "Freya",
0x1F: "Siren",
0x20: "Priest",
0x21: "Princess",
0x22: "Centurion",
0x23: "Centurion",
0x24: "AngelKnight",
0x25: "Seraph",
0x26: "Lich",
0x27: "Hawkman",
0x28: "Vultan",
0x29: "Raven",
0x2A: "Werewolf",
0x2B: "Vampire",
0x2C: "Vampire",
0x2D: "Zombie",
0x2E: "Zombie",
0x2F: "Skeleton",
0x30: "Ghost",
0x31: "Gorgon",
0x32: "Pumpkinhead",
0x33: "Faerie",
0x34: "Gremlin",
0x35: "Goblin",
0x36: "Saturos",
0x37: "Ogre",
0x38: "YoungDragon",
0x39: "ThunderDragon",
0x3A: "RedDragon",
0x3B: "EarthDragon",
0x3C: "BlueDragon",
0x3D: "PlatinumDragon",
0x3E: "BlackDragon",
0x3F: "Quetzalcoatl",
0x40: "Flarebrass",
0x41: "AhziDahaka",
0x42: "Hydra",
0x43: "Bahamut",
0x44: "Tiamat",
0x45: "Wyrm",
0x46: "Wyvern",
0x47: "Griffin",
0x48: "Opinincus",
0x49: "Cockatrice",
0x4A: "Sphinx",
0x4B: "Hellhound",
0x4C: "Cerberus",
0x4D: "Giant",
0x4E: "Golem",
0x4F: "StoneGolem",
0x50: "BaldrGolem",
0x51: "Gladiator",
0x52: "Vanguard",
0x53: "General",
0x54: "Gladiator",
0x55: "Warrior",
0x56: "BlazeKnight",
0x57: "RuneKnight",
0x58: "Lord",
0x59: "General",
0x5A: "BeastMaster",
0x5B: "Priest",
0x5C: "Warlock",
0x5D: "Grappler",
0x5E: "Centurion",
0x5F: "Lycanthrope",
0x60: "Werewolf",
0x61: "Solidblade",
0x62: "Overlord",
0x63: "DarkPrince",
0x64: "SpecialClass",
0x65: "FlailMonarch",
0x66: "DeathTemplar",
0x67: "TempleCommander",
0x68: "TempleCommander",
0x69: "TempleCommander",
0x6A: "TempleCommander",
0x6B: "TempleCommander",
0x6C: "Vanity",
0x6D: "Vanity",
0x6E: "Vanity",
0x6F: "SuperiorKnight",
0x70: "SuperiorKnight",
0x71: "Gatekeeper",
0x72: "Grappler",
0x73: "KnightTemplar",
0x74: "Daemon",
0x75: "Phalanx",
0x76: "Berserker",
0x77: "Cleric",
0x78: "Archer",
0x79: "Hawkman",
0x7A: "Siren",
0x7B: "Enchanter",
0x7C: "BlackKnight",
0x7D: "SpecialClass",
0x7E: "SpecialClass",
0x7F: "SpecialClass",
0x80: "SpecialClass",
0x81: "SpecialClass",
0x82: "Barkeep",
0x83: "ElderlyMan",
0x84: "Commoner",
0x85: "Commoner",
0x86: "Danika",
0x87: "Danika_01",
0x88: "Danika_02",
0x89: "Archer",
0x8A: "Berserker",
0x8B: "BeastTamer",
0x8C: "Valkyrie",
0x8D: "Wizard",
0x8E: "Phalanx",
0x8F: "Berserker",
0x90: "Knight",
0x91: "NinjaMaster",
0x92: "DollMaster",
0x93: "KnightTemplar",
0x94: "Archmage",
0x95: "Priest",
0x96: "BlackKnight",
0x97: "DragonMaster",
0x98: "Siren",
0x99: "Saturos",
0x9A: "SwordMaster",
0x9B: "KnightTemplar",
0x9C: "Dragoon",
0x9D: "Gorgon",
0x9E: "Lich",
0x9F: "Daemon",
0xA0: "Plaladin",
0xA1: "Danika",
0xA2: "Paladin",
0xA3: "Witch",
0xA4: "DeathBahamut",
}
pattern = """4D61676E 75730000 00000000 00000000
00515104 00000059 00590132 0041003D
003C003C 003F003F 37000000 00000000
00000002 01000000 41726E6F 6C640000
00000000 00000000 00020203 00000053
00370332 003A003B 00370039 0031003B
37000000 00000000 00000000 02000000
4D612764 6F670000 00000000 00000000
00020203 00000051 00510432 003A003C
00360039 0031003B 37000000 00000000
00000000 03000000 486F6C6C 79000000
00000000 00000000 00040403 01000049
00490132 003D0033 003A003B 003D0042
37000000 00000000 00000000 04000000
4A65616E 6E650000 00000000 00000000
00040403 01000049 00490432 00390033
003B003D 003C0040 37000000 00000000
00000000 05000000 446F726F 74687900
00000000 00000000 00111103 0100004C
004C0123 003B0032 003C003D 003B0042
37000000 00000000 00000002 06000000
41737261 00000000 00000000 00000000
00020203 00000054 00540332 003C0039
00350039 0031003C 37000000 00000000
00000000 07000000 436C7964 65000000
00000000 00000000 00020203 00000052
00520332 003C003A 0038003A 0032003B
37000000 00000000 00000000 08000000
42727961 6E000000 00000000 00000000
00020203 00000051 00510232 003C0038
00350039 0031003A 38000000 00000000
00000000 09000000 4976616E 00000000
00000000 00000000 000A0A03 0000004F
004F0332 003D003A 0037003A 0033003C
36000000 00000000 00000002 0A000000
48616E6E 61000000 00000000 00000000
00040403 0100004B 004B0232 003D0034
0039003C 003A0042 36000000 00000000
00000000 0B000000 44696F00 00000000
00000000 00000000 00545404 00000054
0054012A 003E003B 00310035 00300036
32000000 00000000 00000002 0C000000
50697474 00000000 00000000 00000000
00020203 00000051 00510432 003B0037
002F0034 002D0034 32000000 00000000
00000000 0D000000 41627261 68616D00
00000000 00000000 00020203 00000050
00500432 00390037 002E0035 002F0034
32000000 00000000 00000000 0E000000
56617564 76696C6C 65000000 00000000
00020203 00000050 00500332 003B0039
002D0033 002F0033 32000000 00000000
00000000 0F000000 53657261 66696E61
00000000 00000000 00040403 0100004A
004A0432 003A0030 00330036 00360039
32000000 00000000 00000000 10000000
4B726973 00000000 00000000 00000000
00111103 01000049 00490323 003D0032
003B003A 003C0042 37000000 00000000
00000002 11000000 5A696567 6C657200
00000000 00000000 00080803 00000054
00540332 003D003B 00360038 0033003A
37000000 00000000 00000002 12000000
4F6D6567 61000000 00000000 00000000
004E4E03 02000071 00710332 004B005B
002C002D 002A0039 36000000 00000000
00000000 13000000"""
data = bytes.fromhex(pattern)
while len(data) > 0:
name = data[:0x10].decode("utf-8")
(portrait,) = struct.unpack_from('>h', data[0x10:])
(clazz,) = struct.unpack_from('>b', data[0x12:])
(level,) = struct.unpack_from('>b', data[0x13:])
(max_hp,) = struct.unpack_from('>h', data[0x16:])
(cur_hp,) = struct.unpack_from('>h', data[0x18:])
(strr,) = struct.unpack_from('>h', data[0x1C:])
(vit,) = struct.unpack_from('>h', data[0x1E:])
(intt,) = struct.unpack_from('>h', data[0x20:])
(mem,) = struct.unpack_from('>h', data[0x22:])
(agi,) = struct.unpack_from('>h', data[0x24:])
(dex,) = struct.unpack_from('>h', data[0x26:])
print(f"name= {name}")
print(f"portrait= {portrait}")
print(f"class= {CLASS_NAME[clazz]} ({clazz})")
print(f"max_health= {max_hp}")
print(f"current_health= {cur_hp}")
print(f"level= {level}")
print(f"str= {strr}")
print(f"vit= {vit}")
print(f"int= {intt}")
print(f"mem= {agi}")
print(f"agi= {agi}")
print(f"dex= {dex}")
print(f"rest= {data[0x26:0x38].hex()}")
print(" ")
data = data[0x38:]