summaryrefslogtreecommitdiff
path: root/tools/overlayhelpers/lmapmark.py
blob: cc3a8d639efd43352a0671cb08cb545214429be0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env python3
import os
import struct

SIMPLIFY_OUTPUT = True
OVL_KALEIDO_SCOPE_RAM = 0x80813820
gPauseMapMarkDataTable = 0x8082B2C0

SCENES = [
    ("Deku Tree", 5),
    ("Dodongo's Cavern", 2),
    ("Jabu-Jabu's Belly", 2),
    ("Forest Temple", 4),
    ("Fire Temple", 5),
    ("Water Temple", 4),
    ("Spirit Temple", 4),
    ("Shadow Temple", 4),
    ("Bottom of the Well", 3),
    ("Ice Cavern", 1),
]

def RamToOff(vram):
    return vram - OVL_KALEIDO_SCOPE_RAM

def GetPoints(data, ptr):
    points = []
    off = RamToOff(ptr)
    for i in range(12):
        v = struct.unpack_from(">hhff", data[off:off+0x0C])
        if not (SIMPLIFY_OUTPUT and v[0] == 0 and v[2] == 0 and v[3] == 0):
            points.append([v[0], v[2], v[3]])
        off = off + 0x0C
    return points

def GetIconData(data, ptr):
    off = RamToOff(ptr)
    v = struct.unpack_from(">hhiIii", data[off:off+0x14])
    points = GetPoints(data, ptr+0x14)
    return [v[0], v[2], v[3], v[4], v[5], points]

def GetSceneMap(data, ptr):
    icons = []
    for i in range(3):
        icon = GetIconData(data, ptr + (i * 0xA4))
        if not SIMPLIFY_OUTPUT or icon[0] != 0 or icon[4] > 0:
            icons.append(icon)
    return icons

def GetIconName(v):
    if v == 0:
        return "PAUSE_MAP_MARK_CHEST"
    if v == 1:
        return "PAUSE_MAP_MARK_BOSS"
    if v == -1:
        return "PAUSE_MAP_MARK_NONE"
    return v

def GetVtxPointer(v):
    if v == 0:
        return "NULL"
    if v == 0x80830610:
        return "sMarkBossVtx"
    if v == 0x80830650:
        return "sMarkChestVtx"

def IND(n):
    return ' ' * 4 * n


scriptDir = os.path.dirname(os.path.realpath(__file__))
repo = scriptDir + os.sep +  ".." + os.sep + ".."


kaleido_scope_data = []
with open(repo + "/extracted/gc-eu-mq-dbg/baserom/ovl_kaleido_scope", "rb") as file:
    kaleido_scope_data = bytearray(file.read())

scenemaps = []
i = 0

for name, numMaps in SCENES:
    maps = []
    for k in range(numMaps):
        maps.append(GetSceneMap(kaleido_scope_data, gPauseMapMarkDataTable + (i * 0x1EC)))
        i += 1
    scenemaps.append((name, maps))

cstr = ""

cstr += "PauseMapMarksData gPauseMapMarkDataTable[] = {\n"
for scenemap in scenemaps:
    for mapId, map in enumerate(scenemap[1]):
        cstr += IND(1) + f"// {scenemap[0]} map {mapId}\n"
        cstr += IND(1) + "{\n"
        for icon in map:
            if SIMPLIFY_OUTPUT and icon[0] == -1:
                cstr += IND(2) + f"{{ {GetIconName(icon[0])}, 0, NULL, 0, 0, {{ 0 }} }},\n"
            else:
                cstr += IND(2) + "{\n"
                cstr += IND(3) + f"{GetIconName(icon[0])}, {icon[1]}, {GetVtxPointer(icon[2])}, {icon[3]}, {icon[4]},\n"
                cstr += IND(3) + "{\n"
                for point in icon[5]:
                    cstr += IND(4) + f"{{ {point[0]}, {point[1]}f, {point[2]}f }},\n"
                cstr += IND(3) + "}\n"
                cstr += IND(2) + "},\n"
        cstr += IND(1) + "},\n"
cstr += "};"

print(cstr)