Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-1-2-2013-Decompilation
Path: blob/main/RSDKv4/NativeObjects/MultiplayerScreen.cpp
817 views
1
#include "RetroEngine.hpp"
2
3
#if !RETRO_USE_ORIGINAL_CODE && RETRO_USE_NETWORKING
4
5
void MultiplayerScreen_Create(void *objPtr)
6
{
7
if (skipStartMenu) {
8
// code has been copied here from SegaSplash_Create due to the possibility of loading the 2P stage without the HW menus >:(
9
ResetBitmapFonts();
10
int heading = 0, labelTex = 0, textTex = 0;
11
12
if (Engine.useHighResAssets)
13
heading = LoadTexture("Data/Game/Menu/Heading_EN.png", TEXFMT_RGBA4444);
14
else
15
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
16
LoadBitmapFont("Data/Game/Menu/Heading_EN.fnt", FONT_HEADING, heading);
17
18
if (Engine.useHighResAssets)
19
labelTex = LoadTexture("Data/Game/Menu/Label_EN.png", TEXFMT_RGBA4444);
20
else
21
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
22
LoadBitmapFont("Data/Game/Menu/Label_EN.fnt", FONT_LABEL, labelTex);
23
24
textTex = LoadTexture("Data/Game/Menu/Text_EN.png", TEXFMT_RGBA4444);
25
LoadBitmapFont("Data/Game/Menu/Text_EN.fnt", FONT_TEXT, textTex);
26
27
switch (Engine.language) {
28
case RETRO_JP:
29
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
30
LoadBitmapFont("Data/Game/Menu/Heading_JA.fnt", FONT_HEADING, heading);
31
32
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
33
LoadBitmapFont("Data/Game/Menu/Label_JA.fnt", FONT_LABEL, labelTex);
34
35
textTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
36
LoadBitmapFont("Data/Game/Menu/Text_JA.fnt", FONT_TEXT, textTex);
37
break;
38
case RETRO_RU:
39
if (Engine.useHighResAssets)
40
heading = LoadTexture("Data/Game/Menu/Heading_RU.png", TEXFMT_RGBA4444);
41
else
42
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
43
LoadBitmapFont("Data/Game/Menu/Heading_RU.fnt", FONT_HEADING, heading);
44
45
if (Engine.useHighResAssets)
46
labelTex = LoadTexture("Data/Game/Menu/Label_RU.png", TEXFMT_RGBA4444);
47
else
48
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
49
LoadBitmapFont("Data/Game/Menu/Label_RU.fnt", FONT_LABEL, labelTex);
50
break;
51
case RETRO_KO:
52
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
53
LoadBitmapFont("Data/Game/Menu/Heading_KO.fnt", FONT_HEADING, heading);
54
55
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
56
LoadBitmapFont("Data/Game/Menu/Label_KO.fnt", FONT_LABEL, labelTex);
57
58
textTex = LoadTexture("Data/Game/Menu/Text_KO.png", TEXFMT_RGBA4444);
59
LoadBitmapFont("Data/Game/Menu/Text_KO.fnt", FONT_TEXT, textTex);
60
break;
61
case RETRO_ZH:
62
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
63
LoadBitmapFont("Data/Game/Menu/Heading_ZH.fnt", FONT_HEADING, heading);
64
65
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
66
LoadBitmapFont("Data/Game/Menu/Label_ZH.fnt", FONT_LABEL, labelTex);
67
68
textTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
69
LoadBitmapFont("Data/Game/Menu/Text_ZH.fnt", FONT_TEXT, textTex);
70
break;
71
case RETRO_ZS:
72
heading = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
73
LoadBitmapFont("Data/Game/Menu/Heading_ZHS.fnt", FONT_HEADING, heading);
74
labelTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
75
LoadBitmapFont("Data/Game/Menu/Label_ZHS.fnt", FONT_LABEL, labelTex);
76
textTex = LoadTexture("Data/Game/Menu/[email protected]", TEXFMT_RGBA4444);
77
LoadBitmapFont("Data/Game/Menu/Text_ZHS.fnt", FONT_TEXT, textTex);
78
break;
79
default: break;
80
}
81
}
82
83
RSDK_THIS(MultiplayerScreen);
84
85
self->state = MULTIPLAYERSCREEN_STATE_ENTER;
86
87
self->label = CREATE_ENTITY(TextLabel);
88
self->label->useRenderMatrix = true;
89
self->label->fontID = FONT_HEADING;
90
self->label->scale = 0.2;
91
self->label->alpha = 256;
92
self->label->x = -144.0;
93
self->label->y = 100.0;
94
self->label->z = 16.0;
95
self->label->state = TEXTLABEL_STATE_IDLE;
96
SetStringToFont8(self->label->text, "MULTIPLAYER", FONT_HEADING);
97
98
self->meshPanel = LoadMesh("Data/Game/Models/Panel.bin", -2);
99
SetMeshVertexColors(self->meshPanel, 0, 0, 0, 0xC0);
100
self->textureArrows = LoadTexture("Data/Game/Menu/ArrowButtons.png", TEXFMT_RGBA4444);
101
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST] = CREATE_ENTITY(PushButton);
102
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST]->useRenderMatrix = true;
103
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST]->x = 0.0;
104
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST]->y = 20.0;
105
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST]->z = 0.0;
106
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST]->scale = 0.25;
107
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST]->bgColor = 0x00A048;
108
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST]->bgColorSelected = 0x00C060;
109
SetStringToFont8(self->buttons[0]->text, "HOST", FONT_LABEL);
110
111
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN] = CREATE_ENTITY(PushButton);
112
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN]->useRenderMatrix = true;
113
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN]->x = 0.0;
114
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN]->y = -20.0;
115
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN]->z = 0.0;
116
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN]->scale = 0.25;
117
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN]->bgColor = 0x00A048;
118
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN]->bgColorSelected = 0x00C060;
119
SetStringToFont8(self->buttons[1]->text, "JOIN", FONT_LABEL);
120
121
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY] = CREATE_ENTITY(PushButton);
122
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->useRenderMatrix = true;
123
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->x = 0.0;
124
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->y = -56.0;
125
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->z = 0.0;
126
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->scale = 0.175;
127
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->bgColor = 0x00A048;
128
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->bgColorSelected = 0x00C060;
129
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->alpha = 0;
130
SetStringToFont8(self->buttons[2]->text, "COPY", FONT_LABEL);
131
132
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM] = CREATE_ENTITY(PushButton);
133
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->useRenderMatrix = true;
134
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->x = -56.0;
135
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->y = -56.0;
136
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->z = 0.0;
137
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->scale = 0.175;
138
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->bgColor = 0x00A048;
139
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->bgColorSelected = 0x00C060;
140
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->alpha = 0;
141
SetStringToFont8(self->buttons[3]->text, "JOIN ROOM", FONT_LABEL);
142
143
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE] = CREATE_ENTITY(PushButton);
144
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->useRenderMatrix = true;
145
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->x = 64.0;
146
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->y = -56.0;
147
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->z = 0.0;
148
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->scale = 0.175;
149
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->bgColor = 0x00A048;
150
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->bgColorSelected = 0x00C060;
151
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->alpha = 0;
152
SetStringToFont8(self->buttons[4]->text, "PASTE", FONT_LABEL);
153
154
for (int i = 0; i < 3; ++i) {
155
self->codeLabel[i] = CREATE_ENTITY(TextLabel);
156
self->codeLabel[i]->useRenderMatrix = true;
157
self->codeLabel[i]->fontID = FONT_LABEL;
158
self->codeLabel[i]->scale = 0.15;
159
self->codeLabel[i]->alpha = 0;
160
self->codeLabel[i]->x = 0;
161
self->codeLabel[i]->y = 0;
162
self->codeLabel[i]->z = 16.0;
163
self->codeLabel[i]->state = TEXTLABEL_STATE_IDLE;
164
}
165
166
SetStringToFont8(self->codeLabel[0]->text, "ROOM CODE", self->codeLabel[0]->fontID);
167
self->codeLabel[0]->alignPtr(self->codeLabel[0], ALIGN_CENTER);
168
169
SetStringToFont8(self->codeLabel[1]->text, "UNKNOWN", self->codeLabel[1]->fontID);
170
self->codeLabel[1]->alignPtr(self->codeLabel[1], ALIGN_CENTER);
171
self->codeLabel[1]->y -= 20.0f;
172
173
self->codeLabel[2]->y = 48.0f;
174
self->codeLabel[2]->scale = 0.20f;
175
SetStringToFont8(self->codeLabel[2]->text, "WAITING FOR 2P...", self->codeLabel[2]->fontID);
176
self->codeLabel[2]->alignPtr(self->codeLabel[2], ALIGN_CENTER);
177
178
char codeBuf[0x8];
179
sprintf(codeBuf, "%X", 0);
180
181
for (int i = 0; i < 8; ++i) {
182
self->enterCodeLabel[i] = CREATE_ENTITY(TextLabel);
183
self->enterCodeLabel[i]->useRenderMatrix = true;
184
self->enterCodeLabel[i]->fontID = FONT_LABEL;
185
self->enterCodeLabel[i]->scale = 0.25;
186
self->enterCodeLabel[i]->alpha = 0;
187
self->enterCodeLabel[i]->x = -102.0f + (i * 27.2) + 8.0f;
188
self->enterCodeLabel[i]->y = 0;
189
self->enterCodeLabel[i]->z = 16.0;
190
self->enterCodeLabel[i]->state = TEXTLABEL_STATE_IDLE;
191
192
self->enterCodeLabel[i]->r = 0xFF;
193
self->enterCodeLabel[i]->g = 0xFF;
194
self->enterCodeLabel[i]->b = 0x00;
195
196
SetStringToFont8(self->enterCodeLabel[i]->text, codeBuf, self->enterCodeLabel[i]->fontID);
197
self->enterCodeLabel[i]->alignPtr(self->enterCodeLabel[i], ALIGN_CENTER);
198
}
199
for (int i = 0; i < 2; ++i) {
200
self->enterCodeSlider[i] = CREATE_ENTITY(TextLabel);
201
self->enterCodeSlider[i]->useRenderMatrix = true;
202
self->enterCodeSlider[i]->fontID = FONT_LABEL;
203
self->enterCodeSlider[i]->scale = 0.175;
204
self->enterCodeSlider[i]->alpha = 0;
205
// self->enterCodeSlider[i]->textX = -102.0f + (i * 27.2) + 8.0f;
206
self->enterCodeSlider[i]->y = (i ? -23.0 : -40.0);
207
self->enterCodeSlider[i]->z = 16.0;
208
self->enterCodeSlider[i]->state = TEXTLABEL_STATE_IDLE;
209
SetStringToFont8(self->enterCodeSlider[i]->text, "V", self->enterCodeSlider[i]->fontID);
210
self->enterCodeSlider[i]->alignPtr(self->enterCodeSlider[i], ALIGN_CENTER);
211
}
212
}
213
214
void MultiplayerScreen_DrawJoinCode(void *objPtr, int v)
215
{
216
RSDK_THIS(MultiplayerScreen);
217
union {
218
uint val;
219
byte bytes[4];
220
} u;
221
u.val = self->roomCode;
222
223
for (int i = 0; i < 8; i += 2) {
224
int n = 7 - i;
225
int nybbles[] = { u.bytes[n >> 1] & 0xF, ((u.bytes[n >> 1] & 0xF0) >> 4) & 0xF };
226
227
self->enterCodeLabel[i + 0]->alpha = 0x100;
228
self->enterCodeLabel[i + 1]->alpha = 0x100;
229
230
self->enterCodeLabel[i + 0]->useColors = false;
231
self->enterCodeLabel[i + 1]->useColors = false;
232
233
char codeBuf[0x10];
234
sprintf(codeBuf, "%X", nybbles[1]);
235
SetStringToFont8(self->enterCodeLabel[i + 0]->text, codeBuf, self->enterCodeLabel[i + 0]->fontID);
236
self->enterCodeLabel[i + 0]->alignPtr(self->enterCodeLabel[i + 0], ALIGN_CENTER);
237
238
sprintf(codeBuf, "%X", nybbles[0]);
239
SetStringToFont8(self->enterCodeLabel[i + 1]->text, codeBuf, self->enterCodeLabel[i + 1]->fontID);
240
self->enterCodeLabel[i + 1]->alignPtr(self->enterCodeLabel[i + 1], ALIGN_CENTER);
241
}
242
self->enterCodeLabel[v]->useColors = true;
243
}
244
245
void MultiplayerScreen_Destroy(void *objPtr)
246
{
247
RSDK_THIS(MultiplayerScreen);
248
RemoveNativeObject(self->label);
249
for (int i = 0; i < 3; ++i) RemoveNativeObject(self->codeLabel[i]);
250
for (int i = 0; i < 8; ++i) RemoveNativeObject(self->enterCodeLabel[i]);
251
for (int i = 0; i < 2; ++i) RemoveNativeObject(self->enterCodeSlider[i]);
252
for (int i = 0; i < MULTIPLAYERSCREEN_BUTTON_COUNT; ++i) RemoveNativeObject(self->buttons[i]);
253
RemoveNativeObject(self->bg);
254
RemoveNativeObject(self);
255
}
256
257
void MultiplayerScreen_Main(void *objPtr)
258
{
259
RSDK_THIS(MultiplayerScreen);
260
261
if (dcError && self->state == MULTIPLAYERSCREEN_STATE_HOSTSCR)
262
CREATE_ENTITY(MultiplayerHandler);
263
264
switch (self->state) {
265
case MULTIPLAYERSCREEN_STATE_ENTER: {
266
if (self->arrowAlpha < 0x100)
267
self->arrowAlpha += 8;
268
269
self->scale = fminf(self->scale + ((1.05 - self->scale) / ((60.0 * Engine.deltaTime) * 8.0)), 1.0f);
270
271
NewRenderState();
272
MatrixScaleXYZF(&self->renderMatrix, self->scale, self->scale, 1.0);
273
MatrixTranslateXYZF(&self->matrixTemp, 0.0, -8.0, 160.0);
274
MatrixMultiplyF(&self->renderMatrix, &self->matrixTemp);
275
SetRenderMatrix(&self->renderMatrix);
276
277
memcpy(&self->label->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
278
for (int i = 0; i < 3; ++i) memcpy(&self->codeLabel[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
279
for (int i = 0; i < MULTIPLAYERSCREEN_BUTTON_COUNT; ++i) memcpy(&self->buttons[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
280
for (int i = 0; i < 8; ++i) memcpy(&self->enterCodeLabel[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
281
memcpy(&self->enterCodeSlider[1]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
282
MatrixRotateZF(&self->enterCodeSlider[0]->renderMatrix, DegreesToRad(180));
283
MatrixMultiplyF(&self->enterCodeSlider[0]->renderMatrix, &self->renderMatrix);
284
285
self->timer += Engine.deltaTime;
286
if (self->timer > 0.5) {
287
self->timer = 0.0;
288
self->state = MULTIPLAYERSCREEN_STATE_MAIN;
289
}
290
break;
291
}
292
case MULTIPLAYERSCREEN_STATE_MAIN: {
293
CheckKeyDown(&keyDown);
294
CheckKeyPress(&keyPress);
295
SetRenderMatrix(&self->renderMatrix);
296
297
if (usePhysicalControls) {
298
if (touches > 0) {
299
usePhysicalControls = false;
300
}
301
else {
302
if (keyPress.up) {
303
PlaySfxByName("Menu Move", false);
304
self->selectedButton--;
305
if (self->selectedButton < MULTIPLAYERSCREEN_BUTTON_HOST)
306
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_JOIN;
307
}
308
else if (keyPress.down) {
309
PlaySfxByName("Menu Move", false);
310
self->selectedButton++;
311
if (self->selectedButton > MULTIPLAYERSCREEN_BUTTON_JOIN)
312
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_HOST;
313
}
314
315
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST]->state = PUSHBUTTON_STATE_UNSELECTED;
316
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN]->state = PUSHBUTTON_STATE_UNSELECTED;
317
self->buttons[self->selectedButton]->state = PUSHBUTTON_STATE_SELECTED;
318
319
if (keyPress.start || keyPress.A) {
320
PlaySfxByName("Menu Select", false);
321
self->buttons[self->selectedButton]->state = PUSHBUTTON_STATE_FLASHING;
322
self->state = MULTIPLAYERSCREEN_STATE_ACTION;
323
}
324
else if (keyPress.B || self->backPressed) {
325
PlaySfxByName("Menu Back", false);
326
self->backPressed = false;
327
self->state = MULTIPLAYERSCREEN_STATE_EXIT;
328
self->timer = 0;
329
NativeEntity_FadeScreen *fade = CREATE_ENTITY(FadeScreen);
330
fade->delay = 1.1f;
331
fade->state = FADESCREEN_STATE_FADEOUT;
332
}
333
}
334
}
335
else {
336
if (touches > 0) {
337
for (int i = 0; i < 2; ++i) {
338
self->buttons[i]->state =
339
CheckTouchRect(0, 20 - (i * 40), ((64.0 * self->buttons[i]->scale) + self->buttons[i]->textWidth) * 0.75, 20.4) >= 0;
340
}
341
self->backPressed = CheckTouchRect(128.0, -92.0, 32.0, 32.0) >= 0;
342
if (self->state == MULTIPLAYERSCREEN_STATE_MAIN) {
343
if (keyDown.left) {
344
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_JOIN;
345
usePhysicalControls = true;
346
}
347
if (keyDown.right) {
348
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_HOST;
349
usePhysicalControls = true;
350
}
351
}
352
}
353
else {
354
for (int i = 0; i < 2; ++i) {
355
if (self->buttons[i]->state == PUSHBUTTON_STATE_SELECTED) {
356
PlaySfxByName("Menu Select", false);
357
self->buttons[i]->state = PUSHBUTTON_STATE_FLASHING;
358
self->selectedButton = i;
359
self->state = MULTIPLAYERSCREEN_STATE_ACTION;
360
break;
361
}
362
}
363
364
if (keyPress.B || self->backPressed) {
365
PlaySfxByName("Menu Back", false);
366
self->backPressed = false;
367
self->state = MULTIPLAYERSCREEN_STATE_EXIT;
368
self->timer = 0;
369
NativeEntity_FadeScreen *fade = CREATE_ENTITY(FadeScreen);
370
fade->delay = 1.0;
371
fade->state = FADESCREEN_STATE_FADEOUT;
372
}
373
else {
374
if (self->state == MULTIPLAYERSCREEN_STATE_MAIN) {
375
if (keyDown.down) {
376
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_JOIN;
377
usePhysicalControls = true;
378
}
379
if (keyDown.up) {
380
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_HOST;
381
usePhysicalControls = true;
382
}
383
}
384
}
385
}
386
}
387
break;
388
}
389
case MULTIPLAYERSCREEN_STATE_ACTION: { // action
390
CheckKeyDown(&keyDown);
391
SetRenderMatrix(&self->renderMatrix);
392
393
if (self->buttons[self->selectedButton]->state == PUSHBUTTON_STATE_UNSELECTED) {
394
self->state = MULTIPLAYERSCREEN_STATE_MAIN;
395
switch (self->selectedButton) {
396
default: break;
397
case MULTIPLAYERSCREEN_BUTTON_HOST:
398
self->state = MULTIPLAYERSCREEN_STATE_FLIP;
399
self->nextState = MULTIPLAYERSCREEN_STATE_HOSTSCR;
400
self->nextStateDraw = MULTIPLAYERSCREEN_STATEDRAW_HOST;
401
break;
402
case MULTIPLAYERSCREEN_BUTTON_JOIN:
403
self->state = MULTIPLAYERSCREEN_STATE_FLIP;
404
self->nextState = MULTIPLAYERSCREEN_STATE_JOINSCR;
405
self->nextStateDraw = MULTIPLAYERSCREEN_STATEDRAW_JOIN;
406
break;
407
case MULTIPLAYERSCREEN_BUTTON_JOINROOM: {
408
self->state = MULTIPLAYERSCREEN_STATE_STARTGAME;
409
NativeEntity_FadeScreen *fade = CREATE_ENTITY(FadeScreen);
410
fade->state = FADESCREEN_STATE_GAMEFADEOUT;
411
fade->delay = 1.1f;
412
break;
413
}
414
}
415
}
416
break;
417
}
418
case MULTIPLAYERSCREEN_STATE_STARTGAME:
419
case MULTIPLAYERSCREEN_STATE_EXIT: {
420
if (self->dialog)
421
self->dialog->state = DIALOGPANEL_STATE_IDLE;
422
if (self->arrowAlpha > 0)
423
self->arrowAlpha -= 8;
424
425
/*if (self->timer < 0.2)
426
self->scale = fmaxf(self->scale + ((1.5f - self->scale) / ((Engine.deltaTime * 60.0) * 8.0)), 0.0);
427
else
428
self->scale = fmaxf(self->scale + ((-1.0f - self->scale) / ((Engine.deltaTime * 60.0) * 8.0)), 0.0);
429
//*/
430
NewRenderState();
431
MatrixScaleXYZF(&self->renderMatrix, self->scale, self->scale, 1.0);
432
MatrixTranslateXYZF(&self->matrixTemp, 0.0, -8.0, 160.0);
433
MatrixMultiplyF(&self->renderMatrix, &self->matrixTemp);
434
SetRenderMatrix(&self->renderMatrix);
435
436
memcpy(&self->label->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
437
for (int i = 0; i < 3; ++i) memcpy(&self->codeLabel[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
438
for (int i = 0; i < MULTIPLAYERSCREEN_BUTTON_COUNT; ++i) memcpy(&self->buttons[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
439
for (int i = 0; i < 8; ++i) memcpy(&self->enterCodeLabel[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
440
memcpy(&self->enterCodeSlider[1]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
441
MatrixRotateZF(&self->enterCodeSlider[0]->renderMatrix, DegreesToRad(180));
442
MatrixMultiplyF(&self->enterCodeSlider[0]->renderMatrix, &self->renderMatrix);
443
444
self->timer += Engine.deltaTime;
445
if (self->timer > 0.5) {
446
if (self->state == MULTIPLAYERSCREEN_STATE_EXIT) {
447
if (skipStartMenu) {
448
StopMusic(true);
449
// is there a better way of removing the pop up message? :(
450
if (self->dialog) {
451
RemoveNativeObject(self->dialog);
452
RemoveNativeObject(self->label);
453
RemoveNativeObject(self->label);
454
}
455
SetGlobalVariableByName("options.stageSelectFlag", 0);
456
activeStageList = 0;
457
stageMode = STAGEMODE_LOAD;
458
Engine.gameMode = ENGINE_MAINGAME;
459
stageListPosition = 0;
460
}
461
else
462
Engine.gameMode = ENGINE_RESETGAME;
463
}
464
else {
465
if (self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->state == PUSHBUTTON_STATE_UNSELECTED) { /// hhhhhhack
466
SetRoomCode(self->roomCode);
467
ServerPacket send;
468
send.header = CL_JOIN;
469
vsPlayerID = 1; // we are.... Little Guy
470
471
SendServerPacket(send, true);
472
}
473
}
474
MultiplayerScreen_Destroy(self);
475
MatrixScaleXYZF(&self->renderMatrix, Engine.windowScale, Engine.windowScale, 1.0);
476
MatrixTranslateXYZF(&self->matrixTemp, 0.0, 0.0, 160.0);
477
MatrixMultiplyF(&self->renderMatrix, &self->matrixTemp);
478
SetRenderMatrix(&self->renderMatrix);
479
480
RenderRect(-SCREEN_CENTERX_F, SCREEN_CENTERY_F, 160.0, SCREEN_XSIZE_F, SCREEN_YSIZE_F, 0, 0, 0, 255);
481
return;
482
}
483
break;
484
}
485
case MULTIPLAYERSCREEN_STATE_FLIP: { // panel flip
486
if (self->flipDir) {
487
self->rotationY += (10.0 * Engine.deltaTime);
488
if (self->rotationY > (M_PI_2)) {
489
self->state = self->nextState;
490
self->rotationY = 0.0;
491
}
492
else if (self->rotationY > M_PI) {
493
self->stateDraw = self->nextStateDraw;
494
self->nextStateDraw = MULTIPLAYERSCREEN_STATEDRAW_NONE;
495
}
496
}
497
else {
498
self->rotationY -= (10.0 * Engine.deltaTime);
499
if (self->rotationY < -(M_PI_2)) {
500
self->state = self->nextState;
501
self->rotationY = 0.0;
502
}
503
else if (self->rotationY < -M_PI) {
504
self->stateDraw = self->nextStateDraw;
505
self->nextStateDraw = MULTIPLAYERSCREEN_STATEDRAW_NONE;
506
}
507
}
508
NewRenderState();
509
MatrixRotateYF(&self->renderMatrix, self->rotationY);
510
MatrixTranslateXYZF(&self->matrixTemp, 0.0, -8.0, 160.0);
511
MatrixMultiplyF(&self->renderMatrix, &self->matrixTemp);
512
SetRenderMatrix(&self->renderMatrix);
513
514
for (int i = 0; i < 3; ++i) memcpy(&self->codeLabel[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
515
for (int i = 0; i < MULTIPLAYERSCREEN_BUTTON_COUNT; ++i) memcpy(&self->buttons[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
516
for (int i = 0; i < 8; ++i) memcpy(&self->enterCodeLabel[i]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
517
memcpy(&self->enterCodeSlider[1]->renderMatrix, &self->renderMatrix, sizeof(MatrixF));
518
MatrixRotateZF(&self->enterCodeSlider[0]->renderMatrix, DegreesToRad(180));
519
MatrixMultiplyF(&self->enterCodeSlider[0]->renderMatrix, &self->renderMatrix);
520
521
break;
522
}
523
case MULTIPLAYERSCREEN_STATE_HOSTSCR: {
524
CheckKeyDown(&keyDown);
525
CheckKeyPress(&keyPress);
526
SetRenderMatrix(&self->renderMatrix);
527
528
if (!self->roomCode) {
529
int code = GetRoomCode();
530
if (code) {
531
char buffer[0x30];
532
int code = GetRoomCode();
533
sprintf(buffer, "%08X", code);
534
SetStringToFont8(self->codeLabel[1]->text, buffer, self->codeLabel[1]->fontID);
535
self->codeLabel[1]->alignPtr(self->codeLabel[1], ALIGN_CENTER);
536
self->roomCode = code;
537
}
538
}
539
else {
540
// listen.
541
if (Engine.gameMode != ENGINE_WAIT2PVS) {
542
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->state = PUSHBUTTON_STATE_UNSELECTED; // HAck
543
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_JOINROOM;
544
self->state = MULTIPLAYERSCREEN_STATE_ACTION;
545
}
546
}
547
548
if (usePhysicalControls) {
549
if (touches > 0) {
550
usePhysicalControls = false;
551
}
552
else {
553
if (keyPress.A || keyPress.start) {
554
PlaySfxByName("Menu Select", false);
555
char buffer[0x30];
556
int code = GetRoomCode();
557
sprintf(buffer, "%08X", code);
558
SDL_SetClipboardText(buffer);
559
}
560
if (keyPress.B) {
561
self->dialog = CREATE_ENTITY(DialogPanel);
562
SetStringToFont8(self->dialog->text,
563
"Are you sure you want to exit?\rThis will close the room,\rand you will return to the main menu.", 2);
564
self->state = MULTIPLAYERSCREEN_STATE_DIALOGWAIT;
565
PlaySfxByName("Resume", false);
566
}
567
}
568
}
569
else {
570
if (touches > 0) {
571
self->backPressed = CheckTouchRect(128.0, -92.0, 32.0, 32.0) >= 0;
572
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->state = CheckTouchRect(0, -64.0f,
573
((64.0 * self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->scale)
574
+ self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->textWidth)
575
* 0.75,
576
12.0)
577
>= 0;
578
}
579
else {
580
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->state |= keyPress.A || keyPress.start;
581
if (self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->state) {
582
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->state = PUSHBUTTON_STATE_UNSELECTED;
583
if (keyPress.A || keyPress.start)
584
usePhysicalControls = true;
585
PlaySfxByName("Menu Select", false);
586
char buffer[0x30];
587
int code = GetRoomCode();
588
sprintf(buffer, "%08X", code);
589
SDL_SetClipboardText(buffer);
590
}
591
if (keyPress.B || self->backPressed) {
592
self->backPressed = false;
593
self->dialog = CREATE_ENTITY(DialogPanel);
594
SetStringToFont8(self->dialog->text,
595
"Are you sure you want to exit?\rThis will close the room,\rand you will return to the main menu.",
596
FONT_TEXT);
597
self->state = MULTIPLAYERSCREEN_STATE_DIALOGWAIT;
598
PlaySfxByName("Resume", false);
599
}
600
}
601
}
602
break;
603
}
604
case MULTIPLAYERSCREEN_STATE_JOINSCR: {
605
CheckKeyDown(&keyDown);
606
CheckKeyPress(&keyPress);
607
SetRenderMatrix(&self->renderMatrix);
608
609
if (usePhysicalControls) {
610
if (touches > 0) {
611
usePhysicalControls = false;
612
}
613
else {
614
if (keyPress.left) {
615
PlaySfxByName("Menu Move", false);
616
self->selectedButton--;
617
if (self->selectedButton < 3)
618
self->selectedButton = 12;
619
}
620
else if (keyPress.right) {
621
PlaySfxByName("Menu Move", false);
622
self->selectedButton++;
623
if (self->selectedButton > 12)
624
self->selectedButton = 3;
625
}
626
627
if ((self->selectedButton != MULTIPLAYERSCREEN_BUTTON_JOINROOM && self->selectedButton != MULTIPLAYERSCREEN_BUTTON_PASTE)
628
&& (keyPress.up || keyPress.down)) {
629
union {
630
int val;
631
byte bytes[4];
632
} u;
633
u.val = self->roomCode;
634
int n = 7 - (self->selectedButton - 5);
635
int nybbles[] = { u.bytes[n >> 1] & 0xF, ((u.bytes[n >> 1] & 0xF0) >> 4) & 0xF };
636
637
if (keyPress.up) {
638
PlaySfxByName("Menu Move", false);
639
nybbles[n & 1] = (nybbles[n & 1] + 1) & 0xF;
640
}
641
else if (keyPress.down) {
642
PlaySfxByName("Menu Move", false);
643
nybbles[n & 1] = (nybbles[n & 1] - 1) & 0xF;
644
}
645
646
u.bytes[n >> 1] = (nybbles[1] << 4) | (nybbles[0] & 0xF);
647
self->roomCode = u.val;
648
649
MultiplayerScreen_DrawJoinCode(self, n);
650
}
651
652
for (int i = 0; i < 8; ++i) self->enterCodeLabel[i]->useColors = false;
653
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->state = PUSHBUTTON_STATE_UNSELECTED;
654
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->state = PUSHBUTTON_STATE_UNSELECTED;
655
self->enterCodeSlider[0]->alpha = 0;
656
self->enterCodeSlider[1]->alpha = 0;
657
658
if (self->selectedButton == MULTIPLAYERSCREEN_BUTTON_JOINROOM)
659
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->state = PUSHBUTTON_STATE_SELECTED;
660
else if (self->selectedButton == MULTIPLAYERSCREEN_BUTTON_PASTE)
661
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->state = PUSHBUTTON_STATE_SELECTED;
662
else if (self->selectedButton > 4) {
663
self->enterCodeSlider[0]->x = self->enterCodeLabel[7 - (self->selectedButton - 5)]->x - 2.5;
664
self->enterCodeSlider[1]->x = -(self->enterCodeLabel[7 - (self->selectedButton - 5)]->x - 2.5);
665
self->enterCodeSlider[0]->alpha = 0x100;
666
self->enterCodeSlider[1]->alpha = 0x100;
667
668
self->enterCodeLabel[self->selectedButton - 5]->useColors = true;
669
}
670
671
if (keyPress.start || keyPress.A) {
672
if (self->selectedButton == MULTIPLAYERSCREEN_BUTTON_JOINROOM) {
673
PlaySfxByName("Menu Select", false);
674
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->state = PUSHBUTTON_STATE_UNSELECTED;
675
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_JOINROOM;
676
self->state = MULTIPLAYERSCREEN_STATE_ACTION;
677
}
678
else if (self->selectedButton == MULTIPLAYERSCREEN_BUTTON_PASTE) {
679
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->state = PUSHBUTTON_STATE_FLASHING;
680
char buf[0x30];
681
char *txt = SDL_GetClipboardText(); // easier bc we must SDL free after
682
if (StrLength(txt) && StrLength(txt) < 0x30 - 2) {
683
StrCopy(buf, "0x");
684
StrAdd(buf, txt);
685
int before = self->roomCode;
686
if (ConvertStringToInteger(buf, &self->roomCode)) {
687
MultiplayerScreen_DrawJoinCode(self, 0);
688
self->enterCodeLabel[0]->useColors = false;
689
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_JOINROOM;
690
if (Engine.gameType == GAME_SONIC1) //??
691
PlaySfxByName("Lamp Post", false);
692
else
693
PlaySfxByName("Star Post", false);
694
}
695
else {
696
self->roomCode = before;
697
PlaySfxByName("Hurt", false);
698
}
699
}
700
else
701
PlaySfxByName("Hurt", false);
702
SDL_free(txt);
703
}
704
}
705
else if (keyPress.B) {
706
PlaySfxByName("Menu Back", false);
707
self->state = MULTIPLAYERSCREEN_STATE_FLIP;
708
self->nextState = MULTIPLAYERSCREEN_STATE_MAIN;
709
self->nextStateDraw = MULTIPLAYERSCREEN_STATEDRAW_MAIN;
710
}
711
}
712
}
713
else {
714
if (touches > 0) {
715
float w = self->enterCodeLabel[1]->x - self->enterCodeLabel[0]->x;
716
for (int i = 0; i < 8; ++i) {
717
if (CheckTouchRect(self->enterCodeLabel[i]->x, 16.0f, w / 2, 16.0) >= 0)
718
self->touchedUpID = i;
719
if (CheckTouchRect(self->enterCodeLabel[i]->x, -16.0f, w / 2, 16.0) >= 0)
720
self->touchedDownID = i;
721
}
722
723
for (int i = 0; i < 8; ++i) self->enterCodeLabel[i]->useColors = false;
724
725
int id = self->touchedDownID;
726
if (self->touchedUpID >= 0)
727
id = self->touchedUpID;
728
if (id >= 0) {
729
self->selectedButton = id + 5;
730
self->enterCodeSlider[0]->x = self->enterCodeLabel[7 - id]->x - 2.5;
731
self->enterCodeSlider[1]->x = -(self->enterCodeLabel[7 - id]->x - 2.5);
732
self->enterCodeSlider[0]->alpha = 0x100;
733
self->enterCodeSlider[1]->alpha = 0x100;
734
735
self->enterCodeLabel[id]->useColors = true;
736
}
737
738
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->state =
739
CheckTouchRect(-56.0f, -64.0f,
740
((64.0 * self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->scale)
741
+ self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->textWidth)
742
* 0.75,
743
12.0)
744
>= 0;
745
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->state =
746
CheckTouchRect(
747
64.0f, -64.0f,
748
((64.0 * self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->scale) + self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->textWidth)
749
* 0.75,
750
12.0)
751
>= 0;
752
753
self->backPressed = CheckTouchRect(128.0, -92.0, 32.0, 32.0) >= 0;
754
if (keyDown.left || keyDown.right) {
755
usePhysicalControls = true;
756
}
757
}
758
else {
759
if (self->touchedUpID >= 0 || self->touchedDownID >= 0) {
760
int id = self->touchedDownID;
761
if (self->touchedUpID >= 0)
762
id = self->touchedUpID;
763
764
union {
765
int val;
766
byte bytes[4];
767
} u;
768
u.val = self->roomCode;
769
int n = 7 - id;
770
int nybbles[] = { u.bytes[n >> 1] & 0xF, ((u.bytes[n >> 1] & 0xF0) >> 4) & 0xF };
771
772
if (self->touchedUpID >= 0) {
773
PlaySfxByName("Menu Move", false);
774
nybbles[n & 1] = (nybbles[n & 1] + 1) & 0xF;
775
}
776
else if (self->touchedDownID >= 0) {
777
PlaySfxByName("Menu Move", false);
778
nybbles[n & 1] = (nybbles[n & 1] - 1) & 0xF;
779
}
780
781
u.bytes[n >> 1] = (nybbles[1] << 4) | (nybbles[0] & 0xF);
782
self->roomCode = u.val;
783
784
for (int i = 0; i < 8; i += 2) {
785
int n = 7 - i;
786
int nybbles[] = { u.bytes[n >> 1] & 0xF, ((u.bytes[n >> 1] & 0xF0) >> 4) & 0xF };
787
788
self->enterCodeLabel[i + 0]->alpha = 0x100;
789
self->enterCodeLabel[i + 1]->alpha = 0x100;
790
791
self->enterCodeLabel[i + 0]->useColors = false;
792
self->enterCodeLabel[i + 1]->useColors = false;
793
794
char codeBuf[0x10];
795
sprintf(codeBuf, "%X", nybbles[1]);
796
SetStringToFont8(self->enterCodeLabel[i + 0]->text, codeBuf, self->enterCodeLabel[i + 0]->fontID);
797
self->enterCodeLabel[i + 0]->alignPtr(self->enterCodeLabel[i + 0], ALIGN_CENTER);
798
799
sprintf(codeBuf, "%X", nybbles[0]);
800
SetStringToFont8(self->enterCodeLabel[i + 1]->text, codeBuf, self->enterCodeLabel[i + 1]->fontID);
801
self->enterCodeLabel[i + 1]->alignPtr(self->enterCodeLabel[i + 1], ALIGN_CENTER);
802
}
803
self->enterCodeLabel[id]->useColors = true;
804
805
self->touchedUpID = -1;
806
self->touchedDownID = -1;
807
}
808
809
if (self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->state == PUSHBUTTON_STATE_SELECTED) {
810
PlaySfxByName("Menu Select", false);
811
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->state = PUSHBUTTON_STATE_UNSELECTED;
812
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_JOINROOM;
813
self->state = MULTIPLAYERSCREEN_STATE_ACTION;
814
}
815
else if (self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->state == PUSHBUTTON_STATE_SELECTED) {
816
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->state = PUSHBUTTON_STATE_FLASHING;
817
char buf[0x30];
818
char *txt = SDL_GetClipboardText(); // easier bc we must SDL free after
819
if (StrLength(txt) && StrLength(txt) < 0x30 - 2) {
820
StrCopy(buf, "0x");
821
StrAdd(buf, txt);
822
int before = self->roomCode;
823
if (ConvertStringToInteger(buf, &self->roomCode)) {
824
MultiplayerScreen_DrawJoinCode(self, 0);
825
self->enterCodeLabel[0]->useColors = false;
826
self->selectedButton = 5;
827
if (Engine.gameType == GAME_SONIC1)
828
PlaySfxByName("Lamp Post", false);
829
else
830
PlaySfxByName("Star Post", false);
831
}
832
else {
833
self->roomCode = before;
834
PlaySfxByName("Hurt", false);
835
}
836
}
837
else
838
PlaySfxByName("Hurt", false);
839
SDL_free(txt);
840
}
841
842
if (keyPress.B || self->backPressed) {
843
PlaySfxByName("Menu Back", false);
844
self->backPressed = false;
845
self->state = MULTIPLAYERSCREEN_STATE_FLIP;
846
self->nextState = MULTIPLAYERSCREEN_STATE_MAIN;
847
self->nextStateDraw = MULTIPLAYERSCREEN_STATEDRAW_MAIN;
848
}
849
else {
850
if (keyDown.left) {
851
self->selectedButton = 5;
852
usePhysicalControls = true;
853
}
854
if (keyDown.right) {
855
self->selectedButton = 12;
856
usePhysicalControls = true;
857
}
858
}
859
}
860
}
861
break;
862
}
863
case MULTIPLAYERSCREEN_STATE_DIALOGWAIT: {
864
SetRenderMatrix(&self->renderMatrix);
865
if (self->dialog->selection == DLG_NO || self->dialog->selection == DLG_OK) {
866
self->state = MULTIPLAYERSCREEN_STATE_HOSTSCR;
867
}
868
else if (self->dialog->selection == DLG_YES) {
869
PlaySfxByName("Menu Back", false);
870
self->backPressed = false;
871
self->state = MULTIPLAYERSCREEN_STATE_EXIT;
872
self->timer = 0;
873
NativeEntity_FadeScreen *fade = CREATE_ENTITY(FadeScreen);
874
fade->delay = 1.1f;
875
fade->state = FADESCREEN_STATE_FADEOUT;
876
DisconnectNetwork();
877
InitNetwork();
878
}
879
break;
880
}
881
}
882
883
switch (self->stateDraw) {
884
default: break;
885
case MULTIPLAYERSCREEN_STATEDRAW_MAIN:
886
for (int i = 0; i < MULTIPLAYERSCREEN_BUTTON_COUNT; ++i) self->buttons[i]->alpha = 0;
887
self->buttons[MULTIPLAYERSCREEN_BUTTON_HOST]->alpha = 0x100;
888
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOIN]->alpha = 0x100;
889
890
for (int i = 0; i < 3; ++i) self->codeLabel[i]->alpha = 0;
891
for (int i = 0; i < 8; ++i) self->enterCodeLabel[i]->alpha = 0;
892
for (int i = 0; i < 2; ++i) self->enterCodeSlider[i]->alpha = 0;
893
894
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_HOST;
895
break;
896
case MULTIPLAYERSCREEN_STATEDRAW_HOST: {
897
for (int i = 0; i < MULTIPLAYERSCREEN_BUTTON_COUNT; ++i) self->buttons[i]->alpha = 0;
898
for (int i = 0; i < 3; ++i) self->codeLabel[i]->alpha = 0x100;
899
for (int i = 0; i < 8; ++i) self->enterCodeLabel[i]->alpha = 0;
900
for (int i = 0; i < 2; ++i) self->enterCodeSlider[i]->alpha = 0;
901
902
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_COPY;
903
self->buttons[MULTIPLAYERSCREEN_BUTTON_COPY]->alpha = 0x100;
904
905
self->roomCode = 0;
906
SetStringToFont8(self->codeLabel[1]->text, "FETCHING...", self->codeLabel[1]->fontID);
907
self->codeLabel[1]->alignPtr(self->codeLabel[1], ALIGN_CENTER);
908
909
ServerPacket send;
910
send.header = CL_REQUEST_CODE;
911
// send over a preferred roomcode style
912
if (!vsGameLength)
913
vsGameLength = 4;
914
if (!vsItemMode)
915
vsItemMode = 1;
916
send.data.multiData.type = 0x00000FF0;
917
send.data.multiData.data[0] = (vsGameLength << 4) | (vsItemMode << 8);
918
vsPlayerID = 0; // we are... Big Host
919
920
SendServerPacket(send, true);
921
break;
922
}
923
case MULTIPLAYERSCREEN_STATEDRAW_JOIN: {
924
for (int i = 0; i < MULTIPLAYERSCREEN_BUTTON_COUNT; ++i) self->buttons[i]->alpha = 0;
925
self->selectedButton = MULTIPLAYERSCREEN_BUTTON_COUNT;
926
self->touchedUpID = -1;
927
self->touchedDownID = -1;
928
929
for (int i = 0; i < 3; ++i) self->codeLabel[i]->alpha = 0;
930
931
self->roomCode = 0;
932
for (int i = 0; i < 8; ++i) {
933
self->enterCodeLabel[i]->alpha = 0x100;
934
self->enterCodeLabel[i]->useColors = false;
935
936
char codeBuf[0x10];
937
sprintf(codeBuf, "%X", 0);
938
SetStringToFont8(self->enterCodeLabel[i]->text, codeBuf, self->enterCodeLabel[i]->fontID);
939
self->enterCodeLabel[i]->alignPtr(self->enterCodeLabel[i], ALIGN_CENTER);
940
}
941
self->enterCodeLabel[0]->useColors = true;
942
self->buttons[MULTIPLAYERSCREEN_BUTTON_JOINROOM]->alpha = 0x100;
943
self->buttons[MULTIPLAYERSCREEN_BUTTON_PASTE]->alpha = 0x100;
944
945
break;
946
}
947
}
948
self->stateDraw = MULTIPLAYERSCREEN_STATEDRAW_NONE;
949
950
SetRenderBlendMode(RENDER_BLEND_ALPHA);
951
RenderMesh(self->meshPanel, MESH_COLORS, false);
952
SetRenderBlendMode(RENDER_BLEND_ALPHA);
953
NewRenderState();
954
SetRenderMatrix(NULL);
955
956
if (self->backPressed)
957
RenderImage(128.0, -92.0, 160.0, 0.3, 0.3, 64.0, 64.0, 128.0, 128.0, 128.0, 128.0, self->arrowAlpha, self->textureArrows);
958
else
959
RenderImage(128.0, -92.0, 160.0, 0.3, 0.3, 64.0, 64.0, 128.0, 128.0, 128.0, 0.0, self->arrowAlpha, self->textureArrows);
960
}
961
#endif
962
963