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/RailRocket.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Rail Rocket 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.startPos.x
14
private alias object.value2 : object.startPos.y
15
private alias object.value3 : object.handlePos.x
16
private alias object.value4 : object.handlePos.y
17
private alias object.value5 : object.handleAngle
18
private alias object.value6 : object.chainPos.x
19
private alias object.value7 : object.chainPos.y
20
private alias object.value8 : object.grabDelay
21
private alias object.value9 : object.targetPos.y
22
private alias object.value10 : object.hasPlayer
23
private alias object.value11 : object.rocketDir
24
private alias object.value12 : object.handleAngleVel
25
private alias object.value13 : object.flameAnimTimer
26
27
// States
28
private alias 0 : RAILROCKET_AWAITPLAYER
29
private alias 1 : RAILROCKET_MOVETOTARGET
30
private alias 2 : RAILROCKET_REACHEDTARGET
31
private alias 3 : RAILROCKET_RETURNTOSTART
32
private alias 4 : RAILROCKET_FINISHED
33
34
// Player Aliases
35
private alias object.state : player.state
36
private alias object.xpos : player.xpos
37
private alias object.ypos : player.ypos
38
private alias object.xvel : player.xvel
39
private alias object.yvel : player.yvel
40
private alias object.speed : player.speed
41
private alias object.gravity : player.gravity
42
private alias object.animation : player.animation
43
private alias object.collisionTop : player.collisionTop
44
private alias object.jumpPress : player.jumpPress
45
46
47
// ========================
48
// Function Declarations
49
// ========================
50
51
reserve function RailRocket_DebugDraw
52
reserve function RailRocket_DebugSpawn
53
54
55
// ========================
56
// Function Definitions
57
// ========================
58
59
private function RailRocket_DebugDraw
60
DrawSprite(object.direction)
61
end function
62
63
64
private function RailRocket_DebugSpawn
65
CreateTempObject(TypeName[Rail Rocket], 0, object.xpos, object.ypos)
66
object[tempObjectPos].rocketDir = object.direction
67
end function
68
69
70
// ========================
71
// Events
72
// ========================
73
74
event ObjectUpdate
75
switch object.state
76
case RAILROCKET_AWAITPLAYER
77
if object.handleAngle > 0
78
if object.handleAngleVel > 0
79
object.handleAngleVel -= 16
80
else
81
object.handleAngleVel -= 8
82
end if
83
else
84
if object.handleAngleVel < 0
85
object.handleAngleVel += 16
86
else
87
object.handleAngleVel += 8
88
end if
89
end if
90
object.handleAngle += object.handleAngleVel
91
92
if object.hasPlayer == true
93
object.speed = -0x80000
94
object.state = RAILROCKET_MOVETOTARGET
95
PlaySfx(SfxName[Launch], false)
96
end if
97
break
98
99
case RAILROCKET_MOVETOTARGET
100
object.ypos += object.speed
101
temp0 = object.speed
102
temp0 >>= 1
103
if object.rocketDir == FLIP_NONE
104
object.xpos += temp0
105
object.handleAngle += 0x20
106
if object.handleAngle >= 0x200
107
object.handleAngle = 0x200
108
end if
109
else
110
object.xpos -= temp0
111
object.handleAngle -= 0x20
112
if object.handleAngle <= -0x200
113
object.handleAngle = -0x200
114
end if
115
end if
116
117
if object.ypos <= object.targetPos.y
118
object.speed = 0
119
object.ypos = object.targetPos.y
120
if object.rocketDir == FLIP_NONE
121
object.handleAngleVel = -0x80
122
else
123
object.handleAngleVel = 0x80
124
end if
125
object.state = RAILROCKET_REACHEDTARGET
126
end if
127
128
object.frame = object.animationTimer
129
object.frame >>= 3
130
temp0 = object.speed
131
Abs(temp0)
132
temp0 >>= 16
133
object.animationTimer += temp0
134
object.animationTimer &= 15
135
object.flameAnimTimer++
136
object.flameAnimTimer &= 3
137
138
if ringTimer == 0
139
CreateTempObject(TypeName[Dust Puff], 0, object.xpos, object.ypos)
140
if object.rocketDir == FLIP_NONE
141
object[tempObjectPos].ixpos += 10
142
else
143
object[tempObjectPos].ixpos -= 10
144
end if
145
object[tempObjectPos].iypos += 22
146
end if
147
break
148
149
case RAILROCKET_REACHEDTARGET
150
if object.handleAngle > 0
151
if object.handleAngleVel > 0
152
object.handleAngleVel -= 16
153
else
154
object.handleAngleVel -= 8
155
end if
156
else
157
if object.handleAngleVel < 0
158
object.handleAngleVel += 16
159
else
160
object.handleAngleVel += 8
161
end if
162
end if
163
164
object.handleAngle += object.handleAngleVel
165
object.timer++
166
if object.timer == 60
167
object.timer = 0
168
object.state = RAILROCKET_RETURNTOSTART
169
end if
170
171
object.flameAnimTimer++
172
object.flameAnimTimer &= 3
173
break
174
175
case RAILROCKET_RETURNTOSTART
176
object.speed += 0x1800
177
if object.speed > 0x80000
178
object.speed = 0x80000
179
end if
180
object.ypos += object.speed
181
182
temp0 = object.speed
183
temp0 >>= 1
184
if object.rocketDir == FLIP_NONE
185
object.xpos += temp0
186
object.handleAngle -= 0x20
187
if object.handleAngle <= -0x200
188
object.handleAngle = -0x200
189
end if
190
else
191
object.xpos -= temp0
192
object.handleAngle += 0x20
193
if object.handleAngle >= 0x200
194
object.handleAngle = 0x200
195
end if
196
end if
197
198
if object.ypos >= object.startPos.y
199
object.speed = 0
200
object.xpos = object.startPos.x
201
object.ypos = object.startPos.y
202
if object.rocketDir == FLIP_NONE
203
object.handleAngleVel = 0x80
204
else
205
object.handleAngleVel = -0x80
206
end if
207
object.state = RAILROCKET_FINISHED
208
end if
209
210
object.frame = object.animationTimer
211
object.frame >>= 3
212
temp0 = object.speed
213
Abs(temp0)
214
temp0 >>= 16
215
object.animationTimer += temp0
216
object.animationTimer &= 15
217
break
218
219
case RAILROCKET_FINISHED
220
if object.handleAngle > 0
221
if object.handleAngleVel > 0
222
object.handleAngleVel -= 16
223
else
224
object.handleAngleVel -= 8
225
end if
226
else
227
if object.handleAngleVel < 0
228
object.handleAngleVel += 16
229
else
230
object.handleAngleVel += 8
231
end if
232
end if
233
object.handleAngle += object.handleAngleVel
234
235
if object.hasPlayer == false
236
object.state = RAILROCKET_AWAITPLAYER
237
end if
238
break
239
240
end switch
241
242
temp0 = 0
243
temp4 = object.handleAngle
244
object.handlePos.x = object.xpos
245
object.handlePos.y = object.ypos
246
while temp0 < 8
247
temp5 = temp4
248
temp5 >>= 7
249
temp5 &= 0x1FF
250
251
Sin(temp2, temp5)
252
temp2 *= 0x312
253
object.handlePos.x += temp2
254
255
Cos(temp3, temp5)
256
temp3 *= 0x312
257
object.handlePos.y += temp3
258
259
temp0++
260
temp4 += object.handleAngle
261
loop
262
263
if object.grabDelay > 0
264
object.grabDelay--
265
end if
266
object.hasPlayer = false
267
268
temp0 = object.xpos
269
temp1 = object.ypos
270
object.xpos = object.handlePos.x
271
object.ypos = object.handlePos.y
272
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
273
if player[currentPlayer].state != Player_State_Static
274
if object.grabDelay == 0
275
BoxCollisionTest(C_TOUCH, object.entityPos, -10, 16, 10, 24, currentPlayer, C_BOX, 0, C_BOX, 0)
276
if checkResult == true
277
if player[currentPlayer].gravity == GRAVITY_AIR
278
player[currentPlayer].state = Player_State_Static
279
player[currentPlayer].animation = ANI_HANGING
280
player[currentPlayer].speed = 0
281
player[currentPlayer].xvel = 0
282
player[currentPlayer].yvel = 0
283
player[currentPlayer].xpos = object.xpos
284
player[currentPlayer].ypos = player[currentPlayer].collisionTop
285
FlipSign(player[currentPlayer].ypos)
286
player[currentPlayer].ypos += 8
287
player[currentPlayer].ypos <<= 16
288
player[currentPlayer].ypos += object.ypos
289
290
PlaySfx(SfxName[Catch], false)
291
object.hasPlayer = true
292
end if
293
end if
294
end if
295
else
296
BoxCollisionTest(C_TOUCH, object.entityPos, -8, -4, 8, 20, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
297
if checkResult == true
298
if player[currentPlayer].jumpPress == true
299
#platform: USE_STANDALONE
300
player[currentPlayer].state = Player_State_Air
301
#endplatform
302
#platform: USE_ORIGINS
303
player[currentPlayer].state = Player_State_Air_NoDropDash
304
#endplatform
305
player[currentPlayer].yvel = -0x40000
306
player[currentPlayer].gravity = GRAVITY_AIR
307
object.grabDelay = 30
308
else
309
player[currentPlayer].xpos = object.xpos
310
player[currentPlayer].ypos = player[currentPlayer].collisionTop
311
FlipSign(player[currentPlayer].ypos)
312
player[currentPlayer].ypos += 8
313
player[currentPlayer].ypos <<= 16
314
player[currentPlayer].ypos += object.ypos
315
object.hasPlayer = true
316
end if
317
end if
318
end if
319
next
320
321
object.xpos = temp0
322
object.ypos = temp1
323
end event
324
325
326
event ObjectDraw
327
temp0 = 0
328
temp4 = object.handleAngle
329
object.chainPos.x = object.xpos
330
object.chainPos.y = object.ypos
331
332
// Draw Handle Chain
333
while temp0 < 7
334
temp5 = temp4
335
temp5 >>= 7
336
temp5 &= 0x1FF
337
338
Sin(temp2, temp5)
339
temp2 *= 0x312
340
object.chainPos.x += temp2
341
342
Cos(temp3, temp5)
343
temp3 *= 0x312
344
object.chainPos.y += temp3
345
346
DrawSpriteXY(2, object.chainPos.x, object.chainPos.y)
347
348
temp0++
349
temp4 += object.handleAngle
350
loop
351
352
// Draw Handle
353
DrawSpriteXY(3, object.handlePos.x, object.handlePos.y)
354
355
// Draw Flame
356
switch object.state
357
default
358
case RAILROCKET_AWAITPLAYER
359
case RAILROCKET_RETURNTOSTART
360
case RAILROCKET_FINISHED
361
break
362
363
case RAILROCKET_MOVETOTARGET
364
case RAILROCKET_REACHEDTARGET
365
object.direction = object.rocketDir
366
temp0 = object.flameAnimTimer
367
temp0 >>= 1
368
temp0 += 4
369
DrawSpriteFX(temp0, FX_FLIP, object.xpos, object.ypos)
370
break
371
372
end switch
373
374
object.direction = object.rocketDir
375
object.direction ^= object.frame
376
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
377
end event
378
379
380
event ObjectStartup
381
LoadSpriteSheet("HPZ/Objects.gif")
382
SpriteFrame(-20, -27, 40, 54, 66, 168) // rocket body L - #0
383
SpriteFrame(-20, -27, 40, 54, 140, 57) // rocket body R - #1
384
SpriteFrame(-3, -3, 6, 6, 198, 50) // handle chain - #2
385
SpriteFrame(-8, -3, 16, 16, 193, 57) // handle - #3
386
SpriteFrame(4, 11, 12, 16, 210, 46) // flame (big) - #4
387
SpriteFrame(5, 11, 8, 12, 184, 57) // flame (small) - #5
388
389
foreach (TypeName[Rail Rocket], arrayPos0, ALL_ENTITIES)
390
object[arrayPos0].startPos.x = object[arrayPos0].xpos
391
object[arrayPos0].startPos.y = object[arrayPos0].ypos
392
object[arrayPos0].rocketDir = object[arrayPos0].propertyValue
393
object[arrayPos0].rocketDir >>= 7
394
temp0 = object[arrayPos0].propertyValue
395
temp0 &= 0x7F
396
if temp0 == 0
397
object[arrayPos0].targetPos.y = object[arrayPos0].ypos
398
object[arrayPos0].targetPos.y -= 0x1000000
399
else
400
temp0 <<= 21
401
object[arrayPos0].targetPos.y = object[arrayPos0].ypos
402
object[arrayPos0].targetPos.y -= temp0
403
end if
404
next
405
406
SetTableValue(TypeName[Rail Rocket], DebugMode_ObjCount, DebugMode_TypesTable)
407
SetTableValue(RailRocket_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
408
SetTableValue(RailRocket_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
409
DebugMode_ObjCount++
410
end event
411
412
413
// ========================
414
// Editor Events
415
// ========================
416
417
event RSDKEdit
418
if editor.returnVariable == true
419
switch editor.variableID
420
case EDIT_VAR_PROPVAL // property value
421
checkResult = object.propertyValue
422
break
423
424
case 0 // direction
425
GetBit(checkResult, object.propertyValue, 7)
426
break
427
428
case 1 // distance
429
checkResult = object.propertyValue
430
checkResult &= 0x7F
431
break
432
433
end switch
434
else
435
switch editor.variableID
436
case EDIT_VAR_PROPVAL // property value
437
object.propertyValue = editor.variableValue
438
break
439
440
case 0 // direction
441
CheckNotEqual(editor.variableValue, false)
442
SetBit(object.propertyValue, 7, checkResult)
443
break
444
445
case 1 // distance
446
object.propertyValue &= 0x80
447
editor.variableValue &= 0x7F
448
449
object.propertyValue |= editor.variableValue
450
break
451
452
end switch
453
end if
454
end event
455
456
457
event RSDKDraw
458
GetBit(object.rocketDir, object.propertyValue, 7)
459
460
temp0 = 0
461
temp4 = object.handleAngle
462
object.handlePos.x = object.xpos
463
object.handlePos.y = object.ypos
464
while temp0 < 8
465
temp5 = temp4
466
temp5 >>= 7
467
temp5 &= 0x1FF
468
469
Sin(temp2, temp5)
470
temp2 *= 0x312
471
object.handlePos.x += temp2
472
473
Cos(temp3, temp5)
474
temp3 *= 0x312
475
object.handlePos.y += temp3
476
477
temp0++
478
temp4 += object.handleAngle
479
loop
480
481
temp0 = 0
482
temp4 = object.handleAngle
483
object.chainPos.x = object.xpos
484
object.chainPos.y = object.ypos
485
486
// Draw Handle Chain
487
while temp0 < 7
488
temp5 = temp4
489
temp5 >>= 7
490
temp5 &= 0x1FF
491
492
Sin(temp2, temp5)
493
temp2 *= 0x312
494
object.chainPos.x += temp2
495
496
Cos(temp3, temp5)
497
temp3 *= 0x312
498
object.chainPos.y += temp3
499
500
DrawSpriteXY(2, object.chainPos.x, object.chainPos.y)
501
502
temp0++
503
temp4 += object.handleAngle
504
loop
505
506
// Draw Handle
507
DrawSpriteXY(3, object.handlePos.x, object.handlePos.y)
508
509
object.direction = object.rocketDir
510
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
511
512
if editor.showGizmos == true
513
// Draw arrow of where and how far the rocket will go
514
515
temp0 = object.propertyValue
516
temp0 &= 0x7F
517
if temp0 == 0
518
object.targetPos.y = object.ypos
519
object.targetPos.y -= 0x1000000
520
else
521
temp0 <<= 21
522
object.targetPos.y = object.ypos
523
object.targetPos.y -= temp0
524
end if
525
526
temp0 = object.xpos
527
temp1 = object.ypos
528
temp2 = -0x80000
529
temp2 >>= 1
530
531
while temp1 > object.targetPos.y
532
temp1 += -0x80000
533
if object.rocketDir == 0
534
temp0 += temp2
535
else
536
temp0 -= temp2
537
end if
538
loop
539
540
DrawArrow(object.xpos, object.ypos, temp0, temp1, 0x00, 0xFF, 0x00)
541
end if
542
end event
543
544
545
event RSDKLoad
546
LoadSpriteSheet("HPZ/Objects.gif")
547
SpriteFrame(-20, -27, 40, 54, 66, 168) // rocket body L - #0
548
SpriteFrame(-20, -27, 40, 54, 140, 57) // rocket body R - #1
549
SpriteFrame(-3, -3, 6, 6, 198, 50) // handle chain - #2
550
SpriteFrame(-8, -3, 16, 16, 193, 57) // handle - #3
551
SpriteFrame(4, 11, 12, 16, 210, 46) // flame (big) - #4
552
SpriteFrame(5, 11, 8, 12, 184, 57) // flame (small) - #5
553
554
AddEditorVariable("direction")
555
SetActiveVariable("direction")
556
AddEnumVariable("Left", 0)
557
AddEnumVariable("Right", 1)
558
559
AddEditorVariable("distance")
560
SetActiveVariable("distance")
561
end event
562
563