Decomp SaveScriptVariableValueBytes and ScriptVariablesEqual

This commit is contained in:
slaw-22
2025-10-28 21:08:29 +00:00
parent 3e51dd969a
commit 8c38b81645
5 changed files with 43 additions and 75 deletions

View File

@@ -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}

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}