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/HPZ/Bridge.txt
1479 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Bridge 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.propertyValue : object.length
13
14
private alias object.value0 : object.activePlayerCount
15
private alias object.value1 : object.timer
16
private alias object.value2 : object.stoodPos
17
private alias object.value3 : object.depression
18
private alias object.value4 : object.bridgeDepth
19
private alias object.value5 : object.playerID
20
private alias object.value6 : object.startPos
21
private alias object.value7 : object.endPos
22
23
private alias object.value8 : object.stoodSegment1C
24
private alias object.value9 : object.stoodSegment1L
25
private alias object.value10 : object.stoodSegment1R
26
private alias object.value11 : object.stoodSegment2C
27
private alias object.value12 : object.stoodSegment2L
28
private alias object.value13 : object.stoodSegment2R
29
private alias object.value14 : object.lastStoodSegment1C
30
private alias object.value15 : object.lastStoodSegment2C
31
private alias object.value16 : object.stoodSegment1AnimTimer
32
private alias object.value17 : object.stoodSegment2AnimTimer
33
private alias object.value18 : object.stoodSegment1FrameC
34
private alias object.value19 : object.stoodSegment1FrameLR
35
private alias object.value20 : object.stoodSegment2FrameC
36
private alias object.value21 : object.stoodSegment2FrameLR
37
private alias object.value22 : object.segmentID
38
39
// Player Aliases
40
private alias object.state : player.state
41
private alias object.xpos : player.xpos
42
private alias object.ypos : player.ypos
43
private alias object.yvel : player.yvel
44
private alias object.gravity : player.gravity
45
private alias object.collisionBottom : player.collisionBottom
46
private alias object.floorSensorC : player.floorSensorC
47
private alias object.floorSensorL : player.floorSensorL
48
private alias object.floorSensorR : player.floorSensorR
49
50
private alias object.value17 : debugMode.currentSelection
51
52
// ========================
53
// Function Declarations
54
// ========================
55
56
reserve function Bridge_DebugDraw
57
reserve function Bridge_DebugSpawn
58
reserve function Bridge_drawSegment
59
60
// ========================
61
// Static Values
62
// ========================
63
64
private value Bridge_startDebugID = 0
65
66
// ========================
67
// Tables
68
// ========================
69
70
private table Bridge_segmentCFrameTable
71
2, 2, 2, 2, 1, 0, 0, 1
72
end table
73
74
private table Bridge_segmentLRFrameTable
75
1, 1, 1, 1, 0, 0, 0, 0
76
end table
77
78
79
// ========================
80
// Function Definitions
81
// ========================
82
83
private function Bridge_DebugDraw
84
temp0 = debugMode[0].currentSelection
85
temp0 -= Bridge_startDebugID
86
temp2 = temp0
87
temp0 <<= 19
88
FlipSign(temp0)
89
temp0 += object.xpos
90
temp0 += 0x80000
91
92
temp1 = 0
93
while temp1 < temp2
94
DrawSpriteXY(0, temp0, object.ypos)
95
temp0 += 0x100000
96
temp1++
97
loop
98
99
if temp1 == 0
100
DrawSprite(0)
101
end if
102
end function
103
104
105
private function Bridge_DebugSpawn
106
temp0 = debugMode[0].currentSelection
107
temp0 -= Bridge_startDebugID
108
CreateTempObject(TypeName[Bridge], temp0, object.xpos, object.ypos)
109
110
object[tempObjectPos].startPos = temp0
111
object[tempObjectPos].startPos <<= 19
112
object[tempObjectPos].endPos = object[tempObjectPos].startPos
113
FlipSign(object[tempObjectPos].startPos)
114
object[tempObjectPos].startPos += object[tempObjectPos].xpos
115
object[tempObjectPos].endPos += object[tempObjectPos].xpos
116
object[tempObjectPos].playerID = -1
117
end function
118
119
120
private function Bridge_drawSegment
121
object.frame = 0
122
123
if object.segmentID == object.stoodSegment1L
124
object.frame = object.stoodSegment1FrameLR
125
end if
126
127
if object.segmentID == object.stoodSegment1R
128
object.frame = object.stoodSegment1FrameLR
129
end if
130
131
if object.segmentID == object.stoodSegment2L
132
object.frame = object.stoodSegment2FrameLR
133
end if
134
135
if object.segmentID == object.stoodSegment2R
136
object.frame = object.stoodSegment2FrameLR
137
end if
138
139
if object.segmentID == object.stoodSegment1C
140
object.frame = object.stoodSegment1FrameC
141
end if
142
143
if object.segmentID == object.stoodSegment2C
144
object.frame = object.stoodSegment2FrameC
145
end if
146
147
DrawSpriteXY(object.frame, temp1, temp2)
148
end function
149
150
151
// ========================
152
// Events
153
// ========================
154
155
event ObjectUpdate
156
if object.activePlayerCount > 0
157
if object.timer < 128
158
object.timer += 8
159
end if
160
else
161
if object.timer > 0
162
object.timer -= 8
163
object.playerID = -1
164
else
165
object.depression = 0
166
end if
167
end if
168
object.bridgeDepth = object.depression
169
object.bridgeDepth *= object.timer
170
object.bridgeDepth >>= 7
171
object.activePlayerCount = 0
172
173
object.stoodSegment1C = -5 // current player stood segment
174
object.stoodSegment2C = -5 // new player stood segment
175
176
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
177
if player[currentPlayer].state != Player_State_LedgePullUp
178
if player[currentPlayer].xpos > object.startPos
179
if player[currentPlayer].xpos < object.endPos
180
if currentPlayer == object.playerID
181
object.stoodPos = player[currentPlayer].xpos
182
object.stoodPos -= object.startPos
183
temp0 = object.stoodPos
184
temp0 >>= 8
185
temp1 = object.endPos
186
temp1 -= object.startPos
187
temp2 = temp1
188
temp2 >>= 16
189
temp0 /= temp2
190
Sin(object.depression, temp0)
191
temp1 >>= 13
192
object.depression *= temp1
193
temp0 = object.ypos
194
temp0 -= 0x300000
195
if player[currentPlayer].ypos > temp0
196
if player[currentPlayer].yvel >= 0
197
temp2 = player[currentPlayer].collisionBottom
198
FlipSign(temp2)
199
temp2 <<= 16
200
temp2 += object.bridgeDepth
201
temp2 -= 0x80000
202
object.activePlayerCount++
203
player[currentPlayer].ypos = object.ypos
204
player[currentPlayer].ypos += temp2
205
player[currentPlayer].gravity = GRAVITY_GROUND
206
player[currentPlayer].yvel = 0
207
player[currentPlayer].floorSensorL = 1
208
player[currentPlayer].floorSensorC = 1
209
player[currentPlayer].floorSensorR = 1
210
object.stoodSegment1C = object.stoodPos
211
object.stoodSegment1C >>= 20
212
else
213
object.playerID = -2
214
end if
215
end if
216
else
217
if player[currentPlayer].yvel >= 0
218
temp0 = player[currentPlayer].xpos
219
temp0 -= object.startPos
220
if temp0 > object.stoodPos
221
temp0 = object.endPos
222
temp0 -= player[currentPlayer].xpos
223
temp3 = object.endPos
224
temp3 -= object.startPos
225
temp3 -= object.stoodPos
226
temp1 = temp0
227
temp1 <<= 7
228
temp1 /= temp3
229
else
230
temp1 = temp0
231
temp1 <<= 7
232
temp1 /= object.stoodPos
233
end if
234
Sin(temp2, temp1)
235
temp2 *= object.bridgeDepth
236
temp2 >>= 9
237
temp2 -= 0x80000
238
if player[currentPlayer].yvel < 0x8000
239
temp3 = temp2
240
temp3 >>= 16
241
temp4 = temp3
242
temp3 -= 8
243
else
244
temp3 = temp2
245
temp3 >>= 16
246
temp4 = temp3
247
temp4 += 8
248
end if
249
250
BoxCollisionTest(C_TOUCH, object.entityPos, -0x400, temp3, 0x400, temp4, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
251
if checkResult == true
252
object.activePlayerCount++
253
player[currentPlayer].ypos = player[currentPlayer].collisionBottom
254
FlipSign(player[currentPlayer].ypos)
255
player[currentPlayer].ypos <<= 16
256
player[currentPlayer].ypos += object.ypos
257
player[currentPlayer].ypos += temp2
258
player[currentPlayer].floorSensorL = true
259
player[currentPlayer].floorSensorC = true
260
player[currentPlayer].floorSensorR = true
261
object.stoodSegment2C = player[currentPlayer].xpos
262
object.stoodSegment2C -= object.startPos
263
object.stoodSegment2C >>= 20
264
if currentPlayer == 0
265
if object.playerID < 4
266
if object.playerID > 0
267
object.stoodPos = player[currentPlayer].xpos
268
object.stoodPos -= object.startPos
269
temp0 = object.stoodPos
270
temp0 >>= 8
271
temp1 = object.endPos
272
temp1 -= object.startPos
273
temp2 = temp1
274
temp2 >>= 16
275
temp0 /= temp2
276
Sin(object.depression, temp0)
277
temp1 >>= 13
278
object.depression *= temp1
279
object.bridgeDepth = object.depression
280
object.bridgeDepth *= object.timer
281
object.bridgeDepth >>= 7
282
end if
283
284
object.playerID = 0
285
if player[currentPlayer].yvel < 256
286
object.timer = 128
287
end if
288
end if
289
else
290
if object.playerID == -1
291
object.playerID = currentPlayer
292
if player[currentPlayer].yvel < 256
293
object.timer = 128
294
end if
295
end if
296
297
if object.playerID == -2
298
object.playerID = currentPlayer
299
end if
300
end if
301
302
player[currentPlayer].gravity = GRAVITY_GROUND
303
player[currentPlayer].yvel = 0
304
end if
305
end if
306
end if
307
else
308
if currentPlayer == object.playerID
309
object.playerID = -2
310
object.timer = 32
311
end if
312
end if
313
else
314
if currentPlayer == object.playerID
315
object.playerID = -2
316
object.timer = 32
317
end if
318
end if
319
end if
320
next
321
322
object.stoodSegment1L = object.stoodSegment1C
323
object.stoodSegment1L--
324
object.stoodSegment1R = object.stoodSegment1C
325
object.stoodSegment1R++
326
327
object.stoodSegment2L = object.stoodSegment2C
328
object.stoodSegment2L--
329
object.stoodSegment2R = object.stoodSegment2C
330
object.stoodSegment2R++
331
332
if object.lastStoodSegment1C != object.stoodSegment1C
333
object.lastStoodSegment1C = object.stoodSegment1C
334
object.stoodSegment1AnimTimer = 0
335
end if
336
337
if object.lastStoodSegment2C != object.stoodSegment2C
338
object.lastStoodSegment2C = object.stoodSegment2C
339
object.stoodSegment2AnimTimer = 0
340
end if
341
342
temp0 = object.stoodSegment1AnimTimer
343
temp0 >>= 2
344
GetTableValue(object.stoodSegment1FrameC, temp0, Bridge_segmentCFrameTable)
345
GetTableValue(object.stoodSegment1FrameLR, temp0, Bridge_segmentLRFrameTable)
346
object.stoodSegment1AnimTimer++
347
object.stoodSegment1AnimTimer &= 31
348
349
temp0 = object.stoodSegment2AnimTimer
350
temp0 >>= 2
351
GetTableValue(object.stoodSegment2FrameC, temp0, Bridge_segmentCFrameTable)
352
GetTableValue(object.stoodSegment2FrameLR, temp0, Bridge_segmentLRFrameTable)
353
object.stoodSegment2AnimTimer++
354
object.stoodSegment2AnimTimer &= 31
355
end event
356
357
358
event ObjectDraw
359
object.segmentID = 0
360
temp0 = 0
361
temp1 = object.startPos
362
temp1 += 0x80000
363
temp4 = 0x80000
364
temp5 = object.stoodPos
365
temp5 >>= 20
366
while temp0 < temp5
367
temp3 = temp4
368
temp3 <<= 7
369
temp3 /= object.stoodPos
370
Sin(temp2, temp3)
371
temp2 *= object.bridgeDepth
372
temp2 >>= 9
373
temp2 += object.ypos
374
CallFunction(Bridge_drawSegment)
375
temp1 += 0x100000
376
temp4 += 0x100000
377
temp0++
378
object.segmentID++
379
loop
380
381
temp2 = object.bridgeDepth
382
temp2 += object.ypos
383
CallFunction(Bridge_drawSegment)
384
temp1 += 0x100000
385
temp0++
386
387
temp5 = object.endPos
388
temp5 -= object.startPos
389
temp5 -= object.stoodPos
390
temp1 = object.endPos
391
temp1 -= 0x80000
392
temp4 = 0x80000
393
394
object.segmentID = object.length
395
object.segmentID--
396
while temp0 < object.length
397
temp3 = temp4
398
temp3 <<= 7
399
temp3 /= temp5
400
Sin(temp2, temp3)
401
temp2 *= object.bridgeDepth
402
temp2 >>= 9
403
temp2 += object.ypos
404
CallFunction(Bridge_drawSegment)
405
temp1 -= 0x100000
406
temp4 += 0x100000
407
temp0++
408
object.segmentID--
409
loop
410
end event
411
412
413
event ObjectStartup
414
LoadSpriteSheet("HPZ/Objects.gif")
415
SpriteFrame(-8, -8, 16, 16, 181, 73)
416
SpriteFrame(-8, -8, 16, 16, 181, 90)
417
SpriteFrame(-8, -8, 16, 16, 181, 107)
418
419
foreach (TypeName[Bridge], arrayPos0, ALL_ENTITIES)
420
object[arrayPos0].startPos = object[arrayPos0].length
421
object[arrayPos0].startPos <<= 19
422
object[arrayPos0].endPos = object[arrayPos0].startPos
423
FlipSign(object[arrayPos0].startPos)
424
object[arrayPos0].startPos += object[arrayPos0].xpos
425
object[arrayPos0].endPos += object[arrayPos0].xpos
426
object[arrayPos0].playerID = -1
427
next
428
429
temp0 = 0
430
Bridge_startDebugID = DebugMode_ObjCount
431
Bridge_startDebugID--
432
while temp0 < 16
433
SetTableValue(TypeName[Bridge], DebugMode_ObjCount, DebugMode_TypesTable)
434
SetTableValue(Bridge_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
435
SetTableValue(Bridge_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
436
DebugMode_ObjCount++
437
temp0++
438
loop
439
end event
440
441
442
event RSDKDraw
443
temp0 = object.length
444
temp2 = temp0
445
temp0 <<= 19
446
FlipSign(temp0)
447
temp0 += object.xpos
448
temp0 += 0x80000
449
450
temp1 = 0
451
while temp1 < temp2
452
DrawSpriteXY(0, temp0, object.ypos)
453
temp0 += 0x100000
454
temp1++
455
loop
456
457
if temp1 == 0
458
DrawSprite(0)
459
end if
460
end event
461
462
463
event RSDKLoad
464
LoadSpriteSheet("HPZ/Objects.gif")
465
SpriteFrame(-8, -8, 16, 16, 181, 73)
466
SpriteFrame(-8, -8, 16, 16, 181, 90)
467
SpriteFrame(-8, -8, 16, 16, 181, 107)
468
469
SetVariableAlias(ALIAS_VAR_PROPVAL, "length")
470
end event
471
472