Skip to content

Commit 742e220

Browse files
author
slaw-22
committed
Decomp LoadScriptVariableValue
1 parent 24c7a2e commit 742e220

File tree

6 files changed

+154
-164
lines changed

6 files changed

+154
-164
lines changed

asm/include/main_0204B4EC.inc renamed to asm/include/main_0204B678.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
.public GetNotifyNote
1212
.public GetPartyMembers
1313
.public LoadScriptVariableRaw
14+
.public LoadScriptVariableValue
1415
.public MemcpySimple
1516
.public RandInt
1617
.public SCRIPT_VARS_VALUES

asm/main_0204B4EC.s renamed to asm/main_0204B678.s

Lines changed: 1 addition & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,136 +1,8 @@
11
.include "asm/macros.inc"
2-
.include "main_0204B4EC.inc"
2+
.include "main_0204B678.inc"
33

44
.text
55

6-
arm_func_start LoadScriptVariableValue
7-
LoadScriptVariableValue: ; 0x0204B4EC
8-
stmdb sp!, {r4, lr}
9-
sub sp, sp, #8
10-
mov r2, r0
11-
mov r4, r1
12-
mov r1, r2
13-
add r0, sp, #0
14-
mov r2, r4
15-
bl LoadScriptVariableRaw
16-
ldr r1, [sp]
17-
ldrsh r0, [r1]
18-
cmp r0, #9
19-
addls pc, pc, r0, lsl #2
20-
b _0204B66C
21-
_0204B520: ; jump table
22-
b _0204B66C ; case 0
23-
b _0204B548 ; case 1
24-
b _0204B56C ; case 2
25-
b _0204B56C ; case 3
26-
b _0204B578 ; case 4
27-
b _0204B584 ; case 5
28-
b _0204B590 ; case 6
29-
b _0204B59C ; case 7
30-
b _0204B59C ; case 8
31-
b _0204B5A8 ; case 9
32-
_0204B548:
33-
ldrsh r1, [r1, #6]
34-
ldr r2, [sp, #4]
35-
mov r0, #1
36-
mov r1, r0, lsl r1
37-
ldrb r2, [r2]
38-
and r1, r1, #0xff
39-
tst r2, r1
40-
moveq r0, #0
41-
b _0204B670
42-
_0204B56C:
43-
ldr r0, [sp, #4]
44-
ldrb r0, [r0]
45-
b _0204B670
46-
_0204B578:
47-
ldr r0, [sp, #4]
48-
ldrsb r0, [r0]
49-
b _0204B670
50-
_0204B584:
51-
ldr r0, [sp, #4]
52-
ldrh r0, [r0]
53-
b _0204B670
54-
_0204B590:
55-
ldr r0, [sp, #4]
56-
ldrsh r0, [r0]
57-
b _0204B670
58-
_0204B59C:
59-
ldr r0, [sp, #4]
60-
ldr r0, [r0]
61-
b _0204B670
62-
_0204B5A8:
63-
cmp r4, #0x48
64-
bgt _0204B5E4
65-
bge _0204B62C
66-
cmp r4, #0x3d
67-
bgt _0204B5D8
68-
subs r0, r4, #0x3a
69-
addpl pc, pc, r0, lsl #2
70-
b _0204B66C
71-
_0204B5C8: ; jump table
72-
b _0204B600 ; case 0
73-
b _0204B608 ; case 1
74-
b _0204B614 ; case 2
75-
b _0204B61C ; case 3
76-
_0204B5D8:
77-
cmp r4, #0x47
78-
beq _0204B624
79-
b _0204B66C
80-
_0204B5E4:
81-
cmp r4, #0x49
82-
bgt _0204B5F4
83-
beq _0204B634
84-
b _0204B66C
85-
_0204B5F4:
86-
cmp r4, #0x70
87-
beq _0204B664
88-
b _0204B66C
89-
_0204B600:
90-
mov r0, #1
91-
b _0204B670
92-
_0204B608:
93-
mov r0, #0
94-
bl GetPartyMembers
95-
b _0204B670
96-
_0204B614:
97-
bl GetMoneyCarried
98-
b _0204B670
99-
_0204B61C:
100-
bl GetMoneyStored
101-
b _0204B670
102-
_0204B624:
103-
bl GetLanguageType
104-
b _0204B670
105-
_0204B62C:
106-
bl GetGameMode
107-
b _0204B670
108-
_0204B634:
109-
bl GetGameMode
110-
cmp r0, #1
111-
beq _0204B64C
112-
cmp r0, #3
113-
beq _0204B654
114-
b _0204B65C
115-
_0204B64C:
116-
bl sub_0204C918
117-
b _0204B670
118-
_0204B654:
119-
bl GetSpecialEpisodeType
120-
b _0204B670
121-
_0204B65C:
122-
mvn r0, #0
123-
b _0204B670
124-
_0204B664:
125-
bl GetNotifyNote
126-
b _0204B670
127-
_0204B66C:
128-
mov r0, #0
129-
_0204B670:
130-
add sp, sp, #8
131-
ldmia sp!, {r4, pc}
132-
arm_func_end LoadScriptVariableValue
133-
1346
arm_func_start LoadScriptVariableValueAtIndex
1357
LoadScriptVariableValueAtIndex: ; 0x0204B678
1368
stmdb sp!, {r3, r4, r5, lr}

include/enums.h

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2961,8 +2961,56 @@ enum dungeon_restriction_flags {
29612961
// Remaining flags are unused
29622962
};
29632963

2964-
enum script_variables {
2965-
PLAYED_OLD_GAME = 0x6f
2964+
enum script_var_type {
2965+
VARTYPE_NONE = 0,
2966+
VARTYPE_BIT = 1,
2967+
// VARTYPE_STRING is an array of characters, and implementation-wise are treated exactly the
2968+
// same way as VARTYPE_UINT8
2969+
VARTYPE_STRING = 2,
2970+
VARTYPE_UINT8 = 3,
2971+
VARTYPE_INT8 = 4,
2972+
VARTYPE_UINT16 = 5,
2973+
VARTYPE_INT16 = 6,
2974+
VARTYPE_UINT32 = 7,
2975+
VARTYPE_INT32 = 8,
2976+
VARTYPE_SPECIAL = 9,
2977+
// This dummy value ensures compilation that matches the original assembly.
2978+
// Without it, the compiler reads the enum using ldrb instead of ldrsh
2979+
VARTYPE_DUMMY_PADDING = 256
2980+
};
2981+
2982+
enum script_var_id {
2983+
VAR_FRIEND_SUM = 58,
2984+
VAR_UNIT_SUM = 59,
2985+
// The amount of money the player has on hand.
2986+
VAR_CARRY_GOLD = 60,
2987+
// The amount of money stored in Duskull Bank.
2988+
VAR_BANK_GOLD = 61,
2989+
// The language determined by the NDS firmware. Notably checked in some scripts to display
2990+
// different backgrounds or objects, such as in the intro.
2991+
// 0: Japanese
2992+
// 1: English
2993+
// 2: French
2994+
// 3: German
2995+
// 4: Italian
2996+
// 5: Spanish
2997+
PLAYED_OLD_GAME = 0x6f,
2998+
VAR_LANGUAGE_TYPE = 71,
2999+
// A value to distinguish the type of game being played. This mainly differentiates between maingame and Special Episodes, and the game
3000+
// checks for this value in numerous places (not necessarily in scripts) to differentiate
3001+
// maingame versus Special Episode behavior.
3002+
VAR_GAME_MODE = 72,
3003+
// Used to distinguish which Special Episode is currently being played.
3004+
VAR_EXECUTE_SPECIAL_EPISODE_TYPE = 73,
3005+
VAR_NOTE_MODIFY_FLAG = 112,
3006+
};
3007+
3008+
enum special_episode_type {
3009+
EPISODE_BIDOOFS_WISH = 0,
3010+
EPISODE_IGGLYBUFF_THE_PRODIGY = 1,
3011+
EPISODE_TODAYS_OH_MY_GOSH = 2,
3012+
EPISODE_HERE_COMES_TEAM_CHARM = 3,
3013+
EPISODE_IN_THE_FUTURE_OF_DARKNESS = 4,
29663014
};
29673015

29683016
#endif //PMDSKY_ENUMS_H

include/scripting.h

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,37 @@
44
#include "enums.h"
55
#include "util.h"
66

7-
struct script_var_definition {
8-
s16 p1;
9-
s16 p2;
10-
s16 value_offset; // offset within SCRIPT_VAR_VALUES, or local script var values.
11-
s16 p4;
12-
s16 p5;
13-
s16 p6;
14-
s16 p7;
15-
s16 p8;
7+
struct script_var_def {
8+
enum script_var_type type; // 0x0: type of data contained in this script variable
9+
u16 field_0x1; // 0x2
10+
// 0x4: value's offset into struct script_var_value_table, if type != VARTYPE_SPECIAL
11+
s16 mem_offset;
12+
s16 bitshift; // 0x6: bit position if type == VARTYPE_BIT
13+
u16 n_values; // 0x8: number of values (>1 means this variable is an array)
14+
// 0xA: 0 for every variable except VAR_VERSION, which has a default value of 1.
15+
s16 default_val;
16+
char* name; // 0xC: variable name
1617
};
1718

18-
struct script_var_local_value {
19-
u32 p1;
20-
};
21-
22-
struct script_var_global_value {
23-
u8 p1;
19+
union script_var_value {
20+
u8 u8;
21+
u16 u16;
22+
u32 u32;
23+
s8 s8;
24+
s16 s16;
2425
};
2526

2627
struct script_var_raw {
27-
struct script_var_definition* def;
28-
union {
29-
struct script_var_local_value* local;
30-
struct script_var_global_value* global;
31-
} value;
28+
struct script_var_def* def;
29+
union script_var_value *value;
3230
};
3331

3432
const short LOCAL_SCRIPT_VAR_OFFSET = 0x400;
3533

3634
void LoadScriptVariableRaw(struct script_var_raw* sv_raw,
37-
struct script_var_local_value sv_locals[],
38-
const enum script_variables sv_id);
35+
union script_var_value sv_val_local[],
36+
const enum script_var_id sv_id);
37+
38+
s32 LoadScriptVariableValue(union script_var_value sv_local[], enum script_var_id sv_id);
3939

4040
#endif //PMDSKY_SCRIPTING_H

main.lsf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ Static main
7878
Object src/main_0204AFF8.o
7979
Object asm/main_0204B018.o
8080
Object src/scripting.o
81-
Object asm/main_0204B4EC.o
81+
Object asm/main_0204B678.o
8282
Object src/dungeon_recruitment_3.o
8383
Object asm/main_0204CA94.o
8484
Object src/main_0204DA2C.o

src/scripting.c

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,91 @@
11
#include "enums.h"
22
#include "scripting.h"
33

4+
// Global script variable definitions
5+
extern struct script_var_def SCRIPT_VARS[];
6+
// Local script variable definitions
7+
extern struct script_var_def SCRIPT_VARS_LOCALS[];
8+
// Global script variable values
9+
extern u8 SCRIPT_VARS_VALUES[];
410

5-
extern struct script_var_definition SCRIPT_VARS[];
6-
extern struct script_var_definition SCRIPT_VARS_LOCALS[];
7-
extern struct script_var_global_value SCRIPT_VARS_VALUES[];
11+
extern s32 GetPartyMembers(s32 param1);
12+
extern s32 GetMoneyCarried();
13+
extern s32 GetMoneyStored();
14+
extern s32 GetLanguageType();
15+
extern s32 GetGameMode();
16+
extern s32 sub_0204C918();
17+
extern s32 GetSpecialEpisodeType();
18+
extern s32 GetNotifyNote();
819

920
void LoadScriptVariableRaw(struct script_var_raw* sv_raw,
10-
struct script_var_local_value sv_locals[],
11-
const enum script_variables sv_id)
12-
{
21+
union script_var_value sv_val_local[],
22+
const enum script_var_id sv_id) {
23+
1324
if (sv_id < LOCAL_SCRIPT_VAR_OFFSET) {
14-
// script var is global
25+
// global script var
1526
sv_raw->def = &SCRIPT_VARS[sv_id];
16-
sv_raw->value.global = &SCRIPT_VARS_VALUES[sv_raw->def->value_offset];
27+
sv_raw->value = (union script_var_value*)
28+
&SCRIPT_VARS_VALUES[sv_raw->def->mem_offset];
1729
} else {
18-
// script var is local
30+
// local script var
1931
sv_raw->def = &SCRIPT_VARS_LOCALS[sv_id - LOCAL_SCRIPT_VAR_OFFSET];
20-
sv_raw->value.local = &sv_locals[sv_raw->def->value_offset];
32+
sv_raw->value = &sv_val_local[sv_raw->def->mem_offset];
2133
}
2234
}
35+
36+
s32 LoadScriptVariableValue(union script_var_value sv_local[], enum script_var_id sv_id)
37+
{
38+
struct script_var_raw result;
39+
LoadScriptVariableRaw(&result, sv_local, sv_id);
40+
41+
switch((s16)result.def->type) {
42+
case VARTYPE_NONE:
43+
break;
44+
case VARTYPE_BIT:
45+
// Return true if the value has a particular bit set
46+
if(result.value->u8 & (u8)(1 << result.def->bitshift)) {
47+
return TRUE;
48+
}
49+
return FALSE;
50+
case VARTYPE_STRING:
51+
case VARTYPE_UINT8:
52+
return result.value->u8;
53+
case VARTYPE_INT8:
54+
return result.value->s8;
55+
case VARTYPE_UINT16:
56+
return result.value->u16;
57+
case VARTYPE_INT16:
58+
return result.value->s16;
59+
case VARTYPE_UINT32:
60+
case VARTYPE_INT32:
61+
return result.value->u32;
62+
case VARTYPE_SPECIAL:
63+
switch(sv_id) {
64+
case VAR_FRIEND_SUM:
65+
return 1;
66+
case VAR_UNIT_SUM:
67+
return GetPartyMembers(0);
68+
case VAR_CARRY_GOLD:
69+
return GetMoneyCarried();
70+
case VAR_BANK_GOLD:
71+
return GetMoneyStored();
72+
case VAR_LANGUAGE_TYPE:
73+
return GetLanguageType();
74+
case VAR_GAME_MODE:
75+
return GetGameMode();
76+
case VAR_EXECUTE_SPECIAL_EPISODE_TYPE:
77+
switch(GetGameMode()) {
78+
case EPISODE_IGGLYBUFF_THE_PRODIGY:
79+
return sub_0204C918();
80+
case EPISODE_HERE_COMES_TEAM_CHARM:
81+
return GetSpecialEpisodeType();
82+
default:
83+
return -1;
84+
}
85+
case VAR_NOTE_MODIFY_FLAG:
86+
return GetNotifyNote();
87+
}
88+
}
89+
90+
return 0;
91+
}

0 commit comments

Comments
 (0)