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/LZ/Water.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 1
3
// Script Description: Water Object
4
// Script Author: Christian Whitehead/Simon Thomley
5
// Unpacked by Rubberduckycooly's script unpacker
6
// ----------------------------------
7
8
// Any water objects in the scene should be followed by THREE blank objects, these manage player stuff
9
10
// ========================
11
// Aliases
12
// ========================
13
14
private alias object.value1 : object.constBubbleTimer
15
private alias object.value2 : object.randBubbleTimer
16
private alias object.value3 : object.proccessActEffects
17
private alias object.value8 : object.nextTrackID // Stores the track that should play after the drowning one stops
18
19
// Player Aliases
20
private alias object.type : player.type
21
private alias object.state : player.state
22
private alias object.xpos : player.xpos
23
private alias object.ypos : player.ypos
24
private alias object.xvel : player.xvel
25
private alias object.yvel : player.yvel
26
private alias object.speed : player.speed
27
private alias object.gravity : player.gravity
28
private alias object.animation : player.animation
29
private alias object.direction : player.direction
30
private alias object.tileCollisions : player.tileCollisions
31
private alias object.interaction : player.interaction
32
33
private alias object.value1 : player.timer
34
private alias object.value3 : player.drownTimer
35
private alias object.value4 : player.drownLevel
36
private alias object.value18 : player.sortedDrawOrder
37
private alias object.value20 : player.topSpeed
38
private alias object.value21 : player.acceleration
39
private alias object.value22 : player.deceleration
40
private alias object.value23 : player.airAcceleration
41
private alias object.value24 : player.airDeceleration
42
private alias object.value25 : player.gravityStrength
43
private alias object.value27 : player.jumpStrength
44
private alias object.value28 : player.jumpCap
45
private alias object.value37 : player.shield
46
47
// AirBubble Aliases
48
private alias object.value1 : airBubble.originPos.x
49
private alias object.value2 : airBubble.targetPlayer
50
51
// CountdownBubble Aliases
52
private alias object.value1 : countdownBubble.drawPos.x
53
private alias object.value2 : countdownBubble.drawPos.y
54
55
// Death Event Aliases
56
private alias object.value4 : object.timeOver
57
58
// Shields
59
private alias 0 : SHIELD_NONE
60
private alias 2 : SHIELD_BUBBLE
61
private alias 3 : SHIELD_FIRE
62
private alias 4 : SHIELD_LIGHTNING
63
64
// Tracks
65
private alias 0 : TRACK_STAGE
66
private alias 2 : TRACK_INVINCIBLE
67
private alias 6 : TRACK_DROWNING
68
69
// Super States
70
private alias 1 : SUPERSTATE_SUPER
71
72
73
// ========================
74
// Function Declarations
75
// ========================
76
77
reserve function Water_ProcessLZAct1
78
reserve function Water_ProcessLZAct2
79
reserve function Water_ProcessLZAct3
80
reserve function Water_ProcessSBZAct3
81
reserve function Water_SpawnSmallAirBubble
82
reserve function Water_SpawnCountDownBubble
83
reserve function Water_ResetDrownMusic
84
85
86
// ========================
87
// Static Values
88
// ========================
89
90
public value Water_waterSlotID = 0
91
public value Water_activateFlag = 0
92
93
94
// ========================
95
// Tables
96
// ========================
97
98
private table Water_processActTable[5]
99
100
101
// ========================
102
// Function Definitions
103
// ========================
104
105
private function Water_ProcessLZAct1
106
switch stage.waterState
107
case 0
108
stage.newWaterLevel = 0xB80000
109
if temp0 >= 1696
110
stage.newWaterLevel = 0x1080000
111
if temp1 < 512
112
if temp0 >= 3360
113
stage.newWaterLevel = 0xE80000
114
if temp0 >= 5536
115
stage.newWaterLevel = 0x1080000
116
end if
117
end if
118
else
119
if temp0 >= 3232
120
stage.newWaterLevel = 0x3180000
121
if temp0 >= 4384
122
stage.newWaterLevel = 0x5C80000
123
if temp0 >= 5152
124
stage.newWaterLevel = 0x3A80000
125
if object[arrayPos0].ypos == stage.newWaterLevel
126
stage.waterState = 1
127
end if
128
end if
129
end if
130
end if
131
end if
132
end if
133
break
134
135
case 1
136
if temp1 < 736
137
stage.newWaterLevel = 0x3A80000
138
if temp0 >= 5024
139
stage.newWaterLevel = 0x1080000
140
stage.waterState = 2
141
end if
142
end if
143
break
144
145
case 2
146
break
147
148
end switch
149
end function
150
151
152
private function Water_ProcessLZAct2
153
stage.newWaterLevel = 0x3280000
154
if temp0 >= 1440
155
stage.newWaterLevel = 0x3C80000
156
if temp0 >= 2976
157
stage.newWaterLevel = 0x4280000
158
end if
159
end if
160
end function
161
162
163
private function Water_ProcessLZAct3
164
switch stage.waterState
165
case 0
166
stage.newWaterLevel = 0xA000000
167
object[arrayPos0].ypos = stage.newWaterLevel
168
if temp0 >= 1696
169
if temp1 >= 960
170
if temp1 < 1536
171
stage.waterState = 1
172
stage.newWaterLevel = 0x4C80000
173
object[arrayPos0].ypos = stage.newWaterLevel
174
PlaySfx(SfxName[Large Wall], false)
175
SetTileLayerEntry(302, 0, 12, 5)
176
SetTileLayerEntry(303, 0, 13, 5)
177
end if
178
end if
179
end if
180
break
181
182
case 1
183
temp3 = 0x4C80000
184
if temp0 >= 2048
185
temp3 = 0x3080000
186
if temp0 >= 0x14A0
187
temp2 = false
188
if stage.newWaterLevel == 0x5080000
189
temp2 = true
190
else
191
if temp1 >= 1536
192
temp2 = true
193
else
194
if temp1 < 640
195
temp2 = true
196
end if
197
end if
198
end if
199
200
if temp2 == true
201
temp3 = 0x5080000
202
object[arrayPos0].ypos = temp3
203
if temp0 >= 6160
204
stage.waterState = 2
205
end if
206
end if
207
end if
208
end if
209
stage.newWaterLevel = temp3
210
break
211
212
case 2
213
stage.newWaterLevel = 0x5080000
214
if temp0 >= 6400
215
stage.newWaterLevel = 0x1880000
216
if temp0 < 7040
217
if object[arrayPos0].ypos == stage.newWaterLevel
218
stage.waterState = 3
219
end if
220
else
221
stage.waterState = 3
222
end if
223
end if
224
break
225
226
case 3
227
stage.newWaterLevel = 0x1880000
228
object[arrayPos0].ypos = stage.newWaterLevel
229
230
if temp1 > 1792
231
stage.newWaterLevel = 0xA000000
232
object[arrayPos0].ypos = stage.newWaterLevel
233
end if
234
235
if temp1 < 160
236
stage.newWaterLevel = 0xA000000
237
object[arrayPos0].ypos = stage.newWaterLevel
238
end if
239
240
if temp0 >= 7040
241
stage.newWaterLevel = 0xA000000
242
object[arrayPos0].ypos = stage.newWaterLevel
243
if temp0 >= 7264
244
stage.waterState = 4
245
stage.newWaterLevel = 0x6080000
246
object[arrayPos0].ypos = 0x7C00000
247
Water_activateFlag = true
248
end if
249
end if
250
break
251
252
case 4
253
if temp0 >= 7840
254
stage.newWaterLevel = 0x1280000
255
end if
256
break
257
258
end switch
259
end function
260
261
262
private function Water_ProcessSBZAct3
263
stage.newWaterLevel = 0x2280000
264
if temp0 >= 4000
265
stage.newWaterLevel = 0x4C80000
266
end if
267
end function
268
269
270
private function Water_SpawnSmallAirBubble
271
if object[+currentPlayer].constBubbleTimer > 0
272
object[+currentPlayer].constBubbleTimer--
273
274
if object[+currentPlayer].randBubbleTimer > 0
275
object[+currentPlayer].randBubbleTimer--
276
else
277
CreateTempObject(TypeName[Air Bubble], 2, player[currentPlayer].xpos, player[currentPlayer].ypos)
278
object[tempObjectPos].drawOrder = 4
279
object[tempObjectPos].yvel = -0x8800
280
airBubble[tempObjectPos].targetPlayer = currentPlayer
281
if player[currentPlayer].direction == FLIP_NONE
282
object[tempObjectPos].xpos += 0x60000
283
else
284
object[tempObjectPos].xpos -= 0x60000
285
object[tempObjectPos].angle = 256
286
end if
287
airBubble[tempObjectPos].originPos.x = object[tempObjectPos].xpos
288
object[+currentPlayer].randBubbleTimer = 512
289
end if
290
else
291
Rand(temp0, 3)
292
if temp0 == 1
293
Rand(object[+currentPlayer].randBubbleTimer, 16)
294
object[+currentPlayer].randBubbleTimer += 8
295
else
296
object[+currentPlayer].randBubbleTimer = 512
297
end if
298
299
object[+currentPlayer].constBubbleTimer = 60
300
CreateTempObject(TypeName[Air Bubble], 2, player[currentPlayer].xpos, player[currentPlayer].ypos)
301
object[tempObjectPos].drawOrder = 4
302
object[tempObjectPos].yvel = -0x8800
303
airBubble[tempObjectPos].targetPlayer = currentPlayer
304
if player[currentPlayer].direction == FLIP_NONE
305
object[tempObjectPos].xpos += 0x60000
306
else
307
object[tempObjectPos].xpos -= 0x60000
308
object[tempObjectPos].angle = 256
309
end if
310
311
airBubble[tempObjectPos].originPos.x = object[tempObjectPos].xpos
312
end if
313
end function
314
315
316
private function Water_SpawnCountDownBubble
317
CreateTempObject(TypeName[Countdown Bubble], temp0, player[currentPlayer].xpos, player[currentPlayer].ypos)
318
object[tempObjectPos].drawOrder = 5
319
object[tempObjectPos].yvel = -0x8800
320
countdownBubble[tempObjectPos].drawPos.y = currentPlayer // this is odd... this is drawPos.y, not "targetPlayer", likely a leftover from AirBubble spawning
321
322
if player[currentPlayer].direction == FLIP_NONE
323
object[tempObjectPos].xpos += 0x60000
324
else
325
object[tempObjectPos].xpos -= 0x60000
326
object[tempObjectPos].angle = 0x100
327
end if
328
329
countdownBubble[tempObjectPos].drawPos.x = object[tempObjectPos].xpos
330
end function
331
332
333
private function Water_ResetDrownMusic
334
if currentPlayer == 0
335
arrayPos0 = Water_waterSlotID
336
arrayPos0 += currentPlayer
337
if player[currentPlayer].type != TypeName[Death Event]
338
if music.currentTrack == TRACK_DROWNING
339
if object[arrayPos0].nextTrackID == TRACK_INVINCIBLE
340
arrayPos1 = currentPlayer
341
arrayPos1 += playerCount
342
if object[arrayPos1].type != TypeName[Invincibility]
343
if Player_superState != SUPERSTATE_SUPER
344
object[arrayPos0].nextTrackID = TRACK_STAGE
345
end if
346
end if
347
end if
348
349
PlayMusic(object[arrayPos0].nextTrackID)
350
end if
351
end if
352
end if
353
end function
354
355
356
// ========================
357
// Events
358
// ========================
359
360
event ObjectUpdate
361
temp0 = player[0].xpos
362
temp0 >>= 16
363
temp1 = player[0].ypos
364
temp1 >>= 16
365
366
arrayPos0 = object.entityPos
367
CallFunction(object.proccessActEffects)
368
369
if object.ypos < stage.newWaterLevel
370
object.ypos += 0x10000
371
end if
372
if object.ypos > stage.newWaterLevel
373
object.ypos -= 0x10000
374
end if
375
376
temp0 = oscillation
377
temp0 <<= 1
378
Sin(stage.waterLevel, temp0)
379
stage.waterLevel <<= 10
380
stage.waterLevel += object.ypos
381
temp7 = stage.waterLevel
382
stage.waterLevel >>= 16
383
384
currentPlayer = 0
385
while currentPlayer < playerCount
386
#platform: USE_ORIGINS
387
if game.playMode == BOOT_PLAYMODE_MISSION
388
if stage.timeEnabled == false
389
if object[currentPlayer].type == TypeName[Player Object]
390
player[currentPlayer].drownTimer = 0
391
end if
392
393
if object[currentPlayer].type == TypeName[Death Event]
394
object[currentPlayer].timeOver = 11 // this value is normally true/false.. why are we making it 11?
395
end if
396
end if
397
end if
398
#endplatform
399
400
if player[currentPlayer].gravityStrength == 0x3800
401
CheckNotEqual(player[currentPlayer].type, TypeName[Debug Mode])
402
temp0 = checkResult
403
CheckNotEqual(player[currentPlayer].state, Player_State_Death)
404
temp0 &= checkResult
405
CheckGreater(player[currentPlayer].ypos, temp7)
406
temp0 &= checkResult
407
if temp0 == true
408
if player[currentPlayer].yvel > 0
409
player[currentPlayer].yvel >>= 2
410
end if
411
412
if object.ypos < stage.newWaterLevel
413
player[currentPlayer].yvel += 0x10000
414
end if
415
416
if player[currentPlayer].state == Player_State_Fly
417
StopSfx(SfxName[Flying])
418
StopSfx(SfxName[Jump])
419
end if
420
421
player[currentPlayer].xvel >>= 1
422
player[currentPlayer].speed >>= 1
423
424
CallFunction(Player_UpdatePhysicsState)
425
if player[currentPlayer].yvel != 0
426
CreateTempObject(TypeName[Water Splash], 0, player[currentPlayer].xpos, temp7)
427
object[tempObjectPos].drawOrder = 4
428
PlaySfx(SfxName[Water Splash], false)
429
end if
430
431
object[+currentPlayer].constBubbleTimer = 52
432
player[currentPlayer].drownTimer = 0
433
end if
434
else
435
if player[currentPlayer].shield == SHIELD_FIRE
436
temp2 = 0
437
while temp2 < 8
438
Rand(temp0, 32)
439
Rand(temp1, 32)
440
temp0 -= 16
441
temp0 <<= 16
442
temp0 += player[currentPlayer].xpos
443
temp1 -= 16
444
temp1 <<= 16
445
temp1 += player[currentPlayer].ypos
446
CreateTempObject(TypeName[Dust Puff], 0, temp0, temp1)
447
object[tempObjectPos].drawOrder = player[currentPlayer].sortedDrawOrder
448
object[tempObjectPos].drawOrder++
449
object[tempObjectPos].xvel = player[currentPlayer].xvel
450
object[tempObjectPos].yvel = player[currentPlayer].yvel
451
temp2++
452
loop
453
454
player[currentPlayer].shield = SHIELD_NONE
455
arrayPos0 = currentPlayer
456
arrayPos0 += playerCount
457
CallFunction(Player_ApplyShield)
458
end if
459
460
if player[currentPlayer].shield == SHIELD_LIGHTNING
461
player[currentPlayer].shield = SHIELD_NONE
462
arrayPos0 = currentPlayer
463
arrayPos0 += playerCount
464
CallFunction(Player_ApplyShield)
465
Water_flashTimer = 4
466
end if
467
468
if player[currentPlayer].shield != SHIELD_BUBBLE
469
if player[currentPlayer].drownTimer == 0
470
player[currentPlayer].drownLevel = 0
471
CallFunction(Water_ResetDrownMusic)
472
end if
473
474
switch player[currentPlayer].drownLevel
475
case 0
476
CallFunction(Water_SpawnSmallAirBubble)
477
player[currentPlayer].drownTimer++
478
if player[currentPlayer].drownTimer == 360
479
if currentPlayer == 0
480
PlaySfx(SfxName[Drown Alert], false)
481
end if
482
player[currentPlayer].drownLevel++
483
end if
484
break
485
486
case 1
487
CallFunction(Water_SpawnSmallAirBubble)
488
player[currentPlayer].drownTimer++
489
if player[currentPlayer].drownTimer == 660
490
if currentPlayer == 0
491
PlaySfx(SfxName[Drown Alert], false)
492
end if
493
player[currentPlayer].drownLevel++
494
end if
495
break
496
497
case 2
498
CallFunction(Water_SpawnSmallAirBubble)
499
player[currentPlayer].drownTimer++
500
if player[currentPlayer].drownTimer == 960
501
if currentPlayer == 0
502
PlaySfx(SfxName[Drown Alert], false)
503
end if
504
player[currentPlayer].drownLevel++
505
end if
506
break
507
508
case 3
509
CallFunction(Water_SpawnSmallAirBubble)
510
player[currentPlayer].drownTimer++
511
if player[currentPlayer].drownTimer == 1080
512
if currentPlayer == 0
513
object.nextTrackID = music.currentTrack
514
PlayMusic(TRACK_DROWNING)
515
end if
516
517
temp0 = 0
518
CallFunction(Water_SpawnCountDownBubble)
519
player[currentPlayer].drownLevel++
520
end if
521
break
522
523
case 4
524
CallFunction(Water_SpawnSmallAirBubble)
525
player[currentPlayer].drownTimer++
526
if player[currentPlayer].drownTimer == 1200
527
temp0 = 1
528
CallFunction(Water_SpawnCountDownBubble)
529
player[currentPlayer].drownLevel++
530
end if
531
break
532
533
case 5
534
CallFunction(Water_SpawnSmallAirBubble)
535
player[currentPlayer].drownTimer++
536
if player[currentPlayer].drownTimer == 1320
537
temp0 = 2
538
CallFunction(Water_SpawnCountDownBubble)
539
player[currentPlayer].drownLevel++
540
end if
541
break
542
543
case 6
544
CallFunction(Water_SpawnSmallAirBubble)
545
player[currentPlayer].drownTimer++
546
if player[currentPlayer].drownTimer == 1440
547
temp0 = 3
548
CallFunction(Water_SpawnCountDownBubble)
549
player[currentPlayer].drownLevel++
550
end if
551
break
552
553
case 7
554
CallFunction(Water_SpawnSmallAirBubble)
555
player[currentPlayer].drownTimer++
556
if player[currentPlayer].drownTimer == 1560
557
temp0 = 4
558
CallFunction(Water_SpawnCountDownBubble)
559
player[currentPlayer].drownLevel++
560
end if
561
break
562
563
case 8
564
CallFunction(Water_SpawnSmallAirBubble)
565
player[currentPlayer].drownTimer++
566
if player[currentPlayer].drownTimer == 1680
567
temp0 = 5
568
CallFunction(Water_SpawnCountDownBubble)
569
player[currentPlayer].drownLevel++
570
end if
571
break
572
573
case 9
574
CallFunction(Water_SpawnSmallAirBubble)
575
player[currentPlayer].drownTimer++
576
if player[currentPlayer].drownTimer == 1800
577
if player[currentPlayer].state != Player_State_Death
578
if currentPlayer == 0
579
stage.timeEnabled = false
580
camera[0].enabled = false
581
end if
582
player[currentPlayer].state = Player_State_Drown
583
player[currentPlayer].animation = ANI_DROWNING
584
player[currentPlayer].speed = 0
585
player[currentPlayer].xvel = 0
586
player[currentPlayer].yvel = 0
587
player[currentPlayer].tileCollisions = false
588
player[currentPlayer].interaction = false
589
player[currentPlayer].sortedDrawOrder = 5
590
object[+currentPlayer].constBubbleTimer = 2
591
PlaySfx(SfxName[Drowning], false)
592
player[currentPlayer].drownLevel++
593
end if
594
end if
595
break
596
597
case 10
598
player[currentPlayer].drownTimer++
599
if player[currentPlayer].drownTimer == 1860
600
player[currentPlayer].drownLevel++
601
end if
602
603
if object[+currentPlayer].constBubbleTimer > 0
604
object[+currentPlayer].constBubbleTimer--
605
if object[+currentPlayer].randBubbleTimer > 0
606
object[+currentPlayer].randBubbleTimer--
607
else
608
Rand(temp1, 2)
609
temp1 += 2
610
CreateTempObject(TypeName[Air Bubble], temp1, player[currentPlayer].xpos, player[currentPlayer].ypos)
611
object[tempObjectPos].drawOrder = 5
612
object[tempObjectPos].yvel = -0x8800
613
object[tempObjectPos].ypos -= 0x60000
614
airBubble[tempObjectPos].targetPlayer = currentPlayer
615
Rand(object[tempObjectPos].angle, 256)
616
airBubble[tempObjectPos].originPos.x = object[tempObjectPos].xpos
617
object[+currentPlayer].randBubbleTimer = 512
618
end if
619
else
620
Rand(temp0, 5)
621
if temp0 == 1
622
object[+currentPlayer].randBubbleTimer = 2
623
else
624
object[+currentPlayer].randBubbleTimer = 512
625
end if
626
object[+currentPlayer].constBubbleTimer = 6
627
628
Rand(temp1, 2)
629
temp1 += 2
630
CreateTempObject(TypeName[Air Bubble], temp1, player[currentPlayer].xpos, player[currentPlayer].ypos)
631
object[tempObjectPos].drawOrder = 5
632
object[tempObjectPos].yvel = -0x8800
633
object[tempObjectPos].ypos -= 0x60000
634
airBubble[tempObjectPos].targetPlayer = currentPlayer
635
Rand(object[tempObjectPos].angle, 0x100)
636
airBubble[tempObjectPos].originPos.x = object[tempObjectPos].xpos
637
end if
638
break
639
end switch
640
end if
641
642
CheckEqual(player[currentPlayer].type, TypeName[Debug Mode])
643
temp0 = checkResult
644
CheckLower(player[currentPlayer].ypos, temp7)
645
temp0 |= checkResult
646
if temp0 == true
647
if player[currentPlayer].state != Player_State_Death
648
player[currentPlayer].yvel <<= 1
649
if player[currentPlayer].yvel < -0x100000
650
player[currentPlayer].yvel = -0x100000
651
end if
652
653
// Fixes a bug where jumping at the surface of the water will set your velocity too high
654
// Interestingly, unlike S2 this fix IS in the Origins version of this game
655
if player[currentPlayer].animation == ANI_JUMPING
656
if player[currentPlayer].timer > 0
657
if player[currentPlayer].yvel < -0x68000
658
player[currentPlayer].yvel = -0x68000
659
end if
660
end if
661
end if
662
663
if player[currentPlayer].state == Player_State_Fly
664
if player[currentPlayer].timer < 480
665
PlaySfx(SfxName[Flying], true)
666
else
667
PlaySfx(SfxName[Jump], true)
668
end if
669
end if
670
671
672
CallFunction(Player_UpdatePhysicsState)
673
if player[currentPlayer].yvel != 0
674
temp0 = object.ypos
675
temp0 -= player[currentPlayer].ypos
676
if temp0 < 0xF00000
677
CreateTempObject(TypeName[Water Splash], 0, player[currentPlayer].xpos, temp7)
678
object[tempObjectPos].drawOrder = 4
679
PlaySfx(SfxName[Water Splash], false)
680
end if
681
end if
682
683
player[currentPlayer].drownTimer = 0
684
CallFunction(Water_ResetDrownMusic)
685
end if
686
end if
687
end if
688
currentPlayer++
689
loop
690
691
object.animationTimer++
692
object.animationTimer %= 24
693
object.frame = object.animationTimer
694
object.frame >>= 3
695
end event
696
697
698
event ObjectDraw
699
temp0 = screen.xoffset
700
Sin(temp1, oscillation)
701
temp1 >>= 5
702
temp0 += temp1
703
temp0 &= 63
704
FlipSign(temp0)
705
706
temp1 = stage.waterLevel
707
temp1 -= screen.yoffset
708
DrawSpriteScreenFX(object.frame, FX_INK, temp0, temp1)
709
710
temp0 += 256
711
DrawSpriteScreenFX(object.frame, FX_INK, temp0, temp1)
712
end event
713
714
715
event ObjectStartup
716
LoadSpriteSheet("LZ/Objects2.gif")
717
718
SetTableValue(Water_ProcessLZAct1, 1, Water_processActTable)
719
SetTableValue(Water_ProcessLZAct2, 2, Water_processActTable)
720
SetTableValue(Water_ProcessLZAct3, 3, Water_processActTable)
721
SetTableValue(Water_ProcessSBZAct3, 4, Water_processActTable)
722
723
foreach (TypeName[Water], arrayPos0, ALL_ENTITIES)
724
object[arrayPos0].priority = PRIORITY_ACTIVE
725
object[arrayPos0].drawOrder = 5
726
object[arrayPos0].inkEffect = INK_ALPHA
727
object[arrayPos0].alpha = 0xA0
728
if credits.screen == 0
729
stage.newWaterLevel = object[arrayPos0].ypos
730
else
731
stage.waterState = 1
732
stage.newWaterLevel = 0x4C80000
733
temp0 = player[0].xpos
734
temp0 >>= 16
735
temp1 = player[0].ypos
736
temp1 >>= 16
737
end if
738
Water_waterSlotID = arrayPos0
739
GetTableValue(object[arrayPos0].proccessActEffects, stage.actNum, Water_processActTable)
740
CallFunction(object[arrayPos0].proccessActEffects)
741
stage.waterLevel = stage.newWaterLevel
742
stage.waterLevel >>= 16
743
object[arrayPos0].ypos = stage.newWaterLevel
744
next
745
746
if lampPostID > 31
747
stage.waterState = recWaterState
748
stage.waterLevel = recWaterLevel
749
stage.newWaterLevel = recWaterLevel
750
stage.newWaterLevel <<= 16
751
arrayPos0 = Water_waterSlotID
752
object[arrayPos0].ypos = stage.newWaterLevel
753
else
754
if credits.screen == 0
755
stage.waterState = 0
756
end if
757
end if
758
759
Water_activateFlag = false
760
761
foreach (GROUP_PLAYERS, currentPlayer, ALL_ENTITIES)
762
player[currentPlayer].drownTimer = 0
763
if player[currentPlayer].ypos > stage.newWaterLevel
764
player[currentPlayer].yvel >>= 2
765
player[currentPlayer].xvel >>= 1
766
player[currentPlayer].speed >>= 1
767
player[currentPlayer].topSpeed >>= 1
768
player[currentPlayer].acceleration >>= 1
769
player[currentPlayer].deceleration >>= 1
770
player[currentPlayer].airAcceleration >>= 1
771
player[currentPlayer].airDeceleration >>= 1
772
player[currentPlayer].gravityStrength = 0x1000
773
if stage.playerListPos == PLAYER_KNUCKLES_A
774
player[currentPlayer].jumpStrength = 0x30000
775
else
776
player[currentPlayer].jumpStrength = 0x38000
777
end if
778
player[currentPlayer].jumpCap = -0x20000
779
arrayPos0 = Water_waterSlotID
780
arrayPos0 += currentPlayer
781
object[arrayPos0].constBubbleTimer = 52
782
end if
783
next
784
785
SpriteFrame(0, -8, 256, 16, 0, 129)
786
SpriteFrame(0, -8, 256, 16, 0, 146)
787
SpriteFrame(0, -8, 256, 16, 0, 163)
788
789
BrokenMonitor_ResetDrownMusic = Water_ResetDrownMusic
790
end event
791
792
793
// ========================
794
// Editor Events
795
// ========================
796
797
event RSDKDraw
798
DrawSprite(0)
799
end event
800
801
802
event RSDKLoad
803
LoadSpriteSheet("LZ/Objects2.gif")
804
SpriteFrame(0, -8, 256, 16, 0, 129)
805
806
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
807
end event
808
809