diff --git a/asm/include/main_0204B988.inc b/asm/include/main_0204BB00.inc similarity index 85% rename from asm/include/main_0204B988.inc rename to asm/include/main_0204BB00.inc index c0f4b416..d950f4e9 100644 --- a/asm/include/main_0204B988.inc +++ b/asm/include/main_0204BB00.inc @@ -1,5 +1,4 @@ #pragma once -.public AddMoneyCarried .public DEBUG_SPECIAL_EPISODE_NUMBER .public Debug_FatalError .public Debug_Print @@ -12,10 +11,8 @@ .public RandInt .public SCRIPT_VARS_VALUES .public SaveScriptVariableValue +.public SaveScriptVariableValueAtIndex .public ScenarioFlagBackup -.public SetMoneyCarried -.public SetMoneyStored -.public SetNotifyNote .public ZinitScriptVariable .public _0209CEAC .public _0209CF28 diff --git a/asm/main_0204B988.s b/asm/main_0204BB00.s similarity index 91% rename from asm/main_0204B988.s rename to asm/main_0204BB00.s index 433883d4..530e1960 100644 --- a/asm/main_0204B988.s +++ b/asm/main_0204BB00.s @@ -1,120 +1,8 @@ .include "asm/macros.inc" - .include "main_0204B988.inc" + .include "main_0204BB00.inc" .text - arm_func_start SaveScriptVariableValueAtIndex -SaveScriptVariableValueAtIndex: ; 0x0204B988 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #8 - mov r4, r0 - mov r6, r1 - mov r5, r2 - mov r1, r4 - add r0, sp, #0 - mov r2, r6 - mov r4, r3 - bl LoadScriptVariableRaw - ldr r1, [sp] - ldrsh r0, [r1] - cmp r0, #9 - addls pc, pc, r0, lsl #2 - b _0204BAF8 -_0204B9C4: ; jump table - b _0204BAF8 ; case 0 - b _0204B9EC ; case 1 - b _0204BA30 ; case 2 - b _0204BA30 ; case 3 - b _0204BA3C ; case 4 - b _0204BA48 ; case 5 - b _0204BA58 ; case 6 - b _0204BA68 ; case 7 - b _0204BA68 ; case 8 - b _0204BA74 ; case 9 -_0204B9EC: - ldrsh r0, [r1, #6] - mov r1, #1 - ldr r2, [sp, #4] - add r0, r5, r0 - mov r0, r0, lsl #0x10 - mov r3, r0, lsr #0x10 - and r0, r3, #7 - mov r0, r1, lsl r0 - and r1, r0, #0xff - ldrb r0, [r2, r3, lsr #3] - cmp r4, #0 - orrne r0, r0, r1 - strneb r0, [r2, r3, lsr #3] - orreq r0, r0, r1 - eoreq r0, r1, r0 - streqb r0, [r2, r3, lsr #3] - b _0204BAF8 -_0204BA30: - ldr r0, [sp, #4] - strb r4, [r0, r5] - b _0204BAF8 -_0204BA3C: - ldr r0, [sp, #4] - strb r4, [r0, r5] - b _0204BAF8 -_0204BA48: - ldr r1, [sp, #4] - mov r0, r5, lsl #1 - strh r4, [r1, r0] - b _0204BAF8 -_0204BA58: - ldr r1, [sp, #4] - mov r0, r5, lsl #1 - strh r4, [r1, r0] - b _0204BAF8 -_0204BA68: - ldr r0, [sp, #4] - str r4, [r0, r5, lsl #2] - b _0204BAF8 -_0204BA74: - cmp r6, #0x49 - bgt _0204BAA0 - bge _0204BACC - cmp r6, #0x3d - bgt _0204BAF8 - cmp r6, #0x3c - blt _0204BAF8 - beq _0204BAAC - cmp r6, #0x3d - beq _0204BAC0 - b _0204BAF8 -_0204BAA0: - cmp r6, #0x70 - beq _0204BAE4 - b _0204BAF8 -_0204BAAC: - mov r0, r4 - bl SetMoneyCarried - mov r0, #0 - bl AddMoneyCarried - b _0204BAF8 -_0204BAC0: - mov r0, r4 - bl SetMoneyStored - b _0204BAF8 -_0204BACC: - bl GetGameMode - cmp r0, #1 - bne _0204BAF8 - mov r0, r4 - bl sub_0204C928 - b _0204BAF8 -_0204BAE4: - cmp r4, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - bl SetNotifyNote -_0204BAF8: - add sp, sp, #8 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end SaveScriptVariableValueAtIndex - arm_func_start LoadScriptVariableValueSum LoadScriptVariableValueSum: ; 0x0204BB00 stmdb sp!, {r3, r4, r5, r6, r7, lr} diff --git a/include/scripting.h b/include/scripting.h index bc0d29e5..27339bf2 100644 --- a/include/scripting.h +++ b/include/scripting.h @@ -38,5 +38,6 @@ void LoadScriptVariableRaw(struct script_var_raw* sv_raw, 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); #endif //PMDSKY_SCRIPTING_H diff --git a/main.lsf b/main.lsf index 94d1a1a7..6633aa32 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_0204B988.o + Object asm/main_0204BB00.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 35a5c1b0..b14577a6 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -223,3 +223,67 @@ void SaveScriptVariableValue(union script_var_value sv_locals[], const enum scri return; } + +void SaveScriptVariableValueAtIndex(union script_var_value sv_locals[], const enum script_var_id script_var_id, int idx, s32 new_val) +{ + struct script_var_raw script_var_raw; + LoadScriptVariableRaw(&script_var_raw, sv_locals, script_var_id); + + switch ((s16)script_var_raw.def->type) { + case VARTYPE_BIT: + // For VARTYPE_BIT, idx specifies a number of bits + u16 offset = idx + script_var_raw.def->bitshift; + u8 *val = &((u8*)script_var_raw.value)[offset / 8]; + u8 bitmask = (1 << (offset & (8 - 1))); + if (new_val != FALSE) { + // new value is true, so we set the bits specified in the bitmask + *val = *val | bitmask; + return; + } + // new value is false, so we unset the bits specified in bitmask + *val = bitmask ^ (*val | bitmask); + return; + case VARTYPE_STRING: + case VARTYPE_UINT8: + ((u8*)script_var_raw.value)[idx] = new_val; + return; + case VARTYPE_INT8: + ((s8*)script_var_raw.value)[idx] = new_val; + return; + case VARTYPE_UINT16: + ((u16*)script_var_raw.value)[idx] = (u16)new_val; + return; + case VARTYPE_INT16: + ((s16*)script_var_raw.value)[idx] = (s16)new_val; + return; + case VARTYPE_UINT32: + case VARTYPE_INT32: + ((s32*)script_var_raw.value)[idx] = (s32)new_val; + return; + case VARTYPE_SPECIAL: + switch (script_var_id) { + case VAR_CARRY_GOLD: + SetMoneyCarried(new_val); + AddMoneyCarried(0); + return; + case VAR_BANK_GOLD: + SetMoneyStored(new_val); + return; + case VAR_EXECUTE_SPECIAL_EPISODE_TYPE: + if (GetGameMode() == GAME_MODE_1) { + sub_0204C928(new_val); + return; + } + return; + case VAR_NOTE_MODIFY_FLAG: + SetNotifyNote((u8)(new_val != FALSE)); + break; + } + break; + + default: + return; + } + + return; +}