Skip to content

Commit 953010c

Browse files
committed
maps: EventFlags fixups, support set/clear/multiple bits in flags_fp_conv
1 parent da66893 commit 953010c

3 files changed

Lines changed: 123 additions & 89 deletions

File tree

include/event_flags.h

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@ typedef enum _EventFlag
55
{
66
EventFlag_0 = 0, // M0S01 FirstAidKit? Also used in M0S02, might just be a default.
77

8-
EventFlag_4 = 4,
9-
10-
EventFlag_6 = 6,
11-
12-
EventFlag_9 = 9,
13-
8+
EventFlag_4 = 4,
9+
EventFlag_5 = 5,
10+
EventFlag_6 = 6,
11+
EventFlag_7 = 7,
12+
EventFlag_8 = 8,
13+
EventFlag_9 = 9,
14+
EventFlag_10 = 10,
1415
EventFlag_11 = 11,
1516

1617
EventFlag_13 = 13,
17-
18+
EventFlag_14 = 14,
19+
EventFlag_15 = 15,
1820
EventFlag_16 = 16,
1921
EventFlag_17 = 17,
22+
EventFlag_18 = 18,
2023

2124
EventFlag_24 = 24,
2225
EventFlag_25 = 25,
@@ -85,6 +88,8 @@ typedef enum _EventFlag
8588

8689
EventFlag_SeenSaveScreen = 186,
8790

91+
EventFlag_188 = 188,
92+
8893
EventFlag_197 = 197,
8994

9095
EventFlag_M3S00_FirstAidKit = 199, // Odd numbering not with other common items, possibly some default that goes unused, shared with M3S01 and M3S06.

src/maps/map0_s00/map0_s00.c

Lines changed: 27 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -612,15 +612,8 @@ void func_800DA454(void) // 0x800DA454
612612

613613
void func_800DA5A0(void) // 0x800DA5A0
614614
{
615-
s32 temp_s0;
616-
s32 temp_s1;
617615
s32 temp_s1_2;
618616
s32 temp_s2;
619-
s32 temp_v1;
620-
s32 var_a0;
621-
s32 var_a1;
622-
s32 temp;
623-
s32 temp2;
624617

625618
switch (g_SysWork.sysStateStep_C[0])
626619
{
@@ -744,7 +737,7 @@ void func_800DA5A0(void) // 0x800DA5A0
744737
default:
745738
func_8008616C(0, false, 2, 0, false);
746739

747-
g_SavegamePtr->eventFlags_168[0] |= 0x10;
740+
Savegame_EventFlagSet(EventFlag_4);
748741

749742
sharedFunc_800D2244_0_s00(0);
750743
SysWork_StateSetNext(SysState_Gameplay);
@@ -930,7 +923,9 @@ void func_800DAEFC(void) // 0x800DAEFC
930923
SysWork_StateSetNext(SysState_Gameplay);
931924
func_8008616C(0, false, 2, 0, false);
932925

933-
g_SavegamePtr->eventFlags_168[0] |= 0x180;
926+
Savegame_EventFlagSet(EventFlag_7);
927+
Savegame_EventFlagSet(EventFlag_8);
928+
934929
func_800865FC(true, 1, 0, FP_ANGLE(180.0f), Q12(-62.0f), Q12(49.0f));
935930
}
936931
}
@@ -991,7 +986,7 @@ void Map_WorldObjectsInit(void) // 0x800DBE68
991986
rotXY = 0xFAE4FE17; // @hack `vx` and `vy` combined into `s32`.
992987
D_800E3AAC.vz = 0;
993988

994-
g_SavegamePtr->eventFlags_168[5] &= 0xEFFFFFFF;
989+
Savegame_EventFlagClear(EventFlag_188);
995990
*(s32*)&D_800E3AAC.vx = rotXY;
996991
}
997992

@@ -1041,17 +1036,17 @@ void Map_WorldObjectsUpdate(void) // 0x800DBF08
10411036

