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/Crawl.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Crawl 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.foundTarget
16
private alias object.value4 : object.prevState
17
18
// States
19
private alias 0 : CRAWL_SETUP
20
private alias 1 : CRAWL_MOVING
21
private alias 2 : CRAWL_IDLE
22
private alias 3 : CRAWL_DEFEND
23
24
// Player Aliases
25
private alias object.xpos : player.xpos
26
private alias object.ypos : player.ypos
27
private alias object.xvel : player.xvel
28
private alias object.yvel : player.yvel
29
private alias object.speed : player.speed
30
private alias object.gravity : player.gravity
31
private alias object.animation : player.animation
32
33
private alias object.value1 : player.timer
34
private alias object.value40 : player.hitboxLeft
35
private alias object.value38 : player.hitboxTop
36
private alias object.value41 : player.hitboxRight
37
private alias object.value39 : player.hitboxBottom
38
39
// Path ID Aliases
40
private alias 0 : PATH_A
41
42
43
// ========================
44
// Function Declarations
45
// ========================
46
47
reserve function Crawl_DebugDraw
48
reserve function Crawl_DebugSpawn
49
reserve function Crawl_FindTarget
50
reserve function Crawl_HandleBump
51
52
53
// ========================
54
// Function Definitions
55
// ========================
56
57
private function Crawl_DebugDraw
58
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
59
end function
60
61
62
private function Crawl_DebugSpawn
63
CreateTempObject(TypeName[Crawl], 0, object.xpos, object.ypos)
64
object[tempObjectPos].startPos.x = object.xpos
65
object[tempObjectPos].startPos.y = object.ypos
66
object[tempObjectPos].direction = object.direction
67
end function
68
69
70
private function Crawl_FindTarget
71
object.foundTarget = false
72
73
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
74
temp0 = player[currentPlayer].xpos
75
temp0 -= object.xpos
76
Abs(temp0)
77
if temp0 < 0x400000
78
temp0 = player[currentPlayer].ypos
79
temp0 -= object.ypos
80
Abs(temp0)
81
if temp0 < 0x400000
82
object.foundTarget |= true
83
end if
84
end if
85
next
86
end function
87
88
89
private function Crawl_HandleBump
90
temp0 = player[currentPlayer].xpos
91
temp0 -= object.xpos
92
temp1 = player[currentPlayer].ypos
93
temp1 -= object.ypos
94
ATan2(temp2, temp0, temp1)
95
Cos256(temp0, temp2)
96
Sin256(temp1, temp2)
97
temp0 *= 0x700
98
temp1 *= 0x700
99
player[currentPlayer].timer = 0
100
player[currentPlayer].speed = temp0
101
player[currentPlayer].xvel = temp0
102
player[currentPlayer].yvel = temp1
103
PlaySfx(SfxName[Bumper], false)
104
end function
105
106
107
// ========================
108
// Events
109
// ========================
110
111
event ObjectUpdate
112
switch object.state
113
case CRAWL_SETUP
114
if object.priority != PRIORITY_XBOUNDS_DESTROY
115
object.priority = PRIORITY_ACTIVE
116
end if
117
118
if object.direction == FLIP_NONE
119
object.xvel = -0x2000
120
else
121
object.xvel = 0x2000
122
end if
123
124
object.state = CRAWL_MOVING
125
break
126
127
case CRAWL_MOVING
128
object.xpos += object.xvel
129
ObjectTileGrip(CSIDE_FLOOR, 0, 16, PATH_A)
130
131
object.timer++
132
if object.timer == 512
133
object.timer = 0
134
object.state = CRAWL_IDLE
135
end if
136
137
CallFunction(Crawl_FindTarget)
138
if object.foundTarget == true
139
object.prevState = object.state
140
object.state = CRAWL_DEFEND
141
object.frame = 0
142
object.animationTimer = 0
143
end if
144
145
object.frame = object.animationTimer
146
object.frame /= 20
147
object.animationTimer++
148
object.animationTimer %= 40
149
break
150
151
case CRAWL_IDLE
152
object.timer++
153
if object.timer == 60
154
object.timer = 0
155
object.direction ^= FLIP_X
156
FlipSign(object.xvel)
157
object.state = CRAWL_MOVING
158
end if
159
160
CallFunction(Crawl_FindTarget)
161
if object.foundTarget == true
162
object.prevState = object.state
163
object.state = CRAWL_DEFEND
164
end if
165
166
object.frame = 0
167
object.animationTimer = 0
168
break
169
170
case CRAWL_DEFEND
171
CallFunction(Crawl_FindTarget)
172
173
if object.foundTarget == false
174
object.state = object.prevState
175
end if
176
177
object.animationTimer = 0
178
break
179
180
end switch
181
182
if object.outOfBounds == true
183
temp0 = object.xpos
184
temp1 = object.ypos
185
object.xpos = object.startPos.x
186
object.ypos = object.startPos.y
187
if object.outOfBounds == true
188
if object.priority != PRIORITY_XBOUNDS_DESTROY
189
object.priority = PRIORITY_BOUNDS
190
end if
191
object.state = CRAWL_SETUP
192
else
193
object.xpos = temp0
194
object.ypos = temp1
195
end if
196
end if
197
198
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
199
BoxCollisionTest(C_TOUCH, object.entityPos, -15, -16, 15, 16, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
200
if checkResult == true
201
if player[currentPlayer].animation == ANI_JUMPING
202
if player[currentPlayer].gravity == GRAVITY_AIR
203
CallFunction(Crawl_HandleBump)
204
object.frame = 3
205
else
206
if object.direction == FLIP_NONE
207
if player[currentPlayer].xpos > object.xpos
208
CallFunction(Player_BadnikBreak)
209
else
210
CallFunction(Crawl_HandleBump)
211
object.frame = 2
212
end if
213
else
214
if player[currentPlayer].xpos < object.xpos
215
CallFunction(Player_BadnikBreak)
216
else
217
CallFunction(Crawl_HandleBump)
218
object.frame = 2
219
end if
220
end if
221
end if
222
else
223
CallFunction(Player_BadnikBreak)
224
end if
225
end if
226
next
227
end event
228
229
230
event ObjectDraw
231
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
232
end event
233
234
235
event ObjectStartup
236
CheckCurrentStageFolder("Zone04")
237
if checkResult == true
238
LoadSpriteSheet("CNZ/Objects.gif")
239
SpriteFrame(-23, -16, 47, 32, 1, 1)
240
SpriteFrame(-31, -16, 59, 32, 49, 1)
241
SpriteFrame(-24, -16, 40, 32, 109, 1)
242
SpriteFrame(-32, -16, 48, 32, 150, 1)
243
else
244
LoadSpriteSheet("MBZ/Objects.gif")
245
SpriteFrame(-23, -16, 47, 32, 436, 256)
246
SpriteFrame(-31, -16, 59, 32, 484, 256)
247
SpriteFrame(-24, -16, 40, 32, 544, 256)
248
SpriteFrame(-32, -16, 48, 32, 585, 256)
249
end if
250
251
foreach (TypeName[Crawl], arrayPos0, ALL_ENTITIES)
252
object[arrayPos0].startPos.x = object[arrayPos0].xpos
253
object[arrayPos0].startPos.y = object[arrayPos0].ypos
254
next
255
256
SetTableValue(TypeName[Crawl], DebugMode_ObjCount, DebugMode_TypesTable)
257
SetTableValue(Crawl_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
258
SetTableValue(Crawl_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
259
DebugMode_ObjCount++
260
end event
261
262
263
// ========================
264
// Editor Events
265
// ========================
266
267
event RSDKDraw
268
DrawSprite(0)
269
end event
270
271
272
event RSDKLoad
273
CheckCurrentStageFolder("Zone04")
274
if checkResult == true
275
LoadSpriteSheet("CNZ/Objects.gif")
276
SpriteFrame(-23, -16, 47, 32, 1, 1)
277
else
278
LoadSpriteSheet("MBZ/Objects.gif")
279
SpriteFrame(-23, -16, 47, 32, 436, 256)
280
end if
281
282
// Set to 172 in the scene for some reason?
283
// dunno what that's about, but at the very least i can say that this value isn't used here
284
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
285
end event
286
287