Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-CD-2011-Script-Decompilation
Path: blob/main/Scripts/R4/CrushBlocks.txt
1319 views
1
//----------------Sonic CD Crush Blocks Script----------------//
2
//--------Scripted by Christian Whitehead 'The Taxman'--------//
3
//-------Unpacked By Rubberduckycooly's Script Unpacker-------//
4
5
// Aliases
6
#alias Object.Value0 : Object.Timer
7
#alias Object.Value1 : Object.XVelocity
8
#alias Object.Value2 : Object.XOffSet
9
#alias Object.Value3 : Object.OnObject
10
11
// HUD Alias
12
#alias Object[24].PropertyValue : HUD.CurrentTimePeriod
13
14
//States
15
#alias 0 : CRUSHBLOCKS_DELAY_1
16
#alias 1 : CRUSHBLOCKS_OPEN
17
#alias 2 : CRUSHBLOCKS_DELAY_2
18
#alias 3 : CRUSHBLOCKS_CRUSH
19
20
// Time Periods
21
#alias 0 : TIME_PRESENT
22
#alias 1 : TIME_PAST
23
#alias 2 : TIME_GOOD_FUTURE
24
#alias 3 : TIME_BAD_FUTURE
25
26
// Collision
27
#alias 1 : PLAYER_COL_FLOOR
28
#alias 2 : PLAYER_COL_LWALL
29
#alias 3 : PLAYER_COL_RWALL
30
31
// Gravity
32
#alias 1 : GRAVITY_AIR
33
34
35
sub ObjectMain
36
switch Object.State
37
case CRUSHBLOCKS_DELAY_1
38
if Object.Timer < 60
39
Object.Timer++
40
else
41
Object.Timer = 0
42
Object.XOffSet = 0x8000
43
Object.State++
44
end if
45
break
46
47
case CRUSHBLOCKS_OPEN
48
if Object.XVelocity < 0x600000
49
Object.XVelocity += 0x8000
50
else
51
Object.XOffSet = 0
52
Object.State++
53
end if
54
break
55
56
case CRUSHBLOCKS_DELAY_2
57
if Object.Timer < 120
58
Object.Timer++
59
else
60
Object.Timer = 0
61
Object.XOffSet = -0x20000
62
Object.State++
63
end if
64
break
65
66
case CRUSHBLOCKS_CRUSH
67
if Object.XVelocity > 0
68
Object.XVelocity -= 0x20000
69
else
70
Object.XOffSet = 0
71
Object.State = CRUSHBLOCKS_DELAY_1
72
end if
73
break
74
75
end switch
76
end sub
77
78
79
sub ObjectPlayerInteraction
80
TempValue0 = Object.XPos
81
TempValue1 = 0
82
TempValue2 = 0
83
Object.XPos -= Object.XVelocity
84
85
PlayerObjectCollision(C_BOX, -80, -64, -48, -32)
86
switch CheckResult
87
case PLAYER_COL_FLOOR
88
Player.XPos -= Object.XOffSet
89
90
if Player.Speed == 0
91
if Object.OnObject == false
92
Object.OnObject = true
93
94
// Truncate these values
95
Player.XPos &= 0xFFFF0000
96
Object.XVelocity &= 0xFFFF0000
97
end if
98
else
99
Object.OnObject = false
100
end if
101
break
102
103
case PLAYER_COL_RWALL
104
TempValue1 = true
105
break
106
107
end switch
108
109
PlayerObjectCollision(C_BOX, -80, -32, -16, 0)
110
switch CheckResult
111
case PLAYER_COL_FLOOR
112
Player.XPos -= Object.XOffSet
113
114
if Player.Speed == 0
115
if Object.OnObject == false
116
Object.OnObject = true
117
118
Player.XPos &= 0xFFFF0000 // Truncate the value
119
Object.XVelocity &= 0xFFFF0000 // Truncate the value
120
end if
121
else
122
Object.OnObject = false
123
end if
124
break
125
126
case PLAYER_COL_RWALL
127
TempValue1 = true
128
break
129
130
end switch
131
132
PlayerObjectCollision(C_BOX, -80, 0, 16, 32)
133
switch CheckResult
134
case PLAYER_COL_FLOOR
135
Player.XPos -= Object.XOffSet
136
137
if Player.Speed == 0
138
if Object.OnObject == false
139
Object.OnObject = true
140
141
Player.XPos &= 0xFFFF0000 // Truncate the value
142
Object.XVelocity &= 0xFFFF0000 // Truncate the value
143
end if
144
else
145
Object.OnObject = false
146
end if
147
break
148
149
case PLAYER_COL_RWALL
150
TempValue1 = true
151
break
152
153
end switch
154
155
PlayerObjectCollision(C_BOX, -80, 32, 48, 64)
156
switch CheckResult
157
case PLAYER_COL_FLOOR
158
Player.XPos -= Object.XOffSet
159
160
if Player.Speed == 0
161
if Object.OnObject == false
162
Object.OnObject = true
163
164
Player.XPos &= 0xFFFF0000 // Truncate the value
165
Object.XVelocity &= 0xFFFF0000 // Truncate the value
166
end if
167
else
168
Object.OnObject = false
169
end if
170
break
171
172
case PLAYER_COL_RWALL
173
TempValue1 = true
174
break
175
176
end switch
177
178
Object.XPos = TempValue0
179
Object.XPos += Object.XVelocity
180
PlayerObjectCollision(C_BOX, -48, -64, 80, -32)
181
switch CheckResult
182
case PLAYER_COL_FLOOR
183
Player.XPos += Object.XOffSet
184
185
if Player.Speed == 0
186
if Object.OnObject == false
187
Object.OnObject = true
188
189
Player.XPos &= 0xFFFF0000 // Truncate the value
190
Object.XVelocity &= 0xFFFF0000 // Truncate the value
191
end if
192
else
193
Object.OnObject = false
194
end if
195
break
196
197
case PLAYER_COL_LWALL
198
TempValue2 = true
199
break
200
201
end switch
202
203
PlayerObjectCollision(C_BOX, -16, -32, 80, 0)
204
switch CheckResult
205
case PLAYER_COL_FLOOR
206
Player.XPos += Object.XOffSet
207
208
if Player.Speed == 0
209
if Object.OnObject == false
210
Object.OnObject = true
211
212
Player.XPos &= 0xFFFF0000 // Truncate the value
213
Object.XVelocity &= 0xFFFF0000 // Truncate the value
214
end if
215
else
216
Object.OnObject = false
217
end if
218
break
219
220
case PLAYER_COL_LWALL
221
TempValue2 = true
222
break
223
224
end switch
225
226
PlayerObjectCollision(C_BOX, 16, 0, 80, 32)
227
switch CheckResult
228
case PLAYER_COL_FLOOR
229
Player.XPos += Object.XOffSet
230
231
if Player.Speed == 0
232
if Object.OnObject == false
233
Object.OnObject = true
234
235
Player.XPos &= 0xFFFF0000 // Truncate the value
236
Object.XVelocity &= 0xFFFF0000 // Truncate the value
237
end if
238
else
239
Object.OnObject = false
240
end if
241
break
242
243
case PLAYER_COL_LWALL
244
TempValue2 = true
245
break
246
247
end switch
248
249
PlayerObjectCollision(C_BOX, 48, 32, 80, 64)
250
switch CheckResult
251
case PLAYER_COL_FLOOR
252
Player.XPos += Object.XOffSet
253
254
if Player.Speed == 0
255
if Object.OnObject == false
256
Object.OnObject = true
257
258
Player.XPos &= 0xFFFF0000 // Truncate the value
259
Object.XVelocity &= 0xFFFF0000 // Truncate the value
260
end if
261
else
262
Object.OnObject = false
263
end if
264
break
265
266
case PLAYER_COL_LWALL
267
TempValue2 = true
268
break
269
270
end switch
271
272
Object.XPos = TempValue0
273
if TempValue1 == true
274
if TempValue2 == true
275
CallFunction(Player_Kill)
276
end if
277
end if
278
279
if Player.Gravity == GRAVITY_AIR
280
Object.OnObject = false
281
end if
282
end sub
283
284
285
sub ObjectDraw
286
TempValue0 = Object.XPos
287
TempValue0 -= Object.XVelocity
288
289
TempValue1 = Object.XPos
290
TempValue1 += Object.XVelocity
291
292
TempValue2 = Object.YPos
293
TempValue2 -= 0x300000
294
DrawSpriteXY(0, TempValue0, TempValue2)
295
296
TempValue2 += 0x200000
297
DrawSpriteXY(0, TempValue0, TempValue2)
298
DrawSpriteXY(1, TempValue0, TempValue2)
299
300
TempValue2 += 0x200000
301
DrawSpriteXY(0, TempValue0, TempValue2)
302
DrawSpriteXY(1, TempValue0, TempValue2)
303
DrawSpriteXY(2, TempValue0, TempValue2)
304
305
TempValue2 += 0x200000
306
DrawSpriteXY(0, TempValue0, TempValue2)
307
DrawSpriteXY(1, TempValue0, TempValue2)
308
DrawSpriteXY(2, TempValue0, TempValue2)
309
DrawSpriteXY(3, TempValue0, TempValue2)
310
311
TempValue2 -= 0x600000
312
DrawSpriteXY(1, TempValue1, TempValue2)
313
DrawSpriteXY(2, TempValue1, TempValue2)
314
DrawSpriteXY(3, TempValue1, TempValue2)
315
DrawSpriteXY(4, TempValue1, TempValue2)
316
317
TempValue2 += 0x200000
318
DrawSpriteXY(2, TempValue1, TempValue2)
319
DrawSpriteXY(3, TempValue1, TempValue2)
320
DrawSpriteXY(4, TempValue1, TempValue2)
321
322
TempValue2 += 0x200000
323
DrawSpriteXY(3, TempValue1, TempValue2)
324
DrawSpriteXY(4, TempValue1, TempValue2)
325
326
TempValue2 += 0x200000
327
DrawSpriteXY(4, TempValue1, TempValue2)
328
end sub
329
330
331
sub ObjectStartup
332
switch HUD.CurrentTimePeriod
333
case TIME_PRESENT
334
LoadSpriteSheet("R4/Objects.gif")
335
TempValue0 = 163
336
TempValue1 = 1
337
TempValue2 = 196
338
break
339
340
case TIME_PAST
341
LoadSpriteSheet("R4/Objects2.gif")
342
TempValue0 = 1
343
TempValue1 = 157
344
TempValue2 = 34
345
break
346
347
case TIME_GOOD_FUTURE
348
LoadSpriteSheet("R4/Objects2.gif")
349
TempValue0 = 1
350
TempValue1 = 190
351
TempValue2 = 34
352
break
353
354
case TIME_BAD_FUTURE
355
LoadSpriteSheet("R4/Objects2.gif")
356
TempValue0 = 1
357
TempValue1 = 223
358
TempValue2 = 34
359
break
360
361
end switch
362
363
// R4 Crush Blocks
364
SpriteFrame(-80, -16, 32, 32, TempValue0, TempValue1)
365
SpriteFrame(-48, -16, 32, 32, TempValue0, TempValue1)
366
SpriteFrame(-16, -16, 32, 32, TempValue0, TempValue1)
367
SpriteFrame(16, -16, 32, 32, TempValue0, TempValue1)
368
SpriteFrame(48, -16, 32, 32, TempValue0, TempValue1)
369
end sub
370
371
372
// ========================
373
// Editor Subs
374
// ========================
375
376
sub RSDKDraw
377
TempValue0 = Object.XPos
378
379
TempValue1 = Object.XPos
380
381
TempValue2 = Object.YPos
382
TempValue2 -= 0x300000
383
DrawSpriteXY(0, TempValue0, TempValue2)
384
385
TempValue2 += 0x200000
386
DrawSpriteXY(0, TempValue0, TempValue2)
387
DrawSpriteXY(1, TempValue0, TempValue2)
388
389
TempValue2 += 0x200000
390
DrawSpriteXY(0, TempValue0, TempValue2)
391
DrawSpriteXY(1, TempValue0, TempValue2)
392
DrawSpriteXY(2, TempValue0, TempValue2)
393
394
TempValue2 += 0x200000
395
DrawSpriteXY(0, TempValue0, TempValue2)
396
DrawSpriteXY(1, TempValue0, TempValue2)
397
DrawSpriteXY(2, TempValue0, TempValue2)
398
DrawSpriteXY(3, TempValue0, TempValue2)
399
400
TempValue2 -= 0x600000
401
DrawSpriteXY(1, TempValue1, TempValue2)
402
DrawSpriteXY(2, TempValue1, TempValue2)
403
DrawSpriteXY(3, TempValue1, TempValue2)
404
DrawSpriteXY(4, TempValue1, TempValue2)
405
406
TempValue2 += 0x200000
407
DrawSpriteXY(2, TempValue1, TempValue2)
408
DrawSpriteXY(3, TempValue1, TempValue2)
409
DrawSpriteXY(4, TempValue1, TempValue2)
410
411
TempValue2 += 0x200000
412
DrawSpriteXY(3, TempValue1, TempValue2)
413
DrawSpriteXY(4, TempValue1, TempValue2)
414
415
TempValue2 += 0x200000
416
DrawSpriteXY(4, TempValue1, TempValue2)
417
end sub
418
419
420
sub RSDKLoad
421
CallFunction(EditorHelpers_FindTimePeriod)
422
switch CheckResult
423
case TIME_PRESENT
424
LoadSpriteSheet("R4/Objects.gif")
425
TempValue0 = 163
426
TempValue1 = 1
427
TempValue2 = 196
428
break
429
430
case TIME_PAST
431
LoadSpriteSheet("R4/Objects2.gif")
432
TempValue0 = 1
433
TempValue1 = 157
434
TempValue2 = 34
435
break
436
437
case TIME_GOOD_FUTURE
438
LoadSpriteSheet("R4/Objects2.gif")
439
TempValue0 = 1
440
TempValue1 = 190
441
TempValue2 = 34
442
break
443
444
case TIME_BAD_FUTURE
445
LoadSpriteSheet("R4/Objects2.gif")
446
TempValue0 = 1
447
TempValue1 = 223
448
TempValue2 = 34
449
break
450
451
end switch
452
453
// R4 Crush Blocks
454
SpriteFrame(-80, -16, 32, 32, TempValue0, TempValue1)
455
SpriteFrame(-48, -16, 32, 32, TempValue0, TempValue1)
456
SpriteFrame(-16, -16, 32, 32, TempValue0, TempValue1)
457
SpriteFrame(16, -16, 32, 32, TempValue0, TempValue1)
458
SpriteFrame(48, -16, 32, 32, TempValue0, TempValue1)
459
460
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
461
end sub
462
463