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/HTZ/HTZSetup.txt
1478 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: HTZ Setup Object
4
// Script Author: Christian Whitehead/Simon Thomley
5
// Unpacked by Rubberduckycooly's script unpacker
6
// ----------------------------------
7
8
// ========================
9
// Aliases
10
// ========================
11
12
// value0 is unused
13
private alias object.value1 : object.palRotateTimer
14
// value2-4 are unused, too
15
16
private alias object.value5 : object.bgLightDuration
17
private alias object.value6 : object.bgLightFrame
18
19
private alias object.value7 : object.pinkFlowerDuration
20
private alias object.value8 : object.pinkFlowerFrame
21
22
private alias object.value9 : object.redFlowerDuration
23
private alias object.value10 : object.redFlowerFrame
24
25
private alias object.value11 : object.rectFlowerDuration
26
private alias object.value12 : object.rectFlowerFrame
27
28
private alias object.value13 : object.pointyFlowerDuration
29
private alias object.value14 : object.pointyFlowerFrame
30
31
private alias object.value15 : object.lavaPalIndex1
32
private alias object.value16 : object.lavaPalIndex2
33
private alias object.value17 : object.lavaPalIndex3
34
private alias object.value18 : object.lavaPalIndex4
35
36
private alias object.value19 : object.shakeTimer
37
private alias object.value20 : object.unused // unused (besides being reset after earthquakes)
38
private alias object.value21 : object.earthquakeTimer
39
private alias object.value22 : object.movementState
40
private alias object.value23 : object.earthquakePos
41
// value24 is unused
42
private alias object.value25 : object.prevEarthquakeActive
43
private alias object.value26 : object.prevEarthquakeType
44
45
// Earthquake states
46
private alias 0 : EARTHQUAKE_NONE
47
private alias 1 : EARTHQUAKE_HOLD
48
private alias 2 : EARTHQUAKE_ACTIVE
49
50
// Tile Flag Aliases
51
private alias 1 : TILE_LAVA
52
53
// Tile Info ID Aliases
54
private alias 8 : TILEINFO_ANGLEB
55
56
// Player Aliases
57
private alias object.type : player.type
58
private alias object.xpos : player.xpos
59
private alias object.ypos : player.ypos
60
61
// Tracks
62
private alias 0 : TRACK_STAGE
63
private alias 1 : TRACK_ACTFINISH
64
private alias 2 : TRACK_INVINCIBLE
65
private alias 3 : TRACK_CONTINUE
66
private alias 4 : TRACK_BOSS
67
private alias 5 : TRACK_GAMEOVER
68
private alias 6 : TRACK_DROWNING
69
private alias 7 : TRACK_SUPER
70
71
// Reserved object slots
72
private alias 0 : SLOT_PLAYER1
73
private alias 10 : SLOT_ZONESETUP
74
private alias 25 : SLOT_MUSICEVENT_CHANGE
75
76
// Music Events
77
private alias 2 : MUSICEVENT_TRANSITION
78
79
private alias 0 : MUSICEVENT_FLAG_NOCHANGE
80
private alias 1 : MUSICEVENT_FLAG_SPEEDUP
81
private alias 2 : MUSICEVENT_FLAG_SLOWDOWN
82
83
// Music Loops
84
private alias 1 : MUSIC_LOOP_HTZ
85
private alias 1 : MUSIC_LOOP_HTZ_F
86
87
private alias 38679 : MUSIC_LOOP_INV
88
private alias 30897 : MUSIC_LOOP_INV_F
89
90
91
// ========================
92
// Function Declarations
93
// ========================
94
95
reserve function HTZSetup_SpeedUpMusic
96
reserve function HTZSetup_SlowDownMusic
97
98
99
// ========================
100
// Static Values
101
// ========================
102
103
public value HTZSetup_earthquakeState = 0
104
public value HTZSetup_activeEarthquakeType = 0
105
public value HTZSetup_earthquakePosMin = 0
106
public value HTZSetup_earthquakePos = 0 // Y Position, truncated down to 1:1 value
107
public value HTZSetup_earthquakePosMax = 0 // Lowest point the earthquake should go
108
109
110
// ========================
111
// Tables
112
// ========================
113
114
// Format: Tile ID followed by duration
115
private table HTZSetup_bgLightFrameTable
116
508, 24
117
509, 10
118
510, 12
119
511, 24
120
510, 12
121
509, 10
122
end table
123
124
private table HTZSetup_pinkFlowerFrameTable
125
512, 128
126
513, 20
127
512, 8
128
513, 8
129
512, 8
130
513, 8
131
end table
132
133
private table HTZSetup_redFlowerFrameTable
134
514, 128
135
515, 12
136
514, 12
137
515, 12
138
514, 6
139
515, 6
140
514, 6
141
515, 6
142
end table
143
144
private table HTZSetup_rectFlowerFrameTable
145
516, 8
146
517, 8
147
end table
148
149
private table HTZSetup_pointyFlowerFrameTable
150
518, 128
151
519, 8
152
518, 8
153
519, 8
154
518, 8
155
519, 12
156
518, 12
157
519, 12
158
end table
159
160
private table HTZSetup_palTable
161
0xE00000, 0xE06000, 0xE0A000, 0xE0E000
162
0xE0E000, 0xE00000, 0xE06000, 0xE0A000
163
0xE0C020, 0xE0E000, 0xE00000, 0xE06000
164
0xE06000, 0xE0E040, 0xE0E080, 0xE02000
165
0xE04000, 0xE08000, 0xE0E060, 0xE0E0A0
166
0xE0E080, 0xE02000, 0xE06000, 0xE0E040
167
0xE0C020, 0xE0E000, 0xE00000, 0xE06000
168
0xE06000, 0xE0C020, 0xE0E000, 0xE00000
169
0xE00000, 0xE06000, 0xE0A000, 0xE0E000
170
0xE0C000, 0xC00000, 0xE04000, 0xE08000
171
0xE06000, 0xC0A000, 0xA00000, 0xE02000
172
0xC00000, 0xC04000, 0xE08000, 0x800000
173
0xA00000, 0xE02000, 0xE06000, 0xC0A000
174
0xE0C000, 0xC00000, 0xE04000, 0xE08000
175
0xE0A000, 0xE0E000, 0xE00000, 0xE06000
176
0xE06000, 0xE0A000, 0xE0E000, 0xE00000
177
end table
178
179
180
// ========================
181
// Function Definitions
182
// ========================
183
184
private function HTZSetup_SpeedUpMusic
185
CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])
186
temp0 = checkResult
187
CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)
188
temp0 &= checkResult
189
CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)
190
temp0 &= checkResult
191
if temp0 == false
192
switch music.currentTrack
193
case TRACK_STAGE
194
SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)
195
SwapMusicTrack("HillTop_F.ogg", TRACK_STAGE, MUSIC_LOOP_HTZ_F, 8000)
196
break
197
198
case TRACK_INVINCIBLE
199
SetMusicTrack("HillTop_F.ogg", TRACK_STAGE, MUSIC_LOOP_HTZ_F)
200
SwapMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F, 8000)
201
break
202
203
case TRACK_BOSS
204
case TRACK_GAMEOVER
205
case TRACK_SUPER
206
SetMusicTrack("HillTop_F.ogg", TRACK_STAGE, MUSIC_LOOP_HTZ_F)
207
SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)
208
break
209
210
end switch
211
else
212
stage.musicFlag = MUSICEVENT_FLAG_SPEEDUP
213
end if
214
end function
215
216
217
private function HTZSetup_SlowDownMusic
218
CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])
219
temp0 = checkResult
220
CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)
221
temp0 &= checkResult
222
CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)
223
temp0 &= checkResult
224
if temp0 == false
225
switch music.currentTrack
226
case TRACK_STAGE
227
SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)
228
SwapMusicTrack("HillTop.ogg", TRACK_STAGE, MUSIC_LOOP_HTZ, 12500)
229
break
230
231
case TRACK_INVINCIBLE
232
SetMusicTrack("HillTop.ogg", TRACK_STAGE, MUSIC_LOOP_HTZ)
233
SwapMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV, 12500)
234
break
235
236
case TRACK_BOSS
237
case TRACK_GAMEOVER
238
case TRACK_SUPER
239
SetMusicTrack("HillTop.ogg", TRACK_STAGE, MUSIC_LOOP_HTZ)
240
SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)
241
break
242
243
end switch
244
else
245
stage.musicFlag = MUSICEVENT_FLAG_SLOWDOWN
246
end if
247
end function
248
249
250
// ========================
251
// Events
252
// ========================
253
254
event ObjectUpdate
255
object.palRotateTimer++
256
if object.palRotateTimer == 12
257
object.palRotateTimer = 0
258
259
object.lavaPalIndex1 += 4
260
object.lavaPalIndex1 &= 0x3F
261
GetTableValue(temp0, object.lavaPalIndex1, HTZSetup_palTable)
262
SetPaletteEntry(0, 147, temp0)
263
264
object.lavaPalIndex2 += 4
265
object.lavaPalIndex2 &= 0x3F
266
GetTableValue(temp0, object.lavaPalIndex2, HTZSetup_palTable)
267
SetPaletteEntry(0, 148, temp0)
268
269
object.lavaPalIndex3 += 4
270
object.lavaPalIndex3 &= 0x3F
271
GetTableValue(temp0, object.lavaPalIndex3, HTZSetup_palTable)
272
SetPaletteEntry(0, 158, temp0)
273
274
object.lavaPalIndex4 += 4
275
object.lavaPalIndex4 &= 0x3F
276
GetTableValue(temp0, object.lavaPalIndex4, HTZSetup_palTable)
277
SetPaletteEntry(0, 159, temp0)
278
end if
279
280
if object.bgLightDuration < 2
281
GetTableValue(temp0, object.bgLightFrame, HTZSetup_bgLightFrameTable)
282
283
Copy16x16Tile(761, temp0)
284
temp0 += 12
285
286
Copy16x16Tile(762, temp0)
287
temp0 += 4
288
289
Copy16x16Tile(763, temp0)
290
object.bgLightFrame++
291
292
GetTableValue(object.bgLightDuration, object.bgLightFrame, HTZSetup_bgLightFrameTable)
293
object.bgLightFrame++
294
295
object.bgLightFrame %= 12
296
else
297
object.bgLightDuration--
298
end if
299
300
if object.pinkFlowerDuration < 2
301
GetTableValue(temp0, object.pinkFlowerFrame, HTZSetup_pinkFlowerFrameTable)
302
303
Copy16x16Tile(764, temp0)
304
object.pinkFlowerFrame++
305
306
GetTableValue(object.pinkFlowerDuration, object.pinkFlowerFrame, HTZSetup_pinkFlowerFrameTable)
307
object.pinkFlowerFrame++
308
309
object.pinkFlowerFrame %= 12
310
else
311
object.pinkFlowerDuration--
312
end if
313
314
if object.redFlowerDuration < 2
315
GetTableValue(temp0, object.redFlowerFrame, HTZSetup_redFlowerFrameTable)
316
317
Copy16x16Tile(765, temp0)
318
object.redFlowerFrame++
319
320
GetTableValue(object.redFlowerDuration, object.redFlowerFrame, HTZSetup_redFlowerFrameTable)
321
object.redFlowerFrame++
322
323
object.redFlowerFrame &= 15
324
else
325
object.redFlowerDuration--
326
end if
327
328
if object.rectFlowerDuration < 2
329
GetTableValue(temp0, object.rectFlowerFrame, HTZSetup_rectFlowerFrameTable)
330
331
Copy16x16Tile(766, temp0)
332
object.rectFlowerFrame++
333
334
GetTableValue(object.rectFlowerDuration, object.rectFlowerFrame, HTZSetup_rectFlowerFrameTable)
335
object.rectFlowerFrame++
336
337
object.rectFlowerFrame &= 3
338
else
339
object.rectFlowerDuration--
340
end if
341
342
if object.pointyFlowerDuration < 2
343
GetTableValue(temp0, object.pointyFlowerFrame, HTZSetup_pointyFlowerFrameTable)
344
345
Copy16x16Tile(767, temp0)
346
object.pointyFlowerFrame++
347
348
GetTableValue(object.pointyFlowerDuration, object.pointyFlowerFrame, HTZSetup_pointyFlowerFrameTable)
349
object.pointyFlowerFrame++
350
351
object.pointyFlowerFrame &= 15
352
else
353
object.pointyFlowerDuration--
354
end if
355
356
// Check if any players are standing on lava tiles, hurt them if so
357
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
358
temp1 = player[currentPlayer].xpos
359
temp1 >>= 16
360
361
temp2 = player[currentPlayer].ypos
362
temp2 >>= 16
363
temp2 += 4
364
365
Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEB)
366
temp0 &= TILE_LAVA
367
368
if temp0 == TILE_LAVA
369
CallFunction(Player_FireHit)
370
end if
371
next
372
373
if HTZSetup_earthquakeState >= EARTHQUAKE_HOLD
374
if object.prevEarthquakeActive == false
375
if HTZSetup_activeEarthquakeType < 2
376
stage.midPoint = 2
377
stage.activeLayer[0] = 9 // None
378
stage.activeLayer[1] = 0 // FG (Low)
379
stage.activeLayer[2] = 3 // BG 3 (High)
380
stage.activeLayer[3] = 0 // FG (High)
381
else
382
stage.midPoint = 2
383
stage.activeLayer[0] = 9 // None
384
stage.activeLayer[1] = 0 // FG (Low)
385
stage.activeLayer[2] = 4 // BG 4 (Low)
386
stage.activeLayer[3] = 0 // FG (High)
387
end if
388
389
object.prevEarthquakeActive = true
390
if HTZSetup_activeEarthquakeType != object.prevEarthquakeType
391
// Earthquake has been newly-initiated, reset its variables
392
object.earthquakePos = HTZSetup_earthquakePosMin
393
HTZSetup_earthquakePos = 0
394
tileLayer[3].scrollPos = object.earthquakePos
395
tileLayer[4].scrollPos = object.earthquakePos
396
object.prevEarthquakeType = HTZSetup_activeEarthquakeType
397
end if
398
end if
399
400
if HTZSetup_earthquakeState > EARTHQUAKE_HOLD
401
if object.earthquakeTimer > 0
402
object.earthquakeTimer--
403
else
404
object.shakeTimer++
405
object.shakeTimer %= 40
406
if object.shakeTimer == 8
407
PlaySfx(SfxName[Rumble], false)
408
end if
409
410
temp0 = object.shakeTimer
411
temp0 &= 7
412
if temp0 == 0
413
screen.shakeX = 1
414
end if
415
416
temp0 = object.shakeTimer
417
temp0 &= 3
418
if temp0 == 0
419
screen.shakeY = 2
420
end if
421
422
if object.movementState == 0
423
// Going down...
424
object.earthquakePos += 0x4000
425
if object.earthquakePos == HTZSetup_earthquakePosMax
426
object.movementState = 1
427
object.earthquakeTimer = 120
428
end if
429
else
430
// Goin up!
431
object.earthquakePos -= 0x4000
432
if object.earthquakePos == HTZSetup_earthquakePosMin
433
object.movementState = 0
434
object.earthquakeTimer = 120
435
end if
436
end if
437
438
// Move the earthquake layers in accordance with their planned position
439
tileLayer[3].scrollPos = object.earthquakePos
440
tileLayer[4].scrollPos = object.earthquakePos
441
442
// Set the static variable as well, the Earthquake object needs it for collision checks
443
HTZSetup_earthquakePos = object.earthquakePos
444
HTZSetup_earthquakePos -= HTZSetup_earthquakePosMin
445
HTZSetup_earthquakePos >>= 16
446
end if
447
end if
448
449
if player[0].type != TypeName[Debug Mode] // Not quite sure exactly what this is for... if anything you'd want to disable earthquakes *in* debug mode, not the other way around
450
HTZSetup_earthquakeState = EARTHQUAKE_NONE
451
else
452
object.prevEarthquakeActive = false
453
end if
454
else
455
if object.prevEarthquakeActive != false
456
// Restore the stage to its non-earthquaking state
457
458
object.earthquakePos = HTZSetup_earthquakePosMin
459
HTZSetup_earthquakePos = 0
460
tileLayer[3].scrollPos = object.earthquakePos
461
tileLayer[4].scrollPos = object.earthquakePos
462
463
stage.midPoint = 3
464
stage.activeLayer[0] = 1 // First BG layer (far blue cliffs) (Low)
465
stage.activeLayer[1] = 2 // Second BG Layer (closer orange cliffs) (Low)
466
stage.activeLayer[2] = 0 // FG (Low)
467
stage.activeLayer[3] = 0 // FG (High)
468
469
object.shakeTimer = 0
470
object.unused = 0
471
object.earthquakeTimer = 0
472
object.movementState = 0
473
object.prevEarthquakeActive = false
474
end if
475
end if
476
end event
477
478
479
event ObjectStartup
480
SetMusicTrack("HillTop.ogg", TRACK_STAGE, MUSIC_LOOP_HTZ)
481
482
// Set the music speed-changing functions
483
SpeedUpMusic = HTZSetup_SpeedUpMusic
484
SlowDownMusic = HTZSetup_SlowDownMusic
485
486
// Reset the boss flash color
487
SetPaletteEntry(0, 192, 0x000000)
488
489
animalType1 = TypeName[Locky]
490
animalType2 = TypeName[Wocky]
491
492
// Set the BG layers to start from the correct places
493
tileLayer[1].scrollPos = -0x40000
494
tileLayer[2].scrollPos = -0x40000
495
496
object[SLOT_ZONESETUP].type = TypeName[HTZ Setup]
497
object[SLOT_ZONESETUP].priority = PRIORITY_ACTIVE
498
499
object[SLOT_ZONESETUP].lavaPalIndex1 = 0
500
object[SLOT_ZONESETUP].lavaPalIndex2 = 1
501
object[SLOT_ZONESETUP].lavaPalIndex3 = 2
502
object[SLOT_ZONESETUP].lavaPalIndex4 = 3
503
end event
504
505
506
// ========================
507
// Editor Events
508
// ========================
509
510
event RSDKDraw
511
DrawSprite(0)
512
end event
513
514
515
event RSDKLoad
516
LoadSpriteSheet("Global/Display.gif")
517
SpriteFrame(-16, -16, 32, 32, 1, 143)
518
519
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
520
end event
521
522