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/MPZ/SpearBlock.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Spear Block 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.spearPos.x
14
private alias object.value2 : object.spearPos.y
15
16
// States
17
private alias 0 : SPEARBLOCK_SPEARSRETRACTED
18
private alias 1 : SPEARBLOCK_EXTENDSPEARS
19
private alias 2 : SPEARBLOCK_SPEARSEXTENDED
20
private alias 3 : SPEARBLOCK_RETRACTSPEARS
21
22
// Player Aliases
23
private alias object.value17 : debugMode.currentSelection
24
25
26
// ========================
27
// Function Declarations
28
// ========================
29
30
reserve function SpearBlock_Setup
31
reserve function SpearBlock_DebugDraw
32
reserve function SpearBlock_DebugSpawn
33
34
// ========================
35
// Static Values
36
// ========================
37
38
private value SpearBlock_startDebugID = 0
39
40
41
// ========================
42
// Function Definitions
43
// ========================
44
45
private function SpearBlock_Setup
46
object[arrayPos0].spearPos.x = 0
47
object[arrayPos0].spearPos.y = 0
48
object[arrayPos0].timer = 0
49
object[arrayPos0].state = 0
50
object[arrayPos0].priority = PRIORITY_BOUNDS
51
end function
52
53
54
private function SpearBlock_DebugDraw
55
DrawSprite(4)
56
end function
57
58
59
private function SpearBlock_DebugSpawn
60
temp0 = debugMode[0].currentSelection
61
temp0 -= SpearBlock_startDebugID
62
CreateTempObject(TypeName[Spear Block], temp0, object.xpos, object.ypos)
63
64
arrayPos0 = object[tempObjectPos].entityPos
65
CallFunction(SpearBlock_Setup)
66
end function
67
68
69
// ========================
70
// Events
71
// ========================
72
73
event ObjectUpdate
74
switch object.state
75
case SPEARBLOCK_SPEARSRETRACTED
76
temp0 = oscillation
77
temp0 &= 0x7F
78
if temp0 == 0
79
temp0 = oscillation
80
temp0 >>= 7
81
temp0 += object.propertyValue
82
temp0 &= 3
83
object.frame = temp0
84
85
// Note - the `Spear` SFX doesn't exist in MBZ, so this'll error and play the Jump sound (ID 0) instead
86
PlaySfx(SfxName[Spear], false)
87
88
object.priority = PRIORITY_ACTIVE
89
object.timer = 4
90
object.state = SPEARBLOCK_EXTENDSPEARS
91
end if
92
break
93
94
case SPEARBLOCK_EXTENDSPEARS
95
switch object.frame
96
case 0
97
object.spearPos.y -= 0x80000
98
break
99
100
case 1
101
object.spearPos.x += 0x80000
102
break
103
104
case 2
105
object.spearPos.y += 0x80000
106
break
107
108
case 3
109
object.spearPos.x -= 0x80000
110
break
111
112
end switch
113
114
object.timer--
115
if object.timer == 0
116
object.state = 2
117
end if
118
break
119
120
case SPEARBLOCK_SPEARSEXTENDED
121
temp0 = oscillation
122
temp0 &= 0x3F
123
if temp0 == 0
124
// Note - the `Spear` SFX doesn't exist in MBZ's sound list, so this'll error and play the Jump sound (ID 0) instead
125
PlaySfx(SfxName[Spear], false)
126
127
object.priority = PRIORITY_ACTIVE
128
object.timer = 4
129
object.state = SPEARBLOCK_RETRACTSPEARS
130
end if
131
break
132
133
case SPEARBLOCK_RETRACTSPEARS
134
switch object.frame
135
case 0
136
object.spearPos.y += 0x80000
137
break
138
139
case 1
140
object.spearPos.x -= 0x80000
141
break
142
143
case 2
144
object.spearPos.y -= 0x80000
145
break
146
147
case 3
148
object.spearPos.x += 0x80000
149
break
150
151
end switch
152
153
object.timer--
154
if object.timer == 0
155
object.state = SPEARBLOCK_SPEARSRETRACTED
156
end if
157
break
158
159
end switch
160
161
temp0 = object.xpos
162
temp1 = object.ypos
163
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
164
BoxCollisionTest(C_SOLID, object.entityPos, -16, -16, 16, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
165
166
object.xpos += object.spearPos.x
167
object.ypos += object.spearPos.y
168
switch object.frame
169
case 0
170
case 2
171
BoxCollisionTest(C_TOUCH, object.entityPos, -4, -16, 4, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
172
break
173
174
case 1
175
case 3
176
BoxCollisionTest(C_TOUCH, object.entityPos, -16, -4, 16, 4, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
177
break
178
179
end switch
180
181
if checkResult == true
182
CallFunction(Player_Hit)
183
end if
184
185
object.xpos = temp0
186
object.ypos = temp1
187
next
188
189
if object.outOfBounds == true
190
arrayPos0 = object.entityPos
191
CallFunction(SpearBlock_Setup)
192
end if
193
end event
194
195
196
event ObjectDraw
197
temp0 = object.xpos
198
temp0 += object.spearPos.x
199
temp1 = object.ypos
200
temp1 += object.spearPos.y
201
DrawSpriteXY(object.frame, temp0, temp1)
202
203
DrawSprite(4)
204
end event
205
206
207
event ObjectStartup
208
CheckCurrentStageFolder("Zone09")
209
if checkResult == true
210
LoadSpriteSheet("MPZ/Objects.gif")
211
SpriteFrame(-4, -16, 8, 32, 34, 102)
212
SpriteFrame(-16, -4, 32, 8, 34, 84)
213
SpriteFrame(-4, -16, 8, 32, 43, 102)
214
SpriteFrame(-16, -4, 32, 8, 34, 93)
215
SpriteFrame(-16, -16, 32, 32, 52, 102)
216
else
217
LoadSpriteSheet("MBZ/Objects.gif")
218
SpriteFrame(-4, -16, 8, 32, 859, 615)
219
SpriteFrame(-16, -4, 32, 8, 893, 648)
220
SpriteFrame(-4, -16, 8, 32, 868, 615)
221
SpriteFrame(-16, -4, 32, 8, 893, 657)
222
SpriteFrame(-16, -16, 32, 32, 926, 541)
223
end if
224
225
foreach (TypeName[Spear Block], arrayPos0, ALL_ENTITIES)
226
CallFunction(SpearBlock_Setup)
227
next
228
229
temp0 = 0
230
SpearBlock_startDebugID = DebugMode_ObjCount
231
while temp0 < 4
232
SetTableValue(TypeName[Spear Block], DebugMode_ObjCount, DebugMode_TypesTable)
233
SetTableValue(SpearBlock_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
234
SetTableValue(SpearBlock_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
235
DebugMode_ObjCount++
236
temp0++
237
loop
238
end event
239
240
241
// ========================
242
// Editor Events
243
// ========================
244
245
event RSDKEdit
246
if editor.returnVariable == true
247
switch editor.variableID
248
case EDIT_VAR_PROPVAL // property value
249
checkResult = object.propertyValue
250
break
251
252
case 0 // spearDir
253
checkResult = object.propertyValue
254
break
255
256
end switch
257
else
258
switch editor.variableID
259
case EDIT_VAR_PROPVAL // property value
260
object.propertyValue = editor.variableValue
261
break
262
263
case 0 // spearDir
264
object.propertyValue = editor.variableValue
265
break
266
267
end switch
268
end if
269
end event
270
271
272
event RSDKDraw
273
arrayPos0 = object.entityPos
274
CallFunction(SpearBlock_Setup)
275
276
object.frame = object.propertyValue
277
object.frame &= 3
278
switch object.frame
279
case 0
280
object.spearPos.y -= 0x200000
281
break
282
283
case 1
284
object.spearPos.x += 0x200000
285
break
286
287
case 2
288
object.spearPos.y += 0x200000
289
break
290
291
case 3
292
object.spearPos.x -= 0x200000
293
break
294
295
end switch
296
297
temp0 = object.xpos
298
temp0 += object.spearPos.x
299
temp1 = object.ypos
300
temp1 += object.spearPos.y
301
DrawSpriteXY(object.frame, temp0, temp1)
302
303
DrawSprite(4)
304
end event
305
306
307
event RSDKLoad
308
CheckCurrentStageFolder("Zone09")
309
if checkResult == true
310
LoadSpriteSheet("MPZ/Objects.gif")
311
SpriteFrame(-4, -16, 8, 32, 34, 102)
312
SpriteFrame(-16, -4, 32, 8, 34, 84)
313
SpriteFrame(-4, -16, 8, 32, 43, 102)
314
SpriteFrame(-16, -4, 32, 8, 34, 93)
315
SpriteFrame(-16, -16, 32, 32, 52, 102)
316
else
317
LoadSpriteSheet("MBZ/Objects.gif")
318
SpriteFrame(-4, -16, 8, 32, 859, 615)
319
SpriteFrame(-16, -4, 32, 8, 893, 648)
320
SpriteFrame(-4, -16, 8, 32, 868, 615)
321
SpriteFrame(-16, -4, 32, 8, 893, 657)
322
SpriteFrame(-16, -16, 32, 32, 926, 541)
323
end if
324
325
AddEditorVariable("spearDir")
326
SetActiveVariable("spearDir")
327
AddEnumVariable("Up", 0)
328
AddEnumVariable("Right", 1)
329
AddEnumVariable("Down", 2)
330
AddEnumVariable("Left", 3)
331
end event
332
333