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/Global/Spikes.txt
1482 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Spikes 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.movePos
14
private alias object.value2 : object.parentSlot
15
16
private alias 0 : SPIKES_STATIC
17
private alias 1 : SPIKES_HIDDEN
18
private alias 2 : SPIKES_APPEAR
19
private alias 3 : SPIKES_SHOWN
20
private alias 4 : SPIKES_DISAPPEAR
21
private alias 5 : SPIKES_HASPARENT
22
23
// Player Aliases
24
private alias object.xvel : player.xvel
25
private alias object.yvel : player.yvel
26
private alias object.gravity : player.gravity
27
private alias object.collisionMode : player.collisionMode
28
private alias object.value7 : player.invincibleTimer
29
private alias object.value17 : debugMode.currentSelection
30
31
32
// ========================
33
// Function Declarations
34
// ========================
35
36
reserve function Spikes_DebugDraw
37
reserve function Spikes_DebugSpawn
38
39
40
// ========================
41
// Static Values
42
// ========================
43
44
private value Spikes_startDebugID = 0
45
46
47
// ========================
48
// Function Definitions
49
// ========================
50
51
private function Spikes_DebugDraw
52
temp2 = debugMode[0].currentSelection
53
temp2 -= Spikes_startDebugID
54
DrawSprite(temp2)
55
end function
56
57
58
private function Spikes_DebugSpawn
59
temp0 = debugMode[0].currentSelection
60
temp0 -= Spikes_startDebugID
61
CreateTempObject(TypeName[Spikes], temp0, object.xpos, object.ypos)
62
end function
63
64
65
// ========================
66
// Events
67
// ========================
68
69
event ObjectUpdate
70
switch object.state
71
case SPIKES_HIDDEN
72
if object.timer < 60
73
object.timer++
74
else
75
object.state++
76
object.timer = 0
77
temp0 = screen.xcenter
78
temp0 += 64
79
temp1 = temp0
80
FlipSign(temp0)
81
BoxCollisionTest(C_TOUCH, object.entityPos, temp0, -128, temp1, 128, 0, 0, 0, 0, 0)
82
if checkResult == true
83
PlaySfx(SfxName[Spikes Move], false)
84
end if
85
end if
86
break
87
88
case SPIKES_APPEAR
89
if object.movePos < 0x200000
90
object.movePos += 0x80000
91
object.xpos += object.xvel
92
object.ypos += object.yvel
93
else
94
object.state++
95
end if
96
break
97
98
case SPIKES_SHOWN
99
if object.timer < 60
100
object.timer++
101
else
102
object.state++
103
object.timer = 0
104
temp0 = screen.xcenter
105
temp0 += 64
106
temp1 = temp0
107
FlipSign(temp0)
108
BoxCollisionTest(C_TOUCH, object.entityPos, temp0, -128, temp1, 128, 0, 0, 0, 0, 0)
109
if checkResult == true
110
PlaySfx(SfxName[Spikes Move], false)
111
end if
112
end if
113
break
114
115
case SPIKES_DISAPPEAR
116
if object.movePos > 0
117
object.movePos -= 0x80000
118
object.xpos -= object.xvel
119
object.ypos -= object.yvel
120
else
121
object.state = SPIKES_HIDDEN
122
end if
123
break
124
125
case SPIKES_HASPARENT
126
arrayPos0 = object.parentSlot
127
object.ypos = object[-arrayPos0].ypos
128
break
129
end switch
130
131
switch object.propertyValue
132
case 0
133
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
134
BoxCollisionTest(C_SOLID, object.entityPos, -16, -16, 16, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
135
if checkResult == COL_BOTTOM
136
if player[currentPlayer].gravity == GRAVITY_GROUND
137
CallFunction(Player_Kill)
138
end if
139
end if
140
141
if player[currentPlayer].yvel > -1
142
BoxCollisionTest(C_TOUCH, object.entityPos, -15, -17, 15, -12, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
143
if checkResult == true
144
CallFunction(Player_SpikeHit)
145
end if
146
end if
147
next
148
break
149
150
case 1
151
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
152
BoxCollisionTest(C_SOLID, object.entityPos, -16, -16, 15, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
153
if checkResult == COL_BOTTOM
154
if player[currentPlayer].gravity == GRAVITY_GROUND
155
CallFunction(Player_Kill)
156
end if
157
end if
158
159
if player[currentPlayer].xvel <= 0
160
BoxCollisionTest(C_TOUCH, object.entityPos, 12, -15, 16, 15, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
161
if checkResult == true
162
CallFunction(Player_SpikeHit)
163
end if
164
end if
165
next
166
break
167
168
case 2
169
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
170
BoxCollisionTest(C_SOLID, object.entityPos, -15, -16, 16, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
171
if checkResult == COL_BOTTOM
172
if player[currentPlayer].gravity == GRAVITY_GROUND
173
CallFunction(Player_Kill)
174
end if
175
end if
176
177
BoxCollisionTest(C_TOUCH, object.entityPos, -16, -15, -12, 15, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
178
if checkResult == true
179
CallFunction(Player_SpikeHit)
180
end if
181
next
182
break
183
184
case 3
185
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
186
temp0 = player[currentPlayer].yvel
187
BoxCollisionTest(C_SOLID, object.entityPos, -16, -16, 16, 15, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
188
if checkResult == COL_BOTTOM
189
if player[currentPlayer].gravity == GRAVITY_GROUND
190
if player[currentPlayer].collisionMode == CMODE_FLOOR
191
CallFunction(Player_Kill)
192
player[currentPlayer].invincibleTimer = 0
193
else
194
CallFunction(Player_SpikeHit)
195
end if
196
else
197
CallFunction(Player_SpikeHit)
198
end if
199
temp0 = 1
200
end if
201
202
if temp0 < 1
203
BoxCollisionTest(C_TOUCH, object.entityPos, -15, 12, 15, 14, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
204
if checkResult == true
205
CallFunction(Player_SpikeHit)
206
end if
207
end if
208
next
209
break
210
end switch
211
end event
212
213
214
event ObjectDraw
215
DrawSprite(object.propertyValue)
216
end event
217
218
219
event ObjectStartup
220
LoadSpriteSheet("Global/Items2.gif")
221
SpriteFrame(-16, -16, 32, 32, 182, 99)
222
SpriteFrame(-16, -16, 32, 32, 182, 132)
223
SpriteFrame(-16, -16, 32, 32, 215, 132)
224
SpriteFrame(-16, -16, 32, 32, 215, 99)
225
226
temp0 = 0
227
Spikes_startDebugID = DebugMode_ObjCount
228
while temp0 < 4
229
SetTableValue(TypeName[Spikes], DebugMode_ObjCount, DebugMode_TypesTable)
230
SetTableValue(Spikes_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
231
SetTableValue(Spikes_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
232
DebugMode_ObjCount++
233
temp0++
234
loop
235
236
foreach (TypeName[Spikes], arrayPos0, ALL_ENTITIES)
237
if object[arrayPos0].propertyValue > 3
238
object[arrayPos0].propertyValue &= 3
239
temp0 = object[arrayPos0].propertyValue
240
temp0 &= 3
241
switch temp0
242
case 0
243
object[arrayPos0].xvel = 0
244
object[arrayPos0].yvel = 0x80000
245
object[arrayPos0].ypos += 0x200000
246
break
247
248
case 1
249
object[arrayPos0].xvel = -0x80000
250
object[arrayPos0].yvel = 0
251
object[arrayPos0].xpos -= 0x200000
252
break
253
254
case 2
255
object[arrayPos0].xvel = 0x80000
256
object[arrayPos0].yvel = 0
257
object[arrayPos0].xpos += 0x200000
258
break
259
260
case 3
261
object[arrayPos0].xvel = 0
262
object[arrayPos0].yvel = -0x80000
263
object[arrayPos0].ypos -= 0x200000
264
break
265
end switch
266
267
object[arrayPos0].movePos = 0x200000
268
if object[arrayPos0].state != SPIKES_HASPARENT
269
object[arrayPos0].state = SPIKES_SHOWN
270
end if
271
end if
272
next
273
end event
274
275
276
// ========================
277
// Editor Events
278
// ========================
279
280
event RSDKEdit
281
if editor.returnVariable == true
282
switch editor.variableID
283
case EDIT_VAR_PROPVAL // property value
284
checkResult = object.propertyValue
285
break
286
287
case 0 // orientation
288
checkResult = object.propertyValue
289
checkResult &= 3
290
break
291
292
case 1 // moving
293
GetBit(checkResult, object.propertyValue, 7)
294
break
295
296
end switch
297
else
298
switch editor.variableID
299
case EDIT_VAR_PROPVAL // property value
300
object.propertyValue = editor.variableValue
301
break
302
303
case 0 // orientation
304
temp0 = editor.variableValue
305
temp0 &= 3
306
307
temp1 = 3
308
Not(temp1)
309
310
object.propertyValue &= temp1
311
object.propertyValue |= temp0
312
break
313
314
case 1 // moving
315
CheckNotEqual(editor.variableValue, false)
316
SetBit(object.propertyValue, 7, checkResult)
317
break
318
319
case EDIT_VAR_VAL2
320
// TODO: dunno if val2 is set before, after, or not at all during this, test
321
CheckNotEqual(editor.variableValue, 0)
322
checkResult *= 5
323
object.state = checkResult
324
break
325
326
end switch
327
end if
328
end event
329
330
331
event RSDKDraw
332
object.frame = object.propertyValue
333
object.frame &= 3
334
DrawSprite(object.frame)
335
336
CheckEqual(object.state, 5)
337
temp0 = checkResult
338
CheckEqual(editor.showGizmos, true)
339
temp0 &= checkResult
340
if temp0 == true
341
editor.drawingOverlay = true
342
343
arrayPos0 = object.parentSlot
344
DrawLine(object.xpos, object.ypos, object[-arrayPos0].xpos, object[-arrayPos0].ypos, 0xFF, 0xFF, 0x00)
345
346
editor.drawingOverlay = false
347
end if
348
end event
349
350
351
event RSDKLoad
352
LoadSpriteSheet("Global/Items2.gif")
353
SpriteFrame(-16, -16, 32, 32, 182, 99)
354
SpriteFrame(-16, -16, 32, 32, 182, 132)
355
SpriteFrame(-16, -16, 32, 32, 215, 132)
356
SpriteFrame(-16, -16, 32, 32, 215, 99)
357
358
AddEditorVariable("orientation")
359
SetActiveVariable("orientation")
360
AddEnumVariable("Up", 0)
361
AddEnumVariable("Right", 1)
362
AddEnumVariable("Left", 2)
363
AddEnumVariable("Down", 3)
364
365
AddEditorVariable("moving")
366
SetActiveVariable("moving")
367
AddEnumVariable("false", false)
368
AddEnumVariable("true", true)
369
370
SetVariableAlias(ALIAS_VAR_VAL2, "parentOffset") // state has to be set to 5 for this to be used
371
end event
372
373