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/MPZ/Nut.txt
1479 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Nut 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.dropPos.y
13
private alias object.value1 : object.startPos.y
14
private alias object.value2 : object.stoodPlayers
15
private alias object.value3 : object.playerDirections
16
private alias object.value4 : object.activePlayers
17
private alias object.value5 : object.reachedFloor
18
private alias object.value6 : object.spinTimer
19
private alias object.value7 : object.spinSpeed
20
private alias object.value31 : object.wrapOffset.y
21
22
// States
23
private alias 0 : NUT_ATTATCHED
24
private alias 1 : NUT_FALLING
25
26
// Player Aliases
27
private alias object.xpos : player.xpos
28
private alias object.ypos : player.ypos
29
private alias object.xvel : player.xvel
30
private alias object.gravity : player.gravity
31
32
// Path ID Aliases
33
private alias 0 : PATH_A
34
35
36
// ========================
37
// Function Declarations
38
// ========================
39
40
reserve function Nut_DebugDraw
41
reserve function Nut_DebugSpawn
42
43
private function Nut_DebugDraw
44
DrawSprite(0)
45
end function
46
47
48
private function Nut_DebugSpawn
49
CreateTempObject(TypeName[Nut], 0, object.xpos, object.ypos)
50
object[tempObjectPos].startPos.y = object.ypos
51
object[tempObjectPos].dropPos.y = 0x7FFF0000
52
end function
53
54
55
// ========================
56
// Events
57
// ========================
58
59
event ObjectUpdate
60
temp0 = object.ypos
61
temp0 &= 0xFFFF0000
62
63
object.ypos += object.yvel
64
if object.yvel >= 0
65
ObjectTileCollision(CSIDE_FLOOR, 0, 12, PATH_A)
66
if checkResult == true
67
object.reachedFloor = true
68
object.spinSpeed = 0
69
object.yvel = 0
70
end if
71
else
72
object.reachedFloor = false
73
end if
74
75
temp1 = object.ypos
76
temp1 &= 0xFFFF0000
77
temp1 -= temp0
78
79
if object.state == NUT_ATTATCHED
80
GetBit(temp6, object.propertyValue, 7)
81
if temp6 == true
82
if object.ypos > object.dropPos.y
83
object.state = NUT_FALLING
84
object.spinSpeed = object.yvel
85
end if
86
end if
87
88
object.spinTimer += object.yvel
89
temp0 = object.spinTimer
90
temp0 >>= 17
91
temp0 &= 3
92
object.frame = 3
93
object.frame -= temp0
94
object.yvel = 0
95
96
temp7 = 0
97
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
98
temp5 = object.reachedFloor
99
100
GetBit(temp6, object.stoodPlayers, temp7)
101
if temp6 == true
102
player[currentPlayer].ypos += temp1
103
else
104
SetBit(object.activePlayers, temp7, false)
105
end if
106
107
if object.reachedFloor == true
108
if player[currentPlayer].xvel < 0
109
SetBit(object.activePlayers, temp7, false)
110
else
111
temp5 = false
112
end if
113
end if
114
115
SetBit(object.stoodPlayers, temp7, false)
116
BoxCollisionTest(C_SOLID, object.entityPos, -32, -12, 32, 12, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
117
switch checkResult
118
case COL_TOP
119
SetBit(object.stoodPlayers, temp7, true)
120
if temp6 == false
121
GetBit(temp6, object.activePlayers, temp7)
122
temp6 |= temp5
123
if temp6 == false
124
temp2 = player[currentPlayer].xpos
125
temp2 &= 0xFFFF0000
126
temp3 = object.xpos
127
temp3 &= 0xFFFF0000
128
129
if temp2 == temp3
130
SetBit(object.activePlayers, temp7, true)
131
object.priority = PRIORITY_ACTIVE
132
else
133
if player[currentPlayer].xpos > object.xpos
134
SetBit(object.playerDirections, temp7, 0)
135
else
136
SetBit(object.playerDirections, temp7, 1)
137
end if
138
end if
139
end if
140
else
141
GetBit(temp6, object.activePlayers, temp7)
142
if temp6 == false
143
if temp5 == true
144
if player[currentPlayer].xvel > 0
145
SetBit(object.playerDirections, temp7, 0)
146
else
147
SetBit(object.playerDirections, temp7, 1)
148
end if
149
else
150
GetBit(temp6, object.playerDirections, temp7)
151
if temp6 == 0
152
if player[currentPlayer].xpos < object.xpos
153
SetBit(object.activePlayers, temp7, true)
154
player[currentPlayer].xpos = object.xpos
155
object.priority = PRIORITY_ACTIVE
156
end if
157
else
158
if player[currentPlayer].xpos > object.xpos
159
SetBit(object.activePlayers, temp7, true)
160
player[currentPlayer].xpos = object.xpos
161
object.priority = PRIORITY_ACTIVE
162
end if
163
end if
164
end if
165
else
166
player[currentPlayer].xpos = object.xpos
167
object.yvel += player[currentPlayer].xvel
168
end if
169
end if
170
break
171
172
case COL_BOTTOM
173
if player[currentPlayer].gravity == 0
174
CallFunction(Player_Kill)
175
end if
176
break
177
end switch
178
179
temp7++
180
next
181
182
FlipSign(object.yvel)
183
object.yvel >>= 3
184
else
185
object.yvel += 0x3800
186
187
object.spinTimer += object.spinSpeed
188
temp0 = object.spinTimer
189
temp0 >>= 17
190
temp0 &= 3
191
object.frame = 3
192
object.frame -= temp0
193
194
temp7 = 0
195
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
196
GetBit(temp6, object.stoodPlayers, temp7)
197
if temp6 == true
198
player[currentPlayer].ypos += temp1
199
end if
200
201
SetBit(object.stoodPlayers, temp7, false)
202
BoxCollisionTest(C_SOLID, object.entityPos, -32, -12, 32, 12, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
203
if checkResult == COL_TOP
204
SetBit(object.stoodPlayers, temp7, true)
205
end if
206
207
temp7++
208
next
209
end if
210
211
if object.outOfBounds == true
212
temp1 = object.ypos
213
object.ypos = object.startPos.y
214
object.ypos += object.wrapOffset.y
215
216
if object.outOfBounds == true
217
object.stoodPlayers = 0
218
object.playerDirections = 0
219
object.activePlayers = 0
220
object.reachedFloor = false
221
object.spinTimer = 0
222
object.spinSpeed = 0
223
object.state = NUT_ATTATCHED
224
object.priority = PRIORITY_BOUNDS
225
else
226
object.ypos = temp1
227
end if
228
end if
229
end event
230
231
232
event ObjectDraw
233
DrawSprite(object.frame)
234
end event
235
236
237
event ObjectStartup
238
LoadSpriteSheet("MPZ/Objects.gif")
239
SpriteFrame(-32, -12, 64, 24, 130, 156)
240
SpriteFrame(-32, -12, 64, 24, 130, 181)
241
SpriteFrame(-32, -12, 64, 24, 130, 206)
242
SpriteFrame(-32, -12, 64, 24, 130, 231)
243
244
foreach (TypeName[Nut], arrayPos0, ALL_ENTITIES)
245
object[arrayPos0].startPos.y = object[arrayPos0].ypos
246
247
object[arrayPos0].dropPos.y = object[arrayPos0].propertyValue
248
object[arrayPos0].dropPos.y &= 0x7F
249
object[arrayPos0].dropPos.y <<= 19
250
object[arrayPos0].dropPos.y += object[arrayPos0].ypos
251
next
252
253
SetTableValue(TypeName[Nut], DebugMode_ObjCount, DebugMode_TypesTable)
254
SetTableValue(Nut_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
255
SetTableValue(Nut_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
256
DebugMode_ObjCount++
257
end event
258
259
260
// ========================
261
// Editor Events
262
// ========================
263
264
event RSDKEdit
265
if editor.returnVariable == true
266
switch editor.variableID
267
case EDIT_VAR_PROPVAL // property value
268
checkResult = object.propertyValue
269
break
270
271
case 0 // useDistance
272
GetBit(checkResult, object.propertyValue, 7)
273
break
274
275
case 1 // distance
276
checkResult = object.propertyValue
277
checkResult &= 0x7F
278
break
279
280
end switch
281
else
282
switch editor.variableID
283
case EDIT_VAR_PROPVAL // property value
284
object.propertyValue = editor.variableValue
285
break
286
287
case 0 // useDistance
288
CheckNotEqual(editor.variableValue, false)
289
SetBit(object.propertyValue, 7, checkResult)
290
break
291
292
case 1 // distance
293
editor.variableValue &= 0x7F
294
object.propertyValue &= 0x80
295
296
object.propertyValue |= editor.variableValue
297
break
298
299
end switch
300
end if
301
end event
302
303
304
event RSDKDraw
305
DrawSprite(0)
306
307
if editor.showGizmos == true
308
GetBit(checkResult, object.propertyValue, 7)
309
if checkResult == true
310
object.dropPos.y = object.propertyValue
311
object.dropPos.y &= 0x7F
312
object.dropPos.y <<= 19
313
object.dropPos.y += object.ypos
314
315
object.inkEffect = INK_BLEND
316
DrawSpriteFX(0, FX_INK, object.xpos, object.dropPos.y)
317
object.inkEffect = INK_NONE
318
319
DrawArrow(object.xpos, object.ypos, object.xpos, object.dropPos.y, 0x00, 0xFF, 0x00)
320
end if
321
end if
322
end event
323
324
325
event RSDKLoad
326
LoadSpriteSheet("MPZ/Objects.gif")
327
SpriteFrame(-32, -12, 64, 24, 130, 156)
328
329
AddEditorVariable("allowDrop")
330
SetActiveVariable("allowDrop")
331
AddEnumVariable("false", false)
332
AddEnumVariable("true", true)
333
334
AddEditorVariable("dropDistance")
335
SetActiveVariable("dropDistance")
336
end event
337
338