Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-CD-2011-Script-Decompilation
Path: blob/main/Scripts/Global/MSProjector.txt
1319 views
1
//---------------Sonic CD MS Projector Script-----------------//
2
//--------Scripted by Christian Whitehead 'The Taxman'--------//
3
//-------Unpacked By Rubberduckycooly's Script Unpacker-------//
4
5
// Aliases
6
#alias Object.Value0 : Object.Timer
7
#alias Object.Value1 : Object.Flicker
8
#alias Object.Value2 : Object.Angle
9
#alias Object.Value3 : Object.CurrentFrame
10
#alias Object.Value4 : Object.ProjectorSheet
11
#alias Object.Value5 : Object.AnimalSheet
12
#alias Object.Value6 : Object.Speed // "speed" as in angle increase, not as in movement speed or anything
13
14
// States
15
#alias 0 : MSPROJECTOR_ANIM_1
16
#alias 1 : MSPROJECTOR_ANIM_2
17
#alias 2 : MSPROJECTOR_DESTROYED
18
19
// Player
20
#alias 0 : PLAYER_SONIC_A
21
22
// Gravity
23
#alias 1 : GRAVITY_AIR
24
25
// Priority
26
#alias 1 : PRIORITY_ACTIVE
27
28
// Global SFX
29
#alias 22 : SFX_G_EXPLOSION
30
31
32
sub ObjectMain
33
switch Object.State
34
case MSPROJECTOR_ANIM_1
35
Object.Timer++
36
if Object.Timer == 16
37
Object.Timer = 0
38
Object.State = MSPROJECTOR_ANIM_2
39
end if
40
41
Object.Flicker = Object.Timer
42
Object.Flicker &= 3
43
44
Object.Frame++
45
if Object.Frame == 56
46
Object.Frame = 0
47
end if
48
break
49
50
case MSPROJECTOR_ANIM_2
51
Object.Timer++
52
if Object.Timer == 12
53
Object.Timer = 0
54
Object.State = MSPROJECTOR_ANIM_1
55
end if
56
57
Object.Flicker = Object.Timer
58
Object.Flicker %= 3
59
60
Object.Frame++
61
if Object.Frame == 56
62
Object.Frame = 0
63
end if
64
break
65
66
case MSPROJECTOR_DESTROYED
67
TempValue0 = Object.Timer
68
TempValue0 &= 3
69
if TempValue0 == 0
70
Rand(TempValue0, 32)
71
TempValue0 -= 16
72
TempValue0 <<= 16
73
TempValue0 += Object.XPos
74
75
Rand(TempValue1, 32)
76
TempValue1 -= 16
77
TempValue1 <<= 16
78
TempValue1 += Object.YPos
79
80
CreateTempObject(TypeName[Explosion], 0, TempValue0, TempValue1)
81
Object[TempObjectPos].DrawOrder = 4
82
PlaySfx(SFX_G_EXPLOSION, false)
83
end if
84
85
Object.Timer++
86
if Object.Timer == 60
87
ResetObjectEntity(Object.EntityNo, TypeName[Blank Object], 0, Object.XPos, Object.YPos)
88
end if
89
break
90
91
end switch
92
end sub
93
94
95
sub ObjectPlayerInteraction
96
if Object.State < MSPROJECTOR_DESTROYED
97
// if Player.Animation == ANI_JUMPING // Standalone original check
98
CheckEqual(Player.Animation, ANI_JUMPING)
99
TempValue0 = CheckResult
100
101
#platform: Use_Origins
102
CheckEqual(Player.Animation, ANI_GLIDING)
103
TempValue0 |= CheckResult
104
if Stage.PlayerListPos == PLAYER_AMY
105
if Player.Animation == ANI_HAMMER_JUMP
106
TempValue0 = true
107
end if
108
if Player.Animation == ANI_HAMMER_DASH
109
TempValue0 = true
110
end if
111
end if
112
#endplatform
113
114
if TempValue0 == true
115
#platform: Use_Standalone
116
PlayerObjectCollision(C_TOUCH, -13, -13, 13, 13)
117
#endplatform
118
#platform: Use_Origins
119
PlayerObjectCollision(C_ENEMY, -13, -13, 13, 13)
120
#endplatform
121
if CheckResult == true
122
Object.Timer = 0
123
MetalSonic_Destroyed = true
124
Object.Priority = PRIORITY_ACTIVE
125
Object.State = MSPROJECTOR_DESTROYED
126
MetalSonic_List++
127
128
#platform: Use_Origins
129
if Stage.PlayerListPos == PLAYER_AMY
130
game.callbackParam0 = 0
131
game.callbackParam1 = 3
132
EngineCallback(NOTIFY_STATS_BREAK_OBJECT)
133
end if
134
#endplatform
135
// Saviour of the Planet Unlock Criteria
136
if Stage.PlayerListPos == PLAYER_SONIC_A // PLAYER_SONIC in origins
137
if Stage.DebugMode == false
138
if Good_Future_List > 16382 // 0b11111111111110
139
if MetalSonic_List > 11
140
SetAchievement(11, 100)
141
end if
142
end if
143
end if
144
end if
145
146
#platform: Use_Haptics
147
HapticEffect(90, 0, 0, 0)
148
#endplatform
149
150
end if
151
if Player.Gravity == GRAVITY_AIR
152
PlayerObjectCollision(C_BOX, -12, -12, 12, 12)
153
end if
154
else
155
PlayerObjectCollision(C_BOX, -12, -12, 12, 12)
156
end if
157
end if
158
end sub
159
160
161
sub ObjectDraw
162
Object.SpriteSheet = Object.ProjectorSheet
163
DrawSprite(0)
164
165
if Object.State < MSPROJECTOR_DESTROYED
166
Object.CurrentFrame++
167
Object.CurrentFrame &= 31
168
TempValue2 = Object.CurrentFrame
169
TempValue2 >>= 4
170
TempValue2 += 7
171
172
Object.Angle += Object.Speed
173
Object.Angle &= 511
174
Cos(TempValue0, Object.Angle)
175
Sin(TempValue1, Object.Angle)
176
if TempValue1 < 0
177
Object.Direction = FACING_RIGHT
178
else
179
Object.Direction = FACING_LEFT
180
end if
181
182
TempValue0 <<= 12
183
TempValue1 <<= 11
184
185
TempValue0 += Object.XPos
186
TempValue1 += Object.YPos
187
188
TempValue0 -= 0x580000
189
TempValue1 -= 0x180000
190
191
// Projector Particles
192
TempValue3 = Object.Timer
193
TempValue3 &= 1
194
if TempValue3 == 0
195
TempValue3 = Object.Timer
196
TempValue3 &= 3
197
TempValue3 >>= 1
198
TempValue3++
199
DrawSprite(TempValue3)
200
end if
201
202
if Object.Flicker < 2
203
if Object.Speed == 8 // This is true for every animal except the TTZ Fishes
204
// Metal and stomped animal
205
if Object.Frame < 28
206
Object.SpriteSheet = Object.AnimalSheet
207
DrawSprite(5)
208
Object.SpriteSheet = Object.ProjectorSheet
209
DrawSprite(3)
210
else
211
Object.SpriteSheet = Object.AnimalSheet
212
DrawSprite(6)
213
Object.SpriteSheet = Object.ProjectorSheet
214
DrawSprite(4)
215
end if
216
217
// Free animal
218
Object.SpriteSheet = Object.AnimalSheet
219
DrawSpriteFX(TempValue2, FX_FLIP, TempValue0, TempValue1)
220
else
221
// Metal
222
Object.SpriteSheet = Object.ProjectorSheet
223
if Object.Frame < 28
224
DrawSprite(3)
225
else
226
DrawSprite(4)
227
end if
228
229
// Fishes
230
Object.SpriteSheet = Object.AnimalSheet
231
DrawSpriteFX(TempValue2, FX_FLIP, TempValue0, TempValue1)
232
TempValue4 = Object.Angle
233
TempValue4 += 320
234
TempValue4 &= 511
235
Cos(TempValue0, TempValue4)
236
Sin(TempValue1, TempValue4)
237
238
if TempValue1 < 0
239
Object.Direction = FACING_RIGHT
240
else
241
Object.Direction = FACING_LEFT
242
end if
243
TempValue0 <<= 12
244
TempValue1 <<= 11
245
TempValue0 += Object.XPos
246
TempValue1 += Object.YPos
247
TempValue0 -= 0x600000
248
TempValue1 -= 0x180000
249
TempValue2 -= 2
250
DrawSpriteFX(TempValue2, FX_FLIP, TempValue0, TempValue1)
251
end if
252
end if
253
end if
254
end sub
255
256
257
sub ObjectStartup
258
LoadSpriteSheet("Global/Items3.gif")
259
TempValue0 = Object.SpriteSheet
260
261
SpriteFrame(-12, -12, 24, 24, 150, 86) // #0 - Projector
262
SpriteFrame(-29, -10, 16, 8, 158, 111) // #1 - Projector Particles 1
263
SpriteFrame(-29, -10, 16, 8, 158, 120) // #2 - Projector Particles 2
264
SpriteFrame(-108, -28, 40, 40, 175, 136) // #3 - Metal Hologram Frame 0
265
SpriteFrame(-108, -28, 40, 40, 216, 136) // #4 - Metal Hologram Frame 1
266
267
TempValue2 = Stage.ListPos
268
#platform: Use_Decomp
269
// Origins Plus uses a hacky engine edit to work around the Anniversary Mode layouts not properly loading SpriteFrames
270
// Rather than implement that in the decomp, let's just correct the stage pos here instead
271
if TempValue2 >= 70 // If past the regular layouts and in the Anniversary Mode ones
272
// R11A - R12D
273
if TempValue2 <= 77
274
TempValue2 -= 70
275
else
276
// R31A - R42D
277
if TempValue2 <= 95
278
TempValue2 -= 68
279
else
280
// R61A - R82D
281
if TempValue2 <= 133
282
TempValue2 -= 56
283
end if
284
end if
285
end if
286
end if
287
#endplatform
288
TempValue2 /= 10
289
switch TempValue2
290
case 0
291
case 3
292
TempValue3 = 8
293
SpriteFrame(-112, -3, 24, 16, 150, 52) // #5 - Ricky Frame 0
294
SpriteFrame(-112, -3, 24, 16, 150, 69) // #6 - Ricky Frame 1
295
SpriteFrame(-8, -8, 16, 16, 240, 199) // #7 - Flicky Frame 0
296
SpriteFrame(-8, -8, 16, 16, 240, 216) // #8 - Flicky Frame 1
297
break
298
299
case 1
300
TempValue3 = 8
301
LoadSpriteSheet("R3/Objects3.gif")
302
SpriteFrame(-108, -11, 16, 24, 132, 35) // #5 - Pocky Frame 0
303
SpriteFrame(-112, -3, 24, 16, 149, 26) // #6 - Pocky Frame 1
304
SpriteFrame(-8, -8, 16, 16, 132, 1) // #7 - Canary Frame 0
305
SpriteFrame(-8, -8, 16, 16, 132, 18) // #8 - Canary Frame 1
306
break
307
308
case 2
309
TempValue3 = 4
310
LoadSpriteSheet("R4/Objects3.gif")
311
SpriteFrame(-8, -12, 16, 24, 1, 92) // #5 - Green Fish Frame 0
312
SpriteFrame(-8, -12, 16, 24, 18, 92) // #6 - Green Fish Frame 1
313
SpriteFrame(-8, -12, 16, 24, 1, 67) // #7 - Red Fish Frame 0
314
SpriteFrame(-8, -12, 16, 24, 18, 67) // #8 - Red Fish Frame 1
315
break
316
317
case 4
318
TempValue3 = 8
319
LoadSpriteSheet("R6/Objects3.gif")
320
SpriteFrame(-112, -3, 24, 16, 1, 201) // #5 - Pecky Frame 0
321
SpriteFrame(-112, -3, 24, 16, 26, 201) // #6 - Pecky Frame 1
322
SpriteFrame(-12, -8, 24, 16, 1, 218) // #7 - Swallow Frame 0
323
SpriteFrame(-12, -8, 24, 16, 26, 218) // #8 - Swallow Frame 1
324
break
325
326
case 5
327
TempValue3 = 8
328
LoadSpriteSheet("R7/Objects3.gif")
329
SpriteFrame(-108, -11, 16, 24, 1, 192) // #5 - Pocky Frame 0
330
SpriteFrame(-112, -3, 24, 16, 18, 158) // #6 - Pocky Frame 1
331
SpriteFrame(-8, -8, 16, 16, 1, 158) // #7 - Canary Frame 0
332
SpriteFrame(-8, -8, 16, 16, 1, 175) // #8 - Canary Frame 1
333
break
334
335
case 6
336
TempValue3 = 8
337
LoadSpriteSheet("R8/Objects2.gif")
338
SpriteFrame(-112, -3, 24, 16, 1, 234) // #5 - Sheep Frame 0
339
SpriteFrame(-112, -3, 24, 16, 26, 234) // #6 - Sheep Frame 1
340
SpriteFrame(-8, -8, 16, 16, 143, 110) // #7 - Dove Frame 0
341
SpriteFrame(-8, -8, 16, 16, 143, 127) // #8 - Dove Frame 1
342
break
343
344
end switch
345
TempValue1 = Object.SpriteSheet
346
347
ArrayPos0 = 32
348
while ArrayPos0 < 1056
349
if Object[ArrayPos0].Type == TypeName[MSProjector]
350
Object[ArrayPos0].ProjectorSheet = TempValue0
351
Object[ArrayPos0].AnimalSheet = TempValue1
352
Object[ArrayPos0].Speed = TempValue3
353
if MetalSonic_Destroyed == true
354
Object[ArrayPos0].Type = TypeName[Blank Object]
355
end if
356
end if
357
ArrayPos0++
358
loop
359
end sub
360
361
362
// ========================
363
// Editor Subs
364
// ========================
365
366
sub RSDKDraw
367
DrawSprite(0)
368
DrawSprite(1)
369
DrawSprite(3)
370
end sub
371
372
373
sub RSDKLoad
374
LoadSpriteSheet("Global/Items3.gif")
375
SpriteFrame(-12, -12, 24, 24, 150, 86) // #0 - Projector
376
SpriteFrame(-29, -10, 16, 8, 158, 111) // #1 - Projector Particles 1
377
SpriteFrame(-29, -10, 16, 8, 158, 120) // #2 - Projector Particles 2
378
SpriteFrame(-108, -28, 40, 40, 175, 136) // #3 - Metal Hologram Frame 0
379
SpriteFrame(-108, -28, 40, 40, 216, 136) // #4 - Metal Hologram Frame 1
380
381
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
382
end sub
383
384