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/GHZ/Bridge.txt
1483 views
1
// ----------------------------------
2
// RSDK Project: Sonic 1
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
// Player Aliases
24
private alias object.xpos : player.xpos
25
private alias object.ypos : player.ypos
26
private alias object.yvel : player.yvel
27
private alias object.gravity : player.gravity
28
private alias object.floorSensorL : player.floorSensorL
29
private alias object.floorSensorC : player.floorSensorC
30
private alias object.floorSensorR : player.floorSensorR
31
private alias object.collisionBottom : player.collisionBottom
32
33
private alias object.value17 : debugMode.currentSelection
34
35
36
// ========================
37
// Function Declarations
38
// ========================
39
40
reserve function Bridge_DebugDraw
41
reserve function Bridge_DebugSpawn
42
43
44
// ========================
45
// Static Values
46
// ========================
47
48
private value Bridge_startDebugID = 0
49
50
51
// ========================
52
// Function Definitions
53
// ========================
54
55
private function Bridge_DebugDraw
56
temp0 = debugMode[0].currentSelection
57
temp0 -= Bridge_startDebugID
58
temp2 = temp0
59
temp0 <<= 19
60
FlipSign(temp0)
61
temp0 += object.xpos
62
temp0 += 0x80000
63
64
temp1 = 0
65
while temp1 < temp2
66
DrawSpriteXY(0, temp0, object.ypos)
67
temp0 += 0x100000
68
temp1++
69
loop
70
71
if temp1 == 0
72
// If no sprites are drawn, then draw at least 1
73
DrawSprite(0)
74
end if
75
end function
76
77
78
private function Bridge_DebugSpawn
79
temp0 = debugMode[0].currentSelection
80
temp0 -= Bridge_startDebugID
81
CreateTempObject(TypeName[Bridge], temp0, object.xpos, object.ypos)
82
83
object[tempObjectPos].startPos = temp0
84
object[tempObjectPos].startPos <<= 19
85
object[tempObjectPos].endPos = object[tempObjectPos].startPos
86
FlipSign(object[tempObjectPos].startPos)
87
object[tempObjectPos].startPos += object[tempObjectPos].xpos
88
object[tempObjectPos].endPos += object[tempObjectPos].xpos
89
object[tempObjectPos].playerID = -1
90
end function
91
92
93
// ========================
94
// Events
95
// ========================
96
97
event ObjectUpdate
98
if object.activePlayerCount > 0
99
if object.timer < 128
100
object.timer += 8
101
end if
102
else
103
if object.timer > 0
104
object.timer -= 8
105
object.playerID = -1
106
else
107
object.depression = 0
108
end if
109
end if
110
object.bridgeDepth = object.depression
111
object.bridgeDepth *= object.timer
112
object.bridgeDepth >>= 7
113
object.activePlayerCount = 0
114
115
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
116
if player[currentPlayer].xpos > object.startPos
117
if player[currentPlayer].xpos < object.endPos
118
if currentPlayer == object.playerID
119
object.stoodPos = player[currentPlayer].xpos
120
object.stoodPos -= object.startPos
121
temp0 = object.stoodPos
122
temp0 >>= 8
123
temp1 = object.endPos
124
temp1 -= object.startPos
125
temp2 = temp1
126
temp2 >>= 16
127
temp0 /= temp2
128
Sin(object.depression, temp0)
129
temp1 >>= 13
130
object.depression *= temp1
131
temp0 = object.ypos
132
temp0 -= 0x300000
133
if player[currentPlayer].ypos > temp0
134
if player[currentPlayer].yvel >= 0
135
temp2 = player[currentPlayer].collisionBottom
136
FlipSign(temp2)
137
temp2 <<= 16
138
temp2 += object.bridgeDepth
139
temp2 -= 0x80000
140
object.activePlayerCount++
141
player[currentPlayer].ypos = object.ypos
142
player[currentPlayer].ypos += temp2
143
player[currentPlayer].gravity = GRAVITY_GROUND
144
player[currentPlayer].yvel = 0
145
player[currentPlayer].floorSensorL = true
146
player[currentPlayer].floorSensorC = true
147
player[currentPlayer].floorSensorR = true
148
else
149
object.playerID = -2
150
end if
151
end if
152
else
153
if player[currentPlayer].yvel >= 0
154
temp0 = player[currentPlayer].xpos
155
temp0 -= object.startPos
156
if temp0 > object.stoodPos
157
temp0 = object.endPos
158
temp0 -= player[currentPlayer].xpos
159
temp3 = object.endPos
160
temp3 -= object.startPos
161
temp3 -= object.stoodPos
162
temp1 = temp0
163
temp1 <<= 7
164
temp1 /= temp3
165
else
166
temp1 = temp0
167
temp1 <<= 7
168
temp1 /= object.stoodPos
169
end if
170
Sin(temp2, temp1)
171
temp2 *= object.bridgeDepth
172
temp2 >>= 9
173
temp2 -= 0x80000
174
if player[currentPlayer].yvel < 0x8000
175
temp3 = temp2
176
temp3 >>= 16
177
temp4 = temp3
178
temp3 -= 8
179
else
180
temp3 = temp2
181
temp3 >>= 16
182
temp4 = temp3
183
temp4 += 8
184
end if
185
186
BoxCollisionTest(C_TOUCH, object.entityPos, -0x400, temp3, 0x400, temp4, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
187
if checkResult == true
188
object.activePlayerCount++
189
player[currentPlayer].ypos = player[currentPlayer].collisionBottom
190
FlipSign(player[currentPlayer].ypos)
191
player[currentPlayer].ypos <<= 16
192
player[currentPlayer].ypos += object.ypos
193
player[currentPlayer].ypos += temp2
194
player[currentPlayer].floorSensorL = true
195
player[currentPlayer].floorSensorC = true
196
player[currentPlayer].floorSensorR = true
197
if currentPlayer == 0
198
if object.playerID < 4
199
if object.playerID > 0
200
object.stoodPos = player[currentPlayer].xpos
201
object.stoodPos -= object.startPos
202
temp0 = object.stoodPos
203
temp0 >>= 8
204
temp1 = object.endPos
205
temp1 -= object.startPos
206
temp2 = temp1
207
temp2 >>= 16
208
temp0 /= temp2
209
Sin(object.depression, temp0)
210
temp1 >>= 13
211
object.depression *= temp1
212
object.bridgeDepth = object.depression
213
object.bridgeDepth *= object.timer
214
object.bridgeDepth >>= 7
215
end if
216
217
object.playerID = 0
218
if player[currentPlayer].yvel < 256
219
object.timer = 128
220
end if
221
end if
222
else
223
if object.playerID == -1
224
object.playerID = currentPlayer
225
if player[currentPlayer].yvel < 256
226
object.timer = 128
227
end if
228
end if
229
230
if object.playerID == -2
231
object.playerID = currentPlayer
232
end if
233
end if
234
235
player[currentPlayer].gravity = GRAVITY_GROUND
236
player[currentPlayer].yvel = 0
237
end if
238
end if
239
end if
240
else
241
if currentPlayer == object.playerID
242
object.playerID = -2
243
object.timer = 32
244
end if
245
end if
246
else
247
if currentPlayer == object.playerID
248
object.playerID = -2
249
object.timer = 32
250
end if
251
end if
252
next
253
end event
254
255
256
event ObjectDraw
257
temp0 = 0
258
temp1 = object.startPos
259
temp1 += 0x80000
260
temp4 = 0x80000
261
temp5 = object.stoodPos
262
temp5 >>= 20
263
while temp0 < temp5
264
temp3 = temp4
265
temp3 <<= 7
266
temp3 /= object.stoodPos
267
Sin(temp2, temp3)
268
temp2 *= object.bridgeDepth
269
temp2 >>= 9
270
temp2 += object.ypos
271
DrawSpriteXY(0, temp1, temp2)
272
temp1 += 0x100000
273
temp4 += 0x100000
274
temp0++
275
loop
276
277
temp2 = object.bridgeDepth
278
temp2 += object.ypos
279
DrawSpriteXY(0, temp1, temp2)
280
281
temp1 += 0x100000
282
temp0++
283
temp5 = object.endPos
284
temp5 -= object.startPos
285
temp5 -= object.stoodPos
286
temp1 = object.endPos
287
temp1 -= 0x80000
288
temp4 = 0x80000
289
while temp0 < object.length
290
temp3 = temp4
291
temp3 <<= 7
292
temp3 /= temp5
293
Sin(temp2, temp3)
294
temp2 *= object.bridgeDepth
295
temp2 >>= 9
296
temp2 += object.ypos
297
DrawSpriteXY(0, temp1, temp2)
298
temp1 -= 0x100000
299
temp4 += 0x100000
300
temp0++
301
loop
302
end event
303
304
305
event ObjectStartup
306
LoadSpriteSheet("GHZ/Objects.gif")
307
308
SpriteFrame(-8, -8, 16, 16, 1, 1)
309
310
foreach (TypeName[Bridge], arrayPos0, ALL_ENTITIES)
311
object[arrayPos0].startPos = object[arrayPos0].length
312
object[arrayPos0].startPos <<= 19
313
object[arrayPos0].endPos = object[arrayPos0].startPos
314
FlipSign(object[arrayPos0].startPos)
315
object[arrayPos0].startPos += object[arrayPos0].xpos
316
object[arrayPos0].endPos += object[arrayPos0].xpos
317
object[arrayPos0].playerID = -1
318
next
319
320
// Add bridges of varying lengths to the debug object list
321
temp0 = 0
322
Bridge_startDebugID = DebugMode_ObjCount
323
Bridge_startDebugID--
324
while temp0 < 16
325
SetTableValue(TypeName[Bridge], DebugMode_ObjCount, DebugMode_TypesTable)
326
SetTableValue(Bridge_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
327
SetTableValue(Bridge_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
328
DebugMode_ObjCount++
329
temp0++
330
loop
331
end event
332
333
334
// ========================
335
// Editor Events
336
// ========================
337
338
event RSDKDraw
339
temp0 = object.length
340
temp2 = temp0
341
temp0 <<= 19
342
FlipSign(temp0)
343
temp0 += object.xpos
344
temp0 += 0x80000
345
temp1 = 0
346
while temp1 < temp2
347
DrawSpriteXY(0, temp0, object.ypos)
348
temp0 += 0x100000
349
temp1++
350
loop
351
if temp1 == 0
352
DrawSprite(0)
353
end if
354
end event
355
356
357
event RSDKLoad
358
LoadSpriteSheet("GHZ/Objects.gif")
359
SpriteFrame(-8, -8, 16, 16, 1, 1)
360
361
SetVariableAlias(ALIAS_VAR_PROPVAL, "length")
362
end event
363
364