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/SpinyWall.txt
1482 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Spiny Wall 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.dirChangeTimer
15
private alias object.value3 : object.shootTimer
16
private alias object.value4 : object.shotVelocity
17
private alias object.value5 : object.targetDistance
18
19
private alias 0 : SPINYWALL_MOVING
20
private alias 1 : SPINYWALL_IDLE
21
22
// Player Aliases
23
private alias object.xpos : player.xpos
24
private alias object.value40 : player.hitboxLeft
25
private alias object.value38 : player.hitboxTop
26
private alias object.value41 : player.hitboxRight
27
private alias object.value39 : player.hitboxBottom
28
29
30
// ========================
31
// Function Declarations
32
// ========================
33
34
reserve function SpinyWall_Setup
35
reserve function SpinyWall_DebugDraw
36
reserve function SpinyWall_DebugSpawn
37
38
39
40
// ========================
41
// Function Definitions
42
// ========================
43
44
private function SpinyWall_Setup
45
object[arrayPos0].xpos = object[arrayPos0].startPos.x
46
object[arrayPos0].ypos = object[arrayPos0].startPos.y
47
object[arrayPos0].dirChangeTimer = 256
48
object[arrayPos0].shootTimer = 128
49
object[arrayPos0].frame = 0
50
object[arrayPos0].animationTimer = 0
51
object[arrayPos0].state = 0
52
object[arrayPos0].direction = object[arrayPos0].propertyValue
53
object[arrayPos0].yvel = -0x4000
54
object[arrayPos0].priority = PRIORITY_BOUNDS
55
end function
56
57
58
private function SpinyWall_DebugDraw
59
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
60
end function
61
62
63
private function SpinyWall_DebugSpawn
64
CreateTempObject(TypeName[Spiny Wall], temp0, object.xpos, object.ypos)
65
object[tempObjectPos].startPos.x = object.xpos
66
object[tempObjectPos].startPos.y = object.ypos
67
arrayPos0 = object[tempObjectPos].entityPos
68
object[tempObjectPos].propertyValue = object.direction
69
CallFunction(SpinyWall_Setup)
70
end function
71
72
73
// ========================
74
// Events
75
// ========================
76
77
event ObjectUpdate
78
object.priority = PRIORITY_ACTIVE
79
switch object.state
80
case SPINYWALL_MOVING
81
object.dirChangeTimer--
82
if object.dirChangeTimer <= 0
83
object.dirChangeTimer = 256
84
object.shootTimer = 128
85
FlipSign(object.yvel)
86
object.direction ^= FLIP_Y
87
end if
88
89
object.ypos += object.yvel
90
91
object.animationTimer++
92
if object.animationTimer == 10
93
object.animationTimer = 0
94
object.frame ^= 1
95
end if
96
97
if object.shootTimer == 0
98
object.targetDistance = 0x7FFFFFFF
99
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
100
BoxCollisionTest(C_TOUCH, object.entityPos, -96, -256, 96, 256, currentPlayer, 1, 1, 1, 1)
101
if checkResult == true
102
object.shootTimer = 40
103
object.frame = 2
104
object.state = 1
105
temp0 = object.xpos
106
temp0 -= player[currentPlayer].xpos
107
Abs(temp0)
108
if temp0 < object.targetDistance
109
object.targetDistance = temp0
110
if player[currentPlayer].xpos > object.xpos
111
object.shotVelocity = 0x30000
112
else
113
object.shotVelocity = -0x30000
114
end if
115
end if
116
end if
117
next
118
else
119
object.shootTimer--
120
end if
121
break
122
123
case SPINYWALL_IDLE
124
object.shootTimer--
125
if object.shootTimer == 20
126
CreateTempObject(TypeName[Spiny Shot], 0, object.xpos, object.ypos)
127
object[tempObjectPos].xvel = object.shotVelocity
128
object[tempObjectPos].drawOrder = 2
129
end if
130
131
if object.shootTimer < 0
132
object.shootTimer = 64
133
object.frame = 0
134
object.state = 0
135
end if
136
break
137
138
end switch
139
140
if object.outOfBounds == true
141
temp0 = object.xpos
142
temp1 = object.ypos
143
object.xpos = object.startPos.x
144
object.ypos = object.startPos.y
145
if object.outOfBounds == true
146
arrayPos0 = object.entityPos
147
CallFunction(SpinyWall_Setup)
148
else
149
object.xpos = temp0
150
object.ypos = temp1
151
end if
152
end if
153
154
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
155
BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
156
if checkResult == true
157
CallFunction(Player_BadnikBreak)
158
end if
159
next
160
end event
161
162
163
event ObjectDraw
164
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
165
end event
166
167
168
event ObjectStartup
169
LoadSpriteSheet("CPZ/Objects.gif") // this was probably meant to be removed when MBZ became a thing, makes no real difference whether its here or not though
170
171
CheckCurrentStageFolder("Zone02")
172
if checkResult == true
173
LoadSpriteSheet("CPZ/Objects.gif")
174
SpriteFrame(-12, -24, 23, 48, 1, 25)
175
SpriteFrame(-12, -22, 23, 44, 25, 25)
176
SpriteFrame(-12, -24, 23, 48, 49, 25)
177
else
178
LoadSpriteSheet("MBZ/Objects.gif")
179
SpriteFrame(-12, -24, 23, 48, 99, 501)
180
SpriteFrame(-12, -22, 23, 44, 99, 550)
181
SpriteFrame(-12, -24, 23, 48, 99, 595)
182
end if
183
184
foreach (TypeName[Spiny Wall], arrayPos0, ALL_ENTITIES)
185
object[arrayPos0].startPos.x = object[arrayPos0].xpos
186
object[arrayPos0].startPos.y = object[arrayPos0].ypos
187
CallFunction(SpinyWall_Setup)
188
next
189
190
SetTableValue(TypeName[Spiny Wall], DebugMode_ObjCount, DebugMode_TypesTable)
191
SetTableValue(SpinyWall_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
192
SetTableValue(SpinyWall_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
193
DebugMode_ObjCount++
194
end event
195
196
197
// ========================
198
// Editor Events
199
// ========================
200
201
event RSDKEdit
202
if editor.returnVariable == true
203
switch editor.variableID
204
case EDIT_VAR_PROPVAL // property value
205
checkResult = object.propertyValue
206
break
207
208
case 0 // direction
209
GetBit(checkResult, object.propertyValue, 1)
210
break
211
212
end switch
213
else
214
switch editor.variableID
215
case EDIT_VAR_PROPVAL // property value
216
object.propertyValue = editor.variableValue
217
break
218
219
case 0 // direction
220
CheckNotEqual(editor.variableValue, 0)
221
SetBit(object.propertyValue, 1, checkResult)
222
break
223
224
end switch
225
end if
226
end event
227
228
229
event RSDKDraw
230
object.direction = object.propertyValue
231
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
232
end event
233
234
235
event RSDKLoad
236
CheckCurrentStageFolder("Zone02")
237
if checkResult == true
238
LoadSpriteSheet("CPZ/Objects.gif")
239
SpriteFrame(-12, -24, 23, 48, 1, 25)
240
else
241
LoadSpriteSheet("MBZ/Objects.gif")
242
SpriteFrame(-12, -24, 23, 48, 99, 501)
243
end if
244
245
AddEditorVariable("direction")
246
SetActiveVariable("direction")
247
AddEnumVariable("Left", 0)
248
AddEnumVariable("Right", 1)
249
end event
250
251