Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-CD-2011-Script-Decompilation
Path: blob/main/Scripts/R6/RotatingSpikes.txt
1319 views
1
//---------------Sonic CD Rotating Spikes Script--------------//
2
//--------Scripted by Christian Whitehead 'The Taxman'--------//
3
//-------Unpacked By Rubberduckycooly's Script Unpacker-------//
4
5
// Aliases
6
#alias Object.Value0 : Object.Angle
7
#alias Object.Value1 : Object.Increment
8
#alias Object.Value2 : Object.SpawnedSpikes
9
10
#alias Object[-1].Rotation : MovingBlocks.Rotation
11
12
// HUD Alias
13
#alias Object[24].PropertyValue : HUD.CurrentTimePeriod
14
15
// Time Periods
16
#alias 0 : TIME_PRESENT
17
#alias 1 : TIME_PAST
18
#alias 2 : TIME_GOOD_FUTURE
19
#alias 3 : TIME_BAD_FUTURE
20
21
// Property Values
22
#alias 0 : ROTATION_CLOCKWISE
23
#alias 1 : ROTATION_COUNTERCLOCKWISE
24
#alias 2 : ROTATION_CCW_LINK_MOVINGBLOCKS
25
#alias 3 : ROTATION_CCW_TWO_SPIKES
26
#alias 4 : ROTATION_CW_SIX_SPIKES
27
28
29
sub ObjectMain
30
if Object.PropertyValue == ROTATION_CCW_LINK_MOVINGBLOCKS
31
Object.Angle = MovingBlocks.Rotation
32
else
33
Object.Angle += Object.Increment
34
end if
35
36
if Object.Angle < 0
37
Object.Angle += 512
38
end if
39
Object.Angle &= 511
40
end sub
41
42
43
sub ObjectPlayerInteraction
44
TempValue0 = 0
45
TempValue1 = 16
46
TempValue2 = Object.XPos
47
TempValue3 = Object.YPos
48
49
while TempValue0 < Object.SpawnedSpikes
50
51
Cos(Object.XPos, Object.Angle)
52
Object.XPos *= TempValue1
53
Object.XPos <<= 7
54
Object.XPos += TempValue2
55
56
Sin(Object.YPos, Object.Angle)
57
Object.YPos *= TempValue1
58
Object.YPos <<= 7
59
Object.YPos += TempValue3
60
61
PlayerObjectCollision(C_TOUCH, -8, -8, 8, 8)
62
if CheckResult == true
63
CallFunction(Player_Hit)
64
end if
65
66
TempValue0++
67
TempValue1 += 16
68
loop
69
Object.XPos = TempValue2
70
Object.YPos = TempValue3
71
end sub
72
73
74
sub ObjectDraw
75
DrawSprite(0)
76
TempValue0 = 0
77
TempValue1 = 16
78
79
while TempValue0 < Object.SpawnedSpikes
80
Cos(TempValue2, Object.Angle)
81
TempValue2 *= TempValue1
82
TempValue2 <<= 7
83
TempValue2 += Object.XPos
84
85
Sin(TempValue3, Object.Angle)
86
TempValue3 *= TempValue1
87
TempValue3 <<= 7
88
TempValue3 += Object.YPos
89
90
DrawSpriteXY(1, TempValue2, TempValue3)
91
92
TempValue0++
93
TempValue1 += 16
94
loop
95
end sub
96
97
98
sub ObjectStartup
99
LoadSpriteSheet("R6/Objects.gif")
100
101
SpriteFrame(-8, -8, 16, 16, 133, 199) // #0 - Rotating Spikes Center
102
SpriteFrame(-8, -8, 16, 16, 150, 199) // #1 - Spikes
103
104
ArrayPos0 = 32
105
while ArrayPos0 < 1056
106
if Object[ArrayPos0].Type == TypeName[Rotating Spikes]
107
switch Object[ArrayPos0].PropertyValue
108
case ROTATION_CLOCKWISE
109
Object[ArrayPos0].Increment = 2
110
switch HUD.CurrentTimePeriod
111
case TIME_PRESENT
112
Object[ArrayPos0].SpawnedSpikes = 5
113
break
114
115
case TIME_PAST
116
Object[ArrayPos0].SpawnedSpikes = 4
117
break
118
119
case TIME_GOOD_FUTURE
120
case TIME_BAD_FUTURE
121
Object[ArrayPos0].SpawnedSpikes = 6
122
break
123
end switch
124
125
break
126
127
case ROTATION_COUNTERCLOCKWISE
128
Object[ArrayPos0].Increment = -2
129
switch HUD.CurrentTimePeriod
130
case TIME_PRESENT
131
Object[ArrayPos0].SpawnedSpikes = 5
132
break
133
134
case TIME_PAST
135
Object[ArrayPos0].SpawnedSpikes = 4
136
break
137
138
case TIME_GOOD_FUTURE
139
case TIME_BAD_FUTURE
140
Object[ArrayPos0].SpawnedSpikes = 6
141
break
142
end switch
143
144
Object[ArrayPos0].Angle = 384
145
break
146
147
case ROTATION_CCW_LINK_MOVINGBLOCKS
148
Object[ArrayPos0].Increment = -2
149
switch HUD.CurrentTimePeriod
150
case TIME_PRESENT
151
Object[ArrayPos0].SpawnedSpikes = 5
152
break
153
154
case TIME_PAST
155
Object[ArrayPos0].SpawnedSpikes = 4
156
break
157
158
case TIME_GOOD_FUTURE
159
case TIME_BAD_FUTURE
160
Object[ArrayPos0].SpawnedSpikes = 6
161
break
162
end switch
163
164
break
165
166
case ROTATION_CCW_TWO_SPIKES
167
Object[ArrayPos0].Increment = -2
168
Object[ArrayPos0].SpawnedSpikes = 2
169
break
170
171
case ROTATION_CW_SIX_SPIKES
172
Object[ArrayPos0].Increment = 2
173
Object[ArrayPos0].SpawnedSpikes = 6
174
break
175
end switch
176
end if
177
ArrayPos0++
178
loop
179
end sub
180
181
182
// ========================
183
// Editor Subs
184
// ========================
185
186
sub RSDKEdit
187
if Editor.ReturnVariable == true
188
switch Editor.VariableID
189
case EDIT_VAR_PROPVAL // Property Value
190
CheckResult = Object.PropertyValue
191
CheckResult %= 5
192
break
193
case 0 // spikeType
194
CheckResult = Object.PropertyValue
195
CheckResult %= 5
196
break
197
end switch
198
else
199
switch Editor.VariableID
200
case EDIT_VAR_PROPVAL // Property Value
201
Object.PropertyValue = Editor.VariableValue
202
Object.PropertyValue %= 5
203
break
204
case 0 // spikeType
205
Object.PropertyValue = Editor.VariableValue
206
Object.PropertyValue %= 5
207
break
208
end switch
209
end if
210
end sub
211
212
213
sub RSDKDraw
214
DrawSprite(0)
215
216
TempValue0 = 0
217
218
switch Object.PropertyValue
219
case ROTATION_CLOCKWISE
220
case ROTATION_COUNTERCLOCKWISE
221
case ROTATION_CCW_LINK_MOVINGBLOCKS
222
CallFunction(EditorHelpers_FindTimePeriod)
223
switch CheckResult
224
case TIME_PRESENT
225
TempValue1 = 5
226
break
227
case TIME_PAST
228
TempValue1 = 4
229
break
230
case TIME_GOOD_FUTURE
231
case TIME_BAD_FUTURE
232
TempValue1 = 6
233
break
234
end switch
235
break
236
case ROTATION_CCW_TWO_SPIKES
237
TempValue1 = 2
238
break
239
case ROTATION_CW_SIX_SPIKES
240
TempValue1 = 6
241
break
242
end switch
243
244
TempValue2 = Object.XPos
245
TempValue3 = Object.YPos
246
while TempValue0 < TempValue1
247
TempValue2 += 0x100000
248
TempValue3 += 0x100000
249
DrawSpriteXY(1, TempValue2, TempValue3)
250
TempValue0++
251
loop
252
253
if Editor.ShowGizmos == true
254
switch Object.PropertyValue
255
case ROTATION_CLOCKWISE
256
case ROTATION_CW_SIX_SPIKES
257
TempValue0 = Object.iXPos
258
TempValue0 += 32
259
TempValue0 <<= 16
260
261
TempValue1 = Object.iYPos
262
TempValue1 += 32
263
TempValue1 <<= 16
264
DrawArrow(TempValue0, Object.YPos, Object.XPos, TempValue1, 255, 255, 255, 0)
265
break
266
case ROTATION_COUNTERCLOCKWISE
267
case ROTATION_CCW_LINK_MOVINGBLOCKS
268
case ROTATION_CCW_TWO_SPIKES
269
TempValue0 = Object.iXPos
270
TempValue0 += 32
271
TempValue0 <<= 16
272
273
TempValue1 = Object.iYPos
274
TempValue1 += 32
275
TempValue1 <<= 16
276
DrawArrow(Object.XPos, TempValue1, TempValue0, Object.YPos, 255, 255, 255, 0)
277
break
278
end switch
279
280
if Object.PropertyValue == ROTATION_CCW_LINK_MOVINGBLOCKS
281
DrawLine(Object.XPos, Object.YPos, Object[-1].XPos, Object[-1].YPos, 0, 255, 255)
282
end if
283
end if
284
end sub
285
286
287
sub RSDKLoad
288
LoadSpriteSheet("R3/Objects.gif")
289
290
SpriteFrame(-8, -8, 16, 16, 181, 143) // #0 - Spike Joint
291
SpriteFrame(-8, -8, 16, 16, 181, 160) // #1 - Spike
292
293
CallFunction(EditorHelpers_FindTimePeriod)
294
AddEditorVariable("spikeType")
295
SetActiveVariable("spikeType")
296
switch CheckResult
297
default
298
case TIME_PRESENT
299
AddEnumVariable("5 Spikes Clock-wise", ROTATION_CLOCKWISE)
300
AddEnumVariable("5 Spikes Counter Clock-wise", ROTATION_COUNTERCLOCKWISE)
301
AddEnumVariable("5 Spikes Clock-wise, linked to moving blocks", ROTATION_CCW_LINK_MOVINGBLOCKS)
302
break
303
case TIME_PAST
304
AddEnumVariable("4 Spikes Clock-wise", ROTATION_CLOCKWISE)
305
AddEnumVariable("4 Spikes Counter Clock-wise", ROTATION_COUNTERCLOCKWISE)
306
AddEnumVariable("4 Spikes Clock-wise, linked to moving blocks", ROTATION_CCW_LINK_MOVINGBLOCKS)
307
break
308
case TIME_GOOD_FUTURE
309
case TIME_BAD_FUTURE
310
AddEnumVariable("6 Spikes Clock-wise", ROTATION_CLOCKWISE)
311
AddEnumVariable("6 Spikes Counter Clock-wise", ROTATION_COUNTERCLOCKWISE)
312
AddEnumVariable("6 Spikes Counter Clock-wise, linked to moving blocks", ROTATION_CCW_LINK_MOVINGBLOCKS)
313
break
314
end switch
315
AddEnumVariable("2 Spikes Counter Clock-wise", ROTATION_CCW_TWO_SPIKES)
316
AddEnumVariable("6 Spikes Clock-wise", ROTATION_CW_SIX_SPIKES)
317
end sub
318
319