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/BossFireball.txt
1481 views
1
// ----------------------------------
2
// RSDK Project: Sonic 1
3
// Script Description: Boss Fireball 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.fireballDir
14
private alias object.value3 : object.moveDistance
15
16
private alias 0 : BOSSFIREBALL_SPAWNING
17
private alias 1 : BOSSFIREBALL_DROPPED
18
private alias 2 : BOSSFIREBALL_IDLE
19
private alias 3 : BOSSFIREBALL_HITFLOOR
20
private alias 4 : BOSSFIREBALL_MOVE_AND_SPAWN
21
private alias 5 : BOSSFIREBALL_SPAWNER
22
private alias 6 : BOSSFIREBALL_MOVE_HORIZONTAL
23
private alias 7 : BOSSFIREBALL_DISSIPATE
24
25
// Path ID Aliases
26
private alias 0 : PATH_A
27
28
29
// ========================
30
// Function Declarations
31
// ========================
32
33
reserve function BossFireball_ProcessAnimation
34
35
36
// ========================
37
// Function Definitions
38
// ========================
39
40
// Shared by several states in order to animate the fireball
41
private function BossFireball_ProcessAnimation
42
object.frame = object.animationTimer
43
object.frame /= 12
44
45
object.direction = object.animationTimer
46
object.direction /= 6
47
object.direction &= 1
48
object.direction += object.fireballDir
49
50
object.animationTimer++
51
object.animationTimer %= 24
52
end function
53
54
55
// ========================
56
// Events
57
// ========================
58
59
event ObjectUpdate
60
switch object.state
61
case BOSSFIREBALL_SPAWNING
62
object.fireballDir = 2
63
object.timer++
64
if object.timer == 30
65
object.timer = 0
66
object.fireballDir = 0
67
object.state++
68
PlaySfx(SfxName[Small Fireball], false)
69
end if
70
71
CallFunction(BossFireball_ProcessAnimation)
72
break
73
74
case BOSSFIREBALL_DROPPED
75
object.yvel += 0x1800
76
object.ypos += object.yvel
77
78
if object.yvel > 0x30000
79
object.drawOrder = 5
80
end if
81
82
ObjectTileCollision(CSIDE_FLOOR, 0, 4, PATH_A)
83
if checkResult == true
84
CreateTempObject(TypeName[Boss Fireball], 0, object.xpos, object.ypos)
85
object[tempObjectPos].moveDistance = object.xpos
86
object[tempObjectPos].moveDistance -= 0x100000
87
object[tempObjectPos].xvel = -0xA000
88
object[tempObjectPos].state = BOSSFIREBALL_HITFLOOR
89
object[tempObjectPos].drawOrder = 5
90
91
CreateTempObject(TypeName[Boss Fireball], 0, object.xpos, object.ypos)
92
object[tempObjectPos].moveDistance = object.xpos
93
object[tempObjectPos].moveDistance += 0x100000
94
object[tempObjectPos].xvel = 0xA000
95
object[tempObjectPos].state = BOSSFIREBALL_HITFLOOR
96
object[tempObjectPos].drawOrder = 5
97
object.state++
98
end if
99
100
CallFunction(BossFireball_ProcessAnimation)
101
break
102
103
case BOSSFIREBALL_IDLE
104
object.timer++
105
if object.timer == 120
106
object.timer = 0
107
object.state = BOSSFIREBALL_DISSIPATE
108
object.frame = 2
109
object.direction = FACING_RIGHT
110
else
111
CallFunction(BossFireball_ProcessAnimation)
112
end if
113
break
114
115
case BOSSFIREBALL_HITFLOOR
116
object.xpos += object.xvel
117
118
if object.xvel > 0
119
if object.xpos >= object.moveDistance
120
object.xvel = 0
121
object.xpos = object.moveDistance
122
object.state = BOSSFIREBALL_IDLE
123
124
CreateTempObject(TypeName[Boss Fireball], 0, object.xpos, object.ypos)
125
object[tempObjectPos].moveDistance = object.xpos
126
object[tempObjectPos].moveDistance += 0x100000
127
object[tempObjectPos].xvel = 0xA000
128
object[tempObjectPos].state = BOSSFIREBALL_MOVE_AND_SPAWN
129
object[tempObjectPos].drawOrder = 5
130
131
end if
132
else
133
if object.xpos <= object.moveDistance
134
object.xvel = 0
135
object.xpos = object.moveDistance
136
object.state = BOSSFIREBALL_IDLE
137
138
CreateTempObject(TypeName[Boss Fireball], 0, object.xpos, object.ypos)
139
object[tempObjectPos].moveDistance = object.xpos
140
object[tempObjectPos].moveDistance -= 0x100000
141
object[tempObjectPos].xvel = -0xA000
142
object[tempObjectPos].state = BOSSFIREBALL_MOVE_AND_SPAWN
143
object[tempObjectPos].drawOrder = 5
144
145
end if
146
end if
147
148
CallFunction(BossFireball_ProcessAnimation)
149
break
150
151
case BOSSFIREBALL_MOVE_AND_SPAWN
152
object.xpos += object.xvel
153
154
if object.xvel > 0
155
if object.xpos >= object.moveDistance
156
object.xpos = object.moveDistance
157
object.state = BOSSFIREBALL_SPAWNER
158
159
CreateTempObject(TypeName[Boss Fireball], 0, object.xpos, object.ypos)
160
object[tempObjectPos].xvel = 0xA000
161
object[tempObjectPos].state = BOSSFIREBALL_MOVE_HORIZONTAL
162
object[tempObjectPos].drawOrder = 5
163
164
end if
165
else
166
if object.xpos <= object.moveDistance
167
object.xpos = object.moveDistance
168
object.state = BOSSFIREBALL_SPAWNER
169
170
CreateTempObject(TypeName[Boss Fireball], 0, object.xpos, object.ypos)
171
object[tempObjectPos].xvel = -0xA000
172
object[tempObjectPos].state = BOSSFIREBALL_MOVE_HORIZONTAL
173
object[tempObjectPos].drawOrder = 5
174
175
end if
176
end if
177
178
CallFunction(BossFireball_ProcessAnimation)
179
break
180
181
case BOSSFIREBALL_SPAWNER
182
object.timer++
183
184
temp0 = object.timer
185
temp0 %= 48
186
if temp0 == 0
187
CreateTempObject(TypeName[Boss Fireball], 0, object.xpos, object.ypos)
188
189
object[tempObjectPos].xvel = object.xvel
190
object[tempObjectPos].state = BOSSFIREBALL_MOVE_HORIZONTAL
191
object[tempObjectPos].drawOrder = 5
192
end if
193
194
if object.timer == 120
195
object.timer = 0
196
object.state = BOSSFIREBALL_DISSIPATE
197
object.frame = 2
198
object.direction = FACING_RIGHT
199
200
else
201
CallFunction(BossFireball_ProcessAnimation)
202
end if
203
break
204
205
case BOSSFIREBALL_MOVE_HORIZONTAL
206
object.xpos += object.xvel
207
208
if object.gravity == GRAVITY_GROUND
209
ObjectTileGrip(CSIDE_FLOOR, 0, 4, PATH_A)
210
object.gravity = checkResult
211
object.gravity ^= 1
212
else
213
object.drawOrder = 4
214
object.yvel += 0x1800
215
object.ypos += object.yvel
216
end if
217
218
if object.outOfBounds == true
219
object.type = TypeName[Blank Object]
220
end if
221
222
object.timer++
223
if object.timer == 90
224
object.type = TypeName[Blank Object]
225
end if
226
227
CallFunction(BossFireball_ProcessAnimation)
228
break
229
230
case BOSSFIREBALL_DISSIPATE
231
object.timer++
232
if object.timer == 8
233
object.type = TypeName[Blank Object]
234
end if
235
break
236
237
end switch
238
239
// Check for player collision
240
if object.state > BOSSFIREBALL_SPAWNING
241
if object.frame < 2
242
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
243
BoxCollisionTest(C_TOUCH, object.entityPos, -6, -6, 6, 6, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
244
if checkResult == true
245
CallFunction(Player_FireHit)
246
end if
247
next
248
end if
249
end if
250
end event
251
252
253
event ObjectDraw
254
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
255
end event
256
257
258
event ObjectStartup
259
LoadSpriteSheet("MZ/Objects.gif")
260
SpriteFrame(-7, -23, 15, 31, 52, 114)
261
SpriteFrame(-8, -24, 16, 32, 68, 114)
262
SpriteFrame(-8, -19, 16, 23, 85, 114)
263
end event
264
265
266
// ========================
267
// Editor Events
268
// ========================
269
270
event RSDKDraw
271
DrawSprite(0)
272
end event
273
274
275
event RSDKLoad
276
LoadSpriteSheet("MZ/Objects.gif")
277
SpriteFrame(-7, -23, 15, 31, 52, 114)
278
SpriteFrame(-8, -24, 16, 32, 68, 114)
279
SpriteFrame(-8, -19, 16, 23, 85, 114)
280
281
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
282
end event
283
284