Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-1-Sonic-2-2013-Script-Decompilation
Path: blob/master/Sonic 1/Scripts/MZ/FallingBlock.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 1
3
// Script Description: Falling 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.value1 : object.drawPos.y
13
private alias object.value2 : object.collisionOffset.y
14
private alias object.value3 : object.startPos.y
15
private alias object.value4 : object.amplitude.y
16
17
private alias 0 : FALLINGBLOCK_IDLE
18
private alias 1 : FALLINGBLOCK_FLOATING
19
private alias 2 : FALLINGBLOCK_WAITFORPLAYER
20
private alias 3 : FALLINGBLOCK_FALLING
21
private alias 4 : FALLINGBLOCK_FLOATING_LAVA
22
23
// Player Aliases
24
private alias object.xpos : player.xpos
25
private alias object.ypos : player.ypos
26
private alias object.gravity : player.gravity
27
28
private alias object.value17 : debugMode.currentSelection
29
30
// Tile Flag Aliases
31
private alias 1 : TILE_LAVA
32
33
// Tile Info ID Aliases
34
private alias 8 : TILEINFO_ANGLEB
35
36
// Path ID Aliases
37
private alias 0 : PATH_A
38
39
40
// ========================
41
// Function Declarations
42
// ========================
43
44
reserve function FallingBlock_DebugDraw
45
reserve function FallingBlock_DebugSpawn
46
reserve function FallingBlock_HandleCollisions
47
48
// ========================
49
// Static Values
50
// ========================
51
52
private value FallingBlock_startDebugID = 0
53
54
55
// ========================
56
// Function Definitions
57
// ========================
58
59
private function FallingBlock_DebugDraw
60
DrawSprite(0)
61
end function
62
63
64
private function FallingBlock_DebugSpawn
65
CreateTempObject(TypeName[Falling Block], 0, object.xpos, object.ypos)
66
object[tempObjectPos].state = debugMode[0].currentSelection
67
object[tempObjectPos].state -= FallingBlock_startDebugID
68
69
switch object[tempObjectPos].state
70
case FALLINGBLOCK_IDLE
71
object[tempObjectPos].amplitude.y = 0x400
72
break
73
74
case FALLINGBLOCK_FLOATING
75
case FALLINGBLOCK_WAITFORPLAYER
76
object[tempObjectPos].ypos -= 0x80000
77
object[tempObjectPos].amplitude.y = 0x400
78
break
79
80
case FALLINGBLOCK_FALLING //Actually FALLINGBLOCK_FLOATING_LAVA but we dont wanna spawn FALLINGBLOCK_FALLING so we just advance
81
object[tempObjectPos].state++
82
object[tempObjectPos].amplitude.y = 0x200
83
break
84
85
end switch
86
end function
87
88
89
private function FallingBlock_HandleCollisions
90
Sin(object.collisionOffset.y, object.angle)
91
object.collisionOffset.y *= object.amplitude.y
92
object.collisionOffset.y += object.ypos
93
object.collisionOffset.y &= 0xFFFF0000
94
object.collisionOffset.y -= object.drawPos.y
95
temp0 = object.ypos
96
97
object.ypos = object.drawPos.y
98
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
99
BoxCollisionTest(C_SOLID, object.entityPos, -16, -16, 16, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
100
switch checkResult
101
case COL_TOP
102
player[currentPlayer].ypos += object.collisionOffset.y
103
break
104
105
case COL_BOTTOM
106
if player[currentPlayer].gravity == GRAVITY_GROUND
107
CallFunction(Player_Kill)
108
end if
109
break
110
111
end switch
112
next
113
object.ypos = temp0
114
115
Sin(object.drawPos.y, object.angle)
116
object.drawPos.y *= object.amplitude.y
117
object.drawPos.y += object.ypos
118
object.drawPos.y &= 0xFFFF0000
119
end function
120
121
122
// ========================
123
// Events
124
// ========================
125
126
event ObjectUpdate
127
switch object.state
128
case FALLINGBLOCK_IDLE
129
object.drawPos.y = object.ypos
130
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
131
BoxCollisionTest(C_SOLID, object.entityPos, -16, -16, 16, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
132
next
133
break
134
135
case FALLINGBLOCK_FLOATING
136
object.priority = PRIORITY_ACTIVE
137
object.angle = oscillation
138
object.angle <<= 2
139
CallFunction(FallingBlock_HandleCollisions)
140
break
141
142
case FALLINGBLOCK_WAITFORPLAYER
143
object.priority = PRIORITY_ACTIVE
144
object.angle = oscillation
145
object.angle <<= 2
146
CallFunction(FallingBlock_HandleCollisions)
147
148
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
149
if player[currentPlayer].ypos > object.ypos
150
temp0 = object.xpos
151
temp0 -= player[currentPlayer].xpos
152
Abs(temp0)
153
if temp0 < 0x900000
154
object.state = FALLINGBLOCK_FALLING
155
object.ypos = object.drawPos.y
156
object.amplitude.y = 0x200
157
end if
158
end if
159
next
160
break
161
162
case FALLINGBLOCK_FALLING
163
object.priority = PRIORITY_ACTIVE
164
object.yvel += 0x1800
165
object.ypos += object.yvel
166
object.drawPos.y = object.ypos
167
168
ObjectTileCollision(CSIDE_FLOOR, 0, 16, PATH_A)
169
if checkResult == true
170
temp1 = object.iypos
171
temp1 += 8
172
Get16x16TileInfo(temp0, object.ixpos, temp1, TILEINFO_ANGLEB)
173
if temp0 == TILE_LAVA
174
object.state = FALLINGBLOCK_FLOATING_LAVA
175
else
176
object.state = FALLINGBLOCK_IDLE
177
end if
178
end if
179
180
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
181
BoxCollisionTest(C_SOLID, object.entityPos, -16, -16, 16, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
182
if checkResult == COL_BOTTOM
183
if player[currentPlayer].gravity == GRAVITY_GROUND
184
CallFunction(Player_Kill)
185
end if
186
end if
187
next
188
break
189
190
case FALLINGBLOCK_FLOATING_LAVA
191
object.priority = PRIORITY_ACTIVE
192
object.angle = oscillation
193
object.angle <<= 1
194
CallFunction(FallingBlock_HandleCollisions)
195
break
196
197
end switch
198
199
if object.outOfBounds == true
200
temp0 = object.ypos
201
object.ypos = object.startPos.y
202
if object.outOfBounds == true
203
object.yvel = 0
204
object.priority = PRIORITY_BOUNDS
205
object.state = object.propertyValue
206
object.state &= 7
207
if object.state > FALLINGBLOCK_FLOATING_LAVA
208
object.state = FALLINGBLOCK_IDLE
209
end if
210
211
switch object.state
212
case FALLINGBLOCK_IDLE
213
case FALLINGBLOCK_FLOATING
214
case FALLINGBLOCK_WAITFORPLAYER
215
object.amplitude.y = 0x400
216
break
217
218
case FALLINGBLOCK_FLOATING_LAVA
219
object.amplitude.y = 0x200
220
break
221
end switch
222
else
223
object.ypos = temp0
224
end if
225
end if
226
end event
227
228
229
event ObjectDraw
230
DrawSpriteXY(0, object.xpos, object.drawPos.y)
231
end event
232
233
234
event ObjectStartup
235
LoadSpriteSheet("MZ/Objects.gif")
236
SpriteFrame(-16, -16, 32, 32, 191, 289)
237
238
foreach (TypeName[Falling Block], arrayPos0, ALL_ENTITIES)
239
object[arrayPos0].state = object[arrayPos0].propertyValue
240
object[arrayPos0].state &= 7
241
if object[arrayPos0].state > FALLINGBLOCK_FLOATING_LAVA
242
object[arrayPos0].state = FALLINGBLOCK_IDLE
243
end if
244
245
switch object[arrayPos0].state
246
case FALLINGBLOCK_IDLE
247
object[arrayPos0].amplitude.y = 0x400
248
break
249
250
case FALLINGBLOCK_FLOATING
251
case FALLINGBLOCK_WAITFORPLAYER
252
object[arrayPos0].ypos -= 0x80000
253
object[arrayPos0].amplitude.y = 0x400
254
break
255
256
case FALLINGBLOCK_FALLING
257
break
258
259
case FALLINGBLOCK_FLOATING_LAVA
260
object[arrayPos0].amplitude.y = 0x200
261
break
262
263
end switch
264
object[arrayPos0].startPos.y = object[arrayPos0].ypos
265
next
266
267
temp0 = 0
268
FallingBlock_startDebugID = DebugMode_ObjCount
269
while temp0 < 4
270
SetTableValue(TypeName[Falling Block], DebugMode_ObjCount, DebugMode_TypesTable)
271
SetTableValue(FallingBlock_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
272
SetTableValue(FallingBlock_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
273
DebugMode_ObjCount++
274
temp0++
275
loop
276
end event
277
278
279
// ========================
280
// Editor Events
281
// ========================
282
283
event RSDKEdit
284
if editor.returnVariable == true
285
switch editor.variableID
286
case EDIT_VAR_PROPVAL // property value
287
checkResult = object.propertyValue
288
checkResult &= 7
289
break
290
291
case 0 // type
292
checkResult = object.propertyValue
293
checkResult &= 7
294
break
295
296
end switch
297
else
298
switch editor.variableID
299
case EDIT_VAR_PROPVAL // property value
300
object.propertyValue = editor.variableValue
301
object.propertyValue &= 7
302
break
303
304
case 0 // type
305
object.propertyValue = editor.variableValue
306
object.propertyValue &= 7
307
break
308
309
end switch
310
end if
311
end event
312
313
314
event RSDKDraw
315
DrawSprite(0)
316
end event
317
318
319
event RSDKLoad
320
LoadSpriteSheet("MZ/Objects.gif")
321
SpriteFrame(-16, -16, 32, 32, 191, 289)
322
323
AddEditorVariable("type")
324
SetActiveVariable("type")
325
AddEnumVariable("Idle", 0)
326
AddEnumVariable("Floating (Won't Drop)", 1)
327
AddEnumVariable("Floating (Will Drop)", 2)
328
AddEnumVariable("Floating in Lava", 4)
329
end event
330
331