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/MZ/ChainedCrusher.txt
1483 views
1
// ----------------------------------
2
// RSDK Project: Sonic 1
3
// Script Description: Chained Crusher 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.crusherType
14
private alias object.value2 : object.useButton
15
private alias object.value3 : object.startPos.y
16
private alias object.value4 : object.endPos.y
17
private alias object.value5 : object.collisionOffset.y
18
private alias object.value6 : object.currentPos.y
19
private alias object.value7 : object.dontPlaySfx // set by Push Block objects
20
21
private alias 0 : CHAINCRUSHER_DROPPING
22
private alias 1 : CHAINCRUSHER_DROPPED
23
private alias 2 : CHAINCRUSHER_RISING
24
private alias 3 : CHAINCRUSHER_RISEN
25
private alias 4 : CHAINCRUSHER_DROPWHENACTIVE
26
27
private alias 0 : CHAINCRUSHER_TYPE_LARGE
28
private alias 1 : CHAINCRUSHER_TYPE_MED
29
private alias 2 : CHAINCRUSHER_TYPE_SMALL
30
private alias 3 : CHAINCRUSHER_TYPE_SMALL_ACTIVE
31
32
// Player Aliases
33
private alias object.ypos : player.ypos
34
private alias object.gravity : player.gravity
35
36
// Debug Mode Aliases
37
private alias object.value17 : debugMode.currentSelection
38
39
// PushButton aliases
40
private alias object.propertyValue : pushButton.stood
41
42
43
// ========================
44
// Function Declarations
45
// ========================
46
47
reserve function ChainedCrusher_DebugDraw
48
reserve function ChainedCrusher_DebugSpawn
49
reserve function ChainedCrusher_CheckOnScreen
50
51
52
// ========================
53
// Static Values
54
// ========================
55
56
private value ChainedCrusher_startDebugID = 0
57
58
59
// ========================
60
// Function Definitions
61
// ========================
62
63
private function ChainedCrusher_DebugDraw
64
temp7 = debugMode[0].currentSelection
65
temp7 -= ChainedCrusher_startDebugID
66
temp6 = temp7
67
temp6 /= 7
68
temp7 %= 7
69
temp5 = object.ypos
70
switch temp7
71
case 0
72
temp5 += 0x700000
73
break
74
75
case 1
76
temp5 += 0xA00000
77
break
78
79
case 2
80
temp5 += 0x500000
81
break
82
83
case 3
84
temp5 += 0x780000
85
break
86
87
case 4
88
temp5 += 0x380000
89
break
90
91
case 5
92
temp5 += 0x580000
93
break
94
95
case 6
96
temp5 += 0xB80000
97
break
98
end switch
99
100
temp0 = temp5
101
temp0 -= object.ypos
102
temp0 >>= 16
103
temp0 += 4
104
temp1 = 257
105
temp1 -= temp0
106
temp2 = temp0
107
temp2 += 18
108
FlipSign(temp2)
109
EditFrame(5, -4, temp2, 8, temp0, 308, temp1)
110
DrawSpriteXY(5, object.xpos, temp5)
111
DrawSpriteXY(0, object.xpos, object.ypos)
112
switch temp6
113
case 0
114
DrawSpriteXY(1, object.xpos, temp5)
115
DrawSpriteXY(4, object.xpos, temp5)
116
break
117
118
case 1
119
DrawSpriteXY(2, object.xpos, temp5)
120
DrawSpriteXY(4, object.xpos, temp5)
121
break
122
123
case 2
124
case 3
125
DrawSpriteXY(3, object.xpos, temp5)
126
break
127
end switch
128
end function
129
130
131
private function ChainedCrusher_DebugSpawn
132
temp7 = debugMode[0].currentSelection
133
temp7 -= ChainedCrusher_startDebugID
134
135
temp6 = temp7
136
temp6 /= 7
137
temp7 %= 7
138
CreateTempObject(TypeName[Chained Crusher], 0, object.xpos, object.ypos)
139
object[tempObjectPos].useButton = false
140
object[tempObjectPos].crusherType = temp6
141
if object[tempObjectPos].crusherType == CHAINCRUSHER_TYPE_SMALL
142
object[tempObjectPos].state = CHAINCRUSHER_DROPWHENACTIVE
143
end if
144
145
object[tempObjectPos].startPos.y = object.ypos
146
object[tempObjectPos].endPos.y = object[tempObjectPos].startPos.y
147
switch temp7
148
case 0
149
object[tempObjectPos].endPos.y += 0x700000
150
break
151
152
case 1
153
object[tempObjectPos].endPos.y += 0xA00000
154
break
155
156
case 2
157
object[tempObjectPos].endPos.y += 0x500000
158
break
159
160
case 3
161
object[tempObjectPos].endPos.y += 0x780000
162
break
163
164
case 4
165
object[tempObjectPos].endPos.y += 0x380000
166
break
167
168
case 5
169
object[tempObjectPos].endPos.y += 0x580000
170
break
171
172
case 6
173
object[tempObjectPos].endPos.y += 0xB80000
174
break
175
176
end switch
177
end function
178
179
180
private function ChainedCrusher_CheckOnScreen
181
checkResult = false
182
temp0 = object.xpos
183
temp0 >>= 16
184
temp0 -= camera[0].xpos
185
Abs(temp0)
186
switch object.crusherType
187
case CHAINCRUSHER_TYPE_LARGE
188
temp0 -= 64
189
break
190
191
case CHAINCRUSHER_TYPE_MED
192
temp0 -= 56
193
break
194
195
case CHAINCRUSHER_TYPE_SMALL
196
temp0 -= 0 // sure
197
break
198
199
case CHAINCRUSHER_TYPE_SMALL_ACTIVE
200
temp0 -= 24
201
break
202
end switch
203
204
if temp0 <= screen.xcenter
205
temp1 = object.endPos.y
206
temp1 -= object.startPos.y
207
temp1 >>= 16
208
temp1 += 8
209
temp1 >>= 1
210
211
temp0 = object.startPos.y
212
temp0 += object.endPos.y
213
temp0 >>= 17
214
temp0 -= 12
215
temp0 -= camera[0].ypos
216
Abs(temp0)
217
218
temp0 -= temp1
219
temp0 -= 40
220
if temp0 <= screen.ycenter
221
checkResult = true
222
end if
223
end if
224
end function
225
226
227
// ========================
228
// Events
229
// ========================
230
231
event ObjectUpdate
232
object.priority = PRIORITY_ACTIVE
233
234
if object.useButton == true
235
if pushButton[+1].stood == false
236
object.dontPlaySfx = false
237
object.yvel += 0x7000
238
object.ypos += object.yvel
239
if object.ypos >= object.endPos.y
240
if object.yvel > 0x7000
241
CallFunction(ChainedCrusher_CheckOnScreen)
242
if checkResult == true
243
PlaySfx(SfxName[Crusher], false)
244
end if
245
end if
246
object.ypos = object.endPos.y
247
object.yvel = 0
248
end if
249
else
250
object.yvel = -0x8000
251
object.ypos += object.yvel
252
if object.ypos <= object.startPos.y
253
object.ypos = object.startPos.y
254
object.yvel = 0
255
else
256
if object.dontPlaySfx == false
257
temp0 = oscillation
258
temp0 &= 15
259
if temp0 == 0
260
CallFunction(ChainedCrusher_CheckOnScreen)
261
if checkResult == true
262
PlaySfx(SfxName[Chain Pull], false)
263
end if
264
end if
265
end if
266
end if
267
end if
268
else
269
switch object.state
270
case CHAINCRUSHER_DROPPING
271
object.dontPlaySfx = false
272
object.yvel += 0x7000
273
object.ypos += object.yvel
274
if object.ypos >= object.endPos.y
275
if object.yvel > 0x7000
276
CallFunction(ChainedCrusher_CheckOnScreen)
277
if checkResult == true
278
PlaySfx(SfxName[Crusher], false)
279
end if
280
end if
281
object.ypos = object.endPos.y
282
object.yvel = 0
283
object.state++
284
end if
285
break
286
287
case CHAINCRUSHER_DROPPED
288
object.timer++
289
if object.timer == 60
290
object.timer = 0
291
object.yvel = -0x8000
292
object.state++
293
end if
294
break
295
296
case CHAINCRUSHER_RISING
297
object.ypos += object.yvel
298
if object.ypos <= object.startPos.y
299
object.ypos = object.startPos.y
300
object.yvel = 0
301
object.state++
302
else
303
if object.dontPlaySfx == false
304
temp0 = oscillation
305
temp0 &= 15
306
if temp0 == 0
307
CallFunction(ChainedCrusher_CheckOnScreen)
308
if checkResult == true
309
PlaySfx(SfxName[Chain Pull], false)
310
end if
311
end if
312
end if
313
end if
314
break
315
316
case CHAINCRUSHER_RISEN
317
object.timer++
318
if object.timer == 4
319
object.timer = 0
320
object.state = CHAINCRUSHER_DROPPING
321
end if
322
break
323
324
case CHAINCRUSHER_DROPWHENACTIVE
325
CallFunction(ChainedCrusher_CheckOnScreen)
326
if checkResult == true
327
object.state = CHAINCRUSHER_DROPPING
328
object.crusherType++
329
end if
330
break
331
end switch
332
end if
333
334
object.collisionOffset.y = object.ypos
335
object.collisionOffset.y &= 0xFFFF0000
336
object.collisionOffset.y -= object.currentPos.y
337
338
temp0 = object.ypos
339
object.ypos = object.currentPos.y
340
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
341
switch object.crusherType
342
case CHAINCRUSHER_TYPE_LARGE
343
BoxCollisionTest(C_SOLID, object.entityPos, -56, -12, 56, 10, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
344
switch checkResult
345
case COL_NONE
346
BoxCollisionTest(C_TOUCH, object.entityPos, -48, 12, 48, 36, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
347
if checkResult == true
348
CallFunction(Player_Hit)
349
end if
350
break
351
352
case COL_TOP
353
player[currentPlayer].ypos += object.collisionOffset.y
354
break
355
356
case COL_BOTTOM
357
if player[currentPlayer].gravity == GRAVITY_GROUND
358
if object.collisionOffset.y >= 0
359
CallFunction(Player_Kill)
360
end if
361
end if
362
break
363
end switch
364
break
365
366
case CHAINCRUSHER_TYPE_MED
367
BoxCollisionTest(C_SOLID, object.entityPos, -48, -12, 48, 10, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
368
switch checkResult
369
case COL_NONE
370
BoxCollisionTest(C_TOUCH, object.entityPos, -47, 12, 47, 36, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
371
if checkResult == true
372
CallFunction(Player_Hit)
373
end if
374
break
375
376
case COL_TOP
377
player[currentPlayer].ypos += object.collisionOffset.y
378
break
379
380
case COL_BOTTOM
381
if player[currentPlayer].gravity == GRAVITY_GROUND
382
if object.collisionOffset.y >= 0
383
CallFunction(Player_Kill)
384
end if
385
end if
386
break
387
end switch
388
break
389
390
case CHAINCRUSHER_TYPE_SMALL_ACTIVE
391
BoxCollisionTest(C_SOLID, object.entityPos, -16, -12, 16, 12, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
392
switch checkResult
393
case COL_TOP
394
player[currentPlayer].ypos += object.collisionOffset.y
395
break
396
397
case COL_BOTTOM
398
if player[currentPlayer].gravity == GRAVITY_GROUND
399
if object.collisionOffset.y >= 0
400
CallFunction(Player_Kill)
401
end if
402
end if
403
break
404
end switch
405
break
406
end switch
407
next
408
409
object.ypos = temp0
410
object.currentPos.y = object.ypos
411
object.currentPos.y &= 0xFFFF0000
412
413
temp0 = object.xpos
414
temp0 >>= 16
415
temp0 -= camera[0].xpos
416
Abs(temp0)
417
temp0 -= 128
418
if temp0 > screen.xcenter
419
if object.useButton == true
420
object.ypos = object.endPos.y
421
else
422
object.ypos = object.startPos.y
423
end if
424
object.timer = 0
425
426
if object.crusherType >= CHAINCRUSHER_TYPE_SMALL
427
object.state = CHAINCRUSHER_DROPWHENACTIVE
428
object.crusherType = CHAINCRUSHER_TYPE_SMALL
429
else
430
object.state = CHAINCRUSHER_DROPPING
431
end if
432
433
object.priority = PRIORITY_BOUNDS
434
end if
435
end event
436
437
438
event ObjectDraw
439
temp0 = object.ypos
440
temp0 -= object.startPos.y
441
temp0 >>= 16
442
temp0 += 4
443
temp1 = 257
444
temp1 -= temp0
445
temp2 = temp0
446
temp2 += 18
447
FlipSign(temp2)
448
EditFrame(5, -4, temp2, 8, temp0, 308, temp1)
449
DrawSpriteXY(5, object.xpos, object.currentPos.y)
450
DrawSpriteXY(0, object.xpos, object.startPos.y)
451
switch object.crusherType
452
case CHAINCRUSHER_TYPE_LARGE
453
DrawSpriteXY(1, object.xpos, object.currentPos.y)
454
DrawSpriteXY(4, object.xpos, object.currentPos.y)
455
break
456
457
case CHAINCRUSHER_TYPE_MED
458
DrawSpriteXY(2, object.xpos, object.currentPos.y)
459
DrawSpriteXY(4, object.xpos, object.currentPos.y)
460
break
461
462
case CHAINCRUSHER_TYPE_SMALL
463
case CHAINCRUSHER_TYPE_SMALL_ACTIVE
464
DrawSpriteXY(3, object.xpos, object.currentPos.y)
465
break
466
end switch
467
end event
468
469
470
event ObjectStartup
471
LoadSpriteSheet("MZ/Objects.gif")
472
SpriteFrame(-16, -52, 32, 32, 256, 76)
473
SpriteFrame(-56, -20, 112, 32, 143, 180)
474
SpriteFrame(-48, -20, 96, 32, 159, 147)
475
SpriteFrame(-16, -20, 32, 32, 256, 109)
476
SpriteFrame(-44, 12, 87, 32, 199, 256)
477
SpriteFrame(-4, -206, 8, 188, 308, 69)
478
479
foreach (TypeName[Chained Crusher], arrayPos0, ALL_ENTITIES)
480
object[arrayPos0].useButton = object[arrayPos0].propertyValue
481
object[arrayPos0].useButton >>= 7
482
483
object[arrayPos0].crusherType = object[arrayPos0].propertyValue
484
object[arrayPos0].crusherType &= 0x7F
485
object[arrayPos0].crusherType >>= 4
486
object[arrayPos0].crusherType %= 3
487
488
if object[arrayPos0].crusherType == CHAINCRUSHER_TYPE_SMALL
489
object[arrayPos0].state = CHAINCRUSHER_DROPWHENACTIVE
490
end if
491
492
temp0 = object[arrayPos0].propertyValue
493
temp0 &= 7
494
if temp0 > 6
495
temp0 = 0
496
end if
497
498
object[arrayPos0].startPos.y = object[arrayPos0].ypos
499
object[arrayPos0].endPos.y = object[arrayPos0].startPos.y
500
switch temp0
501
case 0
502
object[arrayPos0].endPos.y += 0x700000
503
break
504
505
case 1
506
object[arrayPos0].endPos.y += 0xA00000
507
break
508
509
case 2
510
object[arrayPos0].endPos.y += 0x500000
511
break
512
513
case 3
514
object[arrayPos0].endPos.y += 0x780000
515
break
516
517
case 4
518
object[arrayPos0].endPos.y += 0x380000
519
break
520
521
case 5
522
object[arrayPos0].endPos.y += 0x580000
523
break
524
525
case 6
526
object[arrayPos0].endPos.y += 0xB80000
527
break
528
end switch
529
530
if object[arrayPos0].useButton == true
531
object[arrayPos0].ypos = object[arrayPos0].endPos.y
532
end if
533
next
534
535
temp0 = 0
536
ChainedCrusher_startDebugID = DebugMode_ObjCount
537
while temp0 < 21
538
SetTableValue(TypeName[Chained Crusher], DebugMode_ObjCount, DebugMode_TypesTable)
539
SetTableValue(ChainedCrusher_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
540
SetTableValue(ChainedCrusher_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
541
DebugMode_ObjCount++
542
temp0++
543
loop
544
end event
545
546
547
// ========================
548
// Editor Events
549
// ========================
550
551
event RSDKEdit
552
if editor.returnVariable == true
553
switch editor.variableID
554
case EDIT_VAR_PROPVAL // property value
555
checkResult = object.propertyValue
556
break
557
558
case 0 // useButton
559
checkResult = object.propertyValue
560
checkResult >>= 7
561
checkResult &= 1
562
break
563
564
case 1 // type
565
checkResult = object.propertyValue
566
checkResult &= 0x7F
567
checkResult >>= 4
568
checkResult %= 3
569
break
570
571
case 2 // length
572
checkResult = object.propertyValue
573
checkResult &= 7
574
if checkResult > 6
575
checkResult = 0
576
end if
577
break
578
579
end switch
580
else
581
switch editor.variableID
582
case EDIT_VAR_PROPVAL // property value
583
object.propertyValue = editor.variableValue
584
break
585
586
case 0 // useButton
587
CheckNotEqual(editor.variableValue, false)
588
SetBit(object.propertyValue, 7, checkResult)
589
break
590
591
case 1 // type
592
temp1 = 0x70
593
Not(temp1)
594
object.propertyValue &= temp1
595
596
editor.variableValue &= 3
597
editor.variableValue <<= 4
598
object.propertyValue |= editor.variableValue
599
break
600
601
case 2 // length
602
temp1 = 7
603
Not(temp1)
604
object.propertyValue &= temp1
605
606
temp0 = editor.variableValue
607
temp0 &= 7
608
object.propertyValue |= temp0
609
break
610
611
end switch
612
end if
613
end event
614
615
616
event RSDKDraw
617
temp7 = object.ypos
618
// Get Values
619
object.useButton = object.propertyValue
620
object.useButton >>= 7
621
object.crusherType = object.propertyValue
622
object.crusherType &= 0x7F
623
object.crusherType >>= 4
624
object.crusherType %= 3
625
626
temp0 = object.propertyValue
627
temp0 &= 7
628
if temp0 > 6
629
temp0 = 0
630
end if
631
632
object.startPos.y = object.ypos
633
object.endPos.y = object.startPos.y
634
switch temp0
635
case 0
636
object.endPos.y += 0x700000
637
break
638
639
case 1
640
object.endPos.y += 0xA00000
641
break
642
643
case 2
644
object.endPos.y += 0x500000
645
break
646
647
case 3
648
object.endPos.y += 0x780000
649
break
650
651
case 4
652
object.endPos.y += 0x380000
653
break
654
655
case 5
656
object.endPos.y += 0x580000
657
break
658
659
case 6
660
object.endPos.y += 0xB80000
661
break
662
663
end switch
664
665
object.ypos = object.startPos.y
666
if object.useButton == true
667
object.ypos = object.endPos.y
668
end if
669
object.inkEffect = INK_BLEND
670
671
// Drawww (Actual)
672
object.currentPos.y = object.ypos
673
object.currentPos.y &= 0xFFFF0000
674
temp0 = object.ypos
675
temp0 -= object.startPos.y
676
temp0 >>= 16
677
temp0 += 4
678
temp1 = 257
679
temp1 -= temp0
680
temp2 = temp0
681
temp2 += 18
682
FlipSign(temp2)
683
EditFrame(5, -4, temp2, 8, temp0, 308, temp1)
684
DrawSpriteXY(5, object.xpos, object.currentPos.y)
685
DrawSpriteXY(0, object.xpos, object.startPos.y)
686
switch object.crusherType
687
case CHAINCRUSHER_TYPE_LARGE
688
DrawSpriteXY(1, object.xpos, object.currentPos.y)
689
DrawSpriteXY(4, object.xpos, object.currentPos.y)
690
break
691
692
case CHAINCRUSHER_TYPE_MED
693
DrawSpriteXY(2, object.xpos, object.currentPos.y)
694
DrawSpriteXY(4, object.xpos, object.currentPos.y)
695
break
696
697
case CHAINCRUSHER_TYPE_SMALL
698
DrawSpriteXY(3, object.xpos, object.currentPos.y)
699
break
700
701
end switch
702
703
// Drawww (Preview)
704
object.ypos = object.endPos.y
705
if object.useButton == true
706
object.ypos = object.startPos.y
707
end if
708
object.currentPos.y = object.ypos
709
object.currentPos.y &= 0xFFFF0000
710
temp0 = object.ypos
711
temp0 -= object.startPos.y
712
temp0 >>= 16
713
temp0 += 4
714
temp1 = 257
715
temp1 -= temp0
716
temp2 = temp0
717
temp2 += 18
718
FlipSign(temp2)
719
EditFrame(5, -4, temp2, 8, temp0, 308, temp1)
720
DrawSpriteFX(5, FX_INK, object.xpos, object.currentPos.y)
721
DrawSpriteFX(0, FX_INK, object.xpos, object.startPos.y)
722
switch object.crusherType
723
case CHAINCRUSHER_TYPE_LARGE
724
DrawSpriteFX(1, FX_INK, object.xpos, object.currentPos.y)
725
DrawSpriteFX(4, FX_INK, object.xpos, object.currentPos.y)
726
break
727
728
case CHAINCRUSHER_TYPE_MED
729
DrawSpriteFX(2, FX_INK, object.xpos, object.currentPos.y)
730
DrawSpriteFX(4, FX_INK, object.xpos, object.currentPos.y)
731
break
732
733
case CHAINCRUSHER_TYPE_SMALL
734
DrawSpriteFX(3, FX_INK, object.xpos, object.currentPos.y)
735
break
736
737
end switch
738
739
object.ypos = temp7
740
end event
741
742
743
event RSDKLoad
744
LoadSpriteSheet("MZ/Objects.gif")
745
SpriteFrame(-16, -52, 32, 32, 256, 76)
746
SpriteFrame(-56, -20, 112, 32, 143, 180)
747
SpriteFrame(-48, -20, 96, 32, 159, 147)
748
SpriteFrame(-16, -20, 32, 32, 256, 109)
749
SpriteFrame(-44, 12, 87, 32, 199, 256)
750
SpriteFrame(-4, -206, 8, 188, 308, 69)
751
752
AddEditorVariable("useButton")
753
SetActiveVariable("useButton")
754
AddEnumVariable("false", false)
755
AddEnumVariable("true", true)
756
757
AddEditorVariable("type")
758
SetActiveVariable("type")
759
AddEnumVariable("Large", CHAINCRUSHER_TYPE_LARGE)
760
AddEnumVariable("Medium", CHAINCRUSHER_TYPE_MED)
761
AddEnumVariable("Small (Drop On Interval)", CHAINCRUSHER_TYPE_SMALL)
762
AddEnumVariable("Small (Wait For Visible)", CHAINCRUSHER_TYPE_SMALL_ACTIVE)
763
764
AddEditorVariable("length")
765
SetActiveVariable("length")
766
AddEnumVariable("112 Pixels", 0)
767
AddEnumVariable("160 Pixels", 1)
768
AddEnumVariable("80 Pixels", 2)
769
AddEnumVariable("120 Pixels", 3)
770
AddEnumVariable("56 Pixels", 4)
771
AddEnumVariable("88 Pixels", 5)
772
AddEnumVariable("184 Pixels", 6)
773
end event
774
775