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/Global/AnimalPrison.txt
1482 views
1
// ----------------------------------
2
// RSDK Project: Sonic 1
3
// Script Description: Animal Prison 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.timer
13
14
private alias 0 : ANIMALPRISON_AWAITOPEN
15
private alias 1 : ANIMALPRISON_OPENED
16
private alias 2 : ANIMALPRISON_EXPLODE
17
private alias 3 : ANIMALPRISON_HANDLEACTCLEAR
18
private alias 4 : ANIMALPRISON_FINISHED
19
20
// Animal aliases
21
private alias object.value1 : animal.randomizeDir
22
23
// Player aliases
24
private alias object.animation : player.animation
25
private alias object.xpos : player.xpos
26
private alias object.ypos : player.ypos
27
private alias object.xvel : player.xvel
28
private alias object.yvel : player.yvel
29
private alias object.speed : player.speed
30
private alias object.gravity : player.gravity
31
private alias object.jumpPress : player.jumpPress
32
private alias object.jumpHold : player.jumpHold
33
private alias object.up : player.up
34
private alias object.down : player.down
35
private alias object.left : player.left
36
private alias object.right : player.right
37
private alias object.controlMode : player.controlMode
38
private alias object.value30 : player.jumpOffset
39
40
// Tracks
41
private alias 1 : TRACK_ACTFINISH
42
43
// Game Modes
44
private alias 0 : MODE_NOSAVE
45
private alias 1 : MODE_SAVEGAME
46
private alias 2 : MODE_TIMEATTACK
47
48
// Super States
49
private alias 1 : SUPERSTATE_SUPER
50
private alias 2 : SUPERSTATE_UNTRANSFORM
51
52
// Reserved Object Slot Aliases
53
private alias 30 : SLOT_ACTFINISH
54
55
56
// ========================
57
// Function Declarations
58
// ========================
59
60
reserve function AnimalPrison_DebugDraw
61
reserve function AnimalPrison_DebugSpawn
62
63
64
// ========================
65
// Function Definitions
66
// ========================
67
68
private function AnimalPrison_DebugDraw
69
DrawSprite(2)
70
DrawSprite(0)
71
end function
72
73
74
private function AnimalPrison_DebugSpawn
75
CreateTempObject(TypeName[Animal Prison], 0, object.xpos, object.ypos)
76
end function
77
78
79
// ========================
80
// Events
81
// ========================
82
83
event ObjectUpdate
84
switch object.state
85
case ANIMALPRISON_AWAITOPEN
86
temp0 = object.ixpos
87
temp0 -= screen.xcenter
88
stage.newXBoundary1 = temp0
89
temp0 = object.ixpos
90
temp0 += screen.xcenter
91
stage.newXBoundary2 = temp0
92
object.frame = object.animationTimer
93
object.frame /= 3
94
object.frame += 2
95
object.animationTimer++
96
object.animationTimer %= 6
97
break
98
99
case ANIMALPRISON_OPENED
100
if player[0].controlMode == CONTROLMODE_NONE
101
// Make the player start running to the right
102
player[0].left = false
103
player[0].right = true
104
player[0].up = false
105
player[0].down = false
106
player[0].jumpHold = false
107
end if
108
109
object.timer++
110
temp0 = object.timer
111
temp0 &= 7
112
if temp0 == 4
113
Rand(temp0, 48)
114
temp0 -= 24
115
temp0 <<= 16
116
temp0 += object.xpos
117
Rand(temp1, 48)
118
temp1 -= 24
119
temp1 <<= 16
120
temp1 += object.ypos
121
CreateTempObject(TypeName[Explosion], 0, temp0, temp1)
122
object[tempObjectPos].drawOrder = 4
123
PlaySfx(SfxName[Explosion], false)
124
end if
125
126
if object.timer == 60
127
temp1 = object.ypos
128
temp1 += 0x40000
129
temp2 = 0
130
temp3 = 30
131
while temp2 < 32
132
Rand(temp0, 48)
133
temp0 >>= 2
134
temp0 <<= 18
135
temp0 -= 0x180000
136
temp0 += object.xpos
137
temp4 = temp2
138
temp4 &= 1
139
if temp4 == 0
140
CreateTempObject(animalType1, temp3, temp0, temp1)
141
else
142
CreateTempObject(animalType2, temp3, temp0, temp1)
143
end if
144
animal[tempObjectPos].randomizeDir = true
145
temp0 += 0x40000
146
temp2++
147
temp3 += 5
148
loop
149
object.drawOrder = 4
150
object.timer = 4
151
object.state++
152
end if
153
object.frame = object.animationTimer
154
object.frame /= 3
155
object.frame += 4
156
object.animationTimer++
157
object.animationTimer %= 6
158
break
159
160
case ANIMALPRISON_EXPLODE
161
object.timer++
162
temp0 = object.timer
163
temp0 &= 7
164
if temp0 == 4
165
Rand(temp0, 48)
166
temp0 -= 24
167
temp0 <<= 16
168
temp0 += object.xpos
169
Rand(temp1, 48)
170
temp1 -= 24
171
temp1 <<= 16
172
temp1 += object.ypos
173
CreateTempObject(TypeName[Explosion], 0, temp0, temp1)
174
object[tempObjectPos].drawOrder = 4
175
PlaySfx(SfxName[Explosion], false)
176
end if
177
178
if object.timer == 34
179
object.timer = 0
180
object.state++
181
end if
182
183
object.frame = object.animationTimer
184
object.frame /= 3
185
object.frame += 4
186
object.animationTimer++
187
object.animationTimer %= 6
188
break
189
190
case ANIMALPRISON_HANDLEACTCLEAR
191
if object.timer < 300
192
object.timer++
193
else
194
PlayMusic(TRACK_ACTFINISH)
195
object[SLOT_ACTFINISH].type = TypeName[Act Finish]
196
object[SLOT_ACTFINISH].drawOrder = 6
197
object[SLOT_ACTFINISH].priority = PRIORITY_ACTIVE
198
object.timer = 0
199
object.state++
200
end if
201
break
202
203
case ANIMALPRISON_FINISHED
204
break
205
206
end switch
207
208
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
209
switch object.state
210
case ANIMALPRISON_AWAITOPEN
211
BoxCollisionTest(C_SOLID, object.entityPos, -32, -24, 32, 32, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
212
213
BoxCollisionTest(C_SOLID, object.entityPos, -11, -48, 11, -24, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
214
if checkResult == COL_TOP
215
object.state = ANIMALPRISON_OPENED
216
stage.timeEnabled = false
217
218
if player[currentPlayer].animation == ANI_JUMPING
219
player[currentPlayer].animation = ANI_WALKING
220
end if
221
222
if Player_superState == SUPERSTATE_SUPER
223
Player_superState = SUPERSTATE_UNTRANSFORM
224
end if
225
226
player[0].controlMode = CONTROLMODE_NONE
227
228
#platform: USE_ORIGINS
229
// A fallback in case the player somehow gets to this capsule without beating the boss, for the Boss Rush
230
// -> Every individual boss calls this function already, but it doesn't hurt to play it safe
231
CallNativeFunction2(NotifyCallback, NOTIFY_BOSS_END, true)
232
#endplatform
233
end if
234
break
235
236
case ANIMALPRISON_OPENED
237
BoxCollisionTest(C_SOLID, object.entityPos, -32, -24, 32, 32, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
238
BoxCollisionTest(C_SOLID, object.entityPos, -11, -40, 11, -24, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
239
break
240
241
end switch
242
243
#platform: USE_DECOMP
244
// Fix for when the screen is wide enough to extend beyond the stage width,
245
// causing the player to die during the results screen
246
temp0 = tileLayer[0].xsize
247
temp0 <<= 7
248
temp0 <<= 16
249
250
if player[currentPlayer].xpos > temp0
251
temp1 = object.ypos
252
temp1 += 0xD0000
253
if player[currentPlayer].animation == ANI_JUMPING
254
temp2 = player[currentPlayer].jumpOffset
255
temp2 <<= 16
256
temp1 -= temp2
257
end if
258
if player[currentPlayer].ypos > temp1
259
player[currentPlayer].ypos = temp1
260
player[currentPlayer].yvel = 0
261
end if
262
end if
263
#endplatform
264
265
temp0 = screen.xcenter
266
temp0 += 40
267
temp0 <<= 16
268
temp1 = object.xpos
269
temp1 += temp0
270
if player[currentPlayer].xpos > temp1
271
player[currentPlayer].xpos = temp1
272
player[currentPlayer].speed = 0
273
player[currentPlayer].xvel = 0
274
if player[currentPlayer].gravity == 0
275
player[currentPlayer].yvel = 0
276
end if
277
end if
278
279
next
280
end event
281
282
283
event ObjectDraw
284
switch object.state
285
case ANIMALPRISON_AWAITOPEN
286
case ANIMALPRISON_OPENED
287
DrawSprite(object.frame)
288
DrawSprite(0)
289
break
290
291
case ANIMALPRISON_EXPLODE
292
case ANIMALPRISON_HANDLEACTCLEAR
293
case ANIMALPRISON_FINISHED
294
DrawSprite(1)
295
break
296
297
end switch
298
end event
299
300
301
event ObjectStartup
302
LoadSpriteSheet("Global/Items.gif")
303
304
// Prison frames
305
SpriteFrame(-32, -32, 64, 62, 109, 166)
306
SpriteFrame(-32, -2, 64, 32, 35, 202)
307
SpriteFrame(-11, -48, 22, 16, 84, 166)
308
SpriteFrame(-11, -48, 22, 16, 35, 236)
309
SpriteFrame(-11, -40, 22, 16, 84, 166)
310
SpriteFrame(-11, -40, 22, 16, 35, 236)
311
312
// Add the Animal Prison to the debug object list
313
SetTableValue(TypeName[Animal Prison], DebugMode_ObjCount, DebugMode_TypesTable)
314
SetTableValue(AnimalPrison_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
315
SetTableValue(AnimalPrison_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
316
DebugMode_ObjCount++
317
end event
318
319
320
// ========================
321
// Editor Events
322
// ========================
323
324
event RSDKDraw
325
DrawSprite(1)
326
DrawSprite(0)
327
end event
328
329
330
event RSDKLoad
331
LoadSpriteSheet("Global/Items.gif")
332
SpriteFrame(-32, -32, 64, 62, 109, 166)
333
SpriteFrame(-11, -48, 22, 16, 84, 166)
334
335
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
336
end event
337
338