Merge pull request #199 from slaw-22/SaveScriptVariableValueAtIndex
Some checks failed
build / build (push) Has been cancelled

Decomp SaveScriptVariableValueAtIndex
This commit is contained in:
AnonymousRandomPerson 2025-10-26 17:27:19 -04:00 committed by GitHub
commit 8b5b6f84c8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 68 additions and 118 deletions

View File

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

View File

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

View File

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

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_0204B988.o
Object asm/main_0204BB00.o
Object src/main_0204C938.o
Object asm/main_0204C94C.o
Object src/dungeon_recruitment_3.o

View File

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