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/MPZ/EggmanBalloon.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Eggman Balloon 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.angle : object.angle.x
13
private alias object.value1 : object.angle.y
14
15
private alias object.value0 : object.parent
16
17
// TODO: prolly should be mpz rather than mbz, same applies to other uses of it in this zone too
18
19
// States
20
private alias 0 : MBZEGGMANBALLOON_ROTATING
21
private alias 1 : MBZEGGMANBALLOON_EXPAND
22
private alias 2 : MBZEGGMANBALLOON_BOUNCING
23
private alias 3 : MBZEGGMANBALLOON_POPPED
24
25
// MBZEggman Aliases
26
private alias object.value17 : mbzEggman.balloonRadius.x
27
private alias object.value18 : mbzEggman.balloonRadius.y
28
private alias object.value19 : mbzEggman.balloonOffset.y
29
private alias object.value20 : mbzEggman.activeBalloons
30
31
// Player Aliases
32
private alias object.state : player.state
33
private alias object.xpos : player.xpos
34
private alias object.ypos : player.ypos
35
private alias object.xvel : player.xvel
36
private alias object.yvel : player.yvel
37
private alias object.speed : player.speed
38
private alias object.gravity : player.gravity
39
private alias object.animation : player.animation
40
41
private alias object.value7 : player.invincibleTimer
42
private alias object.value8 : player.blinkTimer
43
private alias object.value16 : player.isSidekick
44
private alias object.value25 : player.gravityStrength
45
private alias object.value40 : player.hitboxLeft
46
private alias object.value38 : player.hitboxTop
47
private alias object.value41 : player.hitboxRight
48
private alias object.value39 : player.hitboxBottom
49
50
// Path ID Aliases
51
private alias 0 : PATH_A
52
53
54
// ========================
55
// Tables
56
// ========================
57
58
private table EggmanBalloon_expandFrameTable
59
0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 5, 6, 7, 8
60
end table
61
62
63
// ========================
64
// Events
65
// ========================
66
67
event ObjectUpdate
68
switch object.state
69
case MBZEGGMANBALLOON_ROTATING
70
object.angle.x += 4
71
object.angle.x &= 0xFF
72
object.angle.y += 4
73
object.angle.y &= 0xFF
74
75
if object.angle.x == 0x80
76
object.drawOrder = 3
77
else
78
if object.angle.x == 0
79
object.drawOrder = 2
80
end if
81
end if
82
83
object.frame = object.angle.x
84
object.frame -= 0x20
85
object.frame &= 0xFF
86
object.frame >>= 6
87
if object.frame == 3
88
object.frame = 1
89
end if
90
91
arrayPos0 = object.parent
92
93
temp0 = object.angle.x
94
Cos256(object.xpos, temp0)
95
object.xpos *= mbzEggman[arrayPos0].balloonRadius.x
96
object.xpos <<= 8
97
object.xpos += object[arrayPos0].xpos
98
99
temp0 += object.angle.y
100
temp0 &= 0xFF
101
Sin256(object.ypos, temp0)
102
object.ypos *= mbzEggman[arrayPos0].balloonRadius.y
103
object.ypos <<= 8
104
object.ypos += object[arrayPos0].ypos
105
object.ypos += mbzEggman[arrayPos0].balloonOffset.y
106
break
107
108
case MBZEGGMANBALLOON_EXPAND
109
object.xpos += object.xvel
110
object.ypos += object.yvel
111
object.yvel += 0x1800
112
113
if object.yvel >= 0x18000
114
object.yvel = 0x18000
115
end if
116
117
if object.yvel > 0
118
ObjectTileCollision(CSIDE_FLOOR, 0, 20, PATH_A)
119
if checkResult == true
120
if player[0].xpos < object.xpos
121
object.xvel = -0x8000
122
object.direction = FLIP_NONE
123
else
124
object.xvel = 0x8000
125
object.direction = FLIP_X
126
end if
127
FlipSign(object.yvel)
128
object.state = MBZEGGMANBALLOON_BOUNCING
129
end if
130
end if
131
132
temp0 = object.animationTimer
133
temp0 >>= 2
134
GetTableValue(object.frame, temp0, EggmanBalloon_expandFrameTable)
135
if object.frame != 8
136
object.animationTimer++
137
end if
138
break
139
140
case MBZEGGMANBALLOON_BOUNCING
141
object.xpos += object.xvel
142
object.ypos += object.yvel
143
object.yvel += 0x480
144
145
if object.yvel >= 0x18000
146
object.yvel = 0x18000
147
end if
148
149
if object.yvel > 0
150
ObjectTileCollision(CSIDE_FLOOR, 0, 20, PATH_A)
151
if checkResult == true
152
if player[0].xpos < object.xpos
153
object.xvel = -0x8000
154
object.direction = FLIP_NONE
155
else
156
object.xvel = 0x8000
157
object.direction = FLIP_X
158
end if
159
FlipSign(object.yvel)
160
end if
161
end if
162
break
163
164
case MBZEGGMANBALLOON_POPPED
165
object.animationTimer--
166
if object.animationTimer == 0
167
object.type = TypeName[Blank Object]
168
end if
169
break
170
171
end switch
172
173
if object.state < MBZEGGMANBALLOON_POPPED
174
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
175
if object.frame < 6
176
BoxCollisionTest(C_TOUCH, object.entityPos, -6, -6, 6, 6, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
177
if checkResult == true
178
CallFunction(Player_Hit)
179
end if
180
else
181
BoxCollisionTest(C_TOUCH, object.entityPos, -12, -12, 12, 12, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
182
if checkResult == true
183
CheckEqual(player[currentPlayer].animation, ANI_JUMPING)
184
temp0 = checkResult
185
CheckEqual(player[currentPlayer].animation, ANI_SPINDASH)
186
temp0 |= checkResult
187
CheckEqual(player[currentPlayer].animation, ANI_GLIDING)
188
temp0 |= checkResult
189
CheckEqual(player[currentPlayer].animation, ANI_GLIDING_STOP)
190
temp0 |= checkResult
191
#platform: USE_ORIGINS
192
if stage.playerListPos == PLAYER_AMY
193
if player[currentPlayer].isSidekick == false
194
CheckEqual(player[currentPlayer].animation, ANI_HAMMER_JUMP)
195
temp0 |= checkResult
196
CheckEqual(player[currentPlayer].animation, ANI_HAMMER_DASH)
197
temp0 |= checkResult
198
end if
199
end if
200
#endplatform
201
CheckNotEqual(player[currentPlayer].invincibleTimer, 0)
202
temp0 |= checkResult
203
CheckEqual(player[currentPlayer].animation, ANI_FLYING)
204
temp1 = checkResult
205
CheckEqual(player[currentPlayer].animation, ANI_FLYINGTIRED)
206
temp1 |= checkResult
207
CheckEqual(player[currentPlayer].animation, ANI_FLY_LIFT_UP)
208
temp1 |= checkResult
209
CheckEqual(player[currentPlayer].animation, ANI_FLY_LIFT_DOWN)
210
temp1 |= checkResult
211
CheckEqual(player[currentPlayer].animation, ANI_FLY_LIFT_TIRED)
212
temp1 |= checkResult
213
if temp1 == true
214
CheckGreater(player[currentPlayer].ypos, object.ypos)
215
temp0 |= checkResult
216
end if
217
218
if temp0 == true
219
PlaySfx(SfxName[Explosion], false)
220
object.state = MBZEGGMANBALLOON_POPPED
221
object.frame = 9
222
object.animationTimer = 3
223
224
arrayPos0 = object.parent
225
mbzEggman[arrayPos0].activeBalloons--
226
if mbzEggman[arrayPos0].activeBalloons < 0
227
mbzEggman[arrayPos0].activeBalloons = 0
228
end if
229
230
if player[currentPlayer].gravity == GRAVITY_AIR
231
FlipSign(player[currentPlayer].xvel)
232
player[currentPlayer].speed = player[currentPlayer].xvel
233
player[currentPlayer].yvel += player[currentPlayer].gravityStrength
234
player[currentPlayer].yvel += player[currentPlayer].gravityStrength
235
FlipSign(player[currentPlayer].yvel)
236
end if
237
238
if player[currentPlayer].animation == ANI_GLIDING
239
player[currentPlayer].animation = ANI_GLIDING_DROP
240
player[currentPlayer].state = Player_State_GlideDrop
241
end if
242
else
243
if player[currentPlayer].state != Player_State_Death
244
if player[currentPlayer].blinkTimer == 0
245
if player[currentPlayer].invincibleTimer == 0
246
player[currentPlayer].state = Player_State_GotHit
247
if player[currentPlayer].xpos > object.xpos
248
player[currentPlayer].speed = 0x20000
249
else
250
player[currentPlayer].speed = -0x20000
251
end if
252
end if
253
PlaySfx(SfxName[Explosion], false)
254
object.state = MBZEGGMANBALLOON_POPPED
255
object.frame = 9
256
object.animationTimer = 3
257
258
arrayPos0 = object.parent
259
mbzEggman[arrayPos0].activeBalloons--
260
if mbzEggman[arrayPos0].activeBalloons < 0
261
mbzEggman[arrayPos0].activeBalloons = 0
262
end if
263
end if
264
end if
265
end if
266
end if
267
end if
268
next
269
end if
270
end event
271
272
273
event ObjectDraw
274
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
275
end event
276
277
278
event ObjectStartup
279
CheckCurrentStageFolder("Zone09")
280
if checkResult == true
281
LoadSpriteSheet("MPZ/Objects.gif")
282
SpriteFrame(-8, -8, 16, 16, 302, 138) // Balloon - Frame 1 - #0
283
SpriteFrame(-10, -10, 20, 20, 281, 134) // Balloon - Frame 2 - #1
284
SpriteFrame(-12, -12, 24, 24, 256, 130) // Balloon - Frame 3 - #2
285
SpriteFrame(-6, -12, 12, 23, 319, 133) // Squish Frame - #3
286
SpriteFrame(-11, -5, 22, 10, 332, 133) // Squash Frame - #4
287
SpriteFrame(-8, -8, 16, 18, 355, 133) // Tiny Balloon - #5
288
SpriteFrame(-12, -12, 24, 23, 372, 133) // Small Eggman Balloon - Frame 1 - #6
289
SpriteFrame(-16, -16, 32, 32, 397, 133) // Small Eggman Balloon - Frame 2 - #7
290
SpriteFrame(-24, -24, 48, 47, 430, 133) // Eggman Balloon - #8
291
SpriteFrame(-21, -24, 42, 48, 277, 207) // Pop - #9
292
else
293
LoadSpriteSheet("MBZ/Objects.gif")
294
SpriteFrame(-8, -8, 16, 16, 371, 239) // Balloon - Frame 1 - #0
295
SpriteFrame(-10, -10, 20, 20, 350, 235) // Balloon - Frame 2 - #1
296
SpriteFrame(-12, -12, 24, 24, 325, 231) // Balloon - Frame 3 - #2
297
SpriteFrame(-6, -12, 12, 23, 375, 214) // Squish Frame - #3
298
SpriteFrame(-11, -5, 22, 10, 388, 245) // Squash Frame - #4
299
SpriteFrame(-8, -8, 16, 18, 411, 237) // Tiny Balloon - #5
300
SpriteFrame(-12, -12, 24, 23, 428, 232) // Small Eggman Balloon - Frame 1 - #6
301
SpriteFrame(-16, -16, 32, 32, 453, 223) // Small Eggman Balloon - Frame 2 - #7
302
SpriteFrame(-24, -24, 48, 47, 486, 208) // Eggman Balloon - #8
303
SpriteFrame(-21, -24, 42, 48, 312, 182) // Pop - #9
304
end if
305
end event
306
307
308
event RSDKDraw
309
DrawSprite(8)
310
end event
311
312
313
event RSDKLoad
314
CheckCurrentStageFolder("Zone09")
315
if checkResult == true
316
LoadSpriteSheet("MPZ/Objects.gif")
317
SpriteFrame(-8, -8, 16, 16, 302, 138) // Balloon - Frame 1 - #0
318
SpriteFrame(-10, -10, 20, 20, 281, 134) // Balloon - Frame 2 - #1
319
SpriteFrame(-12, -12, 24, 24, 256, 130) // Balloon - Frame 3 - #2
320
SpriteFrame(-6, -12, 12, 23, 319, 133) // Squish Frame - #3
321
SpriteFrame(-11, -5, 22, 10, 332, 133) // Squash Frame - #4
322
SpriteFrame(-8, -8, 16, 18, 355, 133) // Tiny Balloon - #5
323
SpriteFrame(-12, -12, 24, 23, 372, 133) // Small Eggman Balloon - Frame 1 - #6
324
SpriteFrame(-16, -16, 32, 32, 397, 133) // Small Eggman Balloon - Frame 2 - #7
325
SpriteFrame(-24, -24, 48, 47, 430, 133) // Eggman Balloon - #8
326
SpriteFrame(-21, -24, 42, 48, 277, 207) // Pop - #9
327
else
328
LoadSpriteSheet("MBZ/Objects.gif")
329
SpriteFrame(-8, -8, 16, 16, 371, 239) // Balloon - Frame 1 - #0
330
SpriteFrame(-10, -10, 20, 20, 350, 235) // Balloon - Frame 2 - #1
331
SpriteFrame(-12, -12, 24, 24, 325, 231) // Balloon - Frame 3 - #2
332
SpriteFrame(-6, -12, 12, 23, 375, 214) // Squish Frame - #3
333
SpriteFrame(-11, -5, 22, 10, 388, 245) // Squash Frame - #4
334
SpriteFrame(-8, -8, 16, 18, 411, 237) // Tiny Balloon - #5
335
SpriteFrame(-12, -12, 24, 23, 428, 232) // Small Eggman Balloon - Frame 1 - #6
336
SpriteFrame(-16, -16, 32, 32, 453, 223) // Small Eggman Balloon - Frame 2 - #7
337
SpriteFrame(-24, -24, 48, 47, 486, 208) // Eggman Balloon - #8
338
SpriteFrame(-21, -24, 42, 48, 312, 182) // Pop - #9
339
end if
340
341
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
342
end event
343
344