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/Cylinder.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Cylinder 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.activePlayers
13
private alias object.value2 : object.player1.angle
14
private alias object.value3 : object.player2.angle
15
private alias object.value4 : object.player3.angle
16
private alias object.value5 : object.player4.angle
17
private alias object.value6 : object.player1.direction
18
private alias object.value7 : object.player2.direction
19
private alias object.value8 : object.player3.direction
20
private alias object.value9 : object.player4.direction
21
private alias object.value10 : object.hitbox.left
22
private alias object.value11 : object.hitbox.right
23
private alias object.value12 : object.size
24
25
// Player Aliases
26
private alias object.state : player.state
27
private alias object.xpos : player.xpos
28
private alias object.ypos : player.ypos
29
private alias object.xvel : player.xvel
30
private alias object.yvel : player.yvel
31
private alias object.rotation : player.rotation
32
private alias object.angle : player.angle
33
private alias object.direction : player.direction
34
private alias object.gravity : player.gravity
35
private alias object.frame : player.frame
36
private alias object.prevAnimation : player.prevAnimation
37
private alias object.animationSpeed : player.animationSpeed
38
private alias object.animation : player.animation
39
private alias object.collisionTop : player.collisionTop
40
private alias object.collisionBottom : player.collisionBottom
41
42
43
// ========================
44
// Tables
45
// ========================
46
47
private table Cylinder_playerFrameTable
48
6, 5, 4, 3, 2, 1, 0, 11, 10, 9, 8, 7, 6
49
end table
50
51
52
// ========================
53
// Events
54
// ========================
55
56
event ObjectUpdate
57
object.priority = PRIORITY_ACTIVE
58
59
temp2 = 0
60
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
61
GetBit(temp3, object.activePlayers, temp2)
62
if temp3 == false
63
BoxCollisionTest(C_TOUCH, object.entityPos, object.hitbox.left, 60, object.hitbox.right, 76, currentPlayer, C_BOX, 1, C_BOX, C_BOX)
64
if player[currentPlayer].yvel < 0
65
checkResult = false
66
end if
67
68
if checkResult == true
69
SetBit(object.activePlayers, temp2, true)
70
player[currentPlayer].yvel = 0
71
72
// Very strange that it explicitly supports up to 4 players here, there's only 3 playable characters to begin with so not sure how that would've worked
73
// It should be noted that if 4 players were loaded at once, there'd be no object slot clashes either (that would happen if 5 or more were loaded though)
74
switch temp2
75
case 0
76
object.player1.angle = 0
77
object.player1.direction = player[currentPlayer].direction
78
break
79
80
case 1
81
object.player2.angle = 0
82
object.player2.direction = player[currentPlayer].direction
83
break
84
85
case 2
86
object.player3.angle = 0
87
object.player3.direction = player[currentPlayer].direction
88
break
89
90
case 3
91
object.player4.angle = 0
92
object.player4.direction = player[currentPlayer].direction
93
break
94
95
end switch
96
else
97
temp0 = player[currentPlayer].collisionTop
98
temp0 <<= 16
99
temp0 += player[currentPlayer].ypos
100
temp0 -= object.ypos
101
if temp0 < -0x300000
102
BoxCollisionTest(C_SOLID, object.entityPos, object.hitbox.left, -64, object.hitbox.right, -48, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
103
else
104
temp0 = player[currentPlayer].collisionBottom
105
temp0 <<= 16
106
temp0 += player[currentPlayer].ypos
107
temp0 -= object.ypos
108
if temp0 > 0x400000
109
BoxCollisionTest(C_SOLID, object.entityPos, object.hitbox.left, 48, object.hitbox.right, 64, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
110
end if
111
end if
112
end if
113
else
114
temp3 = 0
115
temp0 = player[currentPlayer].xpos
116
temp0 -= object.xpos
117
Abs(temp0)
118
119
CheckLower(player[currentPlayer].yvel, -0x40000)
120
temp3 |= checkResult
121
CheckGreater(temp0, object.size)
122
temp3 |= checkResult
123
if temp3 == true
124
SetBit(object.activePlayers, temp2, false)
125
if player[currentPlayer].gravity == 1
126
if player[currentPlayer].yvel >= 0
127
if player[currentPlayer].state != Player_State_Carried
128
if player[currentPlayer].animation != ANI_SKIDDING
129
if player[currentPlayer].xvel < 0
130
player[currentPlayer].direction = FACING_LEFT
131
end if
132
133
player[currentPlayer].animation = ANI_TWIRL
134
player[currentPlayer].angle = 0
135
player[currentPlayer].rotation = 0
136
end if
137
end if
138
end if
139
end if
140
141
switch temp2
142
case 0
143
temp6 = object.player1.angle
144
break
145
146
case 1
147
temp6 = object.player2.angle
148
break
149
150
case 2
151
temp6 = object.player3.angle
152
break
153
154
case 3
155
temp6 = object.player4.angle
156
break
157
158
end switch
159
160
temp6 += 0x20
161
temp6 &= 0xFF
162
if temp6 >= 64
163
player[currentPlayer].yvel = 0
164
else
165
player[currentPlayer].yvel >>= 1
166
end if
167
else
168
player[currentPlayer].yvel = 0
169
temp0 >>= 16
170
switch temp2
171
case 0
172
temp6 = object.player1.angle
173
temp7 = object.player1.direction
174
break
175
176
case 1
177
temp6 = object.player2.angle
178
temp7 = object.player2.direction
179
break
180
181
case 2
182
temp6 = object.player3.angle
183
temp7 = object.player3.direction
184
break
185
186
case 3
187
temp6 = object.player4.angle
188
temp7 = object.player4.direction
189
break
190
191
end switch
192
193
temp6 += 4
194
temp6 &= 0xFF
195
Cos256(player[currentPlayer].ypos, temp6)
196
player[currentPlayer].ypos *= 42
197
player[currentPlayer].ypos >>= 8
198
player[currentPlayer].ypos -= player[currentPlayer].collisionBottom
199
player[currentPlayer].ypos += 19
200
player[currentPlayer].ypos <<= 16
201
player[currentPlayer].ypos += object.ypos
202
if player[currentPlayer].state == Player_State_Ground
203
if player[currentPlayer].gravity == 1
204
player[currentPlayer].prevAnimation = ANI_TWIRL
205
player[currentPlayer].animation = ANI_TWIRL
206
player[currentPlayer].animationSpeed = 0
207
player[currentPlayer].direction = 0
208
209
temp0 = temp6
210
temp0 /= 21
211
if player[currentPlayer].xvel != 0
212
if player[currentPlayer].xvel > 0
213
temp7 = FACING_RIGHT
214
else
215
temp7 = FACING_LEFT
216
end if
217
end if
218
219
if temp7 == FACING_RIGHT
220
player[currentPlayer].frame = temp0
221
player[currentPlayer].rotation = 0x000
222
else
223
GetTableValue(player[currentPlayer].frame, temp0, Cylinder_playerFrameTable)
224
player[currentPlayer].rotation = 0x100
225
end if
226
end if
227
end if
228
229
if player[currentPlayer].state == Player_State_Roll
230
if player[currentPlayer].xvel != 0
231
if player[currentPlayer].xvel > 0
232
player[currentPlayer].direction = FACING_RIGHT
233
else
234
player[currentPlayer].direction = FACING_LEFT
235
end if
236
end if
237
end if
238
239
switch temp2
240
case 0
241
object.player1.angle = temp6
242
object.player1.direction = temp7
243
break
244
245
case 1
246
object.player2.angle = temp6
247
object.player2.direction = temp7
248
break
249
250
case 2
251
object.player3.angle = temp6
252
object.player3.direction = temp7
253
break
254
255
case 3
256
object.player4.angle = temp6
257
object.player4.direction = temp7
258
break
259
260
end switch
261
262
player[currentPlayer].gravity = GRAVITY_GROUND
263
end if
264
end if
265
266
temp2++
267
next
268
269
if object.activePlayers != 0
270
if object.propertyValue == 0
271
if object.outOfBounds == true
272
object.priority = PRIORITY_BOUNDS
273
end if
274
end if
275
276
temp0 = false
277
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
278
BoxCollisionTest(C_TOUCH, object.entityPos, object.hitbox.left, -64, object.hitbox.right, 64, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
279
temp0 |= checkResult
280
next
281
282
if temp0 == false
283
object.activePlayers = 0
284
end if
285
end if
286
end event
287
288
289
event ObjectStartup
290
foreach (TypeName[Cylinder], arrayPos0, ALL_ENTITIES)
291
if object[arrayPos0].propertyValue == 0
292
object[arrayPos0].hitbox.right = 192
293
object[arrayPos0].priority = PRIORITY_BOUNDS
294
else
295
object[arrayPos0].hitbox.right = 384
296
297
// The Cylinder is too large to run with traditional bounds, just make it always active
298
object[arrayPos0].priority = PRIORITY_ACTIVE
299
end if
300
301
object[arrayPos0].size = object[arrayPos0].hitbox.right
302
object[arrayPos0].size <<= 16
303
object[arrayPos0].hitbox.left = object[arrayPos0].hitbox.right
304
FlipSign(object[arrayPos0].hitbox.left)
305
next
306
end event
307
308
309
// ========================
310
// Editor Events
311
// ========================
312
313
event RSDKEdit
314
if editor.returnVariable == true
315
switch editor.variableID
316
case EDIT_VAR_PROPVAL // property value
317
checkResult = object.propertyValue
318
break
319
320
case 0 // type
321
checkResult = object.propertyValue
322
break
323
324
end switch
325
else
326
switch editor.variableID
327
case EDIT_VAR_PROPVAL // property value
328
object.propertyValue = editor.variableValue
329
break
330
331
case 0 // type
332
object.propertyValue = editor.variableValue
333
break
334
335
end switch
336
end if
337
end event
338
339
340
event RSDKDraw
341
DrawSprite(0)
342
343
if editor.showGizmos == true
344
editor.drawingOverlay = true
345
346
// Draw the Cylinder's hitbox
347
348
if object.propertyValue == 0
349
temp0 = 192
350
else
351
temp0 = 384
352
end if
353
354
temp2 = temp0
355
356
temp1 = 64; temp3 = 64;
357
CallFunction(EditorHelpers_DrawHitbox)
358
359
editor.drawingOverlay = false
360
end if
361
end event
362
363
364
event RSDKLoad
365
LoadSpriteSheet("Global/Display.gif")
366
SpriteFrame(-8, -8, 16, 16, 168, 18) // "trigger" - #0
367
368
AddEditorVariable("size")
369
SetActiveVariable("size")
370
AddEnumVariable("Small", 0)
371
AddEnumVariable("Large", 1)
372
end event
373
374