Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Rubberduckycooly
GitHub Repository: Rubberduckycooly/RSDKv5-Decompilation
Path: blob/master/RSDKv5/RSDK/Storage/Legacy/UserStorageLegacy.cpp
1168 views
1
2
3
void *RSDK::Legacy::nativeFunction[LEGACY_v4_NATIIVEFUNCTION_COUNT];
4
int32 RSDK::Legacy::nativeFunctionCount = 0;
5
6
int32 RSDK::Legacy::globalVariablesCount = 0;
7
RSDK::Legacy::GlobalVariable RSDK::Legacy::globalVariables[LEGACY_GLOBALVAR_COUNT];
8
9
int32 RSDK::Legacy::saveRAM[LEGACY_SAVEDATA_SIZE];
10
11
int32 RSDK::Legacy::GetGlobalVariableByName(const char *name)
12
{
13
for (int32 v = 0; v < globalVariablesCount; ++v) {
14
if (StrComp(name, globalVariables[v].name))
15
return globalVariables[v].value;
16
}
17
return 0;
18
}
19
20
void RSDK::Legacy::SetGlobalVariableByName(const char *name, int32 value)
21
{
22
for (int32 v = 0; v < globalVariablesCount; ++v) {
23
if (StrComp(name, globalVariables[v].name)) {
24
globalVariables[v].value = value;
25
break;
26
}
27
}
28
}
29
int32 RSDK::Legacy::GetGlobalVariableID(const char *name)
30
{
31
for (int32 v = 0; v < globalVariablesCount; ++v) {
32
if (StrComp(name, globalVariables[v].name))
33
return v;
34
}
35
return 0xFF;
36
}
37
38
bool32 RSDK::Legacy::ReadSaveRAM() { return SKU::LoadUserFile("SGame.bin", saveRAM, sizeof(saveRAM)); }
39
bool32 RSDK::Legacy::WriteSaveRAM() { return SKU::SaveUserFile("SGame.bin", saveRAM, sizeof(saveRAM)); }
40
41
void RSDK::Legacy::v3::SetAchievement(int32 achievementID, int32 achievementDone)
42
{
43
PrintLog(PRINT_NORMAL, "[RSDKv3] Achieved achievement: %d (%d)!", achievementID, achievementDone);
44
}
45
void RSDK::Legacy::v3::SetLeaderboard(int32 leaderboardID, int32 score)
46
{
47
PrintLog(PRINT_NORMAL, "[RSDKv3] Setting Leaderboard %d score to %d...", leaderboardID, score);
48
}
49
50
// Native Functions
51
52
void RSDK::Legacy::v4::SetAchievement(int32 *achievementID, int32 *status)
53
{
54
if (!achievementID || !status)
55
return;
56
57
PrintLog(PRINT_NORMAL, "[RSDKv4] Achieved achievement: %d (%d)!", *achievementID, *status);
58
59
if ((uint32)*achievementID >= achievementList.size())
60
return;
61
62
achievementList[*achievementID].achieved = *status ? true : false;
63
}
64
void RSDK::Legacy::v4::SetLeaderboard(int32 *leaderboardID, int32 *score)
65
{
66
if (!leaderboardID || !score)
67
return;
68
69
PrintLog(PRINT_NORMAL, "[RSDKv4] Setting Leaderboard %d score to %d...", *leaderboardID, *score);
70
}
71
void RSDK::Legacy::v4::HapticEffect(int32 *id, int32 *unknown1, int32 *unknown2, int32 *unknown3) {}
72
73
enum NotifyCallbackIDs {
74
NOTIFY_DEATH_EVENT = 128,
75
NOTIFY_TOUCH_SIGNPOST = 129,
76
NOTIFY_HUD_ENABLE = 130,
77
NOTIFY_ADD_COIN = 131,
78
NOTIFY_KILL_ENEMY = 132,
79
NOTIFY_SAVESLOT_SELECT = 133,
80
NOTIFY_FUTURE_PAST = 134,
81
NOTIFY_GOTO_FUTURE_PAST = 135,
82
NOTIFY_BOSS_END = 136,
83
NOTIFY_SPECIAL_END = 137,
84
NOTIFY_DEBUGPRINT = 138,
85
NOTIFY_KILL_BOSS = 139,
86
NOTIFY_TOUCH_EMERALD = 140,
87
NOTIFY_STATS_ENEMY = 141,
88
NOTIFY_STATS_CHARA_ACTION = 142,
89
NOTIFY_STATS_RING = 143,
90
NOTIFY_STATS_MOVIE = 144,
91
NOTIFY_STATS_PARAM_1 = 145,
92
NOTIFY_STATS_PARAM_2 = 146,
93
NOTIFY_CHARACTER_SELECT = 147,
94
NOTIFY_SPECIAL_RETRY = 148,
95
NOTIFY_TOUCH_CHECKPOINT = 149,
96
NOTIFY_ACT_FINISH = 150,
97
NOTIFY_1P_VS_SELECT = 151,
98
NOTIFY_CONTROLLER_SUPPORT = 152,
99
NOTIFY_STAGE_RETRY = 153,
100
NOTIFY_SOUND_TRACK = 154,
101
NOTIFY_GOOD_ENDING = 155,
102
NOTIFY_BACK_TO_MAINMENU = 156,
103
NOTIFY_LEVEL_SELECT_MENU = 157,
104
NOTIFY_PLAYER_SET = 158,
105
NOTIFY_EXTRAS_MODE = 159,
106
NOTIFY_SPIN_DASH_TYPE = 160,
107
NOTIFY_TIME_OVER = 161,
108
NOTIFY_TIMEATTACK_MODE = 162,
109
NOTIFY_STATS_BREAK_OBJECT = 163,
110
NOTIFY_STATS_SAVE_FUTURE = 164,
111
NOTIFY_STATS_CHARA_ACTION2 = 165,
112
};
113
114
void RSDK::Legacy::v4::NotifyCallback(int32 *callback, int32 *param1, int32 *param2, int32 *param3)
115
{
116
if (!callback || !param1)
117
return;
118
119
switch (*callback) {
120
default: PrintLog(PRINT_NORMAL, "NOTIFY: Unknown Callback -> %d", *param1); break;
121
case NOTIFY_DEATH_EVENT: PrintLog(PRINT_NORMAL, "NOTIFY: DeathEvent() -> %d", *param1); break;
122
case NOTIFY_TOUCH_SIGNPOST: PrintLog(PRINT_NORMAL, "NOTIFY: TouchSignPost() -> %d", *param1); break;
123
case NOTIFY_HUD_ENABLE: PrintLog(PRINT_NORMAL, "NOTIFY: HUDEnable() -> %d", *param1); break;
124
case NOTIFY_ADD_COIN:
125
PrintLog(PRINT_NORMAL, "NOTIFY: AddCoin() -> %d", *param1);
126
SetGlobalVariableByName("game.coinCount", GetGlobalVariableByName("game.coinCount") + *param1);
127
break;
128
case NOTIFY_KILL_ENEMY: PrintLog(PRINT_NORMAL, "NOTIFY: KillEnemy() -> %d", *param1); break;
129
case NOTIFY_SAVESLOT_SELECT: PrintLog(PRINT_NORMAL, "NOTIFY: SaveSlotSelect() -> %d", *param1); break;
130
case NOTIFY_FUTURE_PAST: PrintLog(PRINT_NORMAL, "NOTIFY: FuturePast() -> %d", *param1); break;
131
case NOTIFY_GOTO_FUTURE_PAST: PrintLog(PRINT_NORMAL, "NOTIFY: GotoFuturePast() -> %d", *param1); break;
132
case NOTIFY_BOSS_END: PrintLog(PRINT_NORMAL, "NOTIFY: BossEnd() -> %d", *param1); break;
133
case NOTIFY_SPECIAL_END: PrintLog(PRINT_NORMAL, "NOTIFY: SpecialEnd() -> %d", *param1); break;
134
case NOTIFY_DEBUGPRINT:
135
// Although there are instances of this being called from both CallNativeFunction2 and CallNativeFunction4 in Origins' scripts, there's no way we can tell which one was used here to handle possible errors
136
// Due to this, we'll only print param1 regardless of the opcode used
137
PrintLog(PRINT_NORMAL, "NOTIFY: DebugPrint() -> %d", *param1);
138
break;
139
case NOTIFY_KILL_BOSS: PrintLog(PRINT_NORMAL, "NOTIFY: KillBoss() -> %d", *param1); break;
140
case NOTIFY_TOUCH_EMERALD: PrintLog(PRINT_NORMAL, "NOTIFY: TouchEmerald() -> %d", *param1); break;
141
case NOTIFY_STATS_ENEMY: PrintLog(PRINT_NORMAL, "NOTIFY: StatsEnemy() -> %d, %d, %d", *param1, *param2, *param3); break;
142
case NOTIFY_STATS_CHARA_ACTION: PrintLog(PRINT_NORMAL, "NOTIFY: StatsCharaAction() -> %d, %d, %d", *param1, *param2, *param3); break;
143
case NOTIFY_STATS_RING: PrintLog(PRINT_NORMAL, "NOTIFY: StatsRing() -> %d", *param1); break;
144
case NOTIFY_STATS_MOVIE:
145
PrintLog(PRINT_NORMAL, "NOTIFY: StatsMovie() -> %d", *param1);
146
sceneInfo.activeCategory = 0;
147
sceneInfo.listPos = 0;
148
gameMode = ENGINE_MAINGAME;
149
stageMode = STAGEMODE_LOAD;
150
break;
151
case NOTIFY_STATS_PARAM_1: PrintLog(PRINT_NORMAL, "NOTIFY: StatsParam1() -> %d, %d, %d", *param1, *param2, *param3); break;
152
case NOTIFY_STATS_PARAM_2: PrintLog(PRINT_NORMAL, "NOTIFY: StatsParam2() -> %d", *param1); break;
153
case NOTIFY_CHARACTER_SELECT:
154
PrintLog(PRINT_NORMAL, "NOTIFY: CharacterSelect() -> %d", *param1);
155
SetGlobalVariableByName("game.callbackResult", 1);
156
SetGlobalVariableByName("game.continueFlag", 0);
157
break;
158
case NOTIFY_SPECIAL_RETRY:
159
PrintLog(PRINT_NORMAL, "NOTIFY: SpecialRetry() -> %d, %d, %d", *param1, *param2, *param3);
160
SetGlobalVariableByName("game.callbackResult", 1);
161
break;
162
case NOTIFY_TOUCH_CHECKPOINT: PrintLog(PRINT_NORMAL, "NOTIFY: TouchCheckpoint() -> %d", *param1); break;
163
case NOTIFY_ACT_FINISH: PrintLog(PRINT_NORMAL, "NOTIFY: ActFinish() -> %d", *param1); break;
164
case NOTIFY_1P_VS_SELECT: PrintLog(PRINT_NORMAL, "NOTIFY: 1PVSSelect() -> %d", *param1); break;
165
case NOTIFY_CONTROLLER_SUPPORT:
166
PrintLog(PRINT_NORMAL, "NOTIFY: ControllerSupport() -> %d", *param1);
167
SetGlobalVariableByName("game.callbackResult", 1);
168
break;
169
case NOTIFY_STAGE_RETRY: PrintLog(PRINT_NORMAL, "NOTIFY: StageRetry() -> %d", *param1); break;
170
case NOTIFY_SOUND_TRACK: PrintLog(PRINT_NORMAL, "NOTIFY: SoundTrack() -> %d", *param1); break;
171
case NOTIFY_GOOD_ENDING: PrintLog(PRINT_NORMAL, "NOTIFY: GoodEnding() -> %d", *param1); break;
172
case NOTIFY_BACK_TO_MAINMENU: PrintLog(PRINT_NORMAL, "NOTIFY: BackToMainMenu() -> %d", *param1); break;
173
case NOTIFY_LEVEL_SELECT_MENU: PrintLog(PRINT_NORMAL, "NOTIFY: LevelSelectMenu() -> %d", *param1); break;
174
case NOTIFY_PLAYER_SET: PrintLog(PRINT_NORMAL, "NOTIFY: PlayerSet() -> %d", *param1); break;
175
case NOTIFY_EXTRAS_MODE: PrintLog(PRINT_NORMAL, "NOTIFY: ExtrasMode() -> %d", *param1); break;
176
case NOTIFY_SPIN_DASH_TYPE: PrintLog(PRINT_NORMAL, "NOTIFY: SpindashType() -> %d", *param1); break;
177
case NOTIFY_TIME_OVER: PrintLog(PRINT_NORMAL, "NOTIFY: TimeOver() -> %d", *param1); break;
178
case NOTIFY_TIMEATTACK_MODE: PrintLog(PRINT_NORMAL, "NOTIFY: TimeAttackMode() -> %d", *param1); break;
179
case NOTIFY_STATS_BREAK_OBJECT: PrintLog(PRINT_NORMAL, "NOTIFY: StatsBreakObject() -> %d, %d", *param1, *param2); break;
180
case NOTIFY_STATS_SAVE_FUTURE: PrintLog(PRINT_NORMAL, "NOTIFY: StatsSaveFuture() -> %d", *param1); break;
181
case NOTIFY_STATS_CHARA_ACTION2: PrintLog(PRINT_NORMAL, "NOTIFY: StatsCharaAction2() -> %d, %d, %d", *param1, *param2, *param3); break;
182
}
183
}
184