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/Mission/ReviveBatbrain.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 1
3
// Script Description: Batbrain 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.startPos.x
13
private alias object.value1 : object.startPos.y
14
private alias object.value2 : object.backupPlayer
15
private alias object.value3 : object.targetPlayer
16
private alias object.value4 : object.targetDistance
17
private alias object.value5 : object.dropPos.y
18
19
// States
20
private alias 0 : BATBRAIN_AWAITPLAYER
21
private alias 1 : BATBRAIN_DROPPING
22
private alias 2 : BATBRAIN_FLYING
23
private alias 3 : BATBRAIN_RETURNTOROOF
24
private alias 4 : BATBRAIN_REVIVE
25
26
// Animations
27
private alias 0 : BATBRAIN_ANI_IDLE
28
private alias 1 : BATBRAIN_ANI_DROPPING
29
private alias 2 : BATBRAIN_ANI_FLYING
30
31
// Player Aliases
32
private alias object.xpos : player.xpos
33
private alias object.ypos : player.ypos
34
private alias object.value38 : player.hitboxTop
35
private alias object.value39 : player.hitboxBottom
36
private alias object.value40 : player.hitboxLeft
37
private alias object.value41 : player.hitboxRight
38
39
// Revive Enemy Aliases
40
private alias object.value47 : object.backupType
41
private alias object.value46 : object.backupState
42
private alias object.value0 : object.target
43
44
// Path ID Aliases
45
private alias 0 : PATH_A
46
47
48
// ========================
49
// Function Declarations
50
// ========================
51
52
reserve function Batbrain_DebugDraw
53
reserve function Batbrain_DebugSpawn
54
reserve function Batbrain_CheckOutOfRange
55
56
57
// ========================
58
// Function Definitions
59
// ========================
60
61
private function Batbrain_DebugDraw
62
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
63
end function
64
65
66
private function Batbrain_DebugSpawn
67
CreateTempObject(TypeName[Batbrain], 0, object.xpos, object.ypos)
68
object[tempObjectPos].startPos.x = object.xpos
69
object[tempObjectPos].startPos.y = object.ypos
70
end function
71
72
73
private function Batbrain_CheckOutOfRange
74
temp1 = object.ixpos
75
temp1 -= screen.xoffset
76
CheckLower(temp1, 0)
77
temp0 = checkResult
78
79
CheckGreater(temp1, screen.xsize)
80
temp0 |= checkResult
81
82
temp1 = object.iypos
83
temp1 -= screen.yoffset
84
CheckLower(temp1, 0)
85
temp0 |= checkResult
86
87
CheckGreater(temp1, screen.ysize)
88
checkResult |= temp0
89
end function
90
91
92
// ========================
93
// Events
94
// ========================
95
96
97
event ObjectUpdate
98
switch object.state
99
case BATBRAIN_AWAITPLAYER
100
object.priority = PRIORITY_ACTIVE
101
object.targetDistance = 0x7FFFFFFF
102
object.backupPlayer = 0
103
object.targetPlayer = 0xFFFF
104
105
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
106
temp0 = player[currentPlayer].xpos
107
temp0 -= object.xpos
108
Abs(temp0)
109
if temp0 < object.targetDistance
110
object.targetDistance = temp0
111
object.backupPlayer = currentPlayer
112
end if
113
114
if temp0 < 0x800000
115
if player[currentPlayer].ypos >= object.ypos
116
if object.targetPlayer != 0xFFFF
117
arrayPos0 = object.targetPlayer
118
if player[currentPlayer].ypos < player[arrayPos0].ypos
119
object.targetPlayer = currentPlayer
120
end if
121
else
122
object.targetPlayer = currentPlayer
123
end if
124
end if
125
end if
126
next
127
128
if object.targetPlayer != 0xFFFF
129
arrayPos0 = object.targetPlayer
130
temp0 = player[arrayPos0].ypos
131
temp0 -= object.ypos
132
if temp0 >= 0
133
if temp0 <= 0x800000
134
Rand(temp0, 8)
135
if temp0 == 0
136
object.state = BATBRAIN_DROPPING
137
object.dropPos.y = player[arrayPos0].ypos
138
object.animation = BATBRAIN_ANI_DROPPING
139
end if
140
end if
141
end if
142
else
143
arrayPos0 = object.backupPlayer
144
end if
145
146
if player[arrayPos0].xpos < object.xpos
147
object.direction = FLIP_NONE
148
else
149
object.direction = FLIP_X
150
end if
151
break
152
153
case BATBRAIN_DROPPING
154
object.ypos += object.yvel
155
object.yvel += 0x1800
156
arrayPos0 = object.targetPlayer
157
if player[arrayPos0].xpos < object.xpos
158
object.direction = FLIP_NONE
159
else
160
object.direction = FLIP_X
161
end if
162
temp0 = object.dropPos.y
163
temp0 -= object.ypos
164
if temp0 < 0x100000
165
if object.direction == FLIP_NONE
166
object.xvel = -0x10000
167
else
168
object.xvel = 0x10000
169
end if
170
object.yvel = 0
171
object.animation = BATBRAIN_ANI_FLYING
172
object.state = BATBRAIN_FLYING
173
end if
174
break
175
176
case BATBRAIN_FLYING
177
object.xpos += object.xvel
178
arrayPos0 = object.targetPlayer
179
temp0 = player[arrayPos0].xpos
180
temp0 -= object.xpos
181
Abs(temp0)
182
if temp0 >= 0x800000
183
Rand(temp0, 8)
184
if temp0 == 0
185
object.state = BATBRAIN_RETURNTOROOF
186
end if
187
end if
188
break
189
190
case BATBRAIN_RETURNTOROOF
191
object.xpos += object.xvel
192
object.ypos += object.yvel
193
object.yvel -= 0x1800
194
195
ObjectTileCollision(CSIDE_ROOF, 0, -12, PATH_A)
196
if checkResult == true
197
object.xvel = 0
198
object.yvel = 0
199
object.state = BATBRAIN_AWAITPLAYER
200
object.animation = BATBRAIN_ANI_IDLE
201
end if
202
break
203
204
case BATBRAIN_REVIVE
205
object.startPos.x = object.xpos
206
object.startPos.y = object.ypos
207
object.drawOrder = 5
208
object.state = BATBRAIN_AWAITPLAYER
209
break
210
211
end switch
212
213
if object.outOfBounds == true
214
temp0 = object.xpos
215
temp1 = object.ypos
216
object.xpos = object.startPos.x
217
object.ypos = object.startPos.y
218
if object.outOfBounds == true
219
object.xvel = 0
220
object.yvel = 0
221
object.direction = FLIP_NONE
222
object.animation = BATBRAIN_ANI_IDLE
223
object.frame = 0
224
object.priority = PRIORITY_BOUNDS
225
object.state = BATBRAIN_AWAITPLAYER
226
else
227
object.xpos = temp0
228
object.ypos = temp1
229
end if
230
end if
231
232
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
233
BoxCollisionTest(C_TOUCH, object.entityPos, -12, -18, 12, 18, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
234
235
if checkResult == true
236
CreateTempObject(TypeName[Revive Enemy], object.propertyValue, object.startPos.x, object.startPos.y)
237
object[tempObjectPos].priority = PRIORITY_ACTIVE
238
object[tempObjectPos].target = object.entityPos
239
object[tempObjectPos].backupType = object.type
240
object[tempObjectPos].backupState = BATBRAIN_REVIVE
241
CallFunction(Player_BadnikBreak)
242
end if
243
next
244
245
switch object.animation
246
case BATBRAIN_ANI_IDLE
247
object.frame = 0
248
break
249
250
case BATBRAIN_ANI_DROPPING
251
object.frame = 1
252
break
253
254
case BATBRAIN_ANI_FLYING
255
if object.animationTimer == 0
256
CallFunction(Batbrain_CheckOutOfRange)
257
if checkResult == 0
258
PlaySfx(SfxName[Batbrain Fly], false)
259
end if
260
end if
261
object.frame = object.animationTimer
262
object.frame >>= 2
263
object.frame++
264
object.animationTimer++
265
object.animationTimer &= 15
266
break
267
268
end switch
269
end event
270
271
272
event ObjectDraw
273
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
274
end event
275
276
277
event ObjectStartup
278
CheckCurrentStageFolder("Zone02")
279
temp0 = checkResult
280
if game.playMode == BOOT_PLAYMODE_MISSION
281
CheckCurrentStageFolder("Zone01")
282
temp0 |= checkResult
283
CheckCurrentStageFolder("Zone03")
284
temp0 |= checkResult
285
end if
286
if temp0 == true
287
LoadSpriteSheet("MZ/Objects.gif")
288
SpriteFrame(-7, -12, 14, 24, 37, 98)
289
SpriteFrame(-12, -14, 32, 30, 52, 81)
290
SpriteFrame(-15, -6, 35, 20, 1, 106)
291
SpriteFrame(-12, -8, 29, 28, 85, 81)
292
SpriteFrame(-15, -6, 35, 20, 1, 106)
293
end if
294
295
CheckCurrentStageFolder("Zone07")
296
if checkResult == true
297
LoadSpriteSheet("MBZ/Objects.gif")
298
SpriteFrame(-7, -12, 14, 24, 52, 68)
299
SpriteFrame(-12, -14, 32, 30, 1, 93)
300
SpriteFrame(-15, -6, 35, 20, 64, 99)
301
SpriteFrame(-12, -8, 29, 28, 34, 93)
302
SpriteFrame(-15, -6, 35, 20, 64, 99)
303
end if
304
305
foreach (TypeName[Batbrain], arrayPos0, ALL_ENTITIES)
306
object[arrayPos0].startPos.x = object[arrayPos0].xpos
307
object[arrayPos0].startPos.y = object[arrayPos0].ypos
308
object[arrayPos0].drawOrder = 5
309
next
310
311
SetTableValue(TypeName[Batbrain], DebugMode_ObjCount, DebugMode_TypesTable)
312
SetTableValue(Batbrain_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
313
SetTableValue(Batbrain_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
314
DebugMode_ObjCount++
315
end event
316
317
318
// ========================
319
// Editor Events
320
// ========================
321
322
event RSDKDraw
323
DrawSprite(0)
324
end event
325
326
327
event RSDKLoad
328
CheckCurrentStageFolder("Zone01")
329
temp0 = checkResult
330
CheckCurrentStageFolder("Zone02")
331
temp0 |= checkResult
332
CheckCurrentStageFolder("Zone03")
333
temp0 |= checkResult
334
if temp0 == true
335
// This following sheet *should* be only in Zone02, but Sonic Team kinda just didn't wanna...
336
LoadSpriteSheet("MZ/Objects.gif")
337
SpriteFrame(-7, -12, 14, 24, 37, 98)
338
SpriteFrame(-12, -14, 32, 30, 52, 81)
339
SpriteFrame(-15, -6, 35, 20, 1, 106)
340
SpriteFrame(-12, -8, 29, 28, 85, 81)
341
SpriteFrame(-15, -6, 35, 20, 1, 106)
342
end if
343
344
CheckCurrentStageFolder("Zone07")
345
if checkResult == true
346
LoadSpriteSheet("MBZ/Objects.gif")
347
SpriteFrame(-7, -12, 14, 24, 52, 68)
348
SpriteFrame(-12, -14, 32, 30, 1, 93)
349
SpriteFrame(-15, -6, 35, 20, 64, 99)
350
SpriteFrame(-12, -8, 29, 28, 34, 93)
351
SpriteFrame(-15, -6, 35, 20, 64, 99)
352
end if
353
354
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
355
end event
356
357