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/Checkpoint.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Checkpoint 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 : CHECKPOINT_SETUP
26
private alias 1 : CHECKPOINT_AWAITPLAYER
27
private alias 2 : CHECKPOINT_SHOWRESULTS
28
private alias 3 : CHECKPOINT_EXITMSG
29
private alias 4 : CHECKPOINT_SHOWGETRINGSMSG
30
31
// Text Message Property Values
32
private alias 0 : TEXTMESSAGE_COOL
33
private alias 1 : TEXTMESSAGE_NOTENOUGH
34
private alias 2 : TEXTMESSAGE_GETRINGS
35
36
// Text Message Aliases
37
private alias object.value4 : textMessage.number
38
39
// Player Aliases
40
private alias object.value0 : player.rings
41
private alias object.value14 : player.localPos.z
42
43
// Face Buffer Flag Aliases
44
private alias 5 : FACE_TEXTURED_C
45
46
47
// ========================
48
// Function Declarations
49
// ========================
50
51
reserve function Checkpoint_ProcessDrawing
52
53
54
// ========================
55
// Tables
56
// ========================
57
58
private table Checkpoint_vertexUTable
59
165, 198, 231, 264, 297, 330, 263
60
end table
61
62
63
// ========================
64
// Events
65
// ========================
66
67
private function Checkpoint_ProcessDrawing
68
arrayPos0 = scene3D.vertexCount
69
arrayPos1 = scene3D.faceCount
70
temp0 = object.localPos.z
71
temp0 >>= 22
72
temp0 &= 3
73
GetTableValue(arrayPos2, temp0, Halfpipe_checkpointFaceTable)
74
75
temp0 = 0
76
while temp0 < 7
77
faceBuffer[arrayPos1].flag = FACE_TEXTURED_C
78
faceBuffer[arrayPos1].a = arrayPos0
79
vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x
80
vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y
81
vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z
82
GetTableValue(vertexBuffer[arrayPos0].u, object.frame, Checkpoint_vertexUTable)
83
vertexBuffer[arrayPos0].v = 256
84
arrayPos0++
85
86
faceBuffer[arrayPos1].b = arrayPos0
87
vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x
88
vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y
89
vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z
90
vertexBuffer[arrayPos0].u = 0x800
91
vertexBuffer[arrayPos0].v = 0x800
92
arrayPos0++
93
94
faceBuffer[arrayPos1].c = arrayPos0
95
vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x
96
vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y
97
vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z
98
vertexBuffer[arrayPos0].u = 16
99
vertexBuffer[arrayPos0].v = 16
100
arrayPos0++
101
102
faceBuffer[arrayPos1].d = arrayPos0
103
vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x
104
vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y
105
vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z
106
arrayPos0++
107
108
scene3D.vertexCount += 4
109
scene3D.faceCount++
110
arrayPos1++
111
arrayPos2 += 4
112
temp0++
113
loop
114
end function
115
116
117
// ========================
118
// Events
119
// ========================
120
121
event ObjectUpdate
122
switch object.state
123
case CHECKPOINT_SETUP
124
if object.timer < 16
125
object.timer++
126
else
127
object.localPos.z >>= 22
128
object.localPos.z <<= 22
129
object.localPos.z += 0x300000
130
// Destroy any existing text messages
131
ResetObjectEntity(11, TypeName[Blank Object], 0, 0, 0)
132
object.timer = 0
133
object.state++
134
end if
135
break
136
137
case CHECKPOINT_AWAITPLAYER
138
object.animationTimer++
139
if object.animationTimer == 4
140
object.animationTimer = 0
141
object.frame++
142
object.frame %= 7
143
end if
144
145
CallFunction(Checkpoint_ProcessDrawing)
146
foreach (TypeName[Player Object], currentPlayer, ACTIVE_ENTITIES)
147
temp1 = object.localPos.z
148
temp1 -= 0x20000
149
temp2 = object.localPos.z
150
temp2 += 0x20000
151
if player[currentPlayer].localPos.z > temp1
152
if player[currentPlayer].localPos.z < temp2
153
object.thumbPos.y = 80
154
#platform: USE_STANDALONE
155
object.drawOrder = 5
156
#endplatform
157
#platform: USE_ORIGINS
158
object.drawOrder = 6
159
#endplatform
160
if options.vsMode == false
161
#platform: USE_STANDALONE
162
object.emblemFrame = 4
163
object.emblemFrame += stage.playerListPos
164
#endplatform
165
#platform: USE_ORIGINS
166
if stage.playerListPos >= PLAYER_AMY
167
object.emblemFrame = 7
168
else
169
object.emblemFrame = 4
170
object.emblemFrame += stage.playerListPos
171
end if
172
#endplatform
173
else
174
object.emblemFrame = 4
175
end if
176
177
object.state++
178
179
if stage.player2Enabled == true
180
temp0 = player[2].rings
181
temp0 += player[3].rings
182
else
183
temp0 = player[2].rings
184
end if
185
GetTableValue(temp1, SpecialSetup_checkpointID, SpecialSetup_ringCountTable)
186
187
if temp0 >= temp1
188
object.failed = false
189
CreateTempObject(TypeName[Text Message], TEXTMESSAGE_COOL, 0, 0)
190
#platform: USE_STANDALONE
191
object[tempObjectPos].drawOrder = 5
192
#endplatform
193
#platform: USE_ORIGINS
194
object[tempObjectPos].drawOrder = 6
195
#endplatform
196
PlaySfx(SfxName[Star Post], false)
197
else
198
object.failed = true
199
CreateTempObject(TypeName[Text Message], TEXTMESSAGE_NOTENOUGH, 0, 0)
200
#platform: USE_STANDALONE
201
object[tempObjectPos].drawOrder = 5
202
#endplatform
203
#platform: USE_ORIGINS
204
object[tempObjectPos].drawOrder = 6
205
#endplatform
206
PlaySfx(SfxName[Fail], false)
207
end if
208
209
object.thumbsFrame = object.failed
210
if object.emblemFrame == 6
211
object.thumbsFrame += 2
212
end if
213
end if
214
end if
215
next
216
break
217
218
case CHECKPOINT_SHOWRESULTS
219
Sin(object.thumbPos.y, object.angle)
220
object.thumbPos.y >>= 7
221
object.thumbPos.y += 0x50
222
object.angle += 24
223
object.angle &= 0x1FF
224
225
if object.timer < 120
226
if object.timer < 20
227
CallFunction(Checkpoint_ProcessDrawing)
228
end if
229
object.timer++
230
else
231
object.timer = 0
232
object.state++
233
end if
234
break
235
236
case CHECKPOINT_EXITMSG
237
if object.scale > 0
238
object.scale -= 16
239
else
240
if object.failed == false
241
object.state++
242
else
243
ResetObjectEntity(object.entityPos, TypeName[Blank Object], 0, 0, 0)
244
ResetObjectEntity(20, TypeName[Special Finish], 0, 0, 0)
245
object[20].priority = PRIORITY_ACTIVE
246
#platform: USE_ORIGINS
247
object[20].drawOrder = 6
248
#endplatform
249
end if
250
end if
251
break
252
253
case CHECKPOINT_SHOWGETRINGSMSG
254
if object.timer < 10
255
object.timer++
256
else
257
CreateTempObject(TypeName[Text Message], TEXTMESSAGE_GETRINGS, 0, 0)
258
#platform: USE_STANDALONE
259
object[tempObjectPos].drawOrder = 5
260
#endplatform
261
#platform: USE_ORIGINS
262
object[tempObjectPos].drawOrder = 6
263
#endplatform
264
265
SpecialSetup_checkpointID++
266
GetTableValue(textMessage[tempObjectPos].number, SpecialSetup_checkpointID, SpecialSetup_ringCountTable)
267
ResetObjectEntity(object.entityPos, TypeName[Blank Object], 0, 0, 0)
268
end if
269
break
270
end switch
271
end event
272
273
274
event ObjectDraw
275
switch object.state
276
default
277
case CHECKPOINT_SETUP
278
case CHECKPOINT_AWAITPLAYER
279
case CHECKPOINT_SHOWGETRINGSMSG
280
break
281
282
case CHECKPOINT_SHOWRESULTS
283
DrawSpriteScreenXY(object.emblemFrame, screen.xcenter, 80)
284
DrawSpriteScreenXY(object.thumbsFrame, screen.xcenter, object.thumbPos.y)
285
break
286
287
case CHECKPOINT_EXITMSG
288
DrawSpriteScreenFX(object.emblemFrame, FX_SCALE, screen.xcenter, 80)
289
DrawSpriteScreenFX(object.thumbsFrame, FX_SCALE, screen.xcenter, object.thumbPos.y)
290
break
291
end switch
292
end event
293
294
295
event ObjectStartup
296
LoadSpriteSheet("Special/Objects.gif")
297
298
SpriteFrame(-24, -24, 48, 48, 463, 42) // Thumbs up - #0
299
SpriteFrame(-24, -24, 48, 48, 366, 155) // Thumbs down - #1
300
SpriteFrame(-24, -24, 48, 48, 463, 328) // Thumbs up (Knux) - #2
301
SpriteFrame(-24, -24, 48, 48, 463, 377) // Thumbs down (Knux) - #3
302
SpriteFrame(-48, -24, 96, 48, 415, 122) // Emblem (Sonic) - #4
303
SpriteFrame(-48, -24, 96, 48, 415, 171) // Emblem (Tails) - #5
304
SpriteFrame(-48, -24, 96, 48, 415, 220) // Emblem (Knux) - #6
305
#platform: USE_ORIGINS
306
SpriteFrame(-48, -24, 96, 48, 154, 361) // Emblem (Amy) - #7
307
#endplatform
308
end event
309
310
311
// ========================
312
// Editor Events
313
// ========================
314
315
event RSDKDraw
316
DrawSprite(0)
317
end event
318
319
320
event RSDKLoad
321
LoadSpriteSheet("Special/Objects.gif")
322
SpriteFrame(-16, -8, 32, 16, 199, 165)
323
324
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
325
SetVariableAlias(ALIAS_VAR_VAL0, "ringCount2P")
326
SetVariableAlias(ALIAS_VAR_VAL1, "ringCountSonic")
327
SetVariableAlias(ALIAS_VAR_VAL2, "ringCountKnux")
328
SetVariableAlias(ALIAS_VAR_VAL3, "unused")
329
end event
330
331