Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-1-Sonic-2-2013-Script-Decompilation
Path: blob/master/Sonic 2/Scripts/2PVS/GameResults.txt
1482 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Game Results Object
4
// Script Author: Christian Whitehead/Simon Thomley
5
// Unpacked by Rubberduckycooly's script unpacker
6
// ----------------------------------
7
8
// ========================
9
// Aliases
10
// ========================
11
12
private alias object.value0 : object.timer
13
private alias object.value1 : object.iconSheet
14
private alias object.value2 : object.textSheet
15
private alias object.value3 : object.round1Results
16
private alias object.value4 : object.round2Results
17
private alias object.value5 : object.round3Results
18
private alias object.value6 : object.wins1P
19
private alias object.value7 : object.wins2P
20
private alias object.value8 : object.overallWinner
21
private alias object.value9 : object.numberPos1P.x
22
private alias object.value10 : object.numberPos2P.x
23
private alias object.value11 : object.drawPos.x
24
private alias object.value12 : object.drawPos.y
25
private alias object.value13 : object.menuID
26
27
// States
28
private alias 0 : GAMERESULTS_SETUP
29
private alias 1 : GAMERESULTS_WAITING
30
private alias 2 : GAMERESULTS_SHOWRESULTS
31
private alias 3 : GAMERESULTS_FADEOUT
32
33
// Achievement Aliases
34
private alias 8 : ACHIEVEMENT_HEAD2HEAD
35
36
37
// ========================
38
// Function Declarations
39
// ========================
40
41
reserve function GameResults_DrawResults
42
43
44
// ========================
45
// Function Definition
46
// ========================
47
48
private function GameResults_DrawResults
49
object.round1Results = saveRAM[arrayPos0]
50
arrayPos0++
51
object.round2Results = saveRAM[arrayPos0]
52
arrayPos0++
53
object.round3Results = saveRAM[arrayPos0]
54
arrayPos0 += 2
55
56
// Wins 1P
57
temp2 = object.round1Results
58
temp2 &= 15
59
// Wins 2P
60
temp3 = object.round1Results
61
temp3 >>= 4
62
DrawNumbers(4, object.numberPos1P.x, object.drawPos.y, temp2, 1, 8, false)
63
DrawNumbers(4, object.numberPos2P.x, object.drawPos.y, temp3, 1, 8, false)
64
65
if temp2 == temp3
66
DrawSpriteScreenXY(3, object.drawPos.x, object.drawPos.y)
67
else
68
if temp2 > temp3
69
DrawSpriteScreenXY(1, object.drawPos.x, object.drawPos.y)
70
else
71
DrawSpriteScreenXY(2, object.drawPos.x, object.drawPos.y)
72
end if
73
end if
74
object.drawPos.y += 8
75
76
// Wins 1P
77
temp2 = object.round2Results
78
temp2 &= 15
79
// Wins 2P
80
temp3 = object.round2Results
81
temp3 >>= 4
82
DrawNumbers(4, object.numberPos1P.x, object.drawPos.y, temp2, 1, 8, false)
83
DrawNumbers(4, object.numberPos2P.x, object.drawPos.y, temp3, 1, 8, false)
84
85
if temp2 == temp3
86
DrawSpriteScreenXY(3, object.drawPos.x, object.drawPos.y)
87
else
88
if temp2 > temp3
89
DrawSpriteScreenXY(1, object.drawPos.x, object.drawPos.y)
90
else
91
DrawSpriteScreenXY(2, object.drawPos.x, object.drawPos.y)
92
end if
93
end if
94
95
object.drawPos.y += 8
96
if object.round3Results > 0
97
// Wins 1P
98
temp2 = object.round3Results
99
temp2 &= 15
100
// Wins 2P
101
temp3 = object.round3Results
102
temp3 >>= 4
103
DrawNumbers(4, object.numberPos1P.x, object.drawPos.y, temp2, 1, 8, false)
104
DrawNumbers(4, object.numberPos2P.x, object.drawPos.y, temp3, 1, 8, false)
105
106
if temp2 == temp3
107
DrawSpriteScreenXY(3, object.drawPos.x, object.drawPos.y)
108
else
109
if temp2 > temp3
110
DrawSpriteScreenXY(1, object.drawPos.x, object.drawPos.y)
111
else
112
DrawSpriteScreenXY(2, object.drawPos.x, object.drawPos.y)
113
end if
114
end if
115
end if
116
object.drawPos.y += 16
117
end function
118
119
120
// ========================
121
// Events
122
// ========================
123
124
event ObjectUpdate
125
switch object.state
126
case GAMERESULTS_SETUP
127
SetupMenu(MENU_1, 0, 3, 0)
128
SetupMenu(MENU_2, 0, 3, 0)
129
options.vsMode = false
130
131
LoadSpriteSheet("LevelSelect/Icons.gif")
132
object.iconSheet = object.spriteSheet
133
134
LoadSpriteSheet("LevelSelect/Text.gif")
135
object.textSheet = object.spriteSheet
136
137
menu1.selection = -1
138
139
temp0 = 0
140
temp1 = vs.gameLength
141
if temp1 > 4
142
arrayPos0 = 0x400
143
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@WINS@@@@@@@@@@@@@@WINS", true)
144
AddMenuEntry(MENU_1, "@", true)
145
object.menuID = MENU_1
146
147
while temp0 < vs.gameLength
148
object.round1Results = saveRAM[arrayPos0]
149
arrayPos0++
150
object.round2Results = saveRAM[arrayPos0]
151
arrayPos0++
152
object.round3Results = saveRAM[arrayPos0]
153
arrayPos0++
154
temp2 = saveRAM[arrayPos0]
155
arrayPos0++
156
157
temp3 = object.round1Results
158
temp3 &= 15
159
temp4 = object.round1Results
160
temp4 >>= 4
161
if temp3 != temp4
162
if temp3 > temp4
163
object.wins1P++
164
else
165
object.wins2P++
166
end if
167
end if
168
169
temp3 = object.round2Results
170
temp3 &= 15
171
temp4 = object.round2Results
172
temp4 >>= 4
173
if temp3 != temp4
174
if temp3 > temp4
175
object.wins1P++
176
else
177
object.wins2P++
178
end if
179
end if
180
181
temp3 = object.round3Results
182
temp3 &= 15
183
temp4 = object.round3Results
184
temp4 >>= 4
185
if temp3 != temp4
186
if temp3 > temp4
187
object.wins1P++
188
else
189
object.wins2P++
190
end if
191
end if
192
193
switch temp2
194
case 0
195
AddMenuEntry(object.menuID, "@EHZ 1*@@:", true)
196
AddMenuEntry(object.menuID, "@@@@ 2*@@:", true)
197
if object.round3Results > 0
198
AddMenuEntry(object.menuID, "@@@@ SS@@:", true)
199
else
200
AddMenuEntry(object.menuID, "@@@@ SS@NO GAME", true)
201
end if
202
break
203
204
case 1
205
AddMenuEntry(object.menuID, "@CPZ 1*@@:", true)
206
AddMenuEntry(object.menuID, "@@@@ 2*@@:", true)
207
if object.round3Results > 0
208
AddMenuEntry(object.menuID, "@@@@ SS@@:", true)
209
else
210
AddMenuEntry(object.menuID, "@@@@ SS@NO GAME", true)
211
end if
212
break
213
214
case 2
215
AddMenuEntry(object.menuID, "@ARZ 1*@@:", true)
216
AddMenuEntry(object.menuID, "@@@@ 2*@@:", true)
217
if object.round3Results > 0
218
AddMenuEntry(object.menuID, "@@@@ SS@@:", true)
219
else
220
AddMenuEntry(object.menuID, "@@@@ SS@NO GAME", true)
221
end if
222
break
223
224
case 3
225
AddMenuEntry(object.menuID, "@CNZ 1*@@:", true)
226
AddMenuEntry(object.menuID, "@@@@ 2*@@:", true)
227
if object.round3Results > 0
228
AddMenuEntry(object.menuID, "@@@@ SS@@:", true)
229
else
230
AddMenuEntry(object.menuID, "@@@@ SS@NO GAME", true)
231
end if
232
break
233
234
case 4
235
AddMenuEntry(object.menuID, "@HTZ 1*@@:", true)
236
AddMenuEntry(object.menuID, "@@@@ 2*@@:", true)
237
if object.round3Results > 0
238
AddMenuEntry(object.menuID, "@@@@ SS@@:", true)
239
else
240
AddMenuEntry(object.menuID, "@@@@ SS@NO GAME", true)
241
end if
242
break
243
244
case 5
245
AddMenuEntry(object.menuID, "@MCZ 1*@@:", true)
246
AddMenuEntry(object.menuID, "@@@@ 2*@@:", true)
247
if object.round3Results > 0
248
AddMenuEntry(object.menuID, "@@@@ SS@@:", true)
249
else
250
AddMenuEntry(object.menuID, "@@@@ SS@NO GAME", true)
251
end if
252
break
253
254
case 6
255
AddMenuEntry(object.menuID, "@OOZ 1*@@:", true)
256
AddMenuEntry(object.menuID, "@@@@ 2*@@:", true)
257
if object.round3Results > 0
258
AddMenuEntry(object.menuID, "@@@@ SS@@:", true)
259
else
260
AddMenuEntry(object.menuID, "@@@@ SS@NO GAME", true)
261
end if
262
break
263
264
case 7
265
AddMenuEntry(object.menuID, "@S.S 1*@@:", true)
266
AddMenuEntry(object.menuID, "@@@@ 2*@@:", true)
267
if object.round3Results > 0
268
AddMenuEntry(object.menuID, "@@@@ 3*@@:", true)
269
else
270
AddMenuEntry(object.menuID, "@@@@ 3*@NO GAME", true)
271
end if
272
break
273
end switch
274
275
AddMenuEntry(object.menuID, "@", true)
276
temp0++
277
if temp0 == 4
278
object.menuID = MENU_2
279
end if
280
loop
281
282
while temp0 < 4
283
AddMenuEntry(MENU_1, "", true)
284
AddMenuEntry(MENU_1, "", true)
285
AddMenuEntry(MENU_1, "", true)
286
AddMenuEntry(MENU_1, "", true)
287
temp0++
288
loop
289
else
290
arrayPos0 = 0x400
291
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@WINS", true)
292
AddMenuEntry(MENU_1, "@", true)
293
294
while temp0 < temp1
295
object.round1Results = saveRAM[arrayPos0]
296
arrayPos0++
297
object.round2Results = saveRAM[arrayPos0]
298
arrayPos0++
299
object.round3Results = saveRAM[arrayPos0]
300
arrayPos0++
301
temp2 = saveRAM[arrayPos0]
302
arrayPos0++
303
304
temp3 = object.round1Results
305
temp3 &= 15
306
temp4 = object.round1Results
307
temp4 >>= 4
308
if temp3 != temp4
309
if temp3 > temp4
310
object.wins1P++
311
else
312
object.wins2P++
313
end if
314
end if
315
316
temp3 = object.round2Results
317
temp3 &= 15
318
temp4 = object.round2Results
319
temp4 >>= 4
320
if temp3 != temp4
321
if temp3 > temp4
322
object.wins1P++
323
else
324
object.wins2P++
325
end if
326
end if
327
328
temp3 = object.round3Results
329
temp3 &= 15
330
temp4 = object.round3Results
331
temp4 >>= 4
332
if temp3 != temp4
333
if temp3 > temp4
334
object.wins1P++
335
else
336
object.wins2P++
337
end if
338
end if
339
340
switch temp2
341
case 0
342
AddMenuEntry(MENU_1, "@@EMERALD HILL *1*@@@@:", true)
343
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *2*@@@@:", true)
344
if object.round3Results > 0
345
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@@@:", true)
346
else
347
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@NO GAME", true)
348
end if
349
break
350
351
case 1
352
AddMenuEntry(MENU_1, "CHEMICAL PLANT *1*@@@@:", true)
353
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *2*@@@@:", true)
354
if object.round3Results > 0
355
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@@@:", true)
356
else
357
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@NO GAME", true)
358
end if
359
break
360
361
case 2
362
AddMenuEntry(MENU_1, "@@AQUATIC RUIN *1*@@@@:", true)
363
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *2*@@@@:", true)
364
if object.round3Results > 0
365
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@@@:", true)
366
else
367
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@NO GAME", true)
368
end if
369
break
370
371
case 3
372
AddMenuEntry(MENU_1, "@@CASINO NIGHT *1*@@@@:", true)
373
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *2*@@@@:", true)
374
if object.round3Results > 0
375
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@@@:", true)
376
else
377
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@NO GAME", true)
378
end if
379
break
380
381
case 4
382
AddMenuEntry(MENU_1, "@@@@@@HILL TOP *1*@@@@:", true)
383
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *2*@@@@:", true)
384
if object.round3Results > 0
385
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@@@:", true)
386
else
387
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@NO GAME", true)
388
end if
389
break
390
391
case 5
392
AddMenuEntry(MENU_1, "@@@MYSTIC CAVE *1*@@@@:", true)
393
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *2*@@@@:", true)
394
if object.round3Results > 0
395
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@@@:", true)
396
else
397
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@NO GAME", true)
398
end if
399
break
400
401
case 6
402
AddMenuEntry(MENU_1, "@@@@@OIL OCEAN *1*@@@@:", true)
403
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *2*@@@@:", true)
404
if object.round3Results > 0
405
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@@@:", true)
406
else
407
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ S.S@@NO GAME", true)
408
end if
409
break
410
411
case 7
412
AddMenuEntry(MENU_1, "@SPECIAL STAGE *1*@@@@:", true)
413
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *2*@@@@:", true)
414
if object.round3Results > 0
415
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *3*@@@@:", true)
416
else
417
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@ *3*@@NO GAME", true)
418
end if
419
break
420
end switch
421
422
AddMenuEntry(MENU_1, "@", true)
423
temp0++
424
loop
425
426
while temp0 < 4
427
AddMenuEntry(MENU_1, "@", true)
428
AddMenuEntry(MENU_1, "@", true)
429
AddMenuEntry(MENU_1, "@", true)
430
AddMenuEntry(MENU_1, "@", true)
431
temp0++
432
loop
433
end if
434
435
AddMenuEntry(MENU_1, "@@@@@@@* TOTAL *@@@@@@:", true)
436
AddMenuEntry(MENU_1, "@", true)
437
AddMenuEntry(MENU_1, "@", true)
438
AddMenuEntry(MENU_1, "@", true)
439
AddMenuEntry(MENU_1, "@@@@@@@@@@@@@@THE GAME", true)
440
441
if object.wins1P == object.wins2P
442
object.overallWinner = 18
443
else
444
// Here, we grant the "Head 2 Head" Achievement if we won
445
// (The Achievement's description may say you need to beat a friend, but thankfully it isn't really that way)
446
447
if object.wins1P > object.wins2P
448
object.overallWinner = 14
449
if vs.playerID == 0
450
CallNativeFunction2(SetAchievement, ACHIEVEMENT_HEAD2HEAD, 100)
451
end if
452
else
453
object.overallWinner = 16
454
if vs.playerID == 1
455
CallNativeFunction2(SetAchievement, ACHIEVEMENT_HEAD2HEAD, 100)
456
end if
457
end if
458
end if
459
object.state++
460
break
461
462
case GAMERESULTS_WAITING
463
object.state++
464
break
465
466
case GAMERESULTS_SHOWRESULTS
467
if object.timer < 60
468
object.timer++
469
else
470
CheckTouchRect(0, 0, screen.xsize, screen.ysize)
471
if keyPress[0].start == true
472
checkResult = 0
473
end if
474
475
if keyPress[0].buttonA == true
476
checkResult = 0
477
end if
478
479
if keyPress[0].buttonB == true
480
checkResult = 0
481
end if
482
483
if keyPress[0].buttonC == true
484
checkResult = 0
485
end if
486
487
if checkResult > -1
488
object.timer = 0
489
object.state = GAMERESULTS_FADEOUT
490
end if
491
end if
492
break
493
494
case GAMERESULTS_FADEOUT
495
if object.timer < 256
496
music.volume -= 10
497
object.timer += 16
498
SetScreenFade(0x00, 0x00, 0x00, object.timer)
499
else
500
StopMusic()
501
CallNativeFunction(Disconnect2PVS)
502
#platform: USE_STANDALONE
503
engine.state = 8
504
#endplatform
505
#platform: USE_ORIGINS
506
stage.activeList = PRESENTATION_STAGE
507
stage.listPos = 0
508
LoadStage()
509
#endplatform
510
SetScreenFade(0x00, 0x00, 0x00, 0xFF)
511
end if
512
break
513
514
end switch
515
516
object.animationTimer++
517
object.animationTimer &= 15
518
end event
519
520
521
event ObjectDraw
522
object.spriteSheet = object.iconSheet
523
DrawSpriteScreenXY(0, screen.xcenter, 17)
524
525
arrayPos0 = 0x400
526
if vs.gameLength <= 4
527
object.numberPos1P.x = screen.xcenter
528
object.numberPos1P.x += 16
529
object.numberPos2P.x = object.numberPos1P.x
530
object.numberPos2P.x += 32
531
object.drawPos.x = screen.xcenter
532
object.drawPos.x += 120
533
object.drawPos.y = 57
534
535
temp0 = 0
536
while temp0 < vs.gameLength
537
CallFunction(GameResults_DrawResults)
538
temp0++
539
loop
540
else
541
object.numberPos1P.x = screen.xcenter
542
object.numberPos1P.x -= 80
543
object.numberPos2P.x = object.numberPos1P.x
544
object.numberPos2P.x += 16
545
object.drawPos.x = screen.xcenter
546
object.drawPos.x -= 24
547
object.drawPos.y = 57
548
549
temp0 = 0
550
while temp0 < 4
551
CallFunction(GameResults_DrawResults)
552
temp0++
553
loop
554
555
object.numberPos1P.x = screen.xcenter
556
object.numberPos1P.x += 64
557
object.numberPos2P.x = object.numberPos1P.x
558
object.numberPos2P.x += 16
559
object.drawPos.x = screen.xcenter
560
object.drawPos.x += 120
561
object.drawPos.y = 57
562
while temp0 < vs.gameLength
563
CallFunction(GameResults_DrawResults)
564
temp0++
565
loop
566
end if
567
568
object.numberPos1P.x = screen.xcenter
569
object.numberPos1P.x += 24
570
object.numberPos2P.x = object.numberPos1P.x
571
object.numberPos2P.x += 24
572
DrawNumbers(4, object.numberPos1P.x, 185, object.wins1P, 2, 8, true)
573
DrawNumbers(4, object.numberPos2P.x, 185, object.wins2P, 2, 8, true)
574
575
temp0 = object.animationTimer
576
temp0 >>= 3
577
temp0 += object.overallWinner
578
DrawSpriteScreenXY(temp0, screen.xcenter, 198)
579
580
object.spriteSheet = object.textSheet
581
temp0 = screen.xcenter
582
temp0 -= 144
583
DrawMenu(MENU_1, temp0, 40)
584
585
if vs.gameLength > 4
586
DrawMenu(MENU_2, screen.xcenter, 56)
587
end if
588
end event
589
590
591
event ObjectStartup
592
LoadSpriteSheet("LevelSelect/Icons.gif")
593
LoadSpriteSheet("LevelSelect/Text.gif")
594
595
SpriteFrame(-48, 0, 96, 14, 1, 136) // RESULT - #0
596
SpriteFrame(-8, 0, 16, 7, 98, 136) // 1P - #1
597
SpriteFrame(-8, 0, 16, 7, 115, 136) // 2P - #2
598
SpriteFrame(-16, 0, 32, 7, 132, 136) // TIED - #3
599
SpriteFrame(0, 0, 8, 7, 175, 140) // 0 - #4
600
SpriteFrame(0, 0, 8, 7, 183, 140) // 1 - #5
601
SpriteFrame(0, 0, 8, 7, 191, 140) // 2 - #6
602
SpriteFrame(0, 0, 8, 7, 199, 140) // 3 - #7
603
SpriteFrame(0, 0, 8, 7, 207, 140) // 4 - #8
604
SpriteFrame(0, 0, 8, 7, 215, 140) // 5 - #9
605
SpriteFrame(0, 0, 8, 7, 223, 140) // 6 - #10
606
SpriteFrame(0, 0, 8, 7, 231, 140) // 7 - #11
607
SpriteFrame(0, 0, 8, 7, 239, 140) // 8 - #12
608
SpriteFrame(0, 0, 8, 7, 247, 140) // 9 - #13
609
SpriteFrame(-47, 0, 91, 12, 1, 110) // 1P WINS - #14
610
SpriteFrame(-47, 0, 91, 12, 1, 123) // 1P WINS (flashing) - #15
611
SpriteFrame(-47, 0, 91, 12, 93, 110) // 2P WINS - #16
612
SpriteFrame(-47, 0, 91, 12, 93, 123) // 2P WINS (flashing) - #17
613
SpriteFrame(-22, 0, 44, 12, 1, 385) // TIED - #18
614
SpriteFrame(-22, 0, 44, 12, 1, 398) // TIED (flashing) - #19
615
616
// Game Results objects aren't even placed in the scene normally, but if one is then make it active
617
foreach (TypeName[Game Results], arrayPos0, ALL_ENTITIES)
618
object[arrayPos0].priority = PRIORITY_ACTIVE
619
620
#platform: USE_DECOMP
621
// Hacky fix for this loading in place of the complete save select on an Origins RSDK
622
// -> This happens because, when adding the 2P VS Menu 4 object, the Origins folks added it into the
623
// middle of the object list, therefore offsetting the IDs all objects after it.
624
// That included the Stage Menu object (formerly ID 12), where it got bumped up and now its scene
625
// is comprised of a Game Results object (current ID 12) instead.
626
if stage.activeList == REGULAR_STAGE
627
// Just turn the object into a Stage Menu object, that way it'll be caught by the Stage Menu object's Startup
628
// (Do note, ID-wise the Stage Menu comes after this object and their Startups are run in that order too so we don't gotta do any more than this here)
629
object[arrayPos0].type = TypeName[Stage Menu]
630
end if
631
#endplatform
632
633
next
634
end event
635
636
637
// ========================
638
// Editor Events
639
// ========================
640
641
event RSDKDraw
642
DrawSprite(0)
643
end event
644
645
646
event RSDKLoad
647
LoadSpriteSheet("LevelSelect/Icons.gif")
648
SpriteFrame(-48, 0, 96, 14, 1, 136) // RESULT - #0
649
650
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
651
end event
652
653