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/HPZ/RotatePlatform.txt
1478 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Rotate Platform 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.state : object.isDynamic
13
14
private alias object.value0 : object.rotateAngle
15
private alias object.value1 : object.drawPos.x
16
private alias object.value2 : object.drawPos.y
17
private alias object.value3 : object.collisionOffset.x
18
private alias object.value4 : object.collisionOffset.y
19
private alias object.value5 : object.length
20
private alias object.value6 : object.rotateSpeed
21
private alias object.value7 : object.useSpikeballs
22
private alias object.value8 : object.platformFrame
23
private alias object.value9 : object.pivotAnimTimer
24
private alias object.value10 : object.pivotFrame
25
private alias object.value11 : object.amplitude
26
27
// Player Aliases
28
private alias object.xpos : player.xpos
29
private alias object.ypos : player.ypos
30
31
32
// ========================
33
// Function Declarations
34
// ========================
35
36
reserve function RotatePlatform_DebugDraw
37
reserve function RotatePlatform_DebugSpawn
38
39
40
// ========================
41
// Tables
42
// ========================
43
44
private table RotatePlatform_pivotFrames
45
2, 2, 2, 2, 1, 0, 0, 1
46
end table
47
48
49
// ========================
50
// Function Definitions
51
// ========================
52
53
private function RotatePlatform_DebugDraw
54
temp7 = 3
55
DrawSprite(0)
56
57
temp0 = 0
58
temp1 = 16
59
while temp0 < temp7
60
Cos(temp2, 128)
61
temp2 *= temp1
62
temp2 <<= 7
63
temp2 += object.xpos
64
65
Sin(temp3, 128)
66
temp3 *= temp1
67
temp3 <<= 7
68
temp3 += object.ypos
69
70
DrawSpriteXY(1, temp2, temp3)
71
72
temp0++
73
temp1 += 16
74
loop
75
temp1 -= 8
76
77
Cos(temp2, 128)
78
temp2 *= temp1
79
temp2 <<= 7
80
temp2 += object.xpos
81
82
Sin(temp3, 128)
83
temp3 *= temp1
84
temp3 <<= 7
85
temp3 += object.ypos
86
87
DrawSpriteXY(2, temp2, temp3)
88
end function
89
90
91
private function RotatePlatform_DebugSpawn
92
// Bug Details:
93
// -> Only the last Rotate Platform spawned here is given the PRIORITY_XBOUNDS_DESTROY priority, while the first two aren't
94
// -> Because of this, if you go make these go off screen and then return to them later,
95
// it'll only be a set of 2 platforms rather than the usual 3
96
// (yeah this really isn't too big of a bug but hey, it's worth noting anyways)
97
98
CreateTempObject(TypeName[Rotate Platform], 0, object.xpos, object.ypos)
99
object[tempObjectPos].length = 3
100
object[tempObjectPos].rotateSpeed = 128
101
object[tempObjectPos].rotateAngle = 0
102
103
CreateTempObject(TypeName[Rotate Platform], 0, object.xpos, object.ypos)
104
object[tempObjectPos].length = 3
105
object[tempObjectPos].rotateSpeed = 128
106
object[tempObjectPos].rotateAngle = 0x5500
107
108
CreateTempObject(TypeName[Rotate Platform], 0, object.xpos, object.ypos)
109
object[tempObjectPos].length = 3
110
object[tempObjectPos].rotateSpeed = 128
111
object[tempObjectPos].rotateAngle = 0xAB00
112
end function
113
114
115
// ========================
116
// Events
117
// ========================
118
119
event ObjectUpdate
120
if object.isDynamic == true
121
temp0 = oscillation
122
temp0 <<= 1
123
Sin(object.amplitude, temp0)
124
object.amplitude >>= 3
125
object.amplitude += 0xC0
126
else
127
object.amplitude = 0x100
128
end if
129
130
temp2 = object.xpos
131
temp3 = object.ypos
132
object.rotateAngle += object.rotateSpeed
133
object.rotateAngle &= 0x1FFFF
134
135
temp0 = object.rotateAngle
136
temp0 >>= 8
137
temp1 = object.length
138
temp1++
139
temp1 <<= 4
140
object.xpos = object.drawPos.x
141
object.ypos = object.drawPos.y
142
143
Cos256(object.collisionOffset.x, temp0)
144
object.collisionOffset.x *= temp1
145
object.collisionOffset.x *= object.amplitude
146
object.collisionOffset.x += temp2
147
object.collisionOffset.x &= 0xFFFF0000
148
object.drawPos.x = object.collisionOffset.x
149
object.collisionOffset.x -= object.xpos
150
151
Sin256(object.collisionOffset.y, temp0)
152
object.collisionOffset.y *= temp1
153
object.collisionOffset.y *= object.amplitude
154
object.collisionOffset.y += temp3
155
object.collisionOffset.y &= 0xFFFF0000
156
object.drawPos.y = object.collisionOffset.y
157
object.collisionOffset.y -= object.ypos
158
159
if object.useSpikeballs == false
160
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
161
BoxCollisionTest(C_PLATFORM, object.entityPos, -24, -8, 24, 8, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
162
if checkResult == true
163
player[currentPlayer].xpos += object.collisionOffset.x
164
player[currentPlayer].ypos += object.collisionOffset.y
165
end if
166
next
167
else
168
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
169
BoxCollisionTest(C_TOUCH, object.entityPos, -16, -16, 16, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
170
if checkResult == true
171
CallFunction(Player_Hit)
172
end if
173
next
174
end if
175
176
object.xpos = temp2
177
object.ypos = temp3
178
179
temp0 = object.pivotAnimTimer
180
temp0 >>= 2
181
GetTableValue(object.pivotFrame, temp0, RotatePlatform_pivotFrames)
182
object.pivotAnimTimer++
183
object.pivotAnimTimer &= 31
184
end event
185
186
187
event ObjectDraw
188
temp0 = 0
189
temp1 = 16
190
temp4 = object.rotateAngle
191
temp4 >>= 8
192
while temp0 < object.length
193
Cos256(temp2, temp4)
194
temp2 *= temp1
195
temp2 *= object.amplitude
196
temp2 += object.xpos
197
198
Sin256(temp3, temp4)
199
temp3 *= temp1
200
temp3 *= object.amplitude
201
temp3 += object.ypos
202
203
DrawSpriteXY(3, temp2, temp3)
204
205
temp0++
206
temp1 += 16
207
loop
208
209
Cos256(object.drawPos.x, temp4)
210
object.drawPos.x *= temp1
211
object.drawPos.x *= object.amplitude
212
object.drawPos.x += object.xpos
213
object.drawPos.x &= 0xFFFF0000
214
215
Sin256(object.drawPos.y, temp4)
216
object.drawPos.y *= temp1
217
object.drawPos.y *= object.amplitude
218
object.drawPos.y += object.ypos
219
object.drawPos.y &= 0xFFFF0000
220
221
DrawSpriteXY(object.platformFrame, object.drawPos.x, object.drawPos.y)
222
DrawSprite(object.pivotFrame)
223
end event
224
225
226
event ObjectStartup
227
LoadSpriteSheet("HPZ/Objects.gif")
228
SpriteFrame(-8, -8, 16, 16, 181, 73) // orb (inactive) - #0
229
SpriteFrame(-8, -8, 16, 16, 181, 90) // orb (activating) - #1
230
SpriteFrame(-8, -8, 16, 16, 181, 107) // orb (active) - #2
231
SpriteFrame(-8, -8, 16, 16, 181, 73) // orb (inactive) - #3
232
SpriteFrame(-32, -8, 64, 16, 1, 183) // platform - #4
233
SpriteFrame(-20, -20, 40, 40, 402, 66) // spike - #5
234
235
SetTableValue(TypeName[Rotate Platform], DebugMode_ObjCount, DebugMode_TypesTable)
236
SetTableValue(RotatePlatform_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
237
SetTableValue(RotatePlatform_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
238
DebugMode_ObjCount++
239
240
foreach (TypeName[Rotate Platform], arrayPos0, ALL_ENTITIES)
241
if object[arrayPos0].isDynamic == true
242
object[arrayPos0].length = 5
243
else
244
object[arrayPos0].length = 4
245
end if
246
247
object[arrayPos0].rotateSpeed = object[arrayPos0].propertyValue
248
object[arrayPos0].rotateSpeed >>= 3
249
object[arrayPos0].rotateSpeed <<= 7
250
object[arrayPos0].rotateSpeed &= 0x7FB
251
if object[arrayPos0].rotateSpeed >= 0x400
252
object[arrayPos0].rotateSpeed -= 0x400
253
FlipSign(object[arrayPos0].rotateSpeed)
254
end if
255
256
object[arrayPos0].rotateAngle = object[arrayPos0].propertyValue
257
object[arrayPos0].rotateAngle &= 7
258
object[arrayPos0].rotateAngle *= 0x2A00
259
260
object[arrayPos0].useSpikeballs = object[arrayPos0].propertyValue
261
object[arrayPos0].useSpikeballs >>= 7
262
if object[arrayPos0].useSpikeballs == false
263
object[arrayPos0].platformFrame = 4
264
else
265
object[arrayPos0].platformFrame = 5
266
end if
267
next
268
end event
269
270
271
// ========================
272
// Editor Events
273
// ========================
274
275
event RSDKEdit
276
if editor.returnVariable == true
277
switch editor.variableID
278
case EDIT_VAR_PROPVAL // property value
279
checkResult = object.propertyValue
280
break
281
282
case 0 // angle
283
checkResult = object.propertyValue
284
checkResult &= 7
285
break
286
287
case 1 // rotateSpeed
288
checkResult = object.propertyValue
289
checkResult >>= 3
290
checkResult &= 0xF
291
break
292
293
case 2 // useSpikeball
294
GetBit(checkResult, object.propertyValue, 7)
295
break
296
297
case 3 // isDynamic
298
checkResult = object.state
299
break
300
301
end switch
302
else
303
switch editor.variableID
304
case EDIT_VAR_PROPVAL // property value
305
object.propertyValue = editor.variableValue
306
break
307
308
case 0 // angle
309
editor.variableValue &= 7
310
311
temp0 = 7
312
Not(temp0)
313
object.propertyValue &= temp0
314
315
object.propertyValue |= editor.variableValue
316
break
317
318
case 1 // rotateSpeed
319
editor.variableValue &= 0xF
320
editor.variableValue <<= 3
321
322
temp0 = 0x78
323
Not(temp0)
324
object.propertyValue &= temp0
325
326
object.propertyValue |= editor.variableValue
327
break
328
329
case 2 // useSpikeball
330
CheckNotEqual(editor.variableValue, false)
331
SetBit(object.propertyValue, 7, checkResult)
332
break
333
334
case 3 // isDynamic
335
object.state = editor.variableValue
336
break
337
338
end switch
339
end if
340
end event
341
342
343
event RSDKDraw
344
if object.isDynamic == true
345
object.length = 5
346
else
347
object.length = 4
348
end if
349
350
object.rotateSpeed = object.propertyValue
351
object.rotateSpeed >>= 3
352
object.rotateSpeed <<= 7
353
object.rotateSpeed &= 0x7FB
354
if object.rotateSpeed >= 0x400
355
object.rotateSpeed -= 0x400
356
FlipSign(object.rotateSpeed)
357
end if
358
359
object.rotateAngle = object.propertyValue
360
object.rotateAngle &= 7
361
object.rotateAngle *= 0x2A00
362
363
object.useSpikeballs = object.propertyValue
364
object.useSpikeballs >>= 7
365
if object.useSpikeballs == false
366
object.platformFrame = 4
367
else
368
object.platformFrame = 5
369
end if
370
371
if object.isDynamic == true
372
Sin(object.amplitude, 0)
373
object.amplitude >>= 3
374
object.amplitude += 0xC0
375
else
376
object.amplitude = 0x100
377
end if
378
379
temp2 = object.xpos
380
temp3 = object.ypos
381
object.rotateAngle &= 0x1FFFF
382
383
temp0 = object.rotateAngle
384
temp0 >>= 8
385
temp1 = object.length
386
temp1++
387
temp1 <<= 4
388
object.xpos = object.drawPos.x
389
object.ypos = object.drawPos.y
390
391
Cos256(object.collisionOffset.x, temp0)
392
object.collisionOffset.x *= temp1
393
object.collisionOffset.x *= object.amplitude
394
object.collisionOffset.x += temp2
395
object.collisionOffset.x &= 0xFFFF0000
396
object.drawPos.x = object.collisionOffset.x
397
object.collisionOffset.x -= object.xpos
398
399
Sin256(object.collisionOffset.y, temp0)
400
object.collisionOffset.y *= temp1
401
object.collisionOffset.y *= object.amplitude
402
object.collisionOffset.y += temp3
403
object.collisionOffset.y &= 0xFFFF0000
404
object.drawPos.y = object.collisionOffset.y
405
object.collisionOffset.y -= object.ypos
406
407
object.xpos = temp2
408
object.ypos = temp3
409
410
temp0 = 0
411
temp1 = 16
412
temp4 = object.rotateAngle
413
temp4 >>= 8
414
while temp0 < object.length
415
Cos256(temp2, temp4)
416
temp2 *= temp1
417
temp2 *= object.amplitude
418
temp2 += object.xpos
419
420
Sin256(temp3, temp4)
421
temp3 *= temp1
422
temp3 *= object.amplitude
423
temp3 += object.ypos
424
425
DrawSpriteXY(3, temp2, temp3)
426
427
temp0++
428
temp1 += 16
429
loop
430
431
Cos256(object.drawPos.x, temp4)
432
object.drawPos.x *= temp1
433
object.drawPos.x *= object.amplitude
434
object.drawPos.x += object.xpos
435
object.drawPos.x &= 0xFFFF0000
436
437
Sin256(object.drawPos.y, temp4)
438
object.drawPos.y *= temp1
439
object.drawPos.y *= object.amplitude
440
object.drawPos.y += object.ypos
441
object.drawPos.y &= 0xFFFF0000
442
443
DrawSpriteXY(object.platformFrame, object.drawPos.x, object.drawPos.y)
444
DrawSprite(2)
445
end event
446
447
448
event RSDKLoad
449
LoadSpriteSheet("HPZ/Objects.gif")
450
SpriteFrame(-8, -8, 16, 16, 181, 73) // orb (inactive) - #0
451
SpriteFrame(-8, -8, 16, 16, 181, 90) // orb (activating) - #1
452
SpriteFrame(-8, -8, 16, 16, 181, 107) // orb (active) - #2
453
SpriteFrame(-8, -8, 16, 16, 181, 73) // orb (inactive) - #3
454
SpriteFrame(-32, -8, 64, 16, 1, 183) // platform - #4
455
SpriteFrame(-20, -20, 40, 40, 402, 66) // spike - #5
456
457
AddEditorVariable("angle")
458
SetActiveVariable("angle")
459
460
AddEditorVariable("rotateSpeed")
461
SetActiveVariable("rotateSpeed")
462
463
AddEditorVariable("useSpikeball")
464
SetActiveVariable("useSpikeball")
465
AddEnumVariable("false", false)
466
AddEnumVariable("true", true)
467
468
AddEditorVariable("isDynamic")
469
SetActiveVariable("isDynamic")
470
AddEnumVariable("false", false)
471
AddEnumVariable("true", true)
472
end event
473
474