10421037
if (g_SysWork.field_22A0 & 0x40)
10431038
{
1044-
g_SavegamePtr->eventFlags_168[5] &= 0xEFFFFFFF;
1039+
Savegame_EventFlagClear(EventFlag_188);
10451040
}
1046-
1047-
if (!(g_SavegamePtr->eventFlags_168[5] & 0x10000000))
1041+
1042+
if (!Savegame_EventFlagGet(EventFlag_188))
10481043
{
10491044
func_8004690C(Sfx_Unk1361);
10501045
Sd_EngineCmd(Sfx_Unk1358);
1051-
g_SavegamePtr->eventFlags_168[5] |= 0x10000000;
1046+
Savegame_EventFlagSet(EventFlag_188);
10521047
}
1053-
1054-
if (!(g_SavegamePtr->eventFlags_168[0] & 0x01000000))
1048+
1049+
if (!Savegame_EventFlagGet(EventFlag_24))
10551050
{
10561051
func_8005DE0C(Sfx_Unk1358, &D_800E3A9C, 0x40, 0x8000, 0);
10571052
}
@@ -1063,7 +1058,7 @@ void Event_GreyChildrenSpawn(void) // 0x800DC1E8
10631058
{
10641059
MAP_CHUNK_CHECK_VARIABLE_DECL();
10651060

1066-
if ((g_SavegamePtr->eventFlags_168[0] & 0x20000) && g_SysWork.npcs_1A0[0].model_0.charaId_0 == Chara_None)
1061+
if (Savegame_EventFlagGet(EventFlag_17) && g_SysWork.npcs_1A0[0].model_0.charaId_0 == Chara_None)
10671062
{
10681063
if (PLAYER_IN_MAP_CHUNK(vx, 1, -7, -1, -7) && PLAYER_IN_MAP_CHUNK(vz, 1, 7, -1, 7))
10691064
{
@@ -1079,24 +1074,18 @@ void func_800DC33C(void) // 0x800DC33C
10791074
VECTOR3 camPos;
10801075
s16 temp_a0;
10811076
s16 var_s1;
1082-
s32 var_v1;
10831077
q19_12 temp_a0_2;
10841078
s32 temp_v1;
10851079
s32 var_a0;
10861080
s32 var_a2;
10871081
s32 var_v1_2;
1088-
s_Savegame* save;
1089-
1090-
save = g_SavegamePtr;
10911082

1092-
// TODO: Use `Savegame_EventFlagGet`.
1093-
1094-
if (!(save->eventFlags_168[0] & 0x20))
1083+
if (!Savegame_EventFlagGet(EventFlag_5))
10951084
{
10961085
func_800865FC(true, 1, 0, FP_ANGLE(180.0f), Q12(-62.0f), Q12(108.0f));
10971086
sharedFunc_800D88AC_0_s00(g_SysWork.npcs_1A0);
10981087

1099-
save->eventFlags_168[0] |= 0x20;
1088+
Savegame_EventFlagSet(EventFlag_5);
11001089
}
11011090

11021091
vwGetViewPosition(&camPos);
@@ -1120,7 +1109,7 @@ void func_800DC33C(void) // 0x800DC33C
11201109

11211110
sharedFunc_800D88C0_0_s00(g_SysWork.npcs_1A0, 0);
11221111

1123-
g_SavegamePtr->eventFlags_168[0] |= 0x40;
1112+
Savegame_EventFlagSet(EventFlag_6);
11241113
return;
11251114
}
11261115
}
@@ -1185,8 +1174,7 @@ void func_800DC694(void) // 0x800DC694
11851174
mag = Math_Vector2MagCalc(g_SysWork.npcs_1A0[0].position_18.vx - g_SysWork.player_4C.chara_0.position_18.vx,
11861175
(g_SysWork.npcs_1A0[0].position_18.vz - g_SysWork.player_4C.chara_0.position_18.vz) - Q12(2.0f));
11871176

1188-
// TODO: Use `Savegame_EventFlagGet`.
1189-
if (!(g_SavegamePtr->eventFlags_168[0] & 0x80))
1177+
if (!Savegame_EventFlagGet(EventFlag_7))
11901178
{
11911179
sharedFunc_800D88AC_0_s00(g_SysWork.npcs_1A0);
11921180
return;
@@ -1209,7 +1197,7 @@ void func_800DC694(void) // 0x800DC694
12091197

12101198
sharedFunc_800D88C0_0_s00(g_SysWork.npcs_1A0, 0);
12111199

1212-
g_SavegamePtr->eventFlags_168[0] |= 0x200;
1200+
Savegame_EventFlagSet(EventFlag_9);
12131201
return;
12141202
}
12151203
}
@@ -1257,8 +1245,7 @@ void func_800DC8D8(void) // 0x800DC8D8
12571245
mag = Math_Vector2MagCalc(g_SysWork.npcs_1A0[0].position_18.vx - g_SysWork.player_4C.chara_0.position_18.vx,
12581246
(g_SysWork.npcs_1A0[0].position_18.vz - g_SysWork.player_4C.chara_0.position_18.vz) - Q12(2.0f));
12591247

