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/Enemies/Grounder2.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Grounder2 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.startPos.x
14
private alias object.value2 : object.startPos.y
15
private alias object.value3 : object.targetPlayer
16
private alias object.value4 : object.targetPlayerDistance
17
18
// States
19
private alias 0 : GROUNDER2_HIDDEN
20
private alias 1 : GROUNDER2_APPEAR
21
private alias 2 : GROUNDER2_MOVING
22
private alias 3 : GROUNDER2_TURNING
23
24
// Player Aliases
25
private alias object.xpos : player.xpos
26
private alias object.value40 : player.hitboxLeft
27
private alias object.value38 : player.hitboxTop
28
private alias object.value41 : player.hitboxRight
29
private alias object.value39 : player.hitboxBottom
30
31
private alias object.value17 : debugMode.currentSelection
32
33
// Path ID Aliases
34
private alias 0 : PATH_A
35
36
37
// ========================
38
// Function Declarations
39
// ========================
40
41
reserve function Grounder2_DebugDraw
42
reserve function Grounder2_DebugSpawn
43
44
// ========================
45
// Static Values
46
// ========================
47
48
private value Grounder2_startDebugID = 0
49
50
private function Grounder2_DebugDraw
51
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
52
end function
53
54
55
private function Grounder2_DebugSpawn
56
temp0 = debugMode[0].currentSelection
57
temp0 -= Grounder2_startDebugID
58
59
CreateTempObject(TypeName[Grounder2], temp0, object.xpos, object.ypos)
60
object[tempObjectPos].startPos.x = object.xpos
61
object[tempObjectPos].startPos.y = object.ypos
62
end function
63
64
65
// ========================
66
// Events
67
// ========================
68
69
event ObjectUpdate
70
switch object.state
71
case GROUNDER2_HIDDEN
72
object.priority = PRIORITY_ACTIVE
73
if object.propertyValue == 1
74
ObjectTileGrip(CSIDE_FLOOR, 0, 20, PATH_A)
75
object.state = GROUNDER2_APPEAR
76
object.timer = 17
77
end if
78
79
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
80
BoxCollisionTest(C_TOUCH, object.entityPos, -96, -256, 96, 256, currentPlayer, -1, -1, 1, 1)
81
if checkResult == true
82
CreateTempObject(TypeName[Brick], 1, object.xpos, object.ypos)
83
object[tempObjectPos].xvel = -0x10000
84
object[tempObjectPos].yvel = -0x40000
85
86
CreateTempObject(TypeName[Brick], 3, object.xpos, object.ypos)
87
object[tempObjectPos].xvel = 0x40000
88
object[tempObjectPos].yvel = -0x30000
89
90
CreateTempObject(TypeName[Brick], 1, object.xpos, object.ypos)
91
object[tempObjectPos].xvel = 0x20000
92
object[tempObjectPos].yvel = 0
93
94
CreateTempObject(TypeName[Brick], 2, object.xpos, object.ypos)
95
object[tempObjectPos].xvel = -0x30000
96
object[tempObjectPos].yvel = -0x10000
97
98
CreateTempObject(TypeName[Brick], 1, object.xpos, object.ypos)
99
object[tempObjectPos].xvel = -0x30000
100
object[tempObjectPos].yvel = -0x30000
101
102
CreateTempObject(TypeName[Brick], 0, object.xpos, object.ypos)
103
object[tempObjectPos].ypos -= 0x140000
104
object[tempObjectPos].xvel = 0x10000
105
object[tempObjectPos].yvel = -0x20000
106
107
CreateTempObject(TypeName[Brick], 0, object.xpos, object.ypos)
108
object[tempObjectPos].xpos += 0x100000
109
object[tempObjectPos].ypos -= 0x40000
110
object[tempObjectPos].xvel = 0x10000
111
object[tempObjectPos].yvel = -0x10000
112
113
CreateTempObject(TypeName[Brick], 0, object.xpos, object.ypos)
114
object[tempObjectPos].ypos += 0xC0000
115
object[tempObjectPos].xvel = -0x10000
116
object[tempObjectPos].yvel = -0x20000
117
118
CreateTempObject(TypeName[Brick], 0, object.xpos, object.ypos)
119
object[tempObjectPos].xpos -= 0x100000
120
object[tempObjectPos].ypos -= 0x40000
121
object[tempObjectPos].xvel = -0x10000
122
object[tempObjectPos].yvel = -0x10000
123
124
ObjectTileGrip(CSIDE_FLOOR, 0, 20, PATH_A)
125
object.state = GROUNDER2_APPEAR
126
end if
127
next
128
break
129
130
case GROUNDER2_APPEAR
131
object.timer++
132
if object.timer == 8
133
object.frame = 1
134
end if
135
136
if object.timer == 18
137
object.timer = 0
138
object.frame = 2
139
object.state = GROUNDER2_MOVING
140
141
object.targetPlayerDistance = 0x7FFFFFFF
142
object.targetPlayer = 0
143
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
144
temp0 = player[currentPlayer].xpos
145
temp0 -= object.xpos
146
if temp0 < 0
147
temp1 = FLIP_NONE
148
FlipSign(temp0)
149
else
150
temp1 = FLIP_X
151
end if
152
153
if temp0 < object.targetPlayerDistance
154
object.targetPlayerDistance = temp0
155
object.targetPlayer = currentPlayer
156
object.direction = temp1
157
end if
158
next
159
160
if object.direction == FLIP_NONE
161
object.xvel = -0x10000
162
else
163
object.xvel = 0x10000
164
end if
165
end if
166
break
167
168
case GROUNDER2_MOVING
169
object.xpos += object.xvel
170
171
temp0 = object.ypos
172
temp1 = object.ypos
173
ObjectTileGrip(CSIDE_FLOOR, 0, 20, PATH_A)
174
temp2 = checkResult
175
temp1 -= object.ypos
176
177
if temp1 <= -0xC0000
178
object.ypos = temp0
179
temp2 = 0
180
end if
181
182
if temp1 > 0x10000
183
object.ypos = temp0
184
temp2 = 0
185
end if
186
187
if temp2 == 0
188
object.timer = 60
189
object.state = GROUNDER2_TURNING
190
end if
191
192
object.animationTimer++
193
if object.animationTimer == 12
194
object.animationTimer = 0
195
end if
196
197
object.frame = object.animationTimer
198
object.frame >>= 2
199
object.frame += 2
200
break
201
202
case GROUNDER2_TURNING
203
object.timer--
204
if object.timer == 0
205
object.direction ^= FLIP_X
206
FlipSign(object.xvel)
207
object.state = GROUNDER2_MOVING
208
end if
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.state = GROUNDER2_HIDDEN
220
object.timer = 0
221
object.animationTimer = 0
222
object.frame = 0
223
object.priority = PRIORITY_BOUNDS
224
else
225
object.xpos = temp0
226
object.ypos = temp1
227
end if
228
end if
229
230
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
231
BoxCollisionTest(C_TOUCH, object.entityPos, -12, -20, 12, 20, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
232
if checkResult == true
233
CallFunction(Player_BadnikBreak)
234
end if
235
next
236
end event
237
238
239
event ObjectDraw
240
if object.state == GROUNDER2_HIDDEN
241
temp0 = object.xpos
242
temp1 = object.ypos
243
244
temp1 -= 0x140000
245
DrawSpriteFX(5, FX_FLIP, temp0, temp1)
246
247
temp1 += 0x100000
248
temp0 -= 0x100000
249
DrawSpriteFX(5, FX_FLIP, temp0, temp1)
250
251
temp0 += 0x200000
252
DrawSpriteFX(5, FX_FLIP, temp0, temp1)
253
254
temp1 += 0x100000
255
temp0 -= 0x100000
256
DrawSpriteFX(5, FX_FLIP, temp0, temp1)
257
else
258
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
259
end if
260
end event
261
262
263
event ObjectStartup
264
CheckCurrentStageFolder("Zone03")
265
if checkResult == true
266
LoadSpriteSheet("ARZ/Objects4.gif")
267
SpriteFrame(-14, -12, 28, 32, 32, 41)
268
SpriteFrame(-16, -16, 32, 36, 0, 82)
269
SpriteFrame(-16, -20, 32, 40, 0, 0)
270
SpriteFrame(-16, -20, 32, 40, 32, 0)
271
SpriteFrame(-16, -20, 32, 40, 0, 41)
272
SpriteFrame(-16, -8, 32, 16, 32, 82)
273
else
274
LoadSpriteSheet("MBZ/Objects.gif")
275
SpriteFrame(-14, -12, 28, 32, 374, 289)
276
SpriteFrame(-16, -16, 32, 36, 403, 293)
277
SpriteFrame(-16, -20, 32, 40, 275, 297)
278
SpriteFrame(-16, -20, 32, 40, 308, 297)
279
SpriteFrame(-16, -20, 32, 40, 341, 297)
280
SpriteFrame(-16, -8, 32, 16, 436, 306)
281
end if
282
283
foreach (TypeName[Grounder2], arrayPos0, ALL_ENTITIES)
284
object[arrayPos0].startPos.x = object[arrayPos0].xpos
285
object[arrayPos0].startPos.y = object[arrayPos0].ypos
286
next
287
288
temp0 = 0
289
Grounder2_startDebugID = DebugMode_ObjCount
290
Grounder2_startDebugID--
291
while temp0 < 2
292
SetTableValue(TypeName[Grounder2], DebugMode_ObjCount, DebugMode_TypesTable)
293
SetTableValue(Grounder2_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
294
SetTableValue(Grounder2_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
295
DebugMode_ObjCount++
296
temp0++
297
loop
298
end event
299
300
301
// ========================
302
// Editor Events
303
// ========================
304
305
event RSDKEdit
306
if editor.returnVariable == true
307
switch editor.variableID
308
case EDIT_VAR_PROPVAL // property value
309
checkResult = object.propertyValue
310
checkResult &= 1
311
break
312
313
case 0 // type
314
GetBit(checkResult, object.propertyValue, 0)
315
break
316
317
end switch
318
else
319
switch editor.variableID
320
case EDIT_VAR_PROPVAL // property value
321
object.propertyValue = editor.variableValue
322
object.propertyValue &= 1
323
break
324
325
case 0 // type
326
CheckNotEqual(editor.variableValue, 0)
327
SetBit(object.propertyValue, 0, checkResult)
328
break
329
330
end switch
331
end if
332
end event
333
334
335
event RSDKDraw
336
object.frame = object.propertyValue
337
object.frame <<= 1
338
339
DrawSprite(object.frame)
340
end event
341
342
343
event RSDKLoad
344
CheckCurrentStageFolder("Zone03")
345
if checkResult == true
346
LoadSpriteSheet("ARZ/Objects4.gif")
347
SpriteFrame(-14, -12, 28, 32, 32, 41)
348
SpriteFrame(-16, -16, 32, 36, 0, 82)
349
SpriteFrame(-16, -20, 32, 40, 0, 0)
350
SpriteFrame(-16, -20, 32, 40, 32, 0)
351
SpriteFrame(-16, -20, 32, 40, 0, 41)
352
SpriteFrame(-16, -8, 32, 16, 32, 82)
353
else
354
LoadSpriteSheet("MBZ/Objects.gif")
355
SpriteFrame(-14, -12, 28, 32, 374, 289)
356
SpriteFrame(-16, -16, 32, 36, 403, 293)
357
SpriteFrame(-16, -20, 32, 40, 275, 297)
358
SpriteFrame(-16, -20, 32, 40, 308, 297)
359
SpriteFrame(-16, -20, 32, 40, 341, 297)
360
SpriteFrame(-16, -8, 32, 16, 436, 306)
361
end if
362
363
AddEditorVariable("type")
364
SetActiveVariable("type")
365
AddEnumVariable("Start Hidden", 0)
366
AddEnumVariable("Not Hidden", 1)
367
end event
368
369