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