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/Special/Checkpoint2PVS.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Checkpoint 2PVS 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.localPos.x // unused, required for halfpipe stuff though
14
private alias object.value2 : object.localPos.y // unused, required for halfpipe stuff though
15
private alias object.value3 : object.localPos.z
16
private alias object.value4 : object.worldPos.x // unused, required for halfpipe stuff though
17
private alias object.value5 : object.worldPos.y // unused, required for halfpipe stuff though
18
private alias object.value6 : object.worldPos.z // unused, required for halfpipe stuff though
19
private alias object.value7 : object.thumbPos.y
20
private alias object.value8 : object.failed
21
private alias object.value9 : object.emblemFrame
22
private alias object.value10 : object.thumbsFrame
23
24
// States
25
private alias 0 : CHECKPOINT2PVS_SETUP
26
private alias 1 : CHECKPOINT2PVS_AWAITPLAYERS
27
private alias 2 : CHECKPOINT2PVS_SHOWRESULTS
28
private alias 3 : CHECKPOINT2PVS_EXITMSG
29
private alias 4 : CHECKPOINT2PVS_SHOWNEXTMSG
30
private alias 5 : CHECKPOINT2PVS_FADEOUT
31
private alias 6 : CHECKPOINT2PVS_TORESULTSSCREEN
32
33
// Text Message Property Values
34
private alias 5 : TEXTMESSAGE_MOSTRINGSWIN
35
private alias 6 : TEXTMESSAGE_P1WINS
36
private alias 7 : TEXTMESSAGE_P2WINS
37
private alias 8 : TEXTMESSAGE_TIE
38
39
// Player Aliases
40
private alias object.value0 : player.rings
41
private alias object.value14 : player.localPos.z
42
private alias object.value19 : player.vsCheckpointID
43
private alias object.value20 : player.vsCheckpoint1Rings
44
private alias object.value21 : player.vsCheckpoint2Rings
45
private alias object.value22 : player.vsCheckpoint3Rings
46
47
// Face Buffer Flag Aliases
48
private alias 5 : FACE_TEXTURED_C
49
50
51
// ========================
52
// Function Declarations
53
// ========================
54
55
reserve function Checkpoint2PVS_ProcessDrawing
56
57
58
// ========================
59
// Tables
60
// ========================
61
62
private table Checkpoint2PVS_vertexUTable
63
165, 198, 231, 264, 297, 330, 263
64
end table
65
66
67
// ========================
68
// Function Definitions
69
// ========================
70
71
private function Checkpoint2PVS_ProcessDrawing
72
arrayPos0 = scene3D.vertexCount
73
arrayPos1 = scene3D.faceCount
74
temp0 = object.localPos.z
75
temp0 >>= 22
76
temp0 &= 3
77
GetTableValue(arrayPos2, temp0, Halfpipe_checkpointFaceTable)
78
79
temp0 = 0
80
while temp0 < 7
81
faceBuffer[arrayPos1].flag = FACE_TEXTURED_C
82
faceBuffer[arrayPos1].a = arrayPos0
83
vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x
84
vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y
85
vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z
86
GetTableValue(vertexBuffer[arrayPos0].u, object.frame, Checkpoint2PVS_vertexUTable)
87
vertexBuffer[arrayPos0].v = 256
88
arrayPos0++
89
90
faceBuffer[arrayPos1].b = arrayPos0
91
vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x
92
vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y
93
vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z
94
vertexBuffer[arrayPos0].u = 0x800
95
vertexBuffer[arrayPos0].v = 0x800
96
arrayPos0++
97
98
faceBuffer[arrayPos1].c = arrayPos0
99
vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x
100
vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y
101
vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z
102
vertexBuffer[arrayPos0].u = 16
103
vertexBuffer[arrayPos0].v = 16
104
arrayPos0++
105
106
faceBuffer[arrayPos1].d = arrayPos0
107
vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x
108
vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y
109
vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z
110
arrayPos0++
111
112
scene3D.vertexCount += 4
113
scene3D.faceCount++
114
arrayPos1++
115
arrayPos2 += 4
116
temp0++
117
loop
118
end function
119
120
121
// ========================
122
// Events
123
// ========================
124
125
event ObjectUpdate
126
switch object.state
127
case CHECKPOINT2PVS_SETUP
128
if object.timer < 16
129
object.timer++
130
else
131
object.localPos.z >>= 22
132
object.localPos.z <<= 22
133
object.localPos.z += 0x300000
134
ResetObjectEntity(11, TypeName[Blank Object], 0, 0, 0)
135
136
object.timer = 0
137
object.state++
138
end if
139
break
140
141
case CHECKPOINT2PVS_AWAITPLAYERS
142
object.animationTimer++
143
if object.animationTimer == 4
144
object.animationTimer = 0
145
object.frame++
146
object.frame %= 7
147
end if
148
CallFunction(Checkpoint2PVS_ProcessDrawing)
149
150
temp3 = false
151
foreach (TypeName[Player Object], currentPlayer, ACTIVE_ENTITIES)
152
if temp3 == false
153
temp1 = object.localPos.z
154
temp1 -= 0x20000
155
temp2 = object.localPos.z
156
temp2 += 0x20000
157
if player[currentPlayer].localPos.z > temp1
158
if player[currentPlayer].localPos.z < temp2
159
object.thumbPos.y = 80
160
#platform: USE_STANDALONE
161
object.drawOrder = 5
162
#endplatform
163
#platform: USE_ORIGINS
164
object.drawOrder = 6
165
#endplatform
166
if player[2].rings == player[3].rings
167
object.emblemFrame = -1
168
CreateTempObject(TypeName[Text Message], TEXTMESSAGE_TIE, 0, 0)
169
else
170
if player[2].rings > player[3].rings
171
player[2].vsCheckpointID++
172
173
// Bug Details:
174
// This works fine for the other characters, but for Amy in Origins Plus her actual character ID is 5,
175
// which means the sprite ID this would have would be one SpriteFrame over the actual Amy Emblem sprite
176
object.emblemFrame = 4
177
object.emblemFrame += stage.playerListPos
178
179
if vs.playerID == 0
180
CreateTempObject(TypeName[Text Message], TEXTMESSAGE_P1WINS, 0, 0)
181
else
182
CreateTempObject(TypeName[Text Message], TEXTMESSAGE_P2WINS, 0, 0)
183
end if
184
else
185
if ReceiveValue == -1
186
player[3].vsCheckpointID++
187
end if
188
189
// Also bugged in Origins Plus, see above
190
object.emblemFrame = 4
191
object.emblemFrame += vs.player2Type
192
193
if vs.playerID == 0
194
CreateTempObject(TypeName[Text Message], TEXTMESSAGE_P2WINS, 0, 0)
195
else
196
CreateTempObject(TypeName[Text Message], TEXTMESSAGE_P1WINS, 0, 0)
197
end if
198
end if
199
end if
200
201
switch SpecialSetup_checkpointID
202
case 0
203
player[2].vsCheckpoint1Rings = player[2].rings
204
player[3].vsCheckpoint1Rings = player[3].rings
205
break
206
207
case 1
208
player[2].vsCheckpoint2Rings = player[2].rings
209
player[3].vsCheckpoint2Rings = player[3].rings
210
break
211
212
case 2
213
player[2].vsCheckpoint3Rings = player[2].rings
214
player[3].vsCheckpoint3Rings = player[3].rings
215
break
216
end switch
217
218
#platform: USE_STANDALONE
219
object[tempObjectPos].drawOrder = 5
220
#endplatform
221
#platform: USE_ORIGINS
222
object[tempObjectPos].drawOrder = 6
223
#endplatform
224
PlaySfx(SfxName[Star Post], false)
225
object.thumbsFrame = 0
226
if object.emblemFrame == 6
227
object.thumbsFrame += 2
228
end if
229
temp3 = true
230
231
object.state++
232
end if
233
end if
234
end if
235
next
236
break
237
238
case CHECKPOINT2PVS_SHOWRESULTS
239
Sin(object.thumbPos.y, object.angle)
240
object.thumbPos.y >>= 7
241
object.thumbPos.y += 0x50
242
object.angle += 24
243
object.angle &= 0x1FF
244
245
if object.timer < 120
246
if object.timer < 20
247
CallFunction(Checkpoint2PVS_ProcessDrawing)
248
end if
249
250
object.timer++
251
else
252
object.timer = 0
253
object.state++
254
end if
255
break
256
257
case CHECKPOINT2PVS_EXITMSG
258
if object.scale > 0
259
object.scale -= 16
260
else
261
SpecialSetup_checkpointID++
262
if SpecialSetup_checkpointID == 3
263
object.state = CHECKPOINT2PVS_FADEOUT
264
object[2].controlMode = CONTROLMODE_NONE
265
object[3].controlMode = CONTROLMODE_NONE
266
else
267
object.state++
268
end if
269
end if
270
break
271
272
case CHECKPOINT2PVS_SHOWNEXTMSG
273
if object.timer < 10
274
object.timer++
275
else
276
CreateTempObject(TypeName[Text Message], TEXTMESSAGE_MOSTRINGSWIN, 0, 0)
277
#platform: USE_STANDALONE
278
object[tempObjectPos].drawOrder = 5
279
#endplatform
280
#platform: USE_ORIGINS
281
object[tempObjectPos].drawOrder = 6
282
#endplatform
283
ResetObjectEntity(object.entityPos, TypeName[Blank Object], 0, 0, 0)
284
end if
285
break
286
287
case CHECKPOINT2PVS_FADEOUT
288
options.touchControls = false
289
290
if object.timer < 320
291
object.timer += 8
292
SetScreenFade(0xF8, 0xF8, 0xF8, object.timer)
293
else
294
object.timer = 248
295
object.state++
296
SetScreenFade(0xF8, 0xF8, 0xF8, 0xFF)
297
end if
298
break
299
300
case CHECKPOINT2PVS_TORESULTSSCREEN
301
options.touchControls = false
302
303
if object.timer > 0
304
object.timer -= 8
305
music.volume -= 5
306
else
307
if vs.playerID == 0
308
vs.checkpoint1P = player[2].vsCheckpoint1Rings
309
temp0 = player[2].vsCheckpoint2Rings
310
temp0 <<= 8
311
vs.checkpoint1P += temp0
312
temp0 = player[2].vsCheckpoint3Rings
313
temp0 <<= 16
314
vs.checkpoint1P += temp0
315
316
vs.checkpoint2P = player[3].vsCheckpoint1Rings
317
temp0 = player[3].vsCheckpoint2Rings
318
temp0 <<= 8
319
vs.checkpoint2P += temp0
320
temp0 = player[3].vsCheckpoint3Rings
321
temp0 <<= 16
322
vs.checkpoint2P += temp0
323
else
324
vs.checkpoint1P = player[3].vsCheckpoint1Rings
325
temp0 = player[3].vsCheckpoint2Rings
326
temp0 <<= 8
327
vs.checkpoint1P += temp0
328
temp0 = player[3].vsCheckpoint3Rings
329
temp0 <<= 16
330
vs.checkpoint1P += temp0
331
332
vs.checkpoint2P = player[2].vsCheckpoint1Rings
333
temp0 = player[2].vsCheckpoint2Rings
334
temp0 <<= 8
335
vs.checkpoint2P += temp0
336
temp0 = player[2].vsCheckpoint3Rings
337
temp0 <<= 16
338
vs.checkpoint2P += temp0
339
end if
340
341
stage.activeList = PRESENTATION_STAGE
342
stage.listPos = 3
343
StopMusic()
344
LoadStage()
345
end if
346
347
SetScreenFade(object.timer, object.timer, object.timer, 255)
348
break
349
end switch
350
end event
351
352
353
event ObjectDraw
354
if object.emblemFrame > -1
355
switch object.state
356
case CHECKPOINT2PVS_SHOWRESULTS
357
DrawSpriteScreenXY(object.emblemFrame, screen.xcenter, 80)
358
DrawSpriteScreenXY(object.thumbsFrame, screen.xcenter, object.thumbPos.y)
359
break
360
361
case CHECKPOINT2PVS_EXITMSG
362
DrawSpriteScreenFX(object.emblemFrame, FX_SCALE, screen.xcenter, 80)
363
DrawSpriteScreenFX(object.thumbsFrame, FX_SCALE, screen.xcenter, object.thumbPos.y)
364
break
365
end switch
366
end if
367
end event
368
369
370
event ObjectStartup
371
LoadSpriteSheet("Special/Objects.gif")
372
SpriteFrame(-24, -24, 48, 48, 463, 42) // Thumbs up - #0
373
SpriteFrame(-24, -24, 48, 48, 366, 155) // Thumbs down - #1
374
SpriteFrame(-24, -24, 48, 48, 463, 328) // Thumbs up (Knux) - #2
375
SpriteFrame(-24, -24, 48, 48, 463, 377) // Thumbs down (Knux) - #3
376
SpriteFrame(-48, -24, 96, 48, 415, 122) // Emblem (Sonic) - #4
377
SpriteFrame(-48, -24, 96, 48, 415, 171) // Emblem (Tails) - #5
378
SpriteFrame(-48, -24, 96, 48, 415, 220) // Emblem (Knux) - #6
379
#platform: USE_ORIGINS
380
SpriteFrame(-48, -24, 96, 48, 154, 361) // Emblem (Amy) - #7
381
#endplatform
382
383
if options.vsMode == true
384
foreach (TypeName[Checkpoint], arrayPos0, ALL_ENTITIES)
385
object[arrayPos0].type = TypeName[Checkpoint 2PVS]
386
next
387
388
foreach (TypeName[Chaos Emerald], arrayPos0, ALL_ENTITIES)
389
object[arrayPos0].type = TypeName[Checkpoint 2PVS]
390
next
391
392
foreach (TypeName[Rings Reminder], arrayPos0, ALL_ENTITIES)
393
object[arrayPos0].type = TypeName[Blank Object]
394
next
395
end if
396
end event
397
398
399
// ========================
400
// Editor Events
401
// ========================
402
403
event RSDKDraw
404
DrawSprite(0)
405
DrawSprite(1)
406
end event
407
408
409
event RSDKLoad
410
LoadSpriteSheet("Special/Objects.gif")
411
SpriteFrame(-16, -8, 32, 16, 199, 165)
412
SpriteFrame(-8, -4, 16, 7, 348, 108)
413
414
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
415
end event
416
417