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/Snail.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Snail 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
16
// States
17
private alias 0 : SNAIL_MOVING
18
private alias 1 : SNAIL_STOPPED
19
20
// Player Aliases
21
private alias object.value40 : player.hitboxLeft
22
private alias object.value38 : player.hitboxTop
23
private alias object.value41 : player.hitboxRight
24
private alias object.value39 : player.hitboxBottom
25
26
// Path ID Aliases
27
private alias 0 : PATH_A
28
29
30
// ========================
31
// Function Declarations
32
// ========================
33
34
reserve function Snail_DebugDraw
35
reserve function Snail_DebugSpawn
36
37
38
// ========================
39
// Function Definitions
40
// ========================
41
42
private function Snail_DebugDraw
43
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
44
DrawSpriteFX(2, FX_FLIP, object.xpos, object.ypos)
45
end function
46
47
48
private function Snail_DebugSpawn
49
CreateTempObject(TypeName[Snail], 0, object.xpos, object.ypos)
50
GetBit(temp0, object.direction, 0)
51
if temp0 == FACING_RIGHT
52
object[tempObjectPos].direction = FLIP_NONE
53
object[tempObjectPos].xvel = -0x8000
54
else
55
object[tempObjectPos].direction = FLIP_X
56
object[tempObjectPos].xvel = 0x8000
57
end if
58
end function
59
60
61
// ========================
62
// Events
63
// ========================
64
65
event ObjectUpdate
66
switch object.state
67
case SNAIL_MOVING
68
object.priority = PRIORITY_ACTIVE
69
object.xpos += object.xvel
70
71
ObjectTileGrip(CSIDE_FLOOR, 0, 15, PATH_A)
72
if checkResult == false
73
object.xpos -= object.xvel
74
if object.direction == FLIP_X
75
object.xvel = -0x8000
76
else
77
object.xvel = 0x8000
78
end if
79
80
object.state = SNAIL_STOPPED
81
end if
82
83
temp0 = object.xvel
84
Abs(temp0)
85
if temp0 == 0x8000
86
temp0 = 6
87
else
88
// The Snail's going faster, meaning it should animate faster as well
89
temp0 = 3
90
end if
91
92
object.animationTimer++
93
if object.animationTimer >= temp0
94
object.animationTimer = 0
95
object.frame ^= 1
96
end if
97
break
98
99
case SNAIL_STOPPED
100
if object.timer < 59
101
object.timer++
102
else
103
object.timer = 0
104
object.state = SNAIL_MOVING
105
object.direction ^= FLIP_X
106
end if
107
break
108
109
end switch
110
111
if object.outOfBounds == true
112
temp0 = object.xpos
113
temp1 = object.ypos
114
object.xpos = object.startPos.x
115
object.ypos = object.startPos.y
116
117
if object.outOfBounds == true
118
if object.propertyValue == 0
119
object.direction = FLIP_NONE
120
object.xvel = -0x8000
121
else
122
object.direction = FLIP_X
123
object.xvel = 0x8000
124
end if
125
126
object.animationTimer = 0
127
object.frame = 0
128
object.priority = PRIORITY_BOUNDS
129
object.state = SNAIL_MOVING
130
else
131
object.xpos = temp0
132
object.ypos = temp1
133
end if
134
end if
135
136
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
137
// Try Detect Player
138
if object.direction == FLIP_NONE
139
BoxCollisionTest(C_TOUCH, object.entityPos, -96, -96, 0, 96, currentPlayer, 0, 0, 0, 0)
140
else
141
BoxCollisionTest(C_TOUCH, object.entityPos, 0, -96, 96, 96, currentPlayer, 0, 0, 0, 0)
142
end if
143
144
if checkResult == true
145
// If we're detected, dash until we hit an edge
146
if object.direction == FLIP_NONE
147
object.xvel = -0x20000
148
else
149
object.xvel = 0x20000
150
end if
151
end if
152
153
BoxCollisionTest(C_TOUCH, object.entityPos, -12, -16, 12, 16, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
154
if checkResult == true
155
CallFunction(Player_BadnikBreak)
156
end if
157
next
158
end event
159
160
161
event ObjectDraw
162
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
163
DrawSpriteFX(2, FX_FLIP, object.xpos, object.ypos)
164
165
// Going fast means we should have boosters on
166
temp0 = object.xvel
167
Abs(temp0)
168
if temp0 != 0x8000
169
temp0 = object.frame
170
temp0 += 3
171
DrawSpriteFX(temp0, FX_FLIP, object.xpos, object.ypos)
172
end if
173
end event
174
175
176
event ObjectStartup
177
CheckCurrentStageFolder("Zone01")
178
if checkResult == true
179
LoadSpriteSheet("EHZ/Objects.gif")
180
SpriteFrame(-16, -16, 32, 33, 44, 27)
181
SpriteFrame(-16, -16, 32, 33, 77, 27)
182
SpriteFrame(-23, -6, 16, 16, 110, 44)
183
SpriteFrame(16, 0, 6, 5, 19, 50)
184
SpriteFrame(16, 0, 7, 5, 19, 56)
185
else
186
LoadSpriteSheet("MBZ/Objects.gif")
187
SpriteFrame(-16, -16, 32, 33, 44, 27)
188
SpriteFrame(-16, -16, 32, 33, 77, 27)
189
SpriteFrame(-23, -6, 16, 16, 110, 44)
190
SpriteFrame(16, 0, 6, 5, 19, 50)
191
SpriteFrame(16, 0, 7, 5, 19, 56)
192
end if
193
194
foreach (TypeName[Snail], arrayPos0, ALL_ENTITIES)
195
object[arrayPos0].startPos.x = object[arrayPos0].xpos
196
object[arrayPos0].startPos.y = object[arrayPos0].ypos
197
198
GetBit(temp0, object[arrayPos0].propertyValue, 0)
199
if temp0 == FLIP_NONE
200
object[arrayPos0].direction = FLIP_NONE
201
object[arrayPos0].xvel = -0x8000
202
else
203
object[arrayPos0].direction = FLIP_X
204
object[arrayPos0].xvel = 0x8000
205
end if
206
next
207
208
SetTableValue(TypeName[Snail], DebugMode_ObjCount, DebugMode_TypesTable)
209
SetTableValue(Snail_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
210
SetTableValue(Snail_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
211
DebugMode_ObjCount++
212
end event
213
214
215
// ========================
216
// Editor Events
217
// ========================
218
219
event RSDKEdit
220
if editor.returnVariable == true
221
switch editor.variableID
222
case EDIT_VAR_PROPVAL // property value
223
checkResult = object.propertyValue
224
break
225
226
case 0 // direction
227
checkResult = object.propertyValue
228
break
229
230
end switch
231
else
232
switch editor.variableID
233
case EDIT_VAR_PROPVAL // property value
234
object.propertyValue = editor.variableValue
235
break
236
237
case 0 // direction
238
object.propertyValue = editor.variableValue
239
break
240
241
end switch
242
end if
243
end event
244
245
246
event RSDKDraw
247
GetBit(object.direction, object.propertyValue, 0)
248
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
249
DrawSpriteFX(2, FX_FLIP, object.xpos, object.ypos)
250
end event
251
252
253
event RSDKLoad
254
CheckCurrentStageFolder("Zone01")
255
if checkResult == true
256
LoadSpriteSheet("EHZ/Objects.gif")
257
SpriteFrame(-16, -16, 32, 33, 44, 27)
258
SpriteFrame(-16, -16, 32, 33, 77, 27)
259
SpriteFrame(-23, -6, 16, 16, 110, 44)
260
SpriteFrame(16, 0, 6, 5, 19, 50)
261
SpriteFrame(16, 0, 7, 5, 19, 56)
262
else
263
LoadSpriteSheet("MBZ/Objects.gif")
264
SpriteFrame(-16, -16, 32, 33, 44, 27)
265
SpriteFrame(-16, -16, 32, 33, 77, 27)
266
SpriteFrame(-23, -6, 16, 16, 110, 44)
267
SpriteFrame(16, 0, 6, 5, 19, 50)
268
SpriteFrame(16, 0, 7, 5, 19, 56)
269
end if
270
271
AddEditorVariable("direction")
272
SetActiveVariable("direction")
273
AddEnumVariable("Left", 0)
274
AddEnumVariable("Right", 1)
275
end event
276
277