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/WFZ/Tornado.txt
1483 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Tornado 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.duration
14
private alias object.value2 : object.stood
15
private alias object.value3 : object.lastPos.y
16
private alias object.value4 : object.collisionOffset.y
17
private alias object.value5 : object.pilotFrame
18
private alias object.value6 : object.pilotFrameDelay
19
private alias object.value7 : object.pilotAnimPos
20
private alias object.value8 : object.velocityTablePos
21
private alias object.value9 : object.boosterActive
22
private alias object.value10 : object.jumpAbilityFunc
23
24
// States
25
private alias 0 : TORNADO_SETUPINTRO
26
private alias 1 : TORNADO_FLYINTRO
27
private alias 2 : TORNADO_SHOTDOWN
28
private alias 3 : TORNADO_FALLING
29
private alias 4 : TORNADO_SETUPOUTRO
30
private alias 5 : TORNADO_WAITFORPLAYER
31
private alias 6 : TORNADO_MOVEPLAYERTOEDGE
32
private alias 7 : TORNADO_JUMPONTOTORNADO
33
private alias 8 : TORNADO_LANDONTORNADO
34
private alias 9 : TORNADO_CHASESEQUENCE
35
private alias 10 : TORNADO_FINISHACT
36
37
// Player Aliases
38
private alias object.type : player.type
39
private alias object.state : player.state
40
private alias object.xpos : player.xpos
41
private alias object.ypos : player.ypos
42
private alias object.xvel : player.xvel
43
private alias object.yvel : player.yvel
44
private alias object.speed : player.speed
45
private alias object.gravity : player.gravity
46
private alias object.controlMode : player.controlMode
47
private alias object.scrollTracking : player.scrollTracking
48
49
private alias object.jumpPress : player.jumpPress
50
private alias object.jumpHold : player.jumpHold
51
private alias object.up : player.up
52
private alias object.down : player.down
53
private alias object.left : player.left
54
private alias object.right : player.right
55
56
private alias object.value0 : player.rings
57
private alias object.value1 : player.timer
58
private alias object.value9 : player.skidSpeed
59
private alias object.value20 : player.topSpeed
60
private alias object.value21 : player.acceleration
61
private alias object.value22 : player.deceleration
62
private alias object.value23 : player.airAcceleration
63
private alias object.value24 : player.airDeceleration
64
private alias object.value25 : player.gravityStrength // Also used in underwater checks, 0x1000 if underwater, otherwise 0x3800. Not to be confused with player.gravity
65
private alias object.value27 : player.jumpStrength
66
private alias object.value28 : player.jumpCap
67
private alias object.value29 : player.rollingFriction // Active rolling deceleration - With the player holding the opposite direction
68
private alias object.value32 : player.jumpAbility // Used to store whatever function this player has for its jump ability
69
private alias object.value35 : player.jumpAbilityState
70
71
// WFZEggmanThruster Aliases
72
private alias object.value0 : wfzEggmanThruster.interval
73
74
// Super States
75
private alias 2 : SUPERSTATE_FADEOUT
76
77
// Game Modes
78
private alias 0 : MODE_NOSAVE
79
private alias 1 : MODE_SAVEGAME
80
private alias 2 : MODE_TIMEATTACK
81
82
83
// ========================
84
// Function Declarations
85
// ========================
86
87
reserve function Tornado_Explode
88
89
90
// ========================
91
// Tables
92
// ========================
93
94
private table Tornado_TailsPilotFrameTable
95
5, 32
96
6, 8
97
7, 8
98
8, 8
99
7, 8
100
6, 16
101
9, 32
102
6, 16
103
end table
104
105
private table Tornado_SonicPilotFrameTable
106
10, 9
107
11, 9
108
10, 9
109
11, 9
110
10, 9
111
11, 9
112
10, 9
113
11, 9
114
end table
115
116
private table Tornado_velocityDurationTable
117
520
118
640
119
712
120
744
121
808
122
968
123
1048
124
1160
125
1224
126
1448
127
65535
128
end table
129
130
private table Tornado_moveVelocityTable
131
-0x10000, -0x10000
132
0x10000, 0x00000
133
0x00000, 0x10000
134
0x10000, -0x10000
135
0x10000, 0x10000
136
0x10000, -0x10000
137
-0x10000, 0x10000
138
-0x10000, -0x10000
139
-0x10000, 0x10000
140
-0x20000, 0x00000
141
0x00000, 0x00000
142
end table
143
144
145
// ========================
146
// Function Definitions
147
// ========================
148
149
// Called to create explosions after the Tornado gets shot
150
// Poor Tails...
151
private function Tornado_Explode
152
if object.duration == 0
153
object.duration = 15
154
temp0 = object.xpos
155
Rand(temp1, 8)
156
temp1 <<= 18
157
temp0 -= temp1
158
temp1 = object.ypos
159
temp1 += 0x100000
160
CreateTempObject(TypeName[T Explosion], 0, temp0, temp1)
161
else
162
object.duration--
163
end if
164
end function
165
166
167
// ========================
168
// Events
169
// ========================
170
171
event ObjectUpdate
172
object.lastPos.y = object.ypos
173
object.drawOrder = 4
174
175
// States TORNADO_SETUPINTRO -> TORNADO_FALLING are for the stage's intro
176
// States after that are for the chase cutscene when Tails helps you hitch a ride on Robotnik's ship
177
178
switch object.state
179
case TORNADO_SETUPINTRO
180
temp0 = player[0].xpos
181
temp0 -= 0x100000
182
if object.xpos < temp0
183
object.type = TypeName[Blank Object]
184
else
185
if stage.playerListPos == PLAYER_TAILS_A
186
// Main player is Tails, shift him down a bit to account for his shorter height
187
player[0].ypos += 0x40000
188
end if
189
object.state++
190
end if
191
break
192
193
case TORNADO_FLYINTRO
194
// Just flying straight for a brief moment
195
object.xpos += object.xvel
196
197
object.timer--
198
if object.timer == 0
199
object.yvel = 0x10000
200
object.timer = 96
201
object.state = TORNADO_SHOTDOWN
202
else
203
temp0 = object.xpos
204
temp0 -= 0x100000
205
if player[0].xpos < temp0
206
player[0].xpos = temp0
207
end if
208
209
temp0 += 0x200000
210
if player[0].xpos > temp0
211
player[0].xpos = temp0
212
end if
213
end if
214
break
215
216
case TORNADO_SHOTDOWN
217
// Tornado getting shot
218
object.xpos += object.xvel
219
object.ypos += object.yvel
220
221
temp0 = oscillation
222
temp0 &= 0x1F
223
if temp0 == 0
224
PlaySfx(SfxName[Laser Skim], false)
225
end if
226
227
object.timer--
228
if object.timer == 0
229
object.xvel = 0x20000
230
object.yvel = 0x20000
231
object.timer = 96
232
object.state = TORNADO_FALLING
233
end if
234
CallFunction(Tornado_Explode)
235
break
236
237
case TORNADO_FALLING
238
// Tornado after being shot, it's just falling now...
239
object.xpos += object.xvel
240
object.ypos += object.yvel
241
if object.outOfBounds == true
242
// Despawn it when out of view
243
object.type = TypeName[Blank Object]
244
end if
245
CallFunction(Tornado_Explode)
246
break
247
248
case TORNADO_SETUPOUTRO
249
// Start of end-of-level cutscene, start removing control from the player,
250
BoxCollisionTest(C_TOUCH, object.entityPos, -640, -192, 0, 0, 0, C_BOX, C_BOX, C_BOX, C_BOX)
251
if checkResult == true
252
if player[0].gravity == GRAVITY_GROUND
253
player[0].controlMode = CONTROLMODE_NONE
254
player[0].jumpPress = false
255
player[0].jumpHold = false
256
player[0].up = false
257
player[0].down = false
258
player[0].left = false
259
player[0].right = false
260
Player_superState = SUPERSTATE_FADEOUT
261
object.state = TORNADO_WAITFORPLAYER
262
end if
263
end if
264
break
265
266
case TORNADO_WAITFORPLAYER
267
if player[0].state == Player_State_Ground
268
player[0].timer = 0
269
end if
270
271
object.timer++
272
if object.timer >= 120
273
object.timer = 0
274
object.state = TORNADO_MOVEPLAYERTOEDGE
275
end if
276
break
277
278
case TORNADO_MOVEPLAYERTOEDGE
279
player[0].right = true
280
281
temp0 = object.xpos
282
temp0 -= 0x100000
283
if player[0].xpos >= temp0
284
player[0].xpos = temp0
285
player[0].xvel = 0
286
player[0].speed = 0
287
player[0].right = 0
288
object.xvel = 0x10000
289
object.yvel = -0x10000
290
object.state = TORNADO_JUMPONTOTORNADO
291
end if
292
break
293
294
case TORNADO_JUMPONTOTORNADO
295
object.xpos += object.xvel
296
object.ypos += object.yvel
297
298
object.timer++
299
if object.timer == 72
300
player[0].jumpPress = true
301
player[0].jumpHold = true
302
player[0].right = true
303
object.jumpAbilityFunc = player[0].jumpAbility
304
305
// Reset the physics values to match Sonic's, even Knux' jump height is ignored here so that the cutscene doesn't desync
306
player[0].jumpAbility = Player_State_Static
307
player[0].gravityStrength = 0x3800
308
player[0].topSpeed = 0x60000
309
player[0].acceleration = 0xC00
310
player[0].deceleration = 0xC00
311
player[0].airAcceleration = 0x1800
312
player[0].airDeceleration = 0x600
313
player[0].skidSpeed = 0x8000
314
player[0].rollingFriction = 0x600
315
player[0].jumpStrength = 0x68000
316
player[0].jumpCap = -0x40000
317
318
object.state = TORNADO_LANDONTORNADO
319
end if
320
break
321
322
case TORNADO_LANDONTORNADO
323
object.xpos += object.xvel
324
object.ypos += object.yvel
325
object.timer++
326
#platform: USE_ORIGINS
327
// Added in Origins Plus, make sure Sonic or Amy don't Drop Dash to their deaths
328
// This is a global variable, which is why we aren't specifying the object position
329
player.dropdashCount0 = 0
330
#endplatform
331
BoxCollisionTest(C_PLATFORM, object.entityPos, -20, -8, 20, 8, 0, C_BOX, C_BOX, C_BOX, C_BOX)
332
if checkResult == true
333
player[0].jumpPress = false
334
player[0].jumpHold = false
335
player[0].xvel = 0
336
player[0].speed = 0
337
player[0].right = false
338
player[0].jumpAbility = object.jumpAbilityFunc
339
GetTableValue(object.duration, object.velocityTablePos, Tornado_velocityDurationTable)
340
object.velocityTablePos++
341
object.state = TORNADO_CHASESEQUENCE
342
end if
343
break
344
345
case TORNADO_CHASESEQUENCE
346
if object.timer < 1160
347
tileLayer[1].scrollSpeed -= 256
348
if tileLayer[1].scrollSpeed < -0x60000
349
tileLayer[1].scrollSpeed = -0x60000
350
end if
351
else
352
if object.timer > 2048
353
tileLayer[1].scrollSpeed += 0x600
354
if tileLayer[1].scrollSpeed > 0
355
tileLayer[1].scrollSpeed = 0
356
end if
357
358
tileLayer[3].scrollSpeed += 0x4E0
359
if tileLayer[3].scrollSpeed > 0
360
tileLayer[3].scrollSpeed = 0
361
if stage.activeLayer[1] != 2
362
stage.activeLayer[1] = 2 // Show Death Egg Dock BG
363
stage.activeLayer[3] = 2 // Show Death Egg Dock BG
364
tileLayer[2].scrollPos = 0
365
tileLayer[2].scrollSpeed = 0
366
hParallax[4].scrollPos = 0
367
hParallax[4].scrollSpeed = 0x20000
368
end if
369
end if
370
end if
371
end if
372
player[0].timer = 0
373
374
object.timer++
375
if object.timer >= object.duration
376
temp0 = object.velocityTablePos
377
temp0 <<= 1
378
GetTableValue(object.xvel, temp0, Tornado_moveVelocityTable)
379
temp0++
380
GetTableValue(object.yvel, temp0, Tornado_moveVelocityTable)
381
GetTableValue(object.duration, object.velocityTablePos, Tornado_velocityDurationTable)
382
object.velocityTablePos++
383
end if
384
385
// "Checkpoints" or "keyframes" of sorts are used here, to mark whenever a change should happen
386
// Any value not listed here just does nothing
387
switch object.timer
388
case 296
389
object.boosterActive = true
390
hParallax[0].scrollSpeed <<= 1
391
hParallax[1].scrollSpeed <<= 1
392
hParallax[2].scrollSpeed <<= 1
393
hParallax[3].scrollSpeed <<= 1
394
break
395
396
case 1148
397
player[0].jumpPress = true
398
player[0].jumpHold = true
399
break
400
401
case 1149
402
player[0].jumpPress = false
403
break
404
405
case 1160
406
wfzEggmanThruster[+4].interval = 1
407
wfzEggmanThruster[+5].interval = 1
408
wfzEggmanThruster[+6].interval = 1
409
hParallax[0].scrollSpeed <<= 2
410
hParallax[1].scrollSpeed <<= 2
411
hParallax[2].scrollSpeed <<= 2
412
hParallax[3].scrollSpeed <<= 2
413
player[0].gravity = GRAVITY_GROUND
414
player[0].scrollTracking = false
415
tileLayer[1].scrollSpeed = -0x80000
416
tileLayer[3].scrollSpeed = -0x80000
417
break
418
419
case 2200
420
stage.activeLayer[0] = 3 // Show the Sky & Space BG
421
tileLayer[3].scrollPos = 0x2490000
422
tileLayer[3].scrollSpeed = tileLayer[1].scrollSpeed
423
break
424
425
case 2624
426
object.timer = 0
427
object.state = TORNADO_FINISHACT
428
break
429
430
end switch
431
432
object.xpos += object.xvel
433
object.ypos += object.yvel
434
break
435
436
case TORNADO_FINISHACT
437
// This stage doesn't have an [Act Finish] object so this object takes its place
438
music.volume -= 2
439
object.timer += 4
440
SetScreenFade(0x00, 0x00, 0x00, object.timer)
441
if object.timer == 384
442
StopMusic()
443
fadeColor = 0
444
object.timer = 0
445
starPostID = 0
446
object.direction = FACING_RIGHT // this doesn't really matter much
447
448
#platform: USE_ORIGINS
449
if game.playMode == BOOT_PLAYMODE_BOSSRUSH
450
CallNativeFunction2(NotifyCallback, NOTIFY_BOSS_END, 1) // the [Eggman Laser] object already does this, so the Tornado never really gets a chance to do it
451
LoadStage()
452
else
453
#endplatform
454
stage.listPos++
455
456
// Huh?
457
// If the stage we're going to is after HPZ, then go back to OOZ1?
458
// if you really wanna, ig...
459
if stage.listPos > 20
460
stage.listPos = 12
461
end if
462
463
if options.gameMode == MODE_SAVEGAME
464
arrayPos1 = options.saveSlot
465
arrayPos1 <<= 3
466
if stage.player2Enabled == true
467
#platform: USE_STANDALONE
468
saveRAM[arrayPos1] = 3
469
#endplatform
470
#platform: USE_ORIGINS
471
switch stage.playerListPos
472
case PLAYER_SONIC_A
473
saveRAM[arrayPos1] = PLAYER_SONIC_TAILS
474
break
475
476
case PLAYER_KNUCKLES_A
477
saveRAM[arrayPos1] = PLAYER_KNUCKLES_TAILS
478
break
479
480
case PLAYER_AMY_A
481
saveRAM[arrayPos1] = PLAYER_AMY_TAILS
482
break
483
end switch
484
#endplatform
485
else
486
saveRAM[arrayPos1] = stage.playerListPos
487
end if
488
arrayPos1++
489
490
saveRAM[arrayPos1] = player.lives
491
arrayPos1++
492
493
saveRAM[arrayPos1] = player.score
494
arrayPos1++
495
496
saveRAM[arrayPos1] = player.scoreBonus
497
arrayPos1++
498
499
// Bug Details:
500
// This is missing the check for if your save file is already past the next act
501
// This means the save file's act will be overwritten to Death Egg Zone, even if you're on a Complete save file...
502
saveRAM[arrayPos1] = stage.listPos
503
saveRAM[arrayPos1]++
504
arrayPos1++
505
506
saveRAM[arrayPos1] = specialStage.emeralds
507
arrayPos1++
508
509
saveRAM[arrayPos1] = specialStage.listPos
510
WriteSaveRAM()
511
end if
512
513
if options.gameMode == MODE_TIMEATTACK
514
timeAttack.result = stage.seconds
515
timeAttack.result *= 100
516
temp0 = stage.minutes
517
temp0 *= 6000
518
timeAttack.result += temp0
519
timeAttack.result += stage.milliSeconds
520
stage.listPos--
521
CallNativeFunction2(SetLeaderboard, stage.listPos, timeAttack.result)
522
engine.state = 8
523
else
524
temp0 = engine.trialMode
525
if stage.listPos >= stage.listSize
526
temp0 = true
527
end if
528
529
if temp0 == false
530
#platform: USE_ORIGINS
531
CallNativeFunction4(NotifyCallback, NOTIFY_STATS_ENEMY, StageStatsUsabilityParam1, StageStatsUsabilityParam2, StageStatsUsabilityParam3)
532
CallNativeFunction2(NotifyCallback, NOTIFY_STATS_RING, player[0].rings)
533
temp0 = StageStatsUsabilityParam5
534
temp0 &= 1
535
temp1 = StageStatsUsabilityParam5
536
temp1 &= 2
537
temp2 = StageStatsUsabilityParam5
538
temp2 &= 4
539
CallNativeFunction4(NotifyCallback, NOTIFY_STATS_CHARA_ACTION, temp0, temp1, temp2)
540
CallNativeFunction2(NotifyCallback, NOTIFY_ACT_FINISH, 0)
541
StageStatsUsabilityParam1 = 0
542
StageStatsUsabilityParam2 = 0
543
StageStatsUsabilityParam3 = 0
544
StageStatsUsabilityParam4 = 0
545
StageStatsUsabilityParam5 = 0
546
StatsUsabilityParam1 = 0
547
StatsUsabilityParam2 = 0
548
StatsUsabilityParam3 = 0
549
StatsUsabilityParam4 = 0
550
StatsUsabilityParam5 = 0
551
#endplatform
552
553
LoadStage()
554
else
555
stage.activeList = PRESENTATION_STAGE
556
stage.listPos = 0
557
LoadStage()
558
end if
559
end if
560
#platform: USE_ORIGINS
561
end if
562
#endplatform
563
end if
564
break
565
end switch
566
567
temp0 = object.ypos
568
569
object.lastPos.y &= 0xFFFF0000
570
object.collisionOffset.y = object.ypos
571
object.collisionOffset.y &= 0xFFFF0000
572
object.collisionOffset.y -= object.lastPos.y
573
object.ypos = object.lastPos.y
574
575
object.stood = false
576
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
577
temp2 = player[currentPlayer].yvel
578
BoxCollisionTest(C_PLATFORM, object.entityPos, -20, -8, 20, 8, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
579
if checkResult == true
580
player[currentPlayer].xpos += object.xvel
581
player[currentPlayer].ypos += object.yvel
582
object.stood |= true
583
end if
584
next
585
object.ypos = temp0
586
587
object.frame++
588
object.frame &= 3
589
590
if object.pilotFrameDelay < 2
591
if stage.playerListPos == PLAYER_TAILS_A
592
GetTableValue(object.pilotFrame, object.pilotAnimPos, Tornado_SonicPilotFrameTable)
593
object.pilotAnimPos++
594
595
GetTableValue(object.pilotFrameDelay, object.pilotAnimPos, Tornado_SonicPilotFrameTable)
596
object.pilotAnimPos++
597
else
598
GetTableValue(object.pilotFrame, object.pilotAnimPos, Tornado_TailsPilotFrameTable)
599
object.pilotAnimPos++
600
601
GetTableValue(object.pilotFrameDelay, object.pilotAnimPos, Tornado_TailsPilotFrameTable)
602
object.pilotAnimPos++
603
end if
604
605
object.pilotAnimPos &= 15
606
else
607
object.pilotFrameDelay--
608
end if
609
end event
610
611
612
event ObjectDraw
613
DrawSprite(object.frame)
614
DrawSprite(4)
615
DrawSprite(object.pilotFrame)
616
617
if object.state >= TORNADO_JUMPONTOTORNADO
618
DrawSprite(12)
619
620
if object.boosterActive == true
621
temp0 = oscillation
622
temp0 &= 1
623
temp0 += 13
624
DrawSprite(temp0)
625
end if
626
end if
627
end event
628
629
630
event ObjectStartup
631
LoadSpriteSheet("SCZ/Objects.gif")
632
SpriteFrame(21, 8, 4, 24, 378, 215) // Propeller - Frame 1 - #0
633
SpriteFrame(21, 11, 4, 18, 383, 218) // Propeller - Frame 2 - #1
634
SpriteFrame(21, 16, 4, 8, 388, 223) // Propeller - Frame 3 - #2
635
SpriteFrame(21, 11, 4, 18, 393, 218) // Propeller - Frame 4 - #3
636
SpriteFrame(-95, -16, 116, 64, 261, 191) // Tornado - #4
637
SpriteFrame(-45, -8, 21, 16, 261, 174) // Pilot (Tails) - Frame 1 - #5
638
SpriteFrame(-45, -8, 21, 16, 283, 174) // Pilot (Tails) - Frame 2 - #6
639
SpriteFrame(-45, -8, 21, 16, 305, 174) // Pilot (Tails) - Frame 3 - #7
640
SpriteFrame(-45, -8, 21, 16, 327, 174) // Pilot (Tails) - Frame 4 - #8
641
SpriteFrame(-47, -8, 23, 16, 349, 174) // Pilot (Tails) - Frame 5 - #9
642
SpriteFrame(-50, -8, 24, 16, 294, 157) // Pilot (Sonic) - Frame 6 - #10
643
SpriteFrame(-50, -8, 24, 16, 319, 157) // Pilot (Sonic) - Frame 2 - #11
644
SpriteFrame(-39, 32, 56, 16, 375, 90) // Booster - #12
645
SpriteFrame(-55, 32, 16, 16, 386, 107) // Booster Flame - Frame 1 - #13
646
SpriteFrame(-71, 32, 32, 16, 386, 124) // Booster Flame - Frame 2 - #14
647
648
if playerCount > 1 // Remove P2
649
player[1].type = TypeName[Blank Object]
650
playerCount = 1
651
end if
652
653
foreach (TypeName[Tornado], arrayPos0, ALL_ENTITIES)
654
object[arrayPos0].priority = PRIORITY_ACTIVE
655
if object[arrayPos0].propertyValue == 0
656
object[arrayPos0].xvel = 0x10000
657
object[arrayPos0].timer = 192
658
else
659
if options.gameMode == MODE_TIMEATTACK
660
ResetObjectEntity(arrayPos0, TypeName[Blank Object], 0, 0, 0)
661
else
662
object[arrayPos0].state = TORNADO_SETUPOUTRO
663
end if
664
end if
665
next
666
end event
667
668
669
// ========================
670
// Editor Events
671
// ========================
672
673
event RSDKEdit
674
if editor.returnVariable == true
675
switch editor.variableID
676
case EDIT_VAR_PROPVAL // property value
677
checkResult = object.propertyValue
678
break
679
680
case 0 // type
681
checkResult = object.propertyValue
682
break
683
684
end switch
685
else
686
switch editor.variableID
687
case EDIT_VAR_PROPVAL // property value
688
object.propertyValue = editor.variableValue
689
break
690
691
case 0 // type
692
object.propertyValue = editor.variableValue
693
break
694
695
end switch
696
end if
697
end event
698
699
700
event RSDKDraw
701
DrawSprite(0)
702
DrawSprite(1)
703
DrawSprite(2)
704
end event
705
706
707
event RSDKLoad
708
LoadSpriteSheet("SCZ/Objects.gif")
709
SpriteFrame(21, 8, 4, 24, 378, 215)
710
SpriteFrame(-95, -16, 116, 64, 261, 191)
711
SpriteFrame(-45, -8, 21, 16, 283, 174)
712
713
AddEditorVariable("type")
714
SetActiveVariable("type")
715
AddEnumVariable("Intro Cutscene", 0)
716
AddEnumVariable("Outro Cutscene", 1)
717
end event
718
719