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/Global/AnimalPrison.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
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
private alias object.value2 : object.buttonPos
14
private alias object.value3 : object.lockPos.x
15
private alias object.value4 : object.lockPos.y
16
private alias object.value5 : object.debrisEdgeFrame
17
private alias object.value6 : object.debrisCenterFrame
18
19
// States
20
private alias 0 : ANIMALPRISON_AWAITOPEN
21
private alias 1 : ANIMALPRISON_OPENING
22
private alias 2 : ANIMALPRISON_SHOWDEBRIS
23
private alias 3 : ANIMALPRISON_HANDLEACTCLEAR
24
private alias 4 : ANIMALPRISON_OPENED
25
26
// Animal Aliases
27
private alias object.value1 : animal.randomizeDir
28
29
// Player Aliases
30
private alias object.xpos : player.xpos
31
private alias object.ypos : player.ypos
32
private alias object.xvel : player.xvel
33
private alias object.speed : player.speed
34
private alias object.collisionRight : player.collisionRight
35
private alias object.collisionBottom : player.collisionBottom
36
37
// Super States
38
private alias 1 : SUPERSTATE_SUPER
39
private alias 2 : SUPERSTATE_FADEOUT
40
41
// Game Modes
42
private alias 2 : MODE_TIMEATTACK
43
44
// Tracks
45
private alias 1 : TRACK_ACTFINISH
46
47
48
// ========================
49
// Function Declarations
50
// ========================
51
52
reserve function AnimalPrison_DebugDraw
53
reserve function AnimalPrison_DebugSpawn
54
55
56
// ========================
57
// Function Definitions
58
// ========================
59
60
private function AnimalPrison_DebugDraw
61
DrawSprite(3)
62
DrawSprite(0)
63
DrawSprite(4)
64
end function
65
66
67
private function AnimalPrison_DebugSpawn
68
CreateTempObject(TypeName[Animal Prison], 0, object.xpos, object.ypos)
69
end function
70
71
72
// ========================
73
// Events
74
// ========================
75
76
event ObjectUpdate
77
switch object.state
78
case ANIMALPRISON_AWAITOPEN
79
temp0 = object.ixpos
80
temp0 -= screen.xcenter
81
stage.newXBoundary1 = temp0
82
temp0 = object.ixpos
83
temp0 += screen.xcenter
84
stage.newXBoundary2 = temp0
85
break
86
87
case ANIMALPRISON_OPENING
88
object.timer++
89
90
object.lockPos.x += object.xvel
91
object.lockPos.y += object.yvel
92
object.yvel += 0x4000
93
94
if object.timer == 30
95
temp1 = object.ypos
96
temp1 += 0x40000
97
temp2 = 0
98
temp3 = 30
99
while temp2 < 32
100
Rand(temp0, 48)
101
temp0 >>= 2
102
temp0 <<= 18
103
temp0 -= 0x180000
104
temp0 += object.xpos
105
temp4 = temp2
106
temp4 &= 1
107
if temp4 == false
108
CreateTempObject(animalType1, temp3, temp0, temp1)
109
else
110
CreateTempObject(animalType2, temp3, temp0, temp1)
111
end if
112
animal[tempObjectPos].randomizeDir = true
113
temp0 += 0x40000
114
temp2++
115
temp3 += 5
116
loop
117
object.drawOrder = 4
118
object.timer = 0
119
object.state++
120
object.debrisEdgeFrame = 5
121
object.debrisCenterFrame = 17
122
end if
123
break
124
125
case ANIMALPRISON_SHOWDEBRIS
126
object.debrisEdgeFrame = object.timer
127
object.debrisEdgeFrame += 5
128
object.debrisCenterFrame = object.timer
129
object.debrisCenterFrame >>= 1
130
object.debrisCenterFrame += 17
131
132
if object.timer < 12
133
object.timer++
134
else
135
object.timer = 0
136
object.state++
137
end if
138
break
139
140
case ANIMALPRISON_HANDLEACTCLEAR
141
if object.timer < 300
142
object.timer++
143
if object.timer > 240
144
music.volume -= 2
145
end if
146
else
147
PlayMusic(TRACK_ACTFINISH)
148
object[30].type = TypeName[Act Finish]
149
object[30].drawOrder = 6
150
object[30].priority = PRIORITY_ACTIVE
151
object.timer = 0
152
object.state++
153
end if
154
break
155
156
case ANIMALPRISON_OPENED
157
break
158
159
end switch
160
161
object.buttonPos = object.ypos
162
object.buttonPos -= 0x300000
163
164
temp2 = object.buttonPos
165
temp2 += 0x80000
166
167
// Check collision with players
168
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
169
BoxCollisionTest(C_SOLID, object.entityPos, -32, -24, 32, 32, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
170
171
BoxCollisionTest(C_SOLID, object.entityPos, -16, -40, 16, -24, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
172
if object.state == ANIMALPRISON_AWAITOPEN
173
if checkResult == COL_TOP
174
object.state = ANIMALPRISON_OPENING
175
stage.timeEnabled = false
176
177
if Player_superState == SUPERSTATE_SUPER
178
Player_superState = SUPERSTATE_FADEOUT
179
end if
180
181
object.xvel = 0x80000
182
object.yvel = -0x40000
183
object.lockPos.x = object.xpos
184
object.lockPos.y = object.ypos
185
CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)
186
object[tempObjectPos].ypos -= 0x180000
187
PlaySfx(SfxName[Destroy], false)
188
#platform: USE_ORIGINS
189
CallNativeFunction2(NotifyCallback, NOTIFY_BOSS_END, 1)
190
#endplatform
191
end if
192
end if
193
194
BoxCollisionTest(C_TOUCH, object.entityPos, -15, -48, 15, -24, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
195
if checkResult == true
196
temp0 = player[currentPlayer].collisionBottom
197
temp0 <<= 16
198
temp0 += player[currentPlayer].ypos
199
if temp0 > object.buttonPos
200
if temp0 <= temp2
201
object.buttonPos = temp0
202
end if
203
end if
204
end if
205
206
// Boundary R
207
temp0 = player[currentPlayer].collisionRight
208
temp0 <<= 16
209
temp0 += player[currentPlayer].xpos
210
temp1 = stage.curXBoundary2
211
temp1 <<= 16
212
if temp0 > temp1
213
player[currentPlayer].xvel = 0
214
player[currentPlayer].speed = 0
215
player[currentPlayer].xpos = temp1
216
temp0 = player[currentPlayer].collisionRight
217
temp0 <<= 16
218
player[currentPlayer].xpos -= temp0
219
end if
220
next
221
end event
222
223
224
event ObjectDraw
225
switch object.state
226
case ANIMALPRISON_AWAITOPEN
227
DrawSpriteXY(2, object.xpos, object.buttonPos)
228
DrawSprite(0)
229
DrawSprite(4)
230
break
231
232
case ANIMALPRISON_OPENING
233
DrawSpriteXY(2, object.xpos, object.buttonPos)
234
DrawSprite(0)
235
DrawSpriteXY(4, object.lockPos.x, object.lockPos.y)
236
break
237
238
case ANIMALPRISON_SHOWDEBRIS
239
DrawSpriteXY(2, object.xpos, object.buttonPos)
240
DrawSprite(1)
241
242
DrawSprite(object.debrisEdgeFrame)
243
244
object.direction = FLIP_X
245
DrawSpriteFX(object.debrisEdgeFrame, FX_FLIP, object.xpos, object.ypos)
246
247
DrawSprite(object.debrisCenterFrame)
248
break
249
250
case ANIMALPRISON_HANDLEACTCLEAR
251
case ANIMALPRISON_OPENED
252
DrawSpriteXY(2, object.xpos, object.buttonPos)
253
DrawSprite(1)
254
break
255
256
end switch
257
end event
258
259
260
event ObjectStartup
261
LoadSpriteSheet("Global/Items2.gif")
262
SpriteFrame(-32, -32, 64, 64, 83, 1) // capsule (closed) - #0
263
SpriteFrame(-32, -32, 64, 64, 148, 1) // capsule (open) - #1
264
SpriteFrame(-16, 0, 32, 16, 213, 1) // button (closed) - #2
265
SpriteFrame(-16, -48, 32, 16, 213, 1) // button (open) - #3
266
SpriteFrame(-8, -31, 16, 16, 213, 18) // lock - #4
267
SpriteFrame(-32, -16, 24, 24, 83, 17) // debris - #5
268
SpriteFrame(-32, -14, 24, 22, 83, 17) // debris - #6
269
SpriteFrame(-32, -12, 24, 20, 83, 17) // debris - #7
270
SpriteFrame(-32, -10, 24, 18, 83, 17) // debris - #8
271
SpriteFrame(-32, -8, 24, 16, 83, 17) // debris - #9
272
SpriteFrame(-32, -6, 24, 14, 83, 17) // debris - #10
273
SpriteFrame(-32, -4, 24, 12, 83, 17) // debris - #11
274
SpriteFrame(-32, -2, 24, 10, 83, 17) // debris - #12
275
SpriteFrame(-32, 0, 24, 8, 83, 17) // debris - #13
276
SpriteFrame(-32, 2, 24, 6, 83, 17) // debris - #14
277
SpriteFrame(-32, 4, 24, 4, 83, 17) // debris - #15
278
SpriteFrame(-32, 6, 24, 2, 83, 17) // debris - #16
279
SpriteFrame(-8, -16, 16, 24, 107, 17) // debris - #17
280
SpriteFrame(-8, -16, 16, 20, 107, 17) // debris - #18
281
SpriteFrame(-8, -16, 16, 16, 107, 17) // debris - #19
282
SpriteFrame(-8, -16, 16, 12, 107, 17) // debris - #20
283
SpriteFrame(-8, -16, 16, 8, 107, 17) // debris - #21
284
SpriteFrame(-8, -16, 16, 4, 107, 17) // debris - #22
285
286
// Add this object to the debug item list
287
SetTableValue(TypeName[Animal Prison], DebugMode_ObjCount, DebugMode_TypesTable)
288
SetTableValue(AnimalPrison_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
289
SetTableValue(AnimalPrison_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
290
DebugMode_ObjCount++
291
292
// Let all Animal Prisons load based on X only regardless of the player's Y, so that the player can't pass the Prison no matter how high they are
293
foreach (TypeName[Animal Prison], arrayPos0, ALL_ENTITIES)
294
object[arrayPos0].priority = PRIORITY_XBOUNDS
295
next
296
297
// Erase all animal prisons if in VS mode, since SignPosts are used there instead
298
if options.vsMode == true
299
foreach (TypeName[Animal Prison], arrayPos0, ALL_ENTITIES)
300
object[arrayPos0].type = TypeName[Blank Object]
301
next
302
end if
303
end event
304
305
306
// ========================
307
// Editor Events
308
// ========================
309
310
event RSDKDraw
311
object.buttonPos = object.ypos
312
object.buttonPos -= 0x300000
313
314
DrawSpriteXY(1, object.xpos, object.buttonPos)
315
DrawSprite(0)
316
DrawSprite(2)
317
end event
318
319
320
event RSDKLoad
321
LoadSpriteSheet("Global/Items2.gif")
322
SpriteFrame(-32, -32, 64, 64, 83, 1)
323
SpriteFrame(-16, 0, 32, 16, 213, 1)
324
SpriteFrame(-8, -31, 16, 16, 213, 18)
325
326
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
327
end event
328
329