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/Enemies/Batbrain.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
25
// Animations
26
private alias 0 : BATBRAIN_ANI_IDLE
27
private alias 1 : BATBRAIN_ANI_DROPPING
28
private alias 2 : BATBRAIN_ANI_FLYING
29
30
// Player Aliases
31
private alias object.xpos : player.xpos
32
private alias object.ypos : player.ypos
33
private alias object.value40 : player.hitboxLeft
34
private alias object.value38 : player.hitboxTop
35
private alias object.value41 : player.hitboxRight
36
private alias object.value39 : player.hitboxBottom
37
38
// Path ID Aliases
39
private alias 0 : PATH_A
40
41
42
// ========================
43
// Function Declarations
44
// ========================
45
46
reserve function Batbrain_DebugDraw
47
reserve function Batbrain_DebugSpawn
48
49
50
// ========================
51
// Function Definitions
52
// ========================
53
54
private function Batbrain_DebugDraw
55
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
56
end function
57
58
59
private function Batbrain_DebugSpawn
60
CreateTempObject(TypeName[Batbrain], 0, object.xpos, object.ypos)
61
object[tempObjectPos].startPos.x = object.xpos
62
object[tempObjectPos].startPos.y = object.ypos
63
end function
64
65
66
// ========================
67
// Events
68
// ========================
69
70
event ObjectUpdate
71
switch object.state
72
case BATBRAIN_AWAITPLAYER
73
object.priority = PRIORITY_ACTIVE
74
75
object.targetDistance = 0x7FFFFFFF
76
object.backupPlayer = 0
77
object.targetPlayer = 0xFFFF
78
79
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
80
temp0 = player[currentPlayer].xpos
81
temp0 -= object.xpos
82
Abs(temp0)
83
if temp0 < object.targetDistance
84
object.targetDistance = temp0
85
object.backupPlayer = currentPlayer
86
end if
87
88
if temp0 < 0x800000
89
if player[currentPlayer].ypos >= object.ypos
90
if object.targetPlayer != 0xFFFF
91
arrayPos0 = object.targetPlayer
92
if player[currentPlayer].ypos < player[arrayPos0].ypos
93
object.targetPlayer = currentPlayer
94
end if
95
else
96
object.targetPlayer = currentPlayer
97
end if
98
end if
99
end if
100
next
101
102
if object.targetPlayer != 0xFFFF
103
arrayPos0 = object.targetPlayer
104
temp0 = player[arrayPos0].ypos
105
temp0 -= object.ypos
106
if temp0 >= 0
107
if temp0 <= 0x800000
108
Rand(temp0, 8)
109
if temp0 == 0
110
object.state = BATBRAIN_DROPPING
111
object.dropPos.y = player[arrayPos0].ypos
112
object.animation = BATBRAIN_ANI_DROPPING
113
end if
114
end if
115
end if
116
else
117
arrayPos0 = object.backupPlayer
118
end if
119
120
if player[arrayPos0].xpos < object.xpos
121
object.direction = FLIP_NONE
122
else
123
object.direction = FLIP_X
124
end if
125
break
126
127
case BATBRAIN_DROPPING
128
object.ypos += object.yvel
129
object.yvel += 0x1800
130
arrayPos0 = object.targetPlayer
131
if player[arrayPos0].xpos < object.xpos
132
object.direction = FLIP_NONE
133
else
134
object.direction = FLIP_X
135
end if
136
137
temp0 = object.dropPos.y
138
temp0 -= object.ypos
139
if temp0 < 0x100000
140
if object.direction == FLIP_NONE
141
object.xvel = -0x10000
142
else
143
object.xvel = 0x10000
144
end if
145
object.yvel = 0
146
object.animation = BATBRAIN_ANI_FLYING
147
object.state = BATBRAIN_FLYING
148
end if
149
break
150
151
case BATBRAIN_FLYING
152
object.xpos += object.xvel
153
arrayPos0 = object.targetPlayer
154
temp0 = player[arrayPos0].xpos
155
temp0 -= object.xpos
156
Abs(temp0)
157
if temp0 >= 0x800000
158
Rand(temp0, 8)
159
if temp0 == 0
160
object.state = BATBRAIN_RETURNTOROOF
161
end if
162
end if
163
break
164
165
case BATBRAIN_RETURNTOROOF
166
object.xpos += object.xvel
167
object.ypos += object.yvel
168
object.yvel -= 0x1800
169
170
ObjectTileCollision(CSIDE_ROOF, 0, -12, PATH_A)
171
if checkResult == true
172
object.xvel = 0
173
object.yvel = 0
174
object.state = BATBRAIN_AWAITPLAYER
175
object.animation = BATBRAIN_ANI_IDLE
176
end if
177
break
178
179
end switch
180
181
if object.outOfBounds == true
182
temp0 = object.xpos
183
temp1 = object.ypos
184
object.xpos = object.startPos.x
185
object.ypos = object.startPos.y
186
if object.outOfBounds == true
187
object.xvel = 0
188
object.yvel = 0
189
object.direction = FLIP_NONE
190
object.animation = BATBRAIN_ANI_IDLE
191
object.frame = 0
192
object.priority = PRIORITY_BOUNDS
193
object.state = BATBRAIN_AWAITPLAYER
194
else
195
object.xpos = temp0
196
object.ypos = temp1
197
end if
198
end if
199
200
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
201
BoxCollisionTest(C_TOUCH, object.entityPos, -12, -18, 12, 18, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
202
if checkResult == true
203
CallFunction(Player_BadnikBreak)
204
end if
205
next
206
207
switch object.animation
208
case BATBRAIN_ANI_IDLE
209
object.frame = 0
210
break
211
212
case BATBRAIN_ANI_DROPPING
213
object.frame = 1
214
break
215
216
case BATBRAIN_ANI_FLYING
217
if object.animationTimer == 0
218
PlaySfx(SfxName[Batbrain Fly], false)
219
end if
220
object.frame = object.animationTimer
221
object.frame >>= 2
222
object.frame++
223
object.animationTimer++
224
object.animationTimer &= 15
225
break
226
227
end switch
228
end event
229
230
231
event ObjectDraw
232
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
233
end event
234
235
236
event ObjectStartup
237
CheckCurrentStageFolder("Zone02")
238
#platform: USE_ORIGINS
239
temp0 = checkResult
240
if game.playMode == BOOT_PLAYMODE_MISSION
241
// In Origins's missions, GHZ and SYZ qualify for loading MZ sprites too
242
CheckCurrentStageFolder("Zone01")
243
temp0 |= checkResult
244
CheckCurrentStageFolder("Zone03")
245
temp0 |= checkResult
246
end if
247
248
if temp0 == true
249
#endplatform
250
#platform: USE_STANDALONE
251
if checkResult == true
252
#endplatform
253
LoadSpriteSheet("MZ/Objects.gif")
254
SpriteFrame(-7, -12, 14, 24, 37, 98)
255
SpriteFrame(-12, -14, 32, 30, 52, 81)
256
SpriteFrame(-15, -6, 35, 20, 1, 106)
257
SpriteFrame(-12, -8, 29, 28, 85, 81)
258
SpriteFrame(-15, -6, 35, 20, 1, 106)
259
end if
260
261
CheckCurrentStageFolder("Zone07")
262
if checkResult == true
263
LoadSpriteSheet("MBZ/Objects.gif")
264
SpriteFrame(-7, -12, 14, 24, 52, 68)
265
SpriteFrame(-12, -14, 32, 30, 1, 93)
266
SpriteFrame(-15, -6, 35, 20, 64, 99)
267
SpriteFrame(-12, -8, 29, 28, 34, 93)
268
SpriteFrame(-15, -6, 35, 20, 64, 99)
269
end if
270
271
foreach (TypeName[Batbrain], arrayPos0, ALL_ENTITIES)
272
// Store the object's starting pos
273
object[arrayPos0].startPos.x = object[arrayPos0].xpos
274
object[arrayPos0].startPos.y = object[arrayPos0].ypos
275
object[arrayPos0].drawOrder = 5
276
next
277
278
// Add the object to the stage's debug object list
279
SetTableValue(TypeName[Batbrain], DebugMode_ObjCount, DebugMode_TypesTable)
280
SetTableValue(Batbrain_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
281
SetTableValue(Batbrain_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
282
DebugMode_ObjCount++
283
end event
284
285
286
// ========================
287
// Editor Events
288
// ========================
289
290
event RSDKDraw
291
DrawSprite(0)
292
end event
293
294
295
event RSDKLoad
296
CheckCurrentStageFolder("Zone07")
297
if checkResult == true
298
LoadSpriteSheet("MBZ/Objects.gif")
299
SpriteFrame(-7, -12, 14, 24, 52, 68)
300
else
301
// We just load MZ sprites as the backup, not checking for MZ (or GHZ or SYZ) here
302
LoadSpriteSheet("MZ/Objects.gif")
303
SpriteFrame(-7, -12, 14, 24, 37, 98)
304
end if
305
306
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
307
end event
308
309