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/SCZ/Tornado.txt
1480 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Tornado 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.frame : object.propellerFrame
13
14
private alias object.value0 : object.timer
15
private alias object.value1 : object.stood
16
private alias object.value2 : object.gravityForce
17
private alias object.value3 : object.storedPos.y
18
private alias object.value4 : object.lastPos.y
19
private alias object.value5 : object.collisionOffset.y
20
private alias object.value6 : object.pilotFrame
21
private alias object.value7 : object.pilotFrameDelay
22
private alias object.value8 : object.pilotAnimPos
23
24
// States
25
private alias 0 : TORNADO_IDLE
26
private alias 1 : TORNADO_JUMP_RECOIL
27
private alias 2 : TORNADO_JUMP_REBOUND
28
private alias 3 : TORNADO_LAND
29
30
// Player Aliases
31
private alias object.type : player.type
32
private alias object.xpos : player.xpos
33
private alias object.ypos : player.ypos
34
private alias object.yvel : player.yvel
35
private alias object.jumpPress : player.jumpPress
36
37
38
// ========================
39
// Tables
40
// ========================
41
42
private table Tornado_TailsPilotFrameTable
43
5, 32
44
6, 8
45
7, 8
46
8, 8
47
7, 8
48
6, 16
49
9, 32
50
6, 16
51
end table
52
53
private table Tornado_SonicPilotFrameTable
54
10, 9
55
11, 9
56
10, 9
57
11, 9
58
10, 9
59
11, 9
60
10, 9
61
11, 9
62
end table
63
64
65
// ========================
66
// Events
67
// ========================
68
69
event ObjectUpdate
70
object.lastPos.y = object.ypos
71
object.drawOrder = 4
72
73
// The normal touch input code in the Player Object only supports the 4 directions, so let's redo the calculations again but account for diagonals this time, for smoother Tornado control
74
if options.touchControls == true
75
CheckTouchRect(0, 96, screen.xcenter, screen.ysize)
76
if checkResult > -1
77
arrayPos0 = checkResult
78
temp0 = touchscreen[arrayPos0].xpos
79
temp0 -= saveRAM[39]
80
temp1 = touchscreen[arrayPos0].ypos
81
temp1 -= saveRAM[40]
82
83
ATan2(temp2, temp0, temp1)
84
temp2 += 16
85
temp2 &= 255
86
temp2 >>= 5
87
switch temp2
88
case 0
89
keyDown[0].right = true
90
break
91
92
case 1
93
keyDown[0].right = true
94
keyDown[0].down = true
95
break
96
97
case 2
98
keyDown[0].down = true
99
break
100
101
case 3
102
keyDown[0].down = true
103
keyDown[0].left = true
104
break
105
106
case 4
107
keyDown[0].left = true
108
break
109
110
case 5
111
keyDown[0].left = true
112
keyDown[0].up = true
113
break
114
115
case 6
116
keyDown[0].up = true
117
break
118
119
case 7
120
keyDown[0].up = true
121
keyDown[0].right = true
122
break
123
end switch
124
end if
125
end if
126
127
switch object.state
128
case TORNADO_IDLE
129
if player[0].yvel < 0
130
if player[0].jumpPress == true
131
object.gravityForce = 0x20000
132
object.storedPos.y = object.ypos
133
object.state++
134
end if
135
end if
136
break
137
138
case TORNADO_JUMP_RECOIL // jump force pushes tornado downwards
139
object.gravityForce -= 0x2000
140
object.ypos += object.gravityForce
141
if object.gravityForce < 0
142
object.state++
143
end if
144
break
145
146
case TORNADO_JUMP_REBOUND // tornado returns to its original position
147
object.gravityForce -= 0x1000
148
object.ypos += object.gravityForce
149
if object.ypos <= object.storedPos.y
150
object.ypos = object.storedPos.y
151
object.gravityForce = 0
152
object.state = TORNADO_IDLE
153
end if
154
break
155
156
case TORNADO_LAND
157
object.gravityForce -= 0x2000
158
object.ypos += object.gravityForce
159
object.timer++
160
if object.timer == 24
161
object.gravityForce = 0
162
object.state = TORNADO_IDLE
163
end if
164
break
165
166
end switch
167
168
if object.stood == true
169
object.xpos += SCZSetup_scrollVelocity.x
170
object.ypos += SCZSetup_scrollVelocity.y
171
if keyDown[0].up == true
172
object.yvel = -0x10000
173
else
174
object.yvel = 0
175
end if
176
177
if keyDown[0].down == true
178
object.yvel = 0x10000
179
end if
180
else
181
object.yvel = 0
182
end if
183
184
object.ypos += object.yvel
185
temp0 = camera[0].ypos
186
temp0 -= 52
187
temp0 <<= 16
188
if object.ypos < temp0
189
object.ypos = temp0
190
end if
191
192
temp0 = camera[0].ypos
193
temp0 += 76
194
temp0 <<= 16
195
if object.ypos > temp0
196
object.ypos = temp0
197
end if
198
199
temp0 = object.ypos
200
object.lastPos.y &= 0xFFFF0000
201
object.collisionOffset.y = object.ypos
202
object.collisionOffset.y &= 0xFFFF0000
203
object.collisionOffset.y -= object.lastPos.y
204
object.ypos = object.lastPos.y
205
206
object.stood = false
207
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
208
temp2 = player[currentPlayer].yvel
209
BoxCollisionTest(C_PLATFORM, object.entityPos, -20, -8, 20, 8, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
210
if checkResult == true
211
player[currentPlayer].xpos += SCZSetup_scrollVelocity.x
212
player[currentPlayer].ypos += object.collisionOffset.y
213
if temp2 > 0x10000
214
object.timer = 0
215
object.gravityForce = 0x20000
216
object.state = TORNADO_LAND
217
end if
218
object.stood |= true
219
end if
220
next
221
222
object.ypos = temp0
223
224
temp0 = player[0].xpos
225
temp0 -= object.xpos
226
Abs(temp0)
227
if temp0 > 0x100000
228
if player[0].xpos > object.xpos
229
temp0 = player[0].xpos
230
temp0 -= object.xpos
231
temp0 -= 0x100000
232
if temp0 > 0x80000
233
temp0 = 0x80000
234
end if
235
object.xpos += temp0
236
else
237
temp0 = player[0].xpos
238
temp0 -= object.xpos
239
temp0 += 0x100000
240
if temp0 < -0x80000
241
temp0 = -0x80000
242
end if
243
object.xpos += temp0
244
end if
245
end if
246
247
temp0 = -0x100000
248
temp0 += object.xpos
249
temp1 = stage.curXBoundary1
250
temp1 <<= 16
251
if temp0 < temp1
252
object.xpos = temp1
253
object.xpos += 0x100000
254
end if
255
256
object.propellerFrame++
257
object.propellerFrame &= 3
258
259
if object.pilotFrameDelay <= 1
260
if stage.playerListPos == PLAYER_TAILS_A
261
GetTableValue(object.pilotFrame, object.pilotAnimPos, Tornado_SonicPilotFrameTable)
262
object.pilotAnimPos++
263
264
GetTableValue(object.pilotFrameDelay, object.pilotAnimPos, Tornado_SonicPilotFrameTable)
265
object.pilotAnimPos++
266
else
267
GetTableValue(object.pilotFrame, object.pilotAnimPos, Tornado_TailsPilotFrameTable)
268
object.pilotAnimPos++
269
270
GetTableValue(object.pilotFrameDelay, object.pilotAnimPos, Tornado_TailsPilotFrameTable)
271
object.pilotAnimPos++
272
end if
273
object.pilotAnimPos &= 15
274
else
275
object.pilotFrameDelay--
276
end if
277
end event
278
279
280
event ObjectDraw
281
DrawSprite(object.propellerFrame) // propeller
282
DrawSprite(4) // tornado
283
DrawSprite(object.pilotFrame) // pilot
284
end event
285
286
287
event ObjectStartup
288
LoadSpriteSheet("SCZ/Objects.gif")
289
SpriteFrame(21, 8, 4, 24, 378, 215) // Propeller - Frame 1 - #0
290
SpriteFrame(21, 11, 4, 18, 383, 218) // Propeller - Frame 2 - #1
291
SpriteFrame(21, 16, 4, 8, 388, 223) // Propeller - Frame 3 - #2
292
SpriteFrame(21, 11, 4, 18, 393, 218) // Propeller - Frame 4 - #3
293
SpriteFrame(-95, -16, 116, 64, 261, 191) // Tornado - #4
294
SpriteFrame(-45, -8, 21, 16, 261, 174) // Pilot (Tails) - Frame 1 - #5
295
SpriteFrame(-45, -8, 21, 16, 283, 174) // Pilot (Tails) - Frame 2 - #6
296
SpriteFrame(-45, -8, 21, 16, 305, 174) // Pilot (Tails) - Frame 3 - #7
297
SpriteFrame(-45, -8, 21, 16, 327, 174) // Pilot (Tails) - Frame 4 - #8
298
SpriteFrame(-47, -8, 23, 16, 349, 174) // Pilot (Tails) - Frame 5 - #9
299
SpriteFrame(-50, -8, 24, 16, 294, 157) // Pilot (Sonic) - Frame 6 - #10
300
SpriteFrame(-50, -8, 24, 16, 319, 157) // Pilot (Sonic) - Frame 2 - #11
301
302
// Bye bye player 2
303
player[1].type = TypeName[Blank Object]
304
playerCount = 1
305
306
if stage.playerListPos == PLAYER_TAILS_A
307
player[0].ypos += 0x40000
308
end if
309
end event
310
311
312
// ========================
313
// Editor Events
314
// ========================
315
316
event RSDKDraw
317
DrawSprite(0)
318
end event
319
320
321
event RSDKLoad
322
LoadSpriteSheet("SCZ/Objects.gif")
323
SpriteFrame(-95, -16, 116, 64, 261, 191)
324
325
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
326
end event
327
328