From d9b62fde0550c7d9a54f9a67ba8973a679c5fad5 Mon Sep 17 00:00:00 2001 From: slaw-22 <> Date: Tue, 28 Oct 2025 15:50:08 +0000 Subject: [PATCH 1/3] Decomp LoadScriptVariableValueSum and LoadScriptVariableValueBytes --- .../{main_0204BB00.inc => main_0204BBB0.inc} | 1 + asm/{main_0204BB00.s => main_0204BBB0.s} | 58 +------------------ include/scripting.h | 7 +-- main.lsf | 2 +- src/scripting.c | 30 ++++++++++ 5 files changed, 36 insertions(+), 62 deletions(-) rename asm/include/{main_0204BB00.inc => main_0204BBB0.inc} (93%) rename asm/{main_0204BB00.s => main_0204BBB0.s} (94%) diff --git a/asm/include/main_0204BB00.inc b/asm/include/main_0204BBB0.inc similarity index 93% rename from asm/include/main_0204BB00.inc rename to asm/include/main_0204BBB0.inc index d950f4e9..493a7b74 100644 --- a/asm/include/main_0204BB00.inc +++ b/asm/include/main_0204BBB0.inc @@ -7,6 +7,7 @@ .public LoadScriptVariableRaw .public LoadScriptVariableValue .public LoadScriptVariableValueAtIndex +.public LoadScriptVariableValueBytes .public MemcpySimple .public RandInt .public SCRIPT_VARS_VALUES diff --git a/asm/main_0204BB00.s b/asm/main_0204BBB0.s similarity index 94% rename from asm/main_0204BB00.s rename to asm/main_0204BBB0.s index 530e1960..1c0d9a42 100644 --- a/asm/main_0204BB00.s +++ b/asm/main_0204BBB0.s @@ -1,64 +1,8 @@ .include "asm/macros.inc" - .include "main_0204BB00.inc" + .include "main_0204BBB0.inc" .text - arm_func_start LoadScriptVariableValueSum -LoadScriptVariableValueSum: ; 0x0204BB00 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #8 - mov r6, r1 - mov r4, #0 - mov r7, r0 - add r0, sp, #0 - mov r1, r4 - mov r2, r6 - bl LoadScriptVariableRaw - mov r5, r4 - b _0204BB48 -_0204BB2C: - mov r2, r5, lsl #0x10 - mov r0, r7 - mov r1, r6 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - add r4, r4, r0 - add r5, r5, #1 -_0204BB48: - ldr r0, [sp] - ldrsh r0, [r0, #8] - cmp r5, r0 - blt _0204BB2C - mov r0, r4 - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end LoadScriptVariableValueSum - - arm_func_start LoadScriptVariableValueBytes -LoadScriptVariableValueBytes: ; 0x0204BB64 - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #8 - mov r3, r0 - mov r5, r1 - mov r4, r2 - add r0, sp, #0 - mov r2, r3 - mov r1, #0 - bl LoadScriptVariableRaw - ldr r2, [sp, #4] - mov r1, #0 - b _0204BBA0 -_0204BB94: - ldrb r0, [r2], #1 - add r1, r1, #1 - strb r0, [r5], #1 -_0204BBA0: - cmp r1, r4 - blt _0204BB94 - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end LoadScriptVariableValueBytes - arm_func_start sub_0204BBB0 sub_0204BBB0: ; 0x0204BBB0 stmdb sp!, {r3, r4, r5, lr} diff --git a/include/scripting.h b/include/scripting.h index 27339bf2..0202f8a2 100644 --- a/include/scripting.h +++ b/include/scripting.h @@ -31,13 +31,12 @@ struct script_var_raw { extern const short LOCAL_SCRIPT_VAR_OFFSET; -void LoadScriptVariableRaw(struct script_var_raw* sv_raw, - union script_var_value sv_val_local[], - const enum script_var_id sv_id); - +void LoadScriptVariableRaw(struct script_var_raw* sv_raw, union script_var_value sv_val_local[], const enum script_var_id sv_id); s32 LoadScriptVariableValue(union script_var_value sv_local[], enum script_var_id sv_id); s32 LoadScriptVariableValueAtIndex(union script_var_value sv_local[], enum script_var_id id, int idx); void SaveScriptVariableValue(union script_var_value sv_locals[], const enum script_var_id script_var_id, u32 new_val); void SaveScriptVariableValueAtIndex(union script_var_value sv_locals[], const enum script_var_id script_var_id, int idx, s32 new_val); +s32 LoadScriptVariableValueSum(union script_var_value sv_local[], const enum script_var_id sv_id); +void LoadScriptVariableValueBytes(const enum script_var_id sv_id, u8* result, s32 num_bytes); #endif //PMDSKY_SCRIPTING_H diff --git a/main.lsf b/main.lsf index 6633aa32..9197889d 100644 --- a/main.lsf +++ b/main.lsf @@ -81,7 +81,7 @@ Static main Object src/main_0204AFF8.o Object asm/main_0204B018.o Object src/scripting.o - Object asm/main_0204BB00.o + Object asm/main_0204BBB0.o Object src/main_0204C938.o Object asm/main_0204C94C.o Object src/dungeon_recruitment_3.o diff --git a/src/scripting.c b/src/scripting.c index b14577a6..51f7c6cf 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -287,3 +287,33 @@ void SaveScriptVariableValueAtIndex(union script_var_value sv_locals[], const en return; } + +s32 LoadScriptVariableValueSum(union script_var_value sv_local[], const enum script_var_id sv_id) +{ + struct script_var_raw script_var_raw; + s32 total = 0; + + LoadScriptVariableRaw(&script_var_raw, 0, sv_id); + + for(s32 idx = 0; idx < (s16) script_var_raw.def->n_values; idx++) { + total += LoadScriptVariableValueAtIndex(sv_local, sv_id, (u16) idx); + } + + return total; +} + +void LoadScriptVariableValueBytes(const enum script_var_id sv_id, u8* result, s32 num_bytes) +{ + struct script_var_raw sv_raw; + LoadScriptVariableRaw(&sv_raw, 0, sv_id); + + s32 i = 0; + u8* val_ptr = (u8*) sv_raw.value; + + for(i = 0; i < num_bytes; i++) { + u8 val = *val_ptr; + *result = val; + val_ptr += 1; + result += 1; + } +} From 3e51dd969ac524f0d72a7a79ec550a013ea243be Mon Sep 17 00:00:00 2001 From: slaw-22 <> Date: Tue, 28 Oct 2025 16:12:23 +0000 Subject: [PATCH 2/3] Decomp LoadScriptVariableValueString --- asm/include/main_02014D18.inc | 2 +- .../{main_0204BBB0.inc => main_0204BBCC.inc} | 1 - asm/main_02014D18.s | 4 ++-- asm/{main_0204BBB0.s => main_0204BBCC.s} | 13 +------------ include/scripting.h | 1 + main.lsf | 2 +- src/scripting.c | 6 ++++++ 7 files changed, 12 insertions(+), 17 deletions(-) rename asm/include/{main_0204BBB0.inc => main_0204BBCC.inc} (93%) rename asm/{main_0204BBB0.s => main_0204BBCC.s} (98%) diff --git a/asm/include/main_02014D18.inc b/asm/include/main_02014D18.inc index 7766d7af..cf1f7de1 100644 --- a/asm/include/main_02014D18.inc +++ b/asm/include/main_02014D18.inc @@ -439,7 +439,7 @@ .public sub_0200D310 .public sub_02025480 .public sub_020257FC -.public sub_0204BBB0 +.public LoadScriptVariableValueString .public sub_0204E530 .public sub_0204F6F8 .public sub_0204F77C diff --git a/asm/include/main_0204BBB0.inc b/asm/include/main_0204BBCC.inc similarity index 93% rename from asm/include/main_0204BBB0.inc rename to asm/include/main_0204BBCC.inc index 493a7b74..d950f4e9 100644 --- a/asm/include/main_0204BBB0.inc +++ b/asm/include/main_0204BBCC.inc @@ -7,7 +7,6 @@ .public LoadScriptVariableRaw .public LoadScriptVariableValue .public LoadScriptVariableValueAtIndex -.public LoadScriptVariableValueBytes .public MemcpySimple .public RandInt .public SCRIPT_VARS_VALUES diff --git a/asm/main_02014D18.s b/asm/main_02014D18.s index 68c72927..a629a64e 100644 --- a/asm/main_02014D18.s +++ b/asm/main_02014D18.s @@ -19157,7 +19157,7 @@ _02023E18: add r1, sp, #2 mov r0, #0x3f mov r2, #0xa - bl sub_0204BBB0 + bl LoadScriptVariableValueString add r0, sp, #0x42 add r1, sp, #2 mov r2, #0xa @@ -19169,7 +19169,7 @@ _02023E44: add r1, sp, #2 mov r0, #0x41 mov r2, #0xa - bl sub_0204BBB0 + bl LoadScriptVariableValueString add r0, sp, #0x42 add r1, sp, #2 mov r2, #0xa diff --git a/asm/main_0204BBB0.s b/asm/main_0204BBCC.s similarity index 98% rename from asm/main_0204BBB0.s rename to asm/main_0204BBCC.s index 1c0d9a42..a858ddfa 100644 --- a/asm/main_0204BBB0.s +++ b/asm/main_0204BBCC.s @@ -1,19 +1,8 @@ .include "asm/macros.inc" - .include "main_0204BBB0.inc" + .include "main_0204BBCC.inc" .text - arm_func_start sub_0204BBB0 -sub_0204BBB0: ; 0x0204BBB0 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r4, r2 - bl LoadScriptVariableValueBytes - mov r0, #0 - strb r0, [r5, r4] - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_0204BBB0 - arm_func_start SaveScriptVariableValueBytes SaveScriptVariableValueBytes: ; 0x0204BBCC stmdb sp!, {r3, r4, r5, lr} diff --git a/include/scripting.h b/include/scripting.h index 0202f8a2..074ae84a 100644 --- a/include/scripting.h +++ b/include/scripting.h @@ -38,5 +38,6 @@ void SaveScriptVariableValue(union script_var_value sv_locals[], const enum scri void SaveScriptVariableValueAtIndex(union script_var_value sv_locals[], const enum script_var_id script_var_id, int idx, s32 new_val); s32 LoadScriptVariableValueSum(union script_var_value sv_local[], const enum script_var_id sv_id); void LoadScriptVariableValueBytes(const enum script_var_id sv_id, u8* result, s32 num_bytes); +void LoadScriptVariableValueString(const enum script_var_id sv_id, u8* result, u8 num_bytes); #endif //PMDSKY_SCRIPTING_H diff --git a/main.lsf b/main.lsf index 9197889d..c945e574 100644 --- a/main.lsf +++ b/main.lsf @@ -81,7 +81,7 @@ Static main Object src/main_0204AFF8.o Object asm/main_0204B018.o Object src/scripting.o - Object asm/main_0204BBB0.o + Object asm/main_0204BBCC.o Object src/main_0204C938.o Object asm/main_0204C94C.o Object src/dungeon_recruitment_3.o diff --git a/src/scripting.c b/src/scripting.c index 51f7c6cf..ed258e94 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -317,3 +317,9 @@ void LoadScriptVariableValueBytes(const enum script_var_id sv_id, u8* result, s3 result += 1; } } + +void LoadScriptVariableValueString(const enum script_var_id sv_id, u8* result, u8 num_bytes) +{ + LoadScriptVariableValueBytes(sv_id, result, num_bytes); + result[num_bytes] = 0; +} From 8c38b8164504b7c75a7326e31fece99da8949a31 Mon Sep 17 00:00:00 2001 From: slaw-22 <> Date: Tue, 28 Oct 2025 21:08:29 +0000 Subject: [PATCH 3/3] Decomp SaveScriptVariableValueBytes and ScriptVariablesEqual --- .../{main_0204BBCC.inc => main_0204BCAC.inc} | 0 asm/{main_0204BBCC.s => main_0204BCAC.s} | 71 +------------------ include/scripting.h | 6 +- main.lsf | 2 +- src/scripting.c | 39 +++++++++- 5 files changed, 43 insertions(+), 75 deletions(-) rename asm/include/{main_0204BBCC.inc => main_0204BCAC.inc} (100%) rename asm/{main_0204BBCC.s => main_0204BCAC.s} (93%) diff --git a/asm/include/main_0204BBCC.inc b/asm/include/main_0204BCAC.inc similarity index 100% rename from asm/include/main_0204BBCC.inc rename to asm/include/main_0204BCAC.inc diff --git a/asm/main_0204BBCC.s b/asm/main_0204BCAC.s similarity index 93% rename from asm/main_0204BBCC.s rename to asm/main_0204BCAC.s index a858ddfa..a817642f 100644 --- a/asm/main_0204BBCC.s +++ b/asm/main_0204BCAC.s @@ -1,77 +1,8 @@ .include "asm/macros.inc" - .include "main_0204BBCC.inc" + .include "main_0204BCAC.inc" .text - arm_func_start SaveScriptVariableValueBytes -SaveScriptVariableValueBytes: ; 0x0204BBCC - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #8 - mov r3, r0 - mov r5, r1 - mov r4, r2 - add r0, sp, #0 - mov r2, r3 - mov r1, #0 - bl LoadScriptVariableRaw - ldr r2, [sp, #4] - mov r1, #0 - b _0204BC08 -_0204BBFC: - ldrb r0, [r5], #1 - add r1, r1, #1 - strb r0, [r2], #1 -_0204BC08: - cmp r1, r4 - blt _0204BBFC - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end SaveScriptVariableValueBytes - - arm_func_start ScriptVariablesEqual -ScriptVariablesEqual: ; 0x0204BC18 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #0x10 - mov r8, r0 - mov r7, r1 - mov r6, r2 - add r0, sp, #8 - mov r1, r8 - mov r2, r7 - bl LoadScriptVariableRaw - add r0, sp, #0 - mov r1, r8 - mov r2, r6 - bl LoadScriptVariableRaw - ldr r0, [sp, #8] - mov r5, #0 - ldrsh r4, [r0, #8] - b _0204BC98 -_0204BC5C: - mov r2, r5, lsl #0x10 - mov r0, r8 - mov r1, r7 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r5, lsl #0x10 - mov sb, r0 - mov r0, r8 - mov r1, r6 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - cmp sb, r0 - movne r0, #0 - bne _0204BCA4 - add r5, r5, #1 -_0204BC98: - cmp r5, r4 - blt _0204BC5C - mov r0, #1 -_0204BCA4: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - arm_func_end ScriptVariablesEqual - arm_func_start sub_0204BCAC sub_0204BCAC: ; 0x0204BCAC stmdb sp!, {r3, lr} diff --git a/include/scripting.h b/include/scripting.h index 074ae84a..107fd37b 100644 --- a/include/scripting.h +++ b/include/scripting.h @@ -10,7 +10,7 @@ struct script_var_def { // 0x4: value's offset into struct script_var_value_table, if type != VARTYPE_SPECIAL s16 mem_offset; s16 bitshift; // 0x6: bit position if type == VARTYPE_BIT - u16 n_values; // 0x8: number of values (>1 means this variable is an array) + s16 n_values; // 0x8: number of values (>1 means this variable is an array) // 0xA: 0 for every variable except VAR_VERSION, which has a default value of 1. s16 default_val; char* name; // 0xC: variable name @@ -33,11 +33,13 @@ extern const short LOCAL_SCRIPT_VAR_OFFSET; void LoadScriptVariableRaw(struct script_var_raw* sv_raw, union script_var_value sv_val_local[], const enum script_var_id sv_id); s32 LoadScriptVariableValue(union script_var_value sv_local[], enum script_var_id sv_id); -s32 LoadScriptVariableValueAtIndex(union script_var_value sv_local[], enum script_var_id id, int idx); +s32 LoadScriptVariableValueAtIndex(union script_var_value sv_local[], enum script_var_id id, u16 idx); void SaveScriptVariableValue(union script_var_value sv_locals[], const enum script_var_id script_var_id, u32 new_val); void SaveScriptVariableValueAtIndex(union script_var_value sv_locals[], const enum script_var_id script_var_id, int idx, s32 new_val); s32 LoadScriptVariableValueSum(union script_var_value sv_local[], const enum script_var_id sv_id); void LoadScriptVariableValueBytes(const enum script_var_id sv_id, u8* result, s32 num_bytes); void LoadScriptVariableValueString(const enum script_var_id sv_id, u8* result, u8 num_bytes); +void SaveScriptVariableValueBytes(const enum script_var_id sv_id, u8* result, s32 num_bytes); +s32 ScriptVariablesEqual(union script_var_value sv_val_ptr_local[], enum script_var_id sv_id_1, enum script_var_id sv_id_2); #endif //PMDSKY_SCRIPTING_H diff --git a/main.lsf b/main.lsf index c945e574..7a0bd49c 100644 --- a/main.lsf +++ b/main.lsf @@ -81,7 +81,7 @@ Static main Object src/main_0204AFF8.o Object asm/main_0204B018.o Object src/scripting.o - Object asm/main_0204BBCC.o + Object asm/main_0204BCAC.o Object src/main_0204C938.o Object asm/main_0204C94C.o Object src/dungeon_recruitment_3.o diff --git a/src/scripting.c b/src/scripting.c index ed258e94..97af982e 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -97,7 +97,7 @@ s32 LoadScriptVariableValue(union script_var_value sv_local[], enum script_var_i return 0; } -s32 LoadScriptVariableValueAtIndex(union script_var_value sv_local[], enum script_var_id id, int idx) +s32 LoadScriptVariableValueAtIndex(union script_var_value sv_local[], enum script_var_id id, u16 idx) { struct script_var_raw result; LoadScriptVariableRaw(&result, sv_local, id); @@ -309,7 +309,7 @@ void LoadScriptVariableValueBytes(const enum script_var_id sv_id, u8* result, s3 s32 i = 0; u8* val_ptr = (u8*) sv_raw.value; - + for(i = 0; i < num_bytes; i++) { u8 val = *val_ptr; *result = val; @@ -323,3 +323,38 @@ void LoadScriptVariableValueString(const enum script_var_id sv_id, u8* result, u LoadScriptVariableValueBytes(sv_id, result, num_bytes); result[num_bytes] = 0; } + +void SaveScriptVariableValueBytes(const enum script_var_id sv_id, u8* result, s32 num_bytes) +{ + struct script_var_raw sv_raw; + LoadScriptVariableRaw(&sv_raw, 0, sv_id); + + s32 i = 0; + u8* val_ptr = (u8*) sv_raw.value; + + for(i = 0; i < num_bytes; i++) { + u8 val = *result; + *val_ptr = val; + val_ptr += 1; + result += 1; + } +} + +s32 ScriptVariablesEqual(union script_var_value sv_val_ptr_local[], enum script_var_id sv_id_1, enum script_var_id sv_id_2) +{ + struct script_var_raw script_var_raw_1, script_var_raw_2; + + LoadScriptVariableRaw(&script_var_raw_1, sv_val_ptr_local, sv_id_1); + LoadScriptVariableRaw(&script_var_raw_2, sv_val_ptr_local, sv_id_2); + + s32 n_values = script_var_raw_1.def->n_values; + + for(int idx = 0; idx < n_values; idx++) { + if (LoadScriptVariableValueAtIndex(sv_val_ptr_local, sv_id_1, idx) != + LoadScriptVariableValueAtIndex(sv_val_ptr_local, sv_id_2, idx)) { + return 0; + } + } + + return 1; +}