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/CNZ/HexBumper.txt
1484 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Hex Bumper 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.value1 : object.offset.x
14
private alias object.value2 : object.offset.y
15
private alias object.value3 : object.boundsL
16
private alias object.value4 : object.boundsR
17
private alias object.value5 : object.playerTimers
18
19
// States
20
private alias 0 : HEXBUMPER_IDLE
21
private alias 1 : HEXBUMPER_BUMPED
22
23
// Player Aliases
24
private alias object.state : player.state
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.animation : player.animation
32
private alias object.tileCollisions : player.tileCollisions
33
34
private alias object.value1 : player.timer
35
private alias object.value36 : player.flyCarryTimer // Tails assist lockout timer
36
private alias object.value40 : player.hitboxLeft
37
private alias object.value38 : player.hitboxTop
38
private alias object.value41 : player.hitboxRight
39
private alias object.value39 : player.hitboxBottom
40
41
42
// ========================
43
// Function Declarations
44
// ========================
45
46
reserve function HexBumper_DebugDraw
47
reserve function HexBumper_DebugSpawn
48
49
50
// ========================
51
// Function Definitions
52
// ========================
53
54
private function HexBumper_DebugDraw
55
DrawSprite(0)
56
end function
57
58
59
private function HexBumper_DebugSpawn
60
CreateTempObject(TypeName[Hex Bumper], 0, object.xpos, object.ypos)
61
object[tempObjectPos].drawOrder = 4
62
end function
63
64
65
// ========================
66
// Events
67
// ========================
68
69
event ObjectUpdate
70
if object.state > HEXBUMPER_IDLE
71
object.frame = object.timer
72
object.frame /= 5
73
object.frame++
74
75
object.timer++
76
if object.timer > 15
77
object.timer = 0
78
object.state = HEXBUMPER_IDLE
79
object.frame = 0
80
end if
81
end if
82
83
if object.outOfBounds == true
84
object.priority = PRIORITY_BOUNDS
85
end if
86
87
if object.xvel != 0
88
object.xpos += object.xvel
89
if object.xvel > 0
90
if object.xpos >= object.boundsR
91
object.xpos = object.boundsR
92
FlipSign(object.xvel)
93
end if
94
else
95
if object.xpos <= object.boundsL
96
object.xpos = object.boundsL
97
FlipSign(object.xvel)
98
end if
99
end if
100
end if
101
102
temp7 = 0
103
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
104
temp6 = object.playerTimers
105
temp6 >>= temp7
106
temp6 &= 0xFF
107
if temp6 == 0
108
if player[currentPlayer].animation != ANI_HURT
109
BoxCollisionTest(C_TOUCH, object.entityPos, -12, -8, 12, 8, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
110
if checkResult == true
111
if object.state == HEXBUMPER_IDLE
112
PlaySfx(SfxName[Bumper], false)
113
end if
114
115
if object.timer > 5
116
PlaySfx(SfxName[Bumper], false)
117
end if
118
119
object.state = HEXBUMPER_BUMPED
120
object.priority = PRIORITY_ACTIVE
121
122
temp0 = player[currentPlayer].xpos
123
temp0 -= object.xpos
124
temp1 = player[currentPlayer].ypos
125
temp1 -= object.ypos
126
ATan2(temp2, temp0, temp1)
127
temp2 += 32
128
temp2 &= 255
129
temp2 >>= 6
130
switch temp2
131
case 0
132
temp0 = 0x80000
133
temp1 = player[currentPlayer].yvel
134
object.offset.x = -0x40000
135
object.offset.y = 0
136
break
137
138
case 1
139
if player[currentPlayer].xpos < object.xpos
140
temp0 = -0x20000
141
else
142
temp0 = 0x20000
143
end if
144
temp1 = 0x80000
145
object.offset.x = 0
146
object.offset.y = -0x40000
147
break
148
149
case 2
150
temp0 = -0x80000
151
temp1 = player[currentPlayer].yvel
152
object.offset.x = 0x40000
153
object.offset.y = 0
154
break
155
156
case 3
157
if player[currentPlayer].xpos < object.xpos
158
temp0 = -0x20000
159
else
160
temp0 = 0x20000
161
end if
162
temp1 = -0x80000
163
object.offset.x = 0
164
object.offset.y = 0x40000
165
break
166
167
end switch
168
169
if player[currentPlayer].state == Player_State_Carried
170
player[1].flyCarryTimer = 30
171
end if
172
173
CheckEqual(player[currentPlayer].animation, ANI_GLIDING)
174
temp2 = checkResult
175
CheckEqual(player[currentPlayer].animation, ANI_GLIDING_STOP)
176
temp2 |= checkResult
177
CheckEqual(player[currentPlayer].animation, ANI_FLYING)
178
temp2 |= checkResult
179
CheckEqual(player[currentPlayer].state, Player_State_TubeRoll)
180
temp2 |= checkResult
181
CheckEqual(player[currentPlayer].state, Player_State_TubeAirRoll)
182
temp2 |= checkResult
183
if temp2 == false
184
#platform: USE_STANDALONE
185
player[currentPlayer].state = Player_State_Air
186
#endplatform
187
#platform: USE_ORIGINS
188
player[currentPlayer].state = Player_State_Air_NoDropDash
189
#endplatform
190
// Bug Details:
191
// This code wasn't updated in Origins Plus to include ANI_HAMMER_JUMP, so
192
// Amy will always start walking if she hits a Bumper with her hammer out
193
if player[currentPlayer].animation != ANI_JUMPING
194
if player[currentPlayer].animation != ANI_RUNNING
195
player[currentPlayer].animation = ANI_WALKING
196
end if
197
end if
198
end if
199
200
if player[currentPlayer].animation != ANI_GLIDING
201
player[currentPlayer].xvel += temp0
202
player[currentPlayer].speed = player[currentPlayer].xvel
203
player[currentPlayer].timer = 0
204
end if
205
206
player[currentPlayer].yvel = temp1
207
player[currentPlayer].gravity = GRAVITY_AIR
208
player[currentPlayer].tileCollisions = true
209
temp6 = 3
210
temp6 <<= temp7
211
object.playerTimers |= temp6
212
end if
213
end if
214
else
215
temp5 = 1
216
temp5 <<= temp7
217
object.playerTimers -= temp5
218
end if
219
220
temp7 += 8
221
next
222
end event
223
224
225
event ObjectDraw
226
temp0 = object.frame
227
temp0 &= 1
228
if temp0 == 0
229
DrawSprite(0)
230
else
231
temp1 = object.xpos
232
temp1 += object.offset.x
233
temp2 = object.ypos
234
temp2 += object.offset.y
235
DrawSpriteXY(0, temp1, temp2)
236
end if
237
end event
238
239
240
event ObjectStartup
241
CheckCurrentStageFolder("Zone04")
242
if checkResult == true
243
LoadSpriteSheet("CNZ/Objects.gif")
244
SpriteFrame(-24, -16, 48, 32, 99, 99)
245
else
246
LoadSpriteSheet("MBZ/Objects.gif")
247
SpriteFrame(-24, -16, 48, 32, 581, 343)
248
end if
249
250
foreach (TypeName[Hex Bumper], arrayPos0, ALL_ENTITIES)
251
object[arrayPos0].drawOrder = 4
252
if object[arrayPos0].propertyValue == 1
253
object[arrayPos0].xvel = 0x10000
254
object[arrayPos0].boundsL = object[arrayPos0].xpos
255
object[arrayPos0].boundsL -= 0x600000
256
object[arrayPos0].boundsR = object[arrayPos0].xpos
257
object[arrayPos0].boundsR += 0x600000
258
end if
259
next
260
261
SetTableValue(TypeName[Hex Bumper], DebugMode_ObjCount, DebugMode_TypesTable)
262
SetTableValue(HexBumper_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
263
SetTableValue(HexBumper_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
264
DebugMode_ObjCount++
265
end event
266
267
268
// ========================
269
// Editor Events
270
// ========================
271
272
event RSDKEdit
273
if editor.returnVariable == true
274
switch editor.variableID
275
case EDIT_VAR_PROPVAL // property value
276
checkResult = object.propertyValue
277
break
278
279
case 0 // moveType
280
checkResult = object.propertyValue
281
break
282
283
end switch
284
else
285
switch editor.variableID
286
case EDIT_VAR_PROPVAL // property value
287
object.propertyValue = editor.variableValue
288
break
289
290
case 0 // moveType
291
object.propertyValue = editor.variableValue
292
break
293
294
end switch
295
end if
296
end event
297
298
299
event RSDKDraw
300
DrawSprite(0)
301
end event
302
303
304
event RSDKLoad
305
CheckCurrentStageFolder("Zone04")
306
if checkResult == true
307
LoadSpriteSheet("CNZ/Objects.gif")
308
SpriteFrame(-24, -16, 48, 32, 99, 99)
309
else
310
LoadSpriteSheet("MBZ/Objects.gif")
311
SpriteFrame(-24, -16, 48, 32, 581, 343)
312
end if
313
314
AddEditorVariable("moveType")
315
SetActiveVariable("moveType")
316
AddEnumVariable("Static", 0)
317
AddEnumVariable("Moving", 1)
318
end event
319
320