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/Asteron.txt
1483 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Asteron 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.value31 : object.wrapOffset.y
16
17
// States
18
private alias 0 : ASTERON_IDLE
19
private alias 1 : ASTERON_CHECKPLAYERINRANGE
20
private alias 2 : ASTERON_EXPLODE
21
22
// Player Aliases
23
private alias object.xpos : player.xpos
24
private alias object.ypos : player.ypos
25
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
32
// ========================
33
// Function Declarations
34
// ========================
35
36
reserve function Asteron_Setup
37
reserve function Asteron_DebugDraw
38
reserve function Asteron_DebugSpawn
39
40
41
// ========================
42
// Function Definitions
43
// ========================
44
45
private function Asteron_Setup
46
object[arrayPos0].frame = 0
47
object[arrayPos0].timer = 0
48
object[arrayPos0].state = ASTERON_IDLE
49
object[arrayPos0].priority = 0
50
end function
51
52
53
private function Asteron_DebugDraw
54
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
55
end function
56
57
58
private function Asteron_DebugSpawn
59
CreateTempObject(TypeName[Asteron], 0, object.xpos, object.ypos)
60
arrayPos0 = object[tempObjectPos].entityPos
61
object[arrayPos0].startPos.x = object.xpos
62
object[arrayPos0].startPos.y = object.ypos
63
object[arrayPos0].drawOrder = 5
64
CallFunction(Asteron_Setup)
65
end function
66
67
68
// ========================
69
// Events
70
// ========================
71
72
event ObjectUpdate
73
switch object.state
74
case ASTERON_IDLE
75
temp0 = 0
76
77
temp1 = 0
78
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
79
BoxCollisionTest(C_TOUCH, object.entityPos, -96, -64, 96, 64, currentPlayer, -1, -1, 1, 1)
80
if checkResult == false
81
temp0++
82
end if
83
temp1++
84
next
85
86
if temp0 == temp1
87
object.priority = PRIORITY_ACTIVE
88
object.state = ASTERON_CHECKPLAYERINRANGE
89
end if
90
break
91
92
case ASTERON_CHECKPLAYERINRANGE
93
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
94
if object.state == ASTERON_CHECKPLAYERINRANGE
95
BoxCollisionTest(C_TOUCH, object.entityPos, -96, -96, 96, 96, currentPlayer, -1, -1, 1, 1)
96
if checkResult == true
97
temp1 = false
98
temp0 = object.xpos
99
temp0 -= player[currentPlayer].xpos
100
Abs(temp0)
101
if temp0 >= 0x100000
102
temp1 = true
103
if object.xpos > player[currentPlayer].xpos
104
object.xvel = -0x4000
105
else
106
object.xvel = 0x4000
107
end if
108
end if
109
110
temp0 = object.ypos
111
temp0 -= player[currentPlayer].ypos
112
Abs(temp0)
113
if temp0 >= 0x100000
114
temp1 = true
115
if object.ypos > player[currentPlayer].ypos
116
object.yvel = -0x4000
117
else
118
object.yvel = 0x4000
119
end if
120
end if
121
122
if temp1 == true
123
object.priority = PRIORITY_ACTIVE
124
object.timer = 65
125
object.state = ASTERON_EXPLODE
126
end if
127
end if
128
end if
129
next
130
break
131
132
case ASTERON_EXPLODE
133
object.xpos += object.xvel
134
object.ypos += object.yvel
135
136
object.frame = object.animationTimer
137
object.frame >>= 1
138
object.animationTimer++
139
object.animationTimer &= 3
140
141
object.timer--
142
if object.timer == 0
143
ResetObjectEntity(object.entityPos, TypeName[Blank Object], 0, object.xpos, object.ypos)
144
145
CreateTempObject(TypeName[Asteron Spike], 0, object.xpos, object.ypos)
146
object[tempObjectPos].ypos -= 0x80000
147
object[tempObjectPos].yvel = -0x40000
148
object[tempObjectPos].drawOrder = 5
149
150
CreateTempObject(TypeName[Asteron Spike], 1, object.xpos, object.ypos)
151
object[tempObjectPos].xpos += 0x80000
152
object[tempObjectPos].ypos -= 0x40000
153
object[tempObjectPos].xvel = 0x30000
154
object[tempObjectPos].yvel = -0x10000
155
object[tempObjectPos].drawOrder = 5
156
157
CreateTempObject(TypeName[Asteron Spike], 2, object.xpos, object.ypos)
158
object[tempObjectPos].xpos += 0x80000
159
object[tempObjectPos].ypos += 0x80000
160
object[tempObjectPos].xvel = 0x30000
161
object[tempObjectPos].yvel = 0x30000
162
object[tempObjectPos].drawOrder = 5
163
164
CreateTempObject(TypeName[Asteron Spike], 2, object.xpos, object.ypos)
165
object[tempObjectPos].xpos -= 0x80000
166
object[tempObjectPos].ypos += 0x80000
167
object[tempObjectPos].xvel = -0x30000
168
object[tempObjectPos].yvel = 0x30000
169
object[tempObjectPos].direction = FLIP_X
170
object[tempObjectPos].drawOrder = 5
171
172
CreateTempObject(TypeName[Asteron Spike], 1, object.xpos, object.ypos)
173
object[tempObjectPos].xpos -= 0x80000
174
object[tempObjectPos].ypos -= 0x40000
175
object[tempObjectPos].xvel = -0x30000
176
object[tempObjectPos].yvel = -0x10000
177
object[tempObjectPos].direction = FLIP_X
178
object[tempObjectPos].drawOrder = 5
179
180
CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)
181
object[tempObjectPos].ypos += 0x20000
182
object[tempObjectPos].drawOrder = 5
183
PlaySfx(SfxName[Destroy], false)
184
end if
185
break
186
187
end switch
188
189
if object.outOfBounds == true
190
temp0 = object.xpos
191
temp1 = object.ypos
192
object.xpos = object.startPos.x
193
object.ypos = object.startPos.y
194
object.ypos += object.wrapOffset.y
195
if object.outOfBounds == true
196
arrayPos0 = object.entityPos
197
CallFunction(Asteron_Setup)
198
else
199
object.xpos = temp0
200
object.ypos = temp1
201
end if
202
end if
203
204
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
205
BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
206
if checkResult == true
207
CallFunction(Player_BadnikBreak)
208
end if
209
next
210
end event
211
212
213
event ObjectDraw
214
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
215
end event
216
217
218
event ObjectStartup
219
CheckCurrentStageFolder("Zone09")
220
if checkResult == true
221
LoadSpriteSheet("MPZ/Objects.gif")
222
SpriteFrame(-16, -14, 32, 28, 223, 1)
223
SpriteFrame(-16, -14, 32, 28, 190, 1)
224
else
225
LoadSpriteSheet("MBZ/Objects.gif")
226
SpriteFrame(-16, -14, 32, 28, 843, 289)
227
SpriteFrame(-16, -14, 32, 28, 876, 289)
228
end if
229
230
foreach (TypeName[Asteron], arrayPos0, ALL_ENTITIES)
231
object[arrayPos0].startPos.x = object[arrayPos0].xpos
232
object[arrayPos0].startPos.y = object[arrayPos0].ypos
233
object[arrayPos0].drawOrder = 5
234
CallFunction(Asteron_Setup)
235
next
236
237
SetTableValue(TypeName[Asteron], DebugMode_ObjCount, DebugMode_TypesTable)
238
SetTableValue(Asteron_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
239
SetTableValue(Asteron_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
240
DebugMode_ObjCount++
241
end event
242
243
244
// ========================
245
// Editor Events
246
// ========================
247
248
event RSDKDraw
249
DrawSprite(0)
250
end event
251
252
253
event RSDKLoad
254
CheckCurrentStageFolder("Zone09")
255
if checkResult == true
256
LoadSpriteSheet("MPZ/Objects.gif")
257
SpriteFrame(-16, -14, 32, 28, 223, 1)
258
SpriteFrame(-16, -14, 32, 28, 190, 1)
259
else
260
LoadSpriteSheet("MBZ/Objects.gif")
261
SpriteFrame(-16, -14, 32, 28, 843, 289)
262
SpriteFrame(-16, -14, 32, 28, 876, 289)
263
end if
264
265
// Asterons in MPZ have it set to 46, though this value isn't used
266
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
267
end event
268
269