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/Transporter.txt
1478 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Transporter 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.playerID
13
private alias object.value1 : object.nodePos.x
14
private alias object.value2 : object.nodePos.y
15
private alias object.value3 : object.nodeChangeDelay
16
private alias object.value4 : object.tablePtr
17
private alias object.value5 : object.tableSize
18
private alias object.value6 : object.tablePos
19
private alias object.value7 : object.parent
20
private alias object.value8 : object.activePlayers
21
22
// States
23
private alias 0 : TRANSPORTER_WAITING
24
private alias 1 : TRANSPORTER_ACTIVATING
25
private alias 2 : TRANSPORTER_TRANSPORTING
26
27
// Types
28
private alias 0 : TRANSPORTER_TYPE_LDR
29
private alias 1 : TRANSPORTER_TYPE_R
30
private alias 2 : TRANSPORTER_TYPE_LDR_2
31
private alias 3 : TRANSPORTER_TYPE_3
32
private alias 4 : TRANSPORTER_TYPE_4
33
private alias 5 : TRANSPORTER_TYPE_RUL
34
private alias 6 : TRANSPORTER_TYPE_LUR
35
private alias 7 : TRANSPORTER_TYPE_RUL_1
36
private alias 8 : TRANSPORTER_TYPE_RDL
37
private alias 9 : TRANSPORTER_TYPE_9
38
private alias 10 : TRANSPORTER_TYPE_R0
39
private alias 11 : TRANSPORTER_TYPE_LUR_2
40
private alias 12 : TRANSPORTER_TYPE_RUL_2
41
42
// Player Aliases
43
private alias object.state : player.state
44
private alias object.xpos : player.xpos
45
private alias object.ypos : player.ypos
46
private alias object.xvel : player.xvel
47
private alias object.yvel : player.yvel
48
private alias object.speed : player.speed
49
private alias object.gravity : player.gravity
50
private alias object.animationSpeed : player.animationSpeed
51
private alias object.animation : player.animation
52
private alias object.interaction : player.interaction
53
private alias object.scrollTracking : player.scrollTracking
54
private alias object.tileCollisions : player.tileCollisions
55
56
private alias object.value5 : player.rollAnimationSpeed
57
private alias object.value7 : player.invincibleTimer
58
59
60
// ========================
61
// Function Declarations
62
// ========================
63
64
reserve function Transporter_HandleNewNode
65
66
67
// ========================
68
// Tables
69
// ========================
70
71
private table Transporter_tableSizes
72
6, 2, 6, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6
73
end table
74
75
private table Transporter_frameTable
76
1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0
77
end table
78
79
private table Transporter_tablePtrs[13]
80
81
private table Transporter_movementTable0
82
0x7A80000, 0x2700000, 0x7500000, 0x2700000, 0x7400000, 0x2800000, 0x7400000, 0x3E00000, 0x7500000, 0x3F00000, 0x7A80000, 0x3F00000
83
end table
84
85
private table Transporter_movementTable1
86
0xC580000, 0x5F00000, 0xE280000, 0x5F00000
87
end table
88
89
private table Transporter_movementTable2
90
0x18280000, 0x6B00000, 0x17D00000, 0x6B00000, 0x17C00000, 0x6C00000, 0x17C00000, 0x7E00000, 0x17B00000, 0x7F00000, 0x17580000, 0x7F00000
91
end table
92
93
private table Transporter_movementTable3
94
0x5D80000, 0x3700000, 0x7800000, 0x3700000
95
end table
96
97
private table Transporter_movementTable4
98
0x5D80000, 0x5F00000, 0x7000000, 0x5F00000
99
end table
100
101
private table Transporter_movementTable5
102
0xBD80000, 0x1F00000, 0xC300000, 0x1F00000, 0xC400000, 0x1E00000, 0xC400000, 0xC00000, 0xC500000, 0xB00000, 0xCA80000, 0xB00000
103
end table
104
105
private table Transporter_movementTable6
106
0x17280000, 0x3300000, 0x15D00000, 0x3300000, 0x15C00000, 0x3200000, 0x15C00000, 0x2400000, 0x15D00000, 0x2300000, 0x16280000, 0x2300000
107
end table
108
109
private table Transporter_movementTable7
110
0x6D80000, 0x1F00000, 0x7300000, 0x1F00000, 0x7400000, 0x1E00000, 0x7400000, 0x1000000, 0x7500000, 0xF00000, 0x7A80000, 0xF00000
111
end table
112
113
private table Transporter_movementTable8
114
0x7D80000, 0x3300000, 0x8280000, 0x3300000, 0x8400000, 0x3400000, 0x8400000, 0x4580000, 0x8280000, 0x4700000, 0x7D80000, 0x4700000
115
end table
116
117
private table Transporter_movementTable9
118
0xFD80000, 0x3B00000, 0x10280000, 0x3B00000, 0x10400000, 0x3980000, 0x10400000, 0x2C40000, 0x10580000, 0x2B00000, 0x10A80000, 0x2B00000
119
end table
120
121
private table Transporter_movementTable10
122
0xFD80000, 0x4B00000, 0x10280000, 0x4B00000, 0x10400000, 0x4C00000, 0x10400000, 0x5D80000, 0x10580000, 0x5F00000, 0x10A80000, 0x5F00000
123
end table
124
125
private table Transporter_movementTable11
126
0x20580000, 0x4300000, 0x20A80000, 0x4300000, 0x20C00000, 0x4180000, 0x20C00000, 0x2C00000, 0x20D00000, 0x2B00000, 0x21280000, 0x2B00000
127
end table
128
129
private table Transporter_movementTable12
130
0x23280000, 0x5B00000, 0x22D00000, 0x5B00000, 0x22C00000, 0x5A00000, 0x22C00000, 0x4C00000, 0x22D00000, 0x4B00000, 0x23280000, 0x4B00000
131
end table
132
133
134
// ========================
135
// Function Definitions
136
// ========================
137
138
private function Transporter_HandleNewNode
139
temp0 = object.nodePos.x
140
temp2 = 0x1000
141
temp0 -= player[currentPlayer].xpos
142
if temp0 < 0
143
FlipSign(temp0)
144
FlipSign(temp2)
145
end if
146
temp0 >>= 16
147
148
temp1 = object.nodePos.y
149
temp3 = 0x1000
150
temp1 -= player[currentPlayer].ypos
151
if temp1 < 0
152
FlipSign(temp1)
153
FlipSign(temp3)
154
end if
155
temp1 >>= 16
156
157
if temp1 >= temp0
158
temp1 = object.nodePos.y
159
temp1 -= player[currentPlayer].ypos
160
temp1 &= 0xFFFF0000
161
temp1 /= temp3
162
temp0 = object.nodePos.x
163
temp0 -= player[currentPlayer].xpos
164
if temp0 != 0
165
temp0 &= 0xFFFF0000
166
#platform: USE_STANDALONE
167
temp0 /= temp1
168
#endplatform
169
#platform: USE_ORIGINS
170
if temp1 != 0
171
temp0 /= temp1
172
end if
173
#endplatform
174
end if
175
temp0 <<= 8
176
temp3 <<= 8
177
temp1 >>= 8
178
player[currentPlayer].xvel = temp0
179
player[currentPlayer].yvel = temp3
180
Abs(temp1)
181
object.nodeChangeDelay = temp1
182
else
183
temp0 = object.nodePos.x
184
temp0 -= player[currentPlayer].xpos
185
temp0 &= 0xFFFF0000
186
temp0 /= temp2
187
temp1 = object.nodePos.y
188
temp1 -= player[currentPlayer].ypos
189
if temp1 != 0
190
temp1 &= 0xFFFF0000
191
#platform: USE_STANDALONE
192
temp1 /= temp0
193
#endplatform
194
#platform: USE_ORIGINS
195
if temp0 != 0
196
temp1 /= temp0
197
end if
198
#endplatform
199
end if
200
temp1 <<= 8
201
temp2 <<= 8
202
temp0 >>= 8
203
player[currentPlayer].xvel = temp2
204
player[currentPlayer].yvel = temp1
205
Abs(temp0)
206
object.nodeChangeDelay = temp0
207
end if
208
end function
209
210
211
// ========================
212
// Events
213
// ========================
214
215
event ObjectUpdate
216
switch object.state
217
case TRANSPORTER_WAITING
218
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
219
#platform: USE_ORIGINS
220
temp3 = 1
221
temp3 <<= currentPlayer
222
temp4 = temp3
223
temp4 &= object.activePlayers
224
if temp4 == false
225
#endplatform
226
if player[currentPlayer].state != Player_State_Static
227
temp0 = player[currentPlayer].xpos
228
temp0 -= object.xpos
229
temp0 += 0x30000
230
if object.direction == FLIP_X
231
temp0 += 0xA0000
232
end if
233
234
if temp0 >= 0
235
if temp0 < 0x100000
236
temp1 = player[currentPlayer].ypos
237
temp1 -= object.ypos
238
temp1 += 0x200000
239
if temp1 >= 0
240
if temp1 < 0x400000
241
temp0 = object.propertyValue
242
temp0 &= 15
243
CreateTempObject(TypeName[Transporter], object.propertyValue, object.xpos, object.ypos)
244
GetTableValue(object[tempObjectPos].tablePtr, temp0, Transporter_tablePtrs)
245
GetTableValue(object[tempObjectPos].tableSize, temp0, Transporter_tableSizes)
246
GetTableValue(temp1, 0, object[tempObjectPos].tablePtr)
247
GetTableValue(temp2, 2, object[tempObjectPos].tablePtr)
248
if temp2 > temp1
249
object[tempObjectPos].direction = FLIP_X
250
end if
251
object[tempObjectPos].state = TRANSPORTER_ACTIVATING
252
object[tempObjectPos].playerID = currentPlayer
253
254
player[currentPlayer].state = Player_State_Static
255
player[currentPlayer].interaction = false
256
player[currentPlayer].tileCollisions = false
257
player[currentPlayer].animation = ANI_JUMPING
258
player[currentPlayer].rollAnimationSpeed = 0
259
player[currentPlayer].animationSpeed = 0
260
player[currentPlayer].xvel = 0
261
player[currentPlayer].yvel = 0
262
player[currentPlayer].gravity = 1
263
player[currentPlayer].scrollTracking = true
264
player[currentPlayer].xpos = object.xpos
265
player[currentPlayer].ypos = object.ypos
266
PlaySfx(SfxName[Rolling], false)
267
268
#platform: USE_ORIGINS
269
object.activePlayers |= temp3
270
object[tempObjectPos].parent = object.entityPos
271
#endplatform
272
end if
273
end if
274
end if
275
end if
276
end if
277
#platform: USE_ORIGINS
278
end if
279
#endplatform
280
next
281
break
282
283
case TRANSPORTER_ACTIVATING
284
currentPlayer = object.playerID
285
Sin256(player[currentPlayer].ypos, object.angle)
286
object.angle += 2
287
288
player[currentPlayer].ypos <<= 11
289
FlipSign(player[currentPlayer].ypos)
290
player[currentPlayer].ypos += object.ypos
291
if player[currentPlayer].invincibleTimer < 2
292
player[currentPlayer].invincibleTimer = 2
293
end if
294
295
if object.angle == 0x80
296
temp0 = object.tablePos
297
temp0 <<= 1
298
GetTableValue(object.nodePos.x, temp0, object.tablePtr)
299
temp0++
300
GetTableValue(object.nodePos.y, temp0, object.tablePtr)
301
CallFunction(Transporter_HandleNewNode)
302
object.state++
303
object.frame = 0
304
PlaySfx(SfxName[Release], false)
305
end if
306
break
307
308
case TRANSPORTER_TRANSPORTING
309
currentPlayer = object.playerID
310
object.nodeChangeDelay--
311
if object.nodeChangeDelay < 0
312
player[currentPlayer].xpos = object.nodePos.x
313
player[currentPlayer].ypos = object.nodePos.y
314
object.tablePos++
315
if object.tablePos >= object.tableSize
316
object.type = TypeName[Blank Object]
317
318
#platform: USE_ORIGINS
319
temp1 = 1
320
temp1 <<= currentPlayer
321
arrayPos0 = object.parent
322
object[arrayPos0].activePlayers ^= temp1
323
#endplatform
324
325
player[currentPlayer].ypos &= 0x7FF0000
326
player[currentPlayer].interaction = true
327
player[currentPlayer].tileCollisions = true
328
329
GetBit(temp1, object.propertyValue, 4)
330
if temp1 == false
331
player[currentPlayer].xvel = 0
332
player[currentPlayer].yvel = 0x20000
333
player[currentPlayer].speed = 0
334
player[currentPlayer].animation = ANI_WALKING
335
#platform: USE_STANDALONE
336
player[currentPlayer].state = Player_State_Air
337
#endplatform
338
#platform: USE_ORIGINS
339
player[currentPlayer].state = Player_State_Air_NoDropDash
340
#endplatform
341
else
342
player[currentPlayer].xvel = 0x100000
343
player[currentPlayer].speed = 0x100000
344
player[currentPlayer].state = Player_State_Ground
345
end if
346
else
347
temp0 = object.tablePos
348
temp0 <<= 1
349
GetTableValue(object.nodePos.x, temp0, object.tablePtr)
350
temp0++
351
GetTableValue(object.nodePos.y, temp0, object.tablePtr)
352
CallFunction(Transporter_HandleNewNode)
353
end if
354
end if
355
break
356
357
end switch
358
359
if object.state >= TRANSPORTER_ACTIVATING
360
temp0 = object.animationTimer
361
temp0 >>= 1
362
GetTableValue(object.frame, temp0, Transporter_frameTable)
363
object.animationTimer++
364
if object.animationTimer == 30
365
object.animationTimer = 26
366
end if
367
end if
368
end event
369
370
371
event ObjectDraw
372
DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
373
end event
374
375
376
event ObjectStartup
377
LoadSpriteSheet("MPZ/Objects.gif")
378
SpriteFrame(0, 0, 1, 1, 1, 1)
379
SpriteFrame(-8, -24, 28, 40, 0, 29)
380
381
SetTableValue(Transporter_movementTable0, TRANSPORTER_TYPE_LDR, Transporter_tablePtrs)
382
SetTableValue(Transporter_movementTable1, TRANSPORTER_TYPE_R, Transporter_tablePtrs)
383
SetTableValue(Transporter_movementTable2, TRANSPORTER_TYPE_LDR_2, Transporter_tablePtrs)
384
SetTableValue(Transporter_movementTable3, TRANSPORTER_TYPE_3, Transporter_tablePtrs)
385
SetTableValue(Transporter_movementTable4, TRANSPORTER_TYPE_4, Transporter_tablePtrs)
386
SetTableValue(Transporter_movementTable5, TRANSPORTER_TYPE_RUL, Transporter_tablePtrs)
387
SetTableValue(Transporter_movementTable6, TRANSPORTER_TYPE_LUR, Transporter_tablePtrs)
388
SetTableValue(Transporter_movementTable7, TRANSPORTER_TYPE_RUL_1, Transporter_tablePtrs)
389
SetTableValue(Transporter_movementTable8, TRANSPORTER_TYPE_RDL, Transporter_tablePtrs)
390
SetTableValue(Transporter_movementTable9, TRANSPORTER_TYPE_9, Transporter_tablePtrs)
391
SetTableValue(Transporter_movementTable10, TRANSPORTER_TYPE_R0, Transporter_tablePtrs)
392
SetTableValue(Transporter_movementTable11, TRANSPORTER_TYPE_LUR_2, Transporter_tablePtrs)
393
SetTableValue(Transporter_movementTable12, TRANSPORTER_TYPE_RUL_2, Transporter_tablePtrs)
394
end event
395
396
397
// ========================
398
// Editor Events
399
// ========================
400
401
event RSDKEdit
402
if editor.returnVariable == true
403
switch editor.variableID
404
case EDIT_VAR_PROPVAL // property value
405
checkResult = object.propertyValue
406
break
407
408
case 0 // type
409
checkResult = object.propertyValue
410
checkResult &= 15
411
break
412
413
case 1 // exitType
414
GetBit(checkResult, object.propertyValue, 4)
415
break
416
417
end switch
418
else
419
switch editor.variableID
420
case EDIT_VAR_PROPVAL // property value
421
object.propertyValue = editor.variableValue
422
break
423
424
case 0 // type
425
object.propertyValue &= 240
426
editor.variableValue &= 15
427
428
object.propertyValue |= editor.variableValue
429
break
430
431
case 1 // exitType
432
CheckNotEqual(editor.variableValue, false)
433
SetBit(object.propertyValue, 4, checkResult)
434
break
435
436
end switch
437
end if
438
end event
439
440
441
event RSDKDraw
442
DrawSprite(0)
443
end event
444
445
446
event RSDKLoad
447
LoadSpriteSheet("Global/Display.gif")
448
SpriteFrame(-8, -8, 16, 16, 168, 18) // "trigger" - #0
449
450
AddEditorVariable("type")
451
SetActiveVariable("type")
452
AddEnumVariable("Left, Down, Right", TRANSPORTER_TYPE_LDR)
453
AddEnumVariable("Right", TRANSPORTER_TYPE_R)
454
AddEnumVariable("Left, Down, Right (Alt)", TRANSPORTER_TYPE_LDR_2)
455
AddEnumVariable("Type 3", TRANSPORTER_TYPE_3)
456
AddEnumVariable("Type 4", TRANSPORTER_TYPE_4)
457
AddEnumVariable("Right, Up, Left", TRANSPORTER_TYPE_RUL)
458
AddEnumVariable("Left (Long), Up, Right", TRANSPORTER_TYPE_LUR)
459
AddEnumVariable("Right, Up, Left (Alt 1)", TRANSPORTER_TYPE_RUL_1)
460
AddEnumVariable("Right, Down, Left", TRANSPORTER_TYPE_RDL)
461
AddEnumVariable("Type9", TRANSPORTER_TYPE_9)
462
AddEnumVariable("Type10", TRANSPORTER_TYPE_R0)
463
AddEnumVariable("Left, Up, Right", TRANSPORTER_TYPE_LUR_2)
464
AddEnumVariable("Right, Up, Left (Alt 2)", TRANSPORTER_TYPE_RUL_2)
465
466
AddEditorVariable("exitType")
467
SetActiveVariable("exitType")
468
AddEnumVariable("Transporter Exit", 0)
469
AddEnumVariable("Shoot Out From Exit", 1)
470
end event
471
472