Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-1-Sonic-2-2013-Script-Decompilation
Path: blob/master/Sonic 1/Scripts/SLZ/SeeSaw.txt
1483 views
1
// ----------------------------------
2
// RSDK Project: Sonic 1
3
// Script Description: SeeSaw 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.orbTimer
13
private alias object.value1 : object.tiltTimerL
14
private alias object.value2 : object.tiltTimerM
15
private alias object.value3 : object.tiltTimerR
16
private alias object.value4 : object.tilt
17
private alias object.value5 : object.prevTilt
18
private alias object.value6 : object.targetTilt
19
private alias object.value7 : object.launchVelocity
20
private alias object.value8 : object.orbTargetPos.x
21
private alias object.value9 : object.orbTargetPos.y
22
private alias object.value10 : object.orbFrame
23
private alias object.value11 : object.orbSide
24
private alias object.value12 : object.stood // it gets set a couple of times but otherwise it's unused
25
26
private alias 0 : SEESAW_ORB_IDLE
27
private alias 1 : SEESAW_NONE
28
private alias 2 : SEESAW_ORB_LAUNCHED
29
private alias 3 : SEESAW_NO_ORB
30
31
private alias 0 : SEESAW_TILT_L
32
private alias 1 : SEESAW_TILT_M
33
private alias 2 : SEESAW_TILT_R
34
35
// Player Aliases
36
private alias object.state : player.state
37
private alias object.xpos : player.xpos
38
private alias object.ypos : player.ypos
39
private alias object.xvel : player.xvel
40
private alias object.yvel : player.yvel
41
private alias object.speed : player.speed
42
private alias object.gravity : player.gravity
43
private alias object.animation : player.animation
44
private alias object.value1 : player.timer
45
46
47
// ========================
48
// Function Declarations
49
// ========================
50
51
reserve function SeeSaw_DebugDraw
52
reserve function SeeSaw_DebugSpawn
53
reserve function SeeSaw_SetupHitbox
54
55
56
// ========================
57
// Tables
58
// ========================
59
60
private table SeeSaw_tiltHeightTable
61
36, 36, 38, 40, 42, 44, 42, 40, 38, 36, 35, 34, 33, 32, 31, 30
62
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14
63
13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 2, 2, 2, 2
64
end table
65
66
67
// ========================
68
// Function Definitions
69
// ========================
70
71
private function SeeSaw_DebugDraw
72
DrawSprite(0)
73
end function
74
75
76
private function SeeSaw_DebugSpawn
77
CreateTempObject(TypeName[SeeSaw], 0, object.xpos, object.ypos)
78
object[tempObjectPos].orbTargetPos.x = object.xpos
79
object[tempObjectPos].orbTargetPos.x += 0x280000
80
object[tempObjectPos].orbTargetPos.y = object.ypos
81
object[tempObjectPos].orbTargetPos.y -= 8 // uhhhhh... why only 8? this is a 16-bit shifted value
82
object[tempObjectPos].orbFrame = 2
83
object[tempObjectPos].tilt = SEESAW_TILT_R
84
object[tempObjectPos].targetTilt = SEESAW_TILT_R
85
if object[tempObjectPos].propertyValue != 0 // we just spawned this object with a prop val of 0 already... this check feels a bit weird...
86
object[tempObjectPos].state = SEESAW_NO_ORB
87
end if
88
end function
89
90
91
private function SeeSaw_SetupHitbox
92
temp2 = 0
93
if temp7 == SEESAW_TILT_M
94
temp0 = -21
95
temp1 = -6
96
temp2 = 48
97
else
98
temp1 = player[currentPlayer].xpos
99
temp1 -= object.xpos
100
temp1 >>= 16
101
temp1 += 48
102
temp3 = temp1
103
if temp1 >= 0
104
if temp1 < 96
105
temp1 >>= 1
106
if temp7 == SEESAW_TILT_L
107
FlipSign(temp1)
108
temp1 += 47
109
end if
110
GetTableValue(temp0, temp1, SeeSaw_tiltHeightTable)
111
FlipSign(temp0)
112
temp1 = temp0
113
temp1 += 18
114
temp2 = 40
115
end if
116
end if
117
end if
118
end function
119
120
121
// ========================
122
// Events
123
// ========================
124
125
event ObjectUpdate
126
temp0 = object.tiltTimerL
127
temp0 |= object.tiltTimerR
128
if temp0 == 0
129
if object.tiltTimerM != 0
130
object.targetTilt = SEESAW_TILT_M
131
end if
132
else
133
if object.tiltTimerL == object.tiltTimerR
134
object.targetTilt = SEESAW_TILT_M
135
else
136
if object.tiltTimerL > object.tiltTimerR
137
object.targetTilt = SEESAW_TILT_L
138
else
139
object.targetTilt = SEESAW_TILT_R
140
end if
141
end if
142
end if
143
144
if object.tilt != object.targetTilt
145
if object.tilt > object.targetTilt
146
object.tilt--
147
else
148
object.tilt++
149
end if
150
151
if object.state == SEESAW_NONE
152
if object.targetTilt == SEESAW_TILT_M
153
temp0 = -0x11400
154
temp1 = -0x81800
155
else
156
if object.orbTimer == 0
157
if object.launchVelocity >= 0xA0000
158
temp0 = -0xA000
159
temp1 = -0xE0000
160
else
161
temp0 = -0xCC00
162
temp1 = -0xAF000
163
end if
164
else
165
if object.launchVelocity >= 0x9C000
166
temp0 = -0x8000
167
temp1 = -0xA2000
168
else
169
temp0 = -0xF400
170
temp1 = -0x96000
171
end if
172
end if
173
end if
174
175
if object.orbTargetPos.x < object.xpos
176
FlipSign(temp0)
177
end if
178
object.xvel = temp0
179
object.yvel = temp1
180
object.state++
181
object.priority = PRIORITY_ACTIVE
182
end if
183
end if
184
185
if object.orbTargetPos.x < object.xpos
186
switch object.tilt
187
case SEESAW_TILT_L
188
temp0 = -0x280000
189
temp1 = -0x80000
190
break
191
192
case SEESAW_TILT_M
193
temp0 = -0x280000
194
temp1 = -0x1C0000
195
break
196
197
case SEESAW_TILT_R
198
temp0 = -0x280000
199
temp1 = -0x2F0000
200
break
201
202
end switch
203
else
204
switch object.tilt
205
case SEESAW_TILT_L
206
temp0 = 0x280000
207
temp1 = -0x2F0000
208
break
209
210
case SEESAW_TILT_M
211
temp0 = 0x280000
212
temp1 = -0x1C0000
213
break
214
215
case SEESAW_TILT_R
216
temp0 = 0x280000
217
temp1 = -0x80000
218
break
219
220
end switch
221
end if
222
223
switch object.state
224
case SEESAW_ORB_IDLE
225
object.orbTargetPos.x = object.xpos
226
object.orbTargetPos.x += temp0
227
object.orbTargetPos.y = object.ypos
228
object.orbTargetPos.y += temp1
229
object.launchVelocity = 0
230
break
231
232
case SEESAW_NONE
233
break
234
235
case SEESAW_ORB_LAUNCHED
236
object.orbTargetPos.x += object.xvel
237
object.orbTargetPos.y += object.yvel
238
object.yvel += 0x3800
239
if object.yvel > 0
240
temp1 += object.ypos
241
if object.orbTargetPos.y >= temp1
242
object.orbTargetPos.y = temp1
243
object.state = SEESAW_ORB_IDLE
244
if object.orbTimer != 0
245
if object.xvel != 0
246
CreateTempObject(TypeName[Smoke Puff], 0, object.orbTargetPos.x, object.orbTargetPos.y)
247
PlaySfx(SfxName[Explosion], false)
248
object.state = SEESAW_NO_ORB
249
object.orbTimer = 0
250
end if
251
end if
252
253
if object.orbTargetPos.x < object.xpos
254
object.targetTilt = SEESAW_TILT_L
255
object.orbSide = 1
256
else
257
object.targetTilt = SEESAW_TILT_R
258
object.orbSide = 2
259
end if
260
object.priority = PRIORITY_BOUNDS
261
end if
262
end if
263
break
264
265
case SEESAW_NO_ORB
266
break
267
268
end switch
269
270
object.tiltTimerL = 0
271
object.tiltTimerM = 0
272
object.tiltTimerR = 0
273
object.stood = false
274
275
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
276
temp7 = object.prevTilt
277
CallFunction(SeeSaw_SetupHitbox)
278
279
if temp2 != 0
280
temp3 = temp2
281
FlipSign(temp3)
282
if player[currentPlayer].yvel > object.launchVelocity
283
temp4 = player[currentPlayer].yvel
284
temp4 += 0x7000
285
else
286
temp4 = object.launchVelocity
287
end if
288
289
if player[currentPlayer].gravity == GRAVITY_AIR
290
BoxCollisionTest(C_PLATFORM, object.entityPos, temp3, temp0, temp2, temp1, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
291
else
292
checkResult = false
293
end if
294
295
if checkResult == true
296
object.stood = true
297
if object.tilt != object.prevTilt
298
temp6 = temp0
299
temp7 = object.tilt
300
CallFunction(SeeSaw_SetupHitbox)
301
temp0 -= temp6
302
temp0 <<= 16
303
player[currentPlayer].ypos += temp0
304
end if
305
306
player[currentPlayer].ypos += 0x20000
307
if object.orbSide == 0
308
if object.state == SEESAW_ORB_IDLE
309
object.state = SEESAW_NONE
310
else
311
if object.state == SEESAW_ORB_LAUNCHED
312
temp4 = object.launchVelocity
313
end if
314
end if
315
316
temp0 = player[currentPlayer].xpos
317
temp0 -= object.xpos
318
Abs(temp0)
319
if temp0 < 0x80000
320
object.tiltTimerM++
321
else
322
if player[currentPlayer].xpos < object.xpos
323
object.tiltTimerL++
324
if object.targetTilt != SEESAW_TILT_L
325
object.launchVelocity = temp4
326
end if
327
else
328
object.tiltTimerR++
329
if object.targetTilt != SEESAW_TILT_R
330
object.launchVelocity = temp4
331
end if
332
end if
333
end if
334
else
335
temp0 = player[currentPlayer].xpos
336
temp0 -= object.xpos
337
Abs(temp0)
338
temp4 = object.yvel
339
if temp0 >= 0x80000
340
if player[currentPlayer].xpos < object.xpos
341
if object.orbSide == 1
342
temp4 = 0
343
end if
344
else
345
if object.orbSide == 2
346
temp4 = 0
347
end if
348
end if
349
end if
350
351
if temp4 != 0
352
#platform: USE_STANDALONE
353
player[currentPlayer].state = Player_State_Air
354
#endplatform
355
#platform: USE_ORIGINS
356
player[currentPlayer].state = Player_State_Air_NoDropDash
357
#endplatform
358
player[currentPlayer].gravity = GRAVITY_AIR
359
player[currentPlayer].speed = player[currentPlayer].xvel
360
if object.state == SEESAW_NO_ORB
361
player[currentPlayer].animation = ANI_JUMPING
362
else
363
if object.orbTimer != 0
364
player[currentPlayer].animation = ANI_JUMPING
365
else
366
player[currentPlayer].animation = ANI_BOUNCING
367
end if
368
end if
369
370
player[currentPlayer].timer = 0
371
PlaySfx(SfxName[Spring], false)
372
player[currentPlayer].yvel = temp4
373
FlipSign(player[currentPlayer].yvel)
374
end if
375
end if
376
end if
377
end if
378
next
379
380
object.orbSide = 0
381
object.prevTilt = object.tilt
382
object.frame = object.tilt
383
object.frame &= 1
384
object.direction = object.tilt
385
object.direction >>= 1
386
object.direction ^= 1
387
388
if object.orbTimer != 0
389
object.animationTimer--
390
if object.animationTimer <= 0
391
object.orbFrame ^= 1
392
if object.orbTimer > 120
393
object.animationTimer = 10
394
else
395
if object.orbTimer > 60
396
object.animationTimer = 5
397
else
398
object.animationTimer = 2
399
end if
400
end if
401
end if
402
403
if object.state == SEESAW_ORB_IDLE
404
object.orbTimer--
405
if object.orbTimer == 0
406
CreateTempObject(TypeName[Smoke Puff], 0, object.orbTargetPos.x, object.orbTargetPos.y)
407
408
CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)
409
object[tempObjectPos].xvel = -0x10000
410
object[tempObjectPos].yvel = -0x34000
411
412
CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)
413
object[tempObjectPos].xvel = -0xA000
414
object[tempObjectPos].yvel = -0x24000
415
416
CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)
417
object[tempObjectPos].xvel = 0x10000
418
object[tempObjectPos].yvel = -0x34000
419
420
CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)
421
object[tempObjectPos].xvel = 0xA000
422
object[tempObjectPos].yvel = -0x24000
423
424
PlaySfx(SfxName[Explosion], false)
425
object.state = SEESAW_NO_ORB
426
end if
427
end if
428
end if
429
430
if object.state < SEESAW_NO_ORB
431
temp0 = object.xpos
432
temp1 = object.ypos
433
object.xpos = object.orbTargetPos.x
434
object.ypos = object.orbTargetPos.y
435
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
436
BoxCollisionTest(C_TOUCH, object.entityPos, -7, -7, 7, 7, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
437
if checkResult == true
438
CallFunction(Player_Hit)
439
end if
440
next
441
object.xpos = temp0
442
object.ypos = temp1
443
end if
444
end event
445
446
447
event ObjectDraw
448
if object.state < SEESAW_NO_ORB
449
DrawSpriteXY(object.orbFrame, object.orbTargetPos.x, object.orbTargetPos.y)
450
end if
451
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
452
end event
453
454
455
event ObjectStartup
456
LoadSpriteSheet("SLZ/Objects.gif")
457
SpriteFrame(-42, -44, 91, 56, 84, 59) // SeeSaw (Tilted) - #0
458
SpriteFrame(-48, -26, 96, 24, 84, 116) // SeeSaw (Flat) - #1
459
SpriteFrame(-12, -11, 24, 22, 156, 1) // Spike (Red) - #2
460
SpriteFrame(-12, -11, 24, 22, 131, 1) // Spike (Grey) - #3
461
462
foreach (TypeName[SeeSaw], arrayPos0, ALL_ENTITIES)
463
object[arrayPos0].orbTargetPos.x = object[arrayPos0].xpos
464
object[arrayPos0].orbTargetPos.x += 0x280000
465
object[arrayPos0].orbTargetPos.y = object[arrayPos0].ypos
466
object[arrayPos0].orbTargetPos.y -= 8 // uhhhhh... why only 8? this is an 16-bit shifted value
467
object[arrayPos0].orbFrame = 2
468
object[arrayPos0].tilt = SEESAW_TILT_R
469
object[arrayPos0].targetTilt = SEESAW_TILT_R
470
if object[arrayPos0].propertyValue != 0
471
object[arrayPos0].state = SEESAW_NO_ORB
472
end if
473
next
474
475
SetTableValue(TypeName[SeeSaw], DebugMode_ObjCount, DebugMode_TypesTable)
476
SetTableValue(SeeSaw_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
477
SetTableValue(SeeSaw_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
478
DebugMode_ObjCount++
479
end event
480
481
482
// ========================
483
// Editor Events
484
// ========================
485
486
event RSDKEdit
487
if editor.returnVariable == true
488
switch editor.variableID
489
case EDIT_VAR_PROPVAL // property value
490
checkResult = object.propertyValue
491
break
492
493
case 0 // orbType
494
checkResult = object.propertyValue
495
break
496
497
end switch
498
else
499
switch editor.variableID
500
case EDIT_VAR_PROPVAL // property value
501
object.propertyValue = editor.variableValue
502
break
503
504
case 0 // orbType
505
object.propertyValue = editor.variableValue
506
break
507
508
end switch
509
end if
510
end event
511
512
513
event RSDKDraw
514
if object.propertyValue == 0
515
object.orbTargetPos.x = object.xpos
516
object.orbTargetPos.x += 0x280000
517
object.orbTargetPos.y = object.ypos
518
object.orbTargetPos.y -= 0x80000
519
DrawSpriteXY(1, object.orbTargetPos.x, object.orbTargetPos.y)
520
end if
521
522
DrawSprite(0)
523
end event
524
525
526
event RSDKLoad
527
LoadSpriteSheet("SLZ/Objects.gif")
528
SpriteFrame(-42, -44, 91, 56, 84, 59) // SeeSaw (Tilted) - #0
529
SpriteFrame(-12, -11, 24, 22, 156, 1) // Spike (Red) - #1
530
531
AddEditorVariable("orbType")
532
SetActiveVariable("orbType")
533
AddEnumVariable("Has Orb", 0)
534
AddEnumVariable("No Orb", 255)
535
end event
536
537