Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-1-2-2013-Decompilation
Path: blob/main/RSDKv4/NativeObjects/PauseMenu.cpp
817 views
1
#include "RetroEngine.hpp"
2
3
int pauseMenuButtonCount;
4
5
void PauseMenu_Create(void *objPtr)
6
{
7
RSDK_THIS(PauseMenu);
8
9
// code has been here from TitleScreen_Create due to the possibility of opening the dev menu before this loads :(
10
#if !RETRO_USE_ORIGINAL_CODE
11
int heading = -1, labelTex = -1, textTex = -1;
12
13
if (fontList[FONT_HEADING].count <= 2) {
14
if (Engine.useHighResAssets)
15
heading = LoadTexture("Data/Game/Menu/Heading_EN.png", TEXFMT_RGBA4444);
16
else
17
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
18
LoadBitmapFont("Data/Game/Menu/Heading_EN.fnt", FONT_HEADING, heading);
19
}
20
21
if (fontList[FONT_LABEL].count <= 2) {
22
if (Engine.useHighResAssets)
23
labelTex = LoadTexture("Data/Game/Menu/Label_EN.png", TEXFMT_RGBA4444);
24
else
25
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
26
LoadBitmapFont("Data/Game/Menu/Label_EN.fnt", FONT_LABEL, labelTex);
27
}
28
29
if (fontList[FONT_TEXT].count <= 2) {
30
textTex = LoadTexture("Data/Game/Menu/Text_EN.png", TEXFMT_RGBA4444);
31
LoadBitmapFont("Data/Game/Menu/Text_EN.fnt", FONT_TEXT, textTex);
32
}
33
34
switch (Engine.language) {
35
case RETRO_JP:
36
if (heading >= 0) {
37
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
38
LoadBitmapFont("Data/Game/Menu/Heading_JA.fnt", FONT_HEADING, heading);
39
}
40
41
if (labelTex >= 0) {
42
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
43
LoadBitmapFont("Data/Game/Menu/Label_JA.fnt", FONT_LABEL, labelTex);
44
}
45
46
if (textTex >= 0) {
47
textTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
48
LoadBitmapFont("Data/Game/Menu/Text_JA.fnt", FONT_TEXT, textTex);
49
}
50
break;
51
case RETRO_RU:
52
if (heading >= 0) {
53
if (Engine.useHighResAssets)
54
heading = LoadTexture("Data/Game/Menu/Heading_RU.png", TEXFMT_RGBA4444);
55
else
56
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
57
LoadBitmapFont("Data/Game/Menu/Heading_RU.fnt", FONT_HEADING, heading);
58
}
59
60
if (labelTex >= 0) {
61
if (Engine.useHighResAssets)
62
labelTex = LoadTexture("Data/Game/Menu/Label_RU.png", TEXFMT_RGBA4444);
63
else
64
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
65
}
66
break;
67
case RETRO_KO:
68
if (heading >= 0) {
69
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
70
LoadBitmapFont("Data/Game/Menu/Heading_KO.fnt", FONT_HEADING, heading);
71
}
72
73
if (labelTex >= 0) {
74
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
75
LoadBitmapFont("Data/Game/Menu/Label_KO.fnt", FONT_LABEL, labelTex);
76
}
77
78
if (textTex >= 0) {
79
textTex = LoadTexture("Data/Game/Menu/Text_KO.png", TEXFMT_RGBA4444);
80
LoadBitmapFont("Data/Game/Menu/Text_KO.fnt", FONT_TEXT, textTex);
81
}
82
break;
83
case RETRO_ZH:
84
if (heading >= 0) {
85
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
86
LoadBitmapFont("Data/Game/Menu/Heading_ZH.fnt", FONT_HEADING, heading);
87
}
88
89
if (labelTex >= 0) {
90
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
91
LoadBitmapFont("Data/Game/Menu/Label_ZH.fnt", FONT_LABEL, labelTex);
92
}
93
94
if (textTex >= 0) {
95
textTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
96
LoadBitmapFont("Data/Game/Menu/Text_ZH.fnt", FONT_TEXT, textTex);
97
}
98
break;
99
case RETRO_ZS:
100
if (heading >= 0) {
101
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
102
LoadBitmapFont("Data/Game/Menu/Heading_ZHS.fnt", FONT_HEADING, heading);
103
}
104
105
if (labelTex >= 0) {
106
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
107
LoadBitmapFont("Data/Game/Menu/Label_ZHS.fnt", FONT_LABEL, labelTex);
108
}
109
110
if (textTex >= 0) {
111
textTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
112
LoadBitmapFont("Data/Game/Menu/Text_ZHS.fnt", FONT_TEXT, textTex);
113
}
114
break;
115
default: break;
116
}
117
#endif
118
119
pauseMenuButtonCount = PMB_COUNT;
120
#if !RETRO_USE_ORIGINAL_CODE
121
if (!Engine.devMenu)
122
pauseMenuButtonCount--;
123
#endif
124
125
self->retroGameLoop = (NativeEntity_RetroGameLoop *)GetNativeObject(0);
126
self->label = CREATE_ENTITY(TextLabel);
127
self->label->state = TEXTLABEL_STATE_IDLE;
128
self->label->z = 0.0;
129
self->label->scale = 0.2;
130
self->label->alpha = 0;
131
self->label->fontID = FONT_HEADING;
132
SetStringToFont(self->label->text, strPause, FONT_HEADING);
133
self->label->alignOffset = 512.0;
134
self->renderRot = DegreesToRad(22.5);
135
MatrixRotateYF(&self->label->renderMatrix, DegreesToRad(22.5));
136
MatrixTranslateXYZF(&self->matrix, -128.0, 80.0, 160.0);
137
MatrixMultiplyF(&self->label->renderMatrix, &self->matrix);
138
self->label->useRenderMatrix = true;
139
self->buttonX = ((SCREEN_CENTERX_F + -160.0) * -0.5) + -128.0;
140
for (int i = 0; i < pauseMenuButtonCount; ++i) {
141
NativeEntity_SubMenuButton *button = CREATE_ENTITY(SubMenuButton);
142
self->buttons[i] = button;
143
button->scale = 0.1;
144
button->matZ = 0.0;
145
button->matXOff = 512.0;
146
button->textY = -4.0;
147
self->buttonRot[i] = DegreesToRad(16.0);
148
MatrixRotateYF(&button->matrix, DegreesToRad(16.0));
149
MatrixTranslateXYZF(&self->matrix, self->buttonX, 48.0 - i * 30, 160.0);
150
MatrixMultiplyF(&self->buttons[i]->matrix, &self->matrix);
151
button->symbol = 1;
152
button->useMatrix = true;
153
}
154
if ((GetGlobalVariableByName("player.lives") <= 1 && GetGlobalVariableByName("options.gameMode") <= 1) || !activeStageList
155
|| GetGlobalVariableByName("options.attractMode") == 1 || GetGlobalVariableByName("options.vsMode") == 1) {
156
self->buttons[PMB_RESTART]->r = 0x80;
157
self->buttons[PMB_RESTART]->g = 0x80;
158
self->buttons[PMB_RESTART]->b = 0x80;
159
}
160
SetStringToFont(self->buttons[PMB_CONTINUE]->text, strContinue, FONT_LABEL);
161
SetStringToFont(self->buttons[PMB_RESTART]->text, strRestart, FONT_LABEL);
162
SetStringToFont(self->buttons[PMB_SETTINGS]->text, strSettings, FONT_LABEL);
163
SetStringToFont(self->buttons[PMB_EXIT]->text, strExit, FONT_LABEL);
164
#if !RETRO_USE_ORIGINAL_CODE
165
if (Engine.devMenu)
166
SetStringToFont(self->buttons[PMB_DEVMENU]->text, strDevMenu, FONT_LABEL);
167
#endif
168
self->textureCircle = LoadTexture("Data/Game/Menu/Circle.png", TEXFMT_RGBA4444);
169
self->rotationY = 0.0;
170
self->rotYOff = DegreesToRad(-16.0);
171
self->matrixX = 0.0;
172
self->matrixY = 0.0;
173
self->matrixZ = 160.0;
174
self->width = (1.75 * SCREEN_CENTERX_F) - ((SCREEN_CENTERX_F - 160) * 2);
175
if (Engine.gameDeviceType == RETRO_MOBILE)
176
self->textureDPad = LoadTexture("Data/Game/Menu/VirtualDPad.png", TEXFMT_RGBA8888);
177
self->dpadY = 104.0;
178
self->state = PAUSEMENU_STATE_ENTER;
179
self->miniPauseDisabled = true;
180
self->dpadX = SCREEN_CENTERX_F - 76.0;
181
self->dpadXSpecial = SCREEN_CENTERX_F - 52.0;
182
}
183
void PauseMenu_Main(void *objPtr)
184
{
185
RSDK_THIS(PauseMenu);
186
switch (self->state) {
187
case PAUSEMENU_STATE_SETUP: {
188
self->timer += Engine.deltaTime;
189
if (self->timer > 1.0) {
190
self->timer = 0.0;
191
self->state = PAUSEMENU_STATE_ENTER;
192
}
193
break;
194
}
195
case PAUSEMENU_STATE_ENTER: {
196
if (self->unusedAlpha < 0x100)
197
self->unusedAlpha += 8;
198
self->timer += Engine.deltaTime * 2;
199
self->label->alignOffset = self->label->alignOffset / (1.125 * (60.0 * Engine.deltaTime));
200
self->label->alpha = (256.0 * self->timer);
201
for (int i = 0; i < pauseMenuButtonCount; ++i)
202
self->buttons[i]->matXOff += ((-176.0 - self->buttons[i]->matXOff) / (16.0 * (60.0 * Engine.deltaTime)));
203
self->matrixX += ((self->width - self->matrixX) / ((60.0 * Engine.deltaTime) * 12.0));
204
self->matrixZ += ((512.0 - self->matrixZ) / ((60.0 * Engine.deltaTime) * 12.0));
205
self->rotationY += ((self->rotYOff - self->rotationY) / (16.0 * (60.0 * Engine.deltaTime)));
206
if (self->timer > 1.0) {
207
self->timer = 0.0;
208
self->state = PAUSEMENU_STATE_MAIN;
209
}
210
break;
211
}
212
case PAUSEMENU_STATE_MAIN: {
213
CheckKeyDown(&keyDown);
214
CheckKeyPress(&keyPress);
215
if (usePhysicalControls) {
216
if (touches > 0) {
217
usePhysicalControls = false;
218
}
219
else {
220
if (keyPress.up) {
221
PlaySfxByName("Menu Move", false);
222
self->buttonSelected--;
223
if (self->buttonSelected < PMB_CONTINUE)
224
self->buttonSelected = pauseMenuButtonCount - 1;
225
}
226
else if (keyPress.down) {
227
PlaySfxByName("Menu Move", false);
228
self->buttonSelected++;
229
if (self->buttonSelected >= pauseMenuButtonCount)
230
self->buttonSelected = PMB_CONTINUE;
231
}
232
for (int i = 0; i < pauseMenuButtonCount; ++i) self->buttons[i]->b = self->buttons[i]->r;
233
self->buttons[self->buttonSelected]->b = 0;
234
if (self->buttons[self->buttonSelected]->g > 0x80 && (keyPress.start || keyPress.A)) {
235
PlaySfxByName("Menu Select", false);
236
self->buttons[self->buttonSelected]->state = SUBMENUBUTTON_STATE_FLASHING2;
237
self->buttons[self->buttonSelected]->b = 0xFF;
238
self->state = PAUSEMENU_STATE_ACTION;
239
}
240
}
241
}
242
else {
243
for (int i = 0; i < pauseMenuButtonCount; ++i) {
244
if (touches > 0) {
245
if (self->buttons[i]->g > 0x80)
246
self->buttons[i]->b = (CheckTouchRect(-80.0, 48.0 - i * 30, 112.0, 12.0) < 0) * 0xFF;
247
else
248
self->buttons[i]->b = 0x80;
249
}
250
else if (!self->buttons[i]->b) {
251
self->buttonSelected = i;
252
PlaySfxByName("Menu Select", false);
253
self->buttons[i]->state = SUBMENUBUTTON_STATE_FLASHING2;
254
self->buttons[i]->b = 0xFF;
255
self->state = PAUSEMENU_STATE_ACTION;
256
break;
257
}
258
}
259
260
if (self->state == PAUSEMENU_STATE_MAIN && (keyDown.up || keyDown.down)) {
261
self->buttonSelected = PMB_CONTINUE;
262
usePhysicalControls = true;
263
}
264
}
265
if (touches > 0) {
266
if (!self->miniPauseDisabled && CheckTouchRect(SCREEN_CENTERX_F, SCREEN_CENTERY_F, 112.0, 24.0) >= 0) {
267
self->buttonSelected = PMB_CONTINUE;
268
PlaySfxByName("Resume", false);
269
self->state = PAUSEMENU_STATE_ACTION;
270
}
271
}
272
else {
273
self->miniPauseDisabled = false;
274
if (self->makeSound) {
275
PlaySfxByName("Menu Select", false);
276
self->makeSound = false;
277
}
278
}
279
break;
280
}
281
case PAUSEMENU_STATE_CONTINUE: {
282
self->label->alignOffset += 10.0 * (60.0 * Engine.deltaTime);
283
self->timer += Engine.deltaTime * 2;
284
for (int i = 0; i < pauseMenuButtonCount; ++i) self->buttons[i]->matXOff += ((12.0 + i) * (60.0 * Engine.deltaTime));
285
self->matrixX += ((-self->matrixX) / (5.0 * (60.0 * Engine.deltaTime)));
286
self->matrixZ += ((160.0 - self->matrixZ) / (5.0 * (60.0 * Engine.deltaTime)));
287
self->rotationY += ((self->rotYOff - self->rotationY) / ((60.0 * Engine.deltaTime) * 6.0));
288
289
if (self->timer > 0.9) {
290
mixFiltersOnJekyll = true;
291
RenderRetroBuffer(64, 160.0);
292
if (Engine.gameDeviceType == RETRO_MOBILE) {
293
if (activeStageList == STAGELIST_SPECIAL)
294
RenderImage(self->dpadXSpecial, self->dpadY, 160.0, 0.25, 0.25, 32.0, 32.0, 64.0, 64.0, 160.0, 258.0, 255, self->textureDPad);
295
else
296
RenderImage(self->dpadX, self->dpadY, 160.0, 0.25, 0.25, 32.0, 32.0, 64.0, 64.0, 160.0, 258.0, 255, self->textureDPad);
297
}
298
self->timer = 0.0;
299
ClearNativeObjects();
300
CREATE_ENTITY(RetroGameLoop);
301
if (Engine.gameDeviceType == RETRO_MOBILE)
302
CREATE_ENTITY(VirtualDPad)->pauseAlpha = 255;
303
ResumeSound();
304
Engine.gameMode = ENGINE_MAINGAME;
305
return;
306
}
307
break;
308
}
309
case PAUSEMENU_STATE_ACTION: {
310
if (!self->buttons[self->buttonSelected]->state) {
311
switch (self->buttonSelected) {
312
case PMB_CONTINUE:
313
self->state = PAUSEMENU_STATE_CONTINUE;
314
self->rotYOff = 0.0;
315
break;
316
case PMB_RESTART:
317
self->dialog = CREATE_ENTITY(DialogPanel);
318
SetStringToFont(self->dialog->text, GetGlobalVariableByName("options.gameMode") ? strRestartMessage : strNSRestartMessage,
319
FONT_TEXT);
320
self->state = PAUSEMENU_STATE_RESTART;
321
break;
322
case PMB_SETTINGS:
323
self->state = PAUSEMENU_STATE_ENTERSUBMENU;
324
self->rotInc = 0.0;
325
self->renderRotMax = DegreesToRad(-90.0);
326
for (int i = 0; i < pauseMenuButtonCount; ++i) {
327
self->rotMax[i] = DegreesToRad(-90.0);
328
self->buttonRotY[i] = 0.02 * (i + 1);
329
}
330
331
break;
332
case PMB_EXIT:
333
self->dialog = CREATE_ENTITY(DialogPanel);
334
SetStringToFont(self->dialog->text, GetGlobalVariableByName("options.gameMode") ? strExitMessage : strNSExitMessage,
335
FONT_TEXT);
336
self->state = PAUSEMENU_STATE_EXIT;
337
if (Engine.gameType == GAME_SONIC1)
338
SetGlobalVariableByName("timeAttack.result", 1000000);
339
break;
340
#if !RETRO_USE_ORIGINAL_CODE
341
case PMB_DEVMENU:
342
self->state = PAUSEMENU_STATE_DEVMENU;
343
self->timer = 0.0;
344
break;
345
#endif
346
default: break;
347
}
348
}
349
break;
350
}
351
case PAUSEMENU_STATE_ENTERSUBMENU: {
352
if (self->renderRot > self->renderRotMax) {
353
self->rotInc -= 0.0025 * (Engine.deltaTime * 60.0);
354
self->renderRot += (Engine.deltaTime * 60.0) * self->rotInc;
355
self->rotInc -= 0.0025 * (Engine.deltaTime * 60.0);
356
MatrixRotateYF(&self->label->renderMatrix, self->renderRot);
357
MatrixTranslateXYZF(&self->matrix, self->buttonX, 80.0, 160.0);
358
MatrixMultiplyF(&self->label->renderMatrix, &self->matrix);
359
}
360
for (int i = 0; i < pauseMenuButtonCount; ++i) {
361
if (self->buttonRot[i] > self->rotMax[i]) {
362
self->buttonRotY[i] -= 0.0025 * (60.0 * Engine.deltaTime);
363
if (self->buttonRotY[i] < 0.0) {
364
self->buttonRot[i] += ((60.0 * Engine.deltaTime) * self->buttonRotY[i]);
365
}
366
self->buttonRotY[i] -= 0.0025 * (60.0 * Engine.deltaTime); // do it again ????
367
MatrixRotateYF(&self->buttons[i]->matrix, self->buttonRot[i]);
368
MatrixTranslateXYZF(&self->matrix, self->buttonX, 48.0 - i * 30, 160.0);
369
MatrixMultiplyF(&self->buttons[i]->matrix, &self->matrix);
370
}
371
}
372
if (self->rotMax[pauseMenuButtonCount - 1] >= self->buttonRot[pauseMenuButtonCount - 1]) {
373
self->state = PAUSEMENU_STATE_SUBMENU;
374
375
self->rotInc = 0.0;
376
self->renderRotMax = DegreesToRad(22.5);
377
for (int i = 0; i < pauseMenuButtonCount; ++i) {
378
self->rotMax[i] = DegreesToRad(16.0);
379
self->buttonRotY[i] = -0.02 * (i + 1);
380
}
381
if (self->buttonSelected == 2) {
382
self->settingsScreen = CREATE_ENTITY(SettingsScreen);
383
self->settingsScreen->optionsMenu = (NativeEntity_OptionsMenu *)self;
384
self->settingsScreen->isPauseMenu = 1;
385
}
386
}
387
self->matrixX += ((1024.0 - self->matrixX) / ((60.0 * Engine.deltaTime) * 16.0));
388
break;
389
}
390
case PAUSEMENU_STATE_SUBMENU: break;
391
case PAUSEMENU_STATE_EXITSUBMENU: {
392
if (self->renderRotMax > self->renderRot) {
393
self->rotInc += 0.0025 * (Engine.deltaTime * 60.0);
394
self->renderRot += (Engine.deltaTime * 60.0) * self->rotInc;
395
self->rotInc += 0.0025 * (Engine.deltaTime * 60.0);
396
MatrixRotateYF(&self->label->renderMatrix, self->renderRot);
397
MatrixTranslateXYZF(&self->matrix, self->buttonX, 80.0, 160.0);
398
MatrixMultiplyF(&self->label->renderMatrix, &self->matrix);
399
}
400
401
for (int i = 0; i < pauseMenuButtonCount; ++i) {
402
if (self->rotMax[i] > self->buttonRot[i]) {
403
self->buttonRotY[i] += 0.0025 * (60.0 * Engine.deltaTime);
404
if (self->buttonRotY[i] > 0.0)
405
self->buttonRot[i] += ((60.0 * Engine.deltaTime) * self->buttonRotY[i]);
406
self->buttonRotY[i] += 0.0025 * (60.0 * Engine.deltaTime);
407
if (self->buttonRot[i] > self->rotMax[i])
408
self->buttonRot[i] = self->rotMax[i];
409
MatrixRotateYF(&self->buttons[i]->matrix, self->buttonRot[i]);
410
MatrixTranslateXYZF(&self->matrix, self->buttonX, 48.0 - i * 30, 160.0);
411
MatrixMultiplyF(&self->buttons[i]->matrix, &self->matrix);
412
}
413
}
414
415
float div = (60.0 * Engine.deltaTime) * 16.0;
416
self->matrixX += (((self->width - 32.0) - self->matrixX) / div);
417
if (self->width - 16.0 > self->matrixX) {
418
self->matrixX = self->width - 16.0;
419
self->state = PAUSEMENU_STATE_MAIN;
420
}
421
break;
422
}
423
case PAUSEMENU_STATE_RESTART: {
424
if (self->dialog->selection == DLG_YES) {
425
self->state = PAUSEMENU_STATE_SUBMENU;
426
Engine.gameMode = ENGINE_EXITPAUSE;
427
stageMode = STAGEMODE_LOAD;
428
if (GetGlobalVariableByName("options.gameMode") <= 1) {
429
SetGlobalVariableByName("player.lives", GetGlobalVariableByName("player.lives") - 1);
430
}
431
if (activeStageList != STAGELIST_SPECIAL) {
432
SetGlobalVariableByName("lampPostID", 0);
433
SetGlobalVariableByName("starPostID", 0);
434
}
435
self->dialog->state = DIALOGPANEL_STATE_IDLE;
436
StopMusic(true);
437
CREATE_ENTITY(FadeScreen);
438
break;
439
}
440
if (self->dialog->selection == DLG_NO)
441
self->state = PAUSEMENU_STATE_MAIN;
442
break;
443
}
444
case PAUSEMENU_STATE_EXIT: {
445
if (self->dialog->selection == DLG_YES) {
446
self->state = PAUSEMENU_STATE_SUBMENU;
447
#if !RETRO_USE_ORIGINAL_CODE
448
if (skipStartMenu) {
449
Engine.gameMode = ENGINE_MAINGAME;
450
self->dialog->state = DIALOGPANEL_STATE_IDLE;
451
NativeEntity_FadeScreen *fadeout = CREATE_ENTITY(FadeScreen);
452
fadeout->state = FADESCREEN_STATE_GAMEFADEOUT;
453
activeStageList = STAGELIST_PRESENTATION;
454
stageListPosition = 0;
455
stageMode = STAGEMODE_LOAD;
456
}
457
else {
458
#endif
459
Engine.gameMode = (GetGlobalVariableByName("options.gameMode") > 1) + ENGINE_ENDGAME;
460
self->dialog->state = DIALOGPANEL_STATE_IDLE;
461
CREATE_ENTITY(FadeScreen);
462
#if !RETRO_USE_ORIGINAL_CODE
463
}
464
#endif
465
}
466
else {
467
if (self->dialog->selection == DLG_YES || self->dialog->selection == DLG_NO || self->dialog->selection == DLG_OK) {
468
self->state = PAUSEMENU_STATE_MAIN;
469
self->unused2 = 50;
470
}
471
}
472
break;
473
}
474
#if !RETRO_USE_ORIGINAL_CODE
475
case PAUSEMENU_STATE_DEVMENU:
476
self->timer += Engine.deltaTime;
477
if (self->timer > 0.5) {
478
if (!self->devMenuFade) {
479
self->devMenuFade = CREATE_ENTITY(FadeScreen);
480
self->devMenuFade->state = FADESCREEN_STATE_FADEOUT;
481
}
482
if (!self->devMenuFade->delay || self->devMenuFade->timer >= self->devMenuFade->delay) {
483
ClearNativeObjects();
484
RenderRect(-SCREEN_CENTERX_F, SCREEN_CENTERY_F, 160.0, SCREEN_XSIZE_F, SCREEN_YSIZE_F, 0, 0, 0, 255);
485
CREATE_ENTITY(RetroGameLoop);
486
if (Engine.gameDeviceType == RETRO_MOBILE)
487
CREATE_ENTITY(VirtualDPad);
488
Engine.gameMode = ENGINE_INITDEVMENU;
489
return;
490
}
491
}
492
break;
493
#endif
494
default: break;
495
}
496
497
SetRenderBlendMode(RENDER_BLEND_NONE);
498
NewRenderState();
499
MatrixRotateYF(&self->matrixTemp, self->rotationY);
500
MatrixTranslateXYZF(&self->matrix, self->matrixX, self->matrixY, self->matrixZ);
501
MatrixMultiplyF(&self->matrixTemp, &self->matrix);
502
SetRenderMatrix(&self->matrixTemp);
503
RenderRect(-SCREEN_CENTERX_F - 4.0, SCREEN_CENTERY_F + 4.0, 0.0, SCREEN_XSIZE_F + 8.0, SCREEN_YSIZE_F + 8.0, 0, 0, 0, 255);
504
RenderRetroBuffer(64, 0.0);
505
NewRenderState();
506
SetRenderMatrix(NULL);
507
if (Engine.gameDeviceType == RETRO_MOBILE && self->state != PAUSEMENU_STATE_SUBMENU) {
508
if (activeStageList == STAGELIST_SPECIAL)
509
RenderImage(self->dpadXSpecial, self->dpadY, 160.0, 0.25, 0.25, 32.0, 32.0, 64.0, 64.0, 160.0, 258.0, 255, self->textureDPad);
510
else
511
RenderImage(self->dpadX, self->dpadY, 160.0, 0.25, 0.25, 32.0, 32.0, 64.0, 64.0, 160.0, 258.0, 255, self->textureDPad);
512
}
513
SetRenderBlendMode(RENDER_BLEND_ALPHA);
514
NewRenderState();
515
}
516
517