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