Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Helpers/Options.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: Options Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectOptions *Options;
11
12
void Options_Update(void) {}
13
14
void Options_LateUpdate(void) {}
15
16
void Options_StaticUpdate(void) {}
17
18
void Options_Draw(void) {}
19
20
void Options_Create(void *data) {}
21
22
void Options_StageLoad(void)
23
{
24
#if !MANIA_USE_PLUS
25
Options->changed = false;
26
if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_DEV) {
27
Options_Reload();
28
}
29
else {
30
OptionsRAM *options = Options_GetOptionsRAM();
31
32
options->vSync = false;
33
options->windowed = false;
34
options->windowBorder = false;
35
options->tripleBuffering = false;
36
}
37
#endif
38
}
39
40
OptionsRAM *Options_GetOptionsRAM(void) { return (OptionsRAM *)globals->optionsRAM; }
41
42
void Options_Reload(void)
43
{
44
OptionsRAM *options = Options_GetOptionsRAM();
45
46
options->overrideLanguage = true;
47
48
options->screenShader = RSDK.GetVideoSetting(VIDEOSETTING_SHADERID) % 4;
49
options->volMusic = RSDK.GetVideoSetting(VIDEOSETTING_STREAM_VOL);
50
options->volSfx = RSDK.GetVideoSetting(VIDEOSETTING_SFX_VOL);
51
options->language = RSDK.GetVideoSetting(VIDEOSETTING_LANGUAGE);
52
options->vSync = RSDK.GetVideoSetting(VIDEOSETTING_VSYNC);
53
options->windowBorder = RSDK.GetVideoSetting(VIDEOSETTING_BORDERED);
54
options->windowed = RSDK.GetVideoSetting(VIDEOSETTING_WINDOWED);
55
options->tripleBuffering = RSDK.GetVideoSetting(VIDEOSETTING_TRIPLEBUFFERED);
56
57
Options_GetWinSize();
58
59
LogHelpers_Print("optionsPtr->screenShader = %d", options->screenShader);
60
LogHelpers_Print("optionsPtr->volMusic = %d", options->volMusic);
61
LogHelpers_Print("optionsPtr->volSfx = %d", options->volSfx);
62
LogHelpers_Print("optionsPtr->language = %d", options->language);
63
LogHelpers_Print("optionsPtr->overrideLanguage = %d", options->overrideLanguage);
64
LogHelpers_Print("optionsPtr->vsync = %d", options->vSync);
65
LogHelpers_Print("optionsPtr->tripleBuffering = %d", options->tripleBuffering);
66
LogHelpers_Print("optionsPtr->windowBorder = %d", options->windowBorder);
67
LogHelpers_Print("optionsPtr->windowed = %d", options->windowed);
68
LogHelpers_Print("optionsPtr->windowSize = %d", options->windowSize);
69
}
70
71
void Options_GetWinSize(void)
72
{
73
OptionsRAM *options = Options_GetOptionsRAM();
74
75
bool32 windowed = RSDK.GetVideoSetting(VIDEOSETTING_WINDOWED);
76
if (!windowed) {
77
options->windowSize = 4;
78
}
79
else {
80
int32 width = RSDK.GetVideoSetting(VIDEOSETTING_WINDOW_WIDTH);
81
82
if (width <= WIDE_SCR_XSIZE)
83
options->windowSize = 0;
84
else if (width <= WIDE_SCR_XSIZE * 2)
85
options->windowSize = 1;
86
else if (width <= WIDE_SCR_XSIZE * 3)
87
options->windowSize = 2;
88
else
89
options->windowSize = 3;
90
}
91
}
92
93
void Options_LoadCallback(bool32 success)
94
{
95
if (success) {
96
Localization->loaded = false;
97
98
Localization_LoadStrings();
99
UIWidgets_ApplyLanguage();
100
UIHeading_LoadSprites();
101
}
102
}
103
104
void Options_LoadFile(void (*callback)(bool32 success))
105
{
106
if (sku_platform != PLATFORM_PC && sku_platform != PLATFORM_DEV) {
107
if (globals->optionsLoaded != STATUS_CONTINUE) {
108
if (globals->optionsLoaded == STATUS_OK) {
109
if (callback)
110
callback(true);
111
}
112
else {
113
globals->optionsLoaded = STATUS_CONTINUE;
114
Options->loadEntityPtr = SceneInfo->entity;
115
Options->loadCallback = callback;
116
API_LoadUserFile("Options.bin", globals->optionsRAM, sizeof(globals->optionsRAM), Options_LoadOptionsCallback);
117
}
118
}
119
}
120
else {
121
globals->optionsLoaded = STATUS_OK;
122
if (callback)
123
callback(true);
124
}
125
}
126
127
#if MANIA_USE_PLUS
128
void Options_SaveFile(void (*callback)(bool32 success))
129
#else
130
void Options_SaveFile(void (*callback)(void))
131
#endif
132
{
133
if (Options->changed) {
134
if (sku_platform != PLATFORM_PC && sku_platform != PLATFORM_DEV) {
135
if (globals->optionsLoaded == STATUS_OK) {
136
Options->saveEntityPtr = SceneInfo->entity;
137
Options->saveCallback = callback;
138
139
#if MANIA_USE_PLUS
140
API_SaveUserFile("Options.bin", globals->optionsRAM, sizeof(globals->optionsRAM), Options_SaveOptionsCallback, false);
141
#else
142
API_SaveUserFile("Options.bin", globals->optionsRAM, sizeof(globals->optionsRAM), Options_SaveOptionsCallback);
143
#endif
144
}
145
else {
146
Options->changed = false;
147
#if MANIA_USE_PLUS
148
if (callback)
149
callback(false);
150
#else
151
if (callback)
152
callback();
153
#endif
154
}
155
156
return;
157
}
158
else {
159
#if MANIA_USE_PLUS
160
RSDK.SetVideoSetting(VIDEOSETTING_WRITE, true);
161
#else
162
APICallback_SaveSettingsINI();
163
#endif
164
Options_Reload();
165
}
166
}
167
168
#if MANIA_USE_PLUS
169
if (callback)
170
callback(true);
171
#else
172
if (callback)
173
callback();
174
#endif
175
}
176
177
void Options_SetLanguage(int32 language)
178
{
179
OptionsRAM *options = Options_GetOptionsRAM();
180
181
if (language >= 0) {
182
options->language = language;
183
options->overrideLanguage = true;
184
}
185
else {
186
options->language = -1;
187
options->overrideLanguage = false;
188
}
189
190
if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_DEV)
191
RSDK.SetVideoSetting(VIDEOSETTING_LANGUAGE, language);
192
193
Options->changed = true;
194
}
195
196
void Options_LoadValuesFromSettings(OptionsRAM *options)
197
{
198
Localization->language = options->overrideLanguage ? options->language : sku_language;
199
200
if (!options->overrideShader)
201
options->screenShader = RSDK.GetVideoSetting(VIDEOSETTING_SHADERID) % 4;
202
203
if (!options->overrideMusicVol)
204
options->volMusic = RSDK.GetVideoSetting(VIDEOSETTING_STREAM_VOL);
205
206
if (!options->overrideSfxVol)
207
options->volSfx = RSDK.GetVideoSetting(VIDEOSETTING_SFX_VOL);
208
}
209
210
void Options_LoadOptionsCallback(int32 status)
211
{
212
OptionsRAM *options = Options_GetOptionsRAM();
213
bool32 success = false;
214
215
#if MANIA_USE_PLUS
216
if (status == STATUS_OK || status == STATUS_NOTFOUND) {
217
#else
218
if (status) {
219
#endif
220
success = true;
221
globals->optionsLoaded = STATUS_OK;
222
223
LogHelpers_Print("dataPtr.language = %d", options->language);
224
LogHelpers_Print("dataPtr.overrideLanguage = %d", options->overrideLanguage);
225
Options_LoadValuesFromSettings(Options_GetOptionsRAM());
226
227
RSDK.SetVideoSetting(VIDEOSETTING_SHADERID, options->screenShader);
228
RSDK.SetVideoSetting(VIDEOSETTING_STREAM_VOL, options->volMusic);
229
RSDK.SetVideoSetting(VIDEOSETTING_SFX_VOL, options->volSfx);
230
}
231
else {
232
success = false;
233
globals->optionsLoaded = STATUS_ERROR;
234
}
235
236
if (Options->loadCallback) {
237
Entity *entStore = SceneInfo->entity;
238
if (Options->loadEntityPtr)
239
SceneInfo->entity = Options->loadEntityPtr;
240
Options->loadCallback(success);
241
SceneInfo->entity = entStore;
242
243
Options->loadCallback = NULL;
244
Options->loadEntityPtr = NULL;
245
}
246
}
247
248
void Options_SaveOptionsCallback(int32 status)
249
{
250
Options->changed = false;
251
if (Options->saveCallback) {
252
Entity *entStore = SceneInfo->entity;
253
if (Options->saveEntityPtr)
254
SceneInfo->entity = Options->saveEntityPtr;
255
256
#if MANIA_USE_PLUS
257
Options->saveCallback(status == STATUS_OK);
258
#else
259
Options->saveCallback();
260
#endif
261
SceneInfo->entity = entStore;
262
263
Options->saveCallback = NULL;
264
Options->saveEntityPtr = NULL;
265
}
266
}
267
268
#if GAME_INCLUDE_EDITOR
269
void Options_EditorDraw(void) {}
270
271
void Options_EditorLoad(void) {}
272
#endif
273
274
void Options_Serialize(void) {}
275
276