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/SBZ/PushButton.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 1
3
// Script Description: Push Button 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.stood
13
private alias object.value1 : object.exitPos.y
14
private alias object.value2 : object.fadeTimer
15
16
private alias 0 : PUSHBUTTON_ACTIVE
17
private alias 1 : PUSHBUTTON_PLAYERFELL
18
19
// Cutscene Bridge Aliases
20
private alias object.state : cutBridge.state
21
private alias object.value0 : cutBridge.timer
22
23
private alias 0 : CUTBRIDGE_ACTIVE
24
private alias 1 : CUTBRIDGE_COLLAPSE
25
26
// Player Aliases
27
private alias object.type : player.type
28
private alias object.ypos : player.ypos
29
private alias object.yvel : player.yvel
30
private alias object.direction : player.direction
31
private alias object.gravity : player.gravity
32
private alias object.animation : player.animation
33
private alias object.collisionBottom : player.collisionBottom
34
35
// Game Mode Aliases
36
private alias 0 : MODE_NOSAVE
37
private alias 1 : MODE_SAVEGAME
38
private alias 2 : MODE_TIMEATTACK
39
40
41
// ========================
42
// Function Declarations
43
// ========================
44
45
reserve function PushButton_DebugDraw
46
reserve function PushButton_DebugSpawn
47
48
49
// ========================
50
// Tables
51
// ========================
52
53
private function PushButton_DebugDraw
54
DrawSprite(0)
55
end function
56
57
58
private function PushButton_DebugSpawn
59
CreateTempObject(TypeName[Push Button], 0, object.xpos, object.ypos)
60
end function
61
62
63
// ========================
64
// Events
65
// ========================
66
67
event ObjectUpdate
68
object.stood = false
69
70
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
71
if object.frame == 0
72
BoxCollisionTest(C_SOLID, object.entityPos, -14, -4, 14, 8, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
73
if checkResult == COL_TOP
74
object.stood = true
75
player[currentPlayer].ypos += 0x60000
76
PlaySfx(SfxName[Button Press], false)
77
end if
78
else
79
if player[currentPlayer].yvel >= 0
80
BoxCollisionTest(C_PLATFORM, object.entityPos, -14, -4, 14, 12, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
81
if checkResult == true
82
object.stood = true
83
player[currentPlayer].ypos += 0x20000
84
else
85
BoxCollisionTest(C_TOUCH, object.entityPos, -20, -12, 20, 8, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
86
if checkResult == true
87
player[currentPlayer].ypos = player[currentPlayer].collisionBottom
88
FlipSign(player[currentPlayer].ypos)
89
player[currentPlayer].ypos <<= 16
90
player[currentPlayer].ypos += object.ypos
91
player[currentPlayer].ypos -= 0x20000
92
player[currentPlayer].gravity = GRAVITY_AIR
93
end if
94
end if
95
end if
96
end if
97
next
98
99
if object.propertyValue == 1
100
// object[+1] should be an Eggman object
101
arrayPos0 = object.entityPos
102
arrayPos0++
103
if object.frame == 0
104
BoxCollisionTest(C_SOLID, object.entityPos, -14, -4, 14, 8, arrayPos0, -22, -24, 16, 32)
105
if checkResult == COL_TOP
106
object.stood = true
107
object[arrayPos0].ypos += 0x60000
108
object[arrayPos0].xvel = 0
109
object[arrayPos0].yvel = 0
110
object[arrayPos0].state++
111
PlaySfx(SfxName[Button Press], false)
112
end if
113
else
114
BoxCollisionTest(C_TOUCH, object.entityPos, -14, -4, 14, 8, arrayPos0, -22, -24, 16, 32)
115
if checkResult == true
116
object.stood = true
117
end if
118
end if
119
120
if object.stood == true
121
arrayPos0++
122
if cutBridge[arrayPos0].state == CUTBRIDGE_ACTIVE
123
object.exitPos.y = stage.deathBoundary
124
object.exitPos.y += 0x100000
125
stage.deathBoundary = 0x7FFF0000
126
arrayPos1 = arrayPos0
127
arrayPos1 += 7
128
temp0 = 0
129
while arrayPos1 >= arrayPos0
130
cutBridge[arrayPos1].state = CUTBRIDGE_COLLAPSE
131
cutBridge[arrayPos1].timer = temp0
132
temp0 += 20
133
arrayPos1--
134
loop
135
end if
136
end if
137
138
if object.state == PUSHBUTTON_PLAYERFELL
139
options.touchControls = false
140
object.fadeTimer += 4
141
music.volume -= 2
142
SetScreenFade(0, 0, 0, object.fadeTimer)
143
if object.fadeTimer == 384
144
fadeColor = 0
145
object.fadeTimer = 0
146
lampPostID = 0
147
object.direction = FACING_RIGHT
148
stage.listPos++
149
if options.gameMode == MODE_SAVEGAME
150
arrayPos1 = options.saveSlot
151
arrayPos1 <<= 3
152
if stage.player2Enabled == true
153
#platform: USE_STANDALONE
154
saveRAM[arrayPos1] = 3
155
#endplatform
156
#platform: USE_ORIGINS
157
switch stage.playerListPos
158
case PLAYER_SONIC_A
159
saveRAM[arrayPos1] = PLAYER_SONIC_TAILS
160
break
161
case PLAYER_AMY_A
162
saveRAM[arrayPos1] = PLAYER_AMY_TAILS
163
break
164
end switch
165
#endplatform
166
else
167
saveRAM[arrayPos1] = stage.playerListPos
168
end if
169
arrayPos1++
170
saveRAM[arrayPos1] = player.lives
171
arrayPos1++
172
saveRAM[arrayPos1] = player.score
173
arrayPos1++
174
saveRAM[arrayPos1] = player.scoreBonus
175
arrayPos1++
176
177
// Bug Details:
178
// This is missing the check for if your save file is already past the next act
179
// This means the save file's act will be overwritten to SBZ3, even if you're on a Complete save file...
180
saveRAM[arrayPos1] = stage.listPos
181
saveRAM[arrayPos1]++
182
183
arrayPos1++
184
saveRAM[arrayPos1] = specialStage.emeralds
185
arrayPos1++
186
saveRAM[arrayPos1] = specialStage.listPos
187
WriteSaveRAM()
188
end if
189
190
temp0 = engine.trialMode
191
if stage.listPos >= stage.listSize
192
temp0 = true
193
end if
194
195
if temp0 == false
196
LoadStage()
197
else
198
stage.activeList = PRESENTATION_STAGE
199
stage.listPos = 0
200
LoadStage()
201
end if
202
end if
203
else
204
if player[0].ypos > object.exitPos.y
205
object.state = PUSHBUTTON_PLAYERFELL
206
recAnimation = 0
207
temp0 = 0
208
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
209
temp1 = player[currentPlayer].animation
210
temp1 <<= 8
211
temp1 |= player[currentPlayer].direction
212
temp1 <<= temp0
213
recAnimation |= temp1
214
temp0 += 16
215
next
216
217
player[0].type = TypeName[Blank Object]
218
end if
219
end if
220
end if
221
end event
222
223
224
event ObjectDraw
225
object.frame = object.stood
226
DrawSprite(object.frame)
227
end event
228
229
230
event ObjectStartup
231
LoadSpriteSheet("SBZ/Objects.gif")
232
SpriteFrame(-16, -8, 32, 16, 92, 1)
233
SpriteFrame(-16, -2, 32, 10, 92, 18)
234
foreach (TypeName[Push Button], arrayPos0, ALL_ENTITIES)
235
if object[arrayPos0].propertyValue == 1
236
object[arrayPos0].exitPos.y = 0x7FFF0000
237
end if
238
next
239
SetTableValue(TypeName[Push Button], DebugMode_ObjCount, DebugMode_TypesTable)
240
SetTableValue(PushButton_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
241
SetTableValue(PushButton_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
242
DebugMode_ObjCount++
243
end event
244
245
246
// ========================
247
// Editor Events
248
// ========================
249
250
event RSDKEdit
251
if editor.returnVariable == true
252
switch editor.variableID
253
case EDIT_VAR_PROPVAL // property value
254
checkResult = object.propertyValue
255
break
256
257
case 0 // type
258
checkResult = object.propertyValue
259
checkResult &= 1
260
break
261
262
end switch
263
else
264
switch editor.variableID
265
case EDIT_VAR_PROPVAL // property value
266
object.propertyValue = editor.variableValue
267
break
268
269
case 0 // type
270
object.propertyValue = editor.variableValue
271
object.propertyValue &= 1
272
break
273
274
end switch
275
end if
276
end event
277
278
279
event RSDKDraw
280
DrawSprite(0)
281
end event
282
283
284
event RSDKLoad
285
LoadSpriteSheet("SBZ/Objects.gif")
286
SpriteFrame(-16, -8, 32, 16, 92, 1)
287
288
AddEditorVariable("type")
289
SetActiveVariable("type")
290
AddEnumVariable("Normal", 0)
291
AddEnumVariable("Cutscene", 1)
292
end event
293
294