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/WFZSetup.txt
1479 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: WFZ Setup 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.value1 : object.palCycleTimer
13
private alias object.value2 : object.palCycleTablePos
14
private alias object.value3 : object.paletteTimer
15
16
// Player Aliases
17
private alias object.gravity : player.gravity
18
private alias object.animation : player.animation
19
private alias object.xvel : player.xvel
20
private alias object.yvel : player.yvel
21
private alias object.speed : player.speed
22
private alias object.up : player.up
23
private alias object.down : player.down
24
private alias object.ypos : player.ypos
25
26
// Game Modes
27
private alias 0 : MODE_NOSAVE
28
private alias 1 : MODE_SAVEGAME
29
private alias 2 : MODE_TIMEATTACK
30
31
// Tracks
32
private alias 0 : TRACK_STAGE
33
private alias 1 : TRACK_ACTFINISH
34
private alias 2 : TRACK_INVINCIBLE
35
private alias 3 : TRACK_CONTINUE
36
private alias 4 : TRACK_BOSS
37
private alias 5 : TRACK_GAMEOVER
38
private alias 6 : TRACK_DROWNING
39
private alias 7 : TRACK_SUPER
40
41
// Reserved object slots
42
private alias 10 : SLOT_ZONESETUP
43
private alias 25 : SLOT_MUSICEVENT_CHANGE
44
45
// Music Events
46
private alias 0 : MUSICEVENT_FADETOBOSS
47
private alias 1 : MUSICEVENT_FADETOSTAGE
48
private alias 2 : MUSICEVENT_TRANSITION
49
50
private alias 0 : MUSICEVENT_FLAG_NOCHANGE
51
private alias 1 : MUSICEVENT_FLAG_SPEEDUP
52
private alias 2 : MUSICEVENT_FLAG_SLOWDOWN
53
54
// Music Loops
55
private alias 99874 : MUSIC_LOOP_WFZ
56
private alias 80074 : MUSIC_LOOP_WFZ_F
57
58
private alias 38679 : MUSIC_LOOP_INV
59
private alias 30897 : MUSIC_LOOP_INV_F
60
61
62
// ========================
63
// Function Declarations
64
// ========================
65
66
reserve function WFZSetup_State_Clinging
67
68
reserve function WFZSetup_SpeedUpMusic
69
reserve function WFZSetup_SlowDownMusic
70
71
72
// ========================
73
// Static Values
74
// ========================
75
76
public value WFZSetup_scrollVelocity.x = 0
77
public value WFZSetup_scrollVelocity.y = 0
78
79
public value WFZSetup_hPropellerFrame = 0
80
public value WFZSetup_hPropellerTimer = 0
81
public value WFZSetup_vPropellerFrame = 0
82
public value WFZSetup_vPropellerTimer = 0
83
84
85
// ========================
86
// Tables
87
// ========================
88
89
private table WFZSetup_palCycleTable
90
0xE0E040, 0xE0A020, 0xE06000, 0xC02000
91
0xE0E0E0, 0xE0E040, 0xE0A020, 0xE06000
92
0xE0E040, 0xE0A020, 0xE06000, 0xC02000
93
0xE0A020, 0xE06000, 0xC02000, 0x802000
94
end table
95
96
97
// ========================
98
// Function Definitions
99
// ========================
100
101
// Custom state given to the player in this stage only, by the Wind Current objects
102
// Identical to the (unused) Player_State_Clinging function in the Player Object script
103
public function WFZSetup_State_Clinging
104
player.gravity = GRAVITY_AIR
105
106
if player.animation != ANI_CLINGING
107
player.xvel = -0x80000
108
player.speed = -0x80000
109
else
110
player.xvel = 0
111
player.speed = 0
112
end if
113
114
if player.up == true
115
player.ypos -= 0x10000
116
else
117
if player.down == true
118
player.ypos += 0x10000
119
end if
120
end if
121
122
player.yvel = 0
123
end function
124
125
126
private function WFZSetup_SpeedUpMusic
127
CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])
128
temp0 = checkResult
129
CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)
130
temp0 &= checkResult
131
CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)
132
temp0 &= checkResult
133
if temp0 == false
134
switch music.currentTrack
135
case TRACK_STAGE
136
SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)
137
SwapMusicTrack("WingFortress_F.ogg", TRACK_STAGE, MUSIC_LOOP_WFZ_F, 8000)
138
break
139
140
case TRACK_INVINCIBLE
141
SetMusicTrack("WingFortress_F.ogg", TRACK_STAGE, MUSIC_LOOP_WFZ_F)
142
SwapMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F, 8000)
143
break
144
145
case TRACK_BOSS
146
case TRACK_DROWNING
147
case TRACK_SUPER
148
SetMusicTrack("WingFortress_F.ogg", TRACK_STAGE, MUSIC_LOOP_WFZ_F)
149
SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)
150
break
151
152
end switch
153
else
154
stage.musicFlag = MUSICEVENT_FLAG_SPEEDUP
155
end if
156
end function
157
158
159
private function WFZSetup_SlowDownMusic
160
CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])
161
temp0 = checkResult
162
CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)
163
temp0 &= checkResult
164
CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)
165
temp0 &= checkResult
166
if temp0 == false
167
switch music.currentTrack
168
case TRACK_STAGE
169
SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)
170
SwapMusicTrack("WingFortress.ogg", TRACK_STAGE, MUSIC_LOOP_WFZ, 12500)
171
break
172
173
case TRACK_INVINCIBLE
174
SetMusicTrack("WingFortress.ogg", TRACK_STAGE, MUSIC_LOOP_WFZ)
175
SwapMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV, 12500)
176
break
177
178
case TRACK_BOSS
179
case TRACK_DROWNING
180
case TRACK_SUPER
181
SetMusicTrack("WingFortress.ogg", TRACK_STAGE, MUSIC_LOOP_WFZ)
182
SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)
183
break
184
185
end switch
186
else
187
stage.musicFlag = MUSICEVENT_FLAG_SLOWDOWN
188
end if
189
end function
190
191
192
// ========================
193
// Events
194
// ========================
195
196
event ObjectUpdate
197
object.palCycleTimer++
198
if object.palCycleTimer == 2
199
object.palCycleTimer = 0
200
201
GetTableValue(temp0, object.palCycleTablePos, WFZSetup_palCycleTable)
202
SetPaletteEntry(0, 167, temp0)
203
object.palCycleTablePos++
204
object.palCycleTablePos &= 15
205
206
GetTableValue(temp0, object.palCycleTablePos, WFZSetup_palCycleTable)
207
SetPaletteEntry(0, 168, temp0)
208
object.palCycleTablePos++
209
object.palCycleTablePos &= 15
210
211
GetTableValue(temp0, object.palCycleTablePos, WFZSetup_palCycleTable)
212
SetPaletteEntry(0, 169, temp0)
213
object.palCycleTablePos++
214
object.palCycleTablePos &= 15
215
216
GetTableValue(temp0, object.palCycleTablePos, WFZSetup_palCycleTable)
217
SetPaletteEntry(0, 170, temp0)
218
object.palCycleTablePos++
219
object.palCycleTablePos &= 15
220
end if
221
222
object.paletteTimer++
223
if object.paletteTimer == 6
224
object.paletteTimer = 0
225
RotatePalette(0, 192, 195, true)
226
end if
227
228
WFZSetup_hPropellerFrame = WFZSetup_hPropellerTimer
229
WFZSetup_hPropellerFrame >>= 1
230
WFZSetup_hPropellerTimer++
231
WFZSetup_hPropellerTimer %= 12
232
233
WFZSetup_vPropellerFrame = WFZSetup_vPropellerTimer
234
WFZSetup_vPropellerFrame >>= 1
235
WFZSetup_vPropellerTimer++
236
WFZSetup_vPropellerTimer %= 6
237
end event
238
239
240
event ObjectStartup
241
SetMusicTrack("WingFortress.ogg", TRACK_STAGE, MUSIC_LOOP_WFZ)
242
243
SpeedUpMusic = WFZSetup_SpeedUpMusic
244
SlowDownMusic = WFZSetup_SlowDownMusic
245
246
animalType1 = TypeName[Locky]
247
animalType2 = TypeName[Wocky]
248
249
// Reset the boss flash color to just be a solid black for now
250
SetPaletteEntry(0, 196, 0x000000)
251
252
object[SLOT_ZONESETUP].type = TypeName[WFZ Setup]
253
object[SLOT_ZONESETUP].priority = PRIORITY_ACTIVE
254
255
WFZSetup_scrollVelocity.x = 0
256
WFZSetup_scrollVelocity.y = 0
257
258
WFZSetup_hPropellerFrame = 0
259
WFZSetup_hPropellerTimer = 0
260
WFZSetup_vPropellerFrame = 0
261
WFZSetup_vPropellerTimer = 0
262
263
// This level has a special cutscene and all for the main game, remove Animal Capsules outside of TA so that we can watch it
264
foreach (TypeName[Animal Prison], arrayPos0, ALL_ENTITIES)
265
if options.gameMode != MODE_TIMEATTACK
266
ResetObjectEntity(arrayPos0, TypeName[Blank Object], 0, 0, 0)
267
end if
268
next
269
end event
270
271
272
// ========================
273
// Editor Events
274
// ========================
275
276
event RSDKDraw
277
DrawSprite(0)
278
end event
279
280
281
event RSDKLoad
282
LoadSpriteSheet("Global/Display.gif")
283
SpriteFrame(-16, -16, 32, 32, 1, 143)
284
285
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
286
end event
287
288