1260-
// TODO: Use `Savegame_EventFlagGet`.
1261-
if (!(g_SavegamePtr->eventFlags_168[0] & 0x400))
1248+
if (!Savegame_EventFlagGet(EventFlag_10))
12621249
{
12631250
g_SysWork.npcs_1A0[0].position_18.vx = Q12(-61.0f);
12641251
g_SysWork.npcs_1A0[0].position_18.vz = Q12(48.0f);
@@ -1268,7 +1255,7 @@ void func_800DC8D8(void) // 0x800DC8D8
12681255
{
12691256
sharedFunc_800D88AC_0_s00(g_SysWork.npcs_1A0);
12701257

1271-
g_SavegamePtr->eventFlags_168[0] |= 0x400;
1258+
Savegame_EventFlagSet(EventFlag_10);
12721259

12731260
func_800865FC(true, 1, 0, FP_ANGLE(90.0f), Q12(-57.0f), Q12(47.0f));
12741261
}
@@ -1281,7 +1268,7 @@ void func_800DC8D8(void) // 0x800DC8D8
12811268

12821269
if (g_SysWork.npcs_1A0[0].position_18.vx > Q12(-58.0f))
12831270
{
1284-
g_SavegamePtr->eventFlags_168[0] |= 0x800;
1271+
Savegame_EventFlagSet(EventFlag_11);
12851272
g_SysWork.npcs_1A0[0].model_0.charaId_0 = Chara_None;
12861273

12871274
func_8005DC1C(Sfx_Unk1354, &D_800CB6A4, 0x80, 0);
@@ -1293,9 +1280,6 @@ INCLUDE_ASM("asm/maps/map0_s00/nonmatchings/map0_s00", func_800DCA30);
12931280

12941281
void func_800DCC54(void) // 0x800DCC54
12951282
{
1296-
s_Savegame* save;
1297-
u32 temp_v1;
1298-
12991283
if (D_800DFADC == NO_VALUE)
13001284
{
13011285
func_8003EF10(6, 6, 5, (s32)&D_800DFADC, 0, 0x64000);
@@ -1304,16 +1288,13 @@ void func_800DCC54(void) // 0x800DCC54
13041288
Sd_PlaySfx(0x54Fu, 0, 0xE0u);
13051289
}
13061290

1307-
save = g_SavegamePtr;
1308-
1309-
temp_v1 = save->eventFlags_168[0];
1310-
if (temp_v1 & 0x4000)
1291+
if (Savegame_EventFlagGet(EventFlag_14))
13111292
{
1312-
if (!(temp_v1 & 0x40000))
1293+
if (!Savegame_EventFlagGet(EventFlag_18))
13131294
{
13141295
sharedFunc_800D0B18_0_s00(6);
13151296

1316-
save->eventFlags_168[0] |= 0x40000;
1297+
Savegame_EventFlagSet(EventFlag_18);
13171298

13181299
Sd_PlaySfx(0x54FU, 0, 0xC0u);
13191300

@@ -1329,12 +1310,12 @@ void func_800DCC54(void) // 0x800DCC54
13291310

13301311
if (D_800DFADC > 0x4FFFF)
13311312
{
1332-
g_SavegamePtr->eventFlags_168[0] |= 0x8000;
1313+
Savegame_EventFlagSet(EventFlag_15);
13331314
}
13341315

13351316
if (D_800DFADC > 0x63FFF)
13361317
{
1337-
g_SavegamePtr->eventFlags_168[0] |= 0x10000;
1318+
Savegame_EventFlagSet(EventFlag_16);
13381319
}
13391320
}
13401321

@@ -1378,22 +1359,21 @@ s32 func_800DCDA8(void) // 0x800DCDA8
13781359
s32 func_800DCF38(s32 arg0) // 0x800DCF38
13791360
{
13801361
s16 sp20;
1381-
s32 temp_v0;
13821362
s32 var_t0;
13831363
s32 var_v0;
13841364

13851365
var_t0 = 0;
13861366

13871367
if (g_SysWork.sysState_8 == SysState_EventCallFunc)
13881368
{
1389-
if (!(g_SavegamePtr->eventFlags_168[0] & 0x8000))
1369+
if (!Savegame_EventFlagGet(EventFlag_15))
13901370
{
13911371
return arg0;
13921372
}
13931373
}
13941374
else
13951375
{
1396-
if (!(g_SavegamePtr->eventFlags_168[0] & 0x8000))
1376+
if (!Savegame_EventFlagGet(EventFlag_15))
13971377
{
13981378
if (g_SysWork.player_4C.chara_0.position_18.vx < Q12(-200.0f))
13991379
{

tools/flags_fp_conv.py

Lines changed: 84 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,45 +6,94 @@
66
import re
77

88
# ---------- EventFlags converter ----------
9-
def bit_index(mask):
10-
"""Convert a mask like 8 (0b1000) to its bit index (3)."""
11-
if mask == 0:
12-
raise ValueError("Mask cannot be zero")
13-
index = 0
14-
while mask > 1:
15-
mask >>= 1
16-
index += 1
17-
return index
9+
def _parse_mask(mask_str):
10+
"""Strip integer suffixes (U/L) and parse mask as int."""
11+
mask_clean = re.sub(r'[uUlL]+$', '', mask_str)
12+
return int(mask_clean, 0)
13+
14+
def _bit_indices(mask, width=32):
15+
"""Return list of bit indices (0..width-1) that are set in mask."""
16+
return [i for i in range(width) if (mask >> i) & 1]
1817

1918
def convert_flag_expression(expr):
2019
"""
21-
Converts:
22-
g_SavegamePtr->eventFlags_168[2] & 8
23-
g_SavegamePtr->eventFlags_168[2] & 0x8
24-
g_SavegamePtr->eventFlags_168[2] & (1 << 3)
25-
temp_a0->eventFlags_168[2] & [...]
26-
into Savegame_EventFlagGet(final_index)
20+
Convert eventFlags_168 bit ops into Savegame_EventFlag* calls.
21+
Rules:
22+
- '|=' -> Savegame_EventFlagSet(...)
23+
- '&' -> Savegame_EventFlagGet(...) (if mask has multiple bits -> OR-combined gets)
24+
- '&=' -> Savegame_EventFlagClear(...)
25+
* if written as '&= ~mask' -> mask gives bits to clear
26+
* if written as '&= mask' -> mask is already negated: bits to clear = ~mask & 0xFFFFFFFF
27+
Returns a string (single call or multiple calls joined).
2728
"""
28-
# Pattern for decimal or hex mask
29-
pattern_literal = r'.*?eventFlags_168\[(\d+)\]\s*&\s*(0x[0-9a-fA-F]+|\d+)'
30-
# Pattern for bit shift
31-
pattern_shift = r'.*?eventFlags_168\[(\d+)\]\s*&\s*\(\s*1\s*<<\s*(\d+)\s*\)'
32-
33-
match_shift = re.search(pattern_shift, expr)
34-
if match_shift:
35-
array_idx = int(match_shift.group(1))
36-
bit_idx = int(match_shift.group(2))
37-
else:
38-
match_literal = re.search(pattern_literal, expr)
39-
if not match_literal:
40-
return None # not an eventFlags expression
41-
array_idx = int(match_literal.group(1))
42-
mask_str = match_literal.group(2)
43-
mask = int(mask_str, 0) # handles decimal and hex
44-
bit_idx = bit_index(mask)
45-
46-
final_idx = array_idx * 32 + bit_idx
47-
return f"Savegame_EventFlagGet({final_idx})"
29+
arr_pat = r'.*?eventFlags_168\[(\d+)\]'
30+
mask_pat = r'(0x[0-9a-fA-F]+(?:[uUlL]*)|\d+)'
31+
shift_pat = r'\(\s*1\s*<<\s*(\d+)\s*\)'
32+
33+
# |= (shift)
34+
m = re.search(arr_pat + r'\s*\|\=\s*' + shift_pat, expr)
35+
if m:
36+
array_idx, bit_idx = int(m.group(1)), int(m.group(2))
37+
return f"Savegame_EventFlagSet(EventFlag_{array_idx * 32 + bit_idx})"
38+
39+
# |= (literal)
40+
m = re.search(arr_pat + r'\s*\|\=\s*' + mask_pat, expr)
41+
if m:
42+
array_idx = int(m.group(1))
43+
mask = _parse_mask(m.group(2))
44+
indices = _bit_indices(mask)
45+
return '; '.join(f"Savegame_EventFlagSet(EventFlag_{array_idx * 32 + i})" for i in indices) if indices else None
46+
47+
# &= ~(shift)
48+
m = re.search(arr_pat + r'\s*\&\=\s*~' + shift_pat, expr)
49+
if m:
50+
array_idx, bit_idx = int(m.group(1)), int(m.group(2))
51+
return f"Savegame_EventFlagClear(EventFlag_{array_idx * 32 + bit_idx})"
52+
53+
# &= ~(literal)
54+
m = re.search(arr_pat + r'\s*\&\=\s*~' + mask_pat, expr)
55+
if m:
56+
array_idx = int(m.group(1))
57+
mask = _parse_mask(m.group(2))
58+
indices = _bit_indices(mask)
59+
return '; '.join(f"Savegame_EventFlagClear(EventFlag_{array_idx * 32 + i})" for i in indices) if indices else None
60+
61+
# &= (literal WITHOUT ~) -> mask is the negated form; bits to clear are zeros in mask
62+
m = re.search(arr_pat + r'\s*\&\=\s*' + mask_pat, expr)
63+
if m:
64+
array_idx = int(m.group(1))
65+
mask = _parse_mask(m.group(2))
66+
inverted = (~mask) & 0xFFFFFFFF
67+
indices = _bit_indices(inverted)
68+
return '; '.join(f"Savegame_EventFlagClear(EventFlag_{array_idx * 32 + i})" for i in indices) if indices else None
69+
70+
# &= (shift WITHOUT ~) -> uncommon, but handle by inverting the single-bit mask
71+
m = re.search(arr_pat + r'\s*\&\=\s*' + shift_pat, expr)
72+
if m:
73+
array_idx, bit_idx = int(m.group(1)), int(m.group(2))
74+
inverted = (~(1 << bit_idx)) & 0xFFFFFFFF
75+
indices = _bit_indices(inverted)
76+
return '; '.join(f"Savegame_EventFlagClear(EventFlag_{array_idx * 32 + i})" for i in indices) if indices else None
77+
78+
# & (shift) -> Get
79+
m = re.search(arr_pat + r'\s*\&\s*' + shift_pat, expr)
80+
if m:
81+
array_idx, bit_idx = int(m.group(1)), int(m.group(2))
82+
return f"Savegame_EventFlagGet(EventFlag_{array_idx * 32 + bit_idx})"
83+
84+
# & (literal) -> Get (if multiple bits -> OR them)
85+
m = re.search(arr_pat + r'\s*\&\s*' + mask_pat, expr)
86+
if m:
87+
array_idx = int(m.group(1))
88+
mask = _parse_mask(m.group(2))
89+
indices = _bit_indices(mask)
90+
if not indices:
91+
return None
92+
if len(indices) == 1:
93+
return f"Savegame_EventFlagGet(EventFlag_{array_idx * 32 + indices[0]})"
94+
return ' || '.join(f"Savegame_EventFlagGet(EventFlag_{array_idx * 32 + i})" for i in indices)
95+
96+
return None
4897

4998
# ---------- FP converter ----------
5099
def to_signed(val, bits=32):

0 commit comments

Comments
 (0)