Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-CD-2011-Script-Decompilation
Path: blob/main/Scripts/R3/Piston.txt
1319 views
1
//-------------------Sonic CD Piston 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.YOffSet
8
9
// Fireball Aliases
10
#alias Object.Value0 : Object.Fade
11
#alias Object.Value1 : Object.XVelocity
12
13
// HUD Alias
14
#alias Object[24].PropertyValue : HUD.CurrentTimePeriod
15
16
// States
17
#alias 0 : PISTON_DETECT_PLAYER
18
#alias 1 : PISTON_PREPARE_FIRE
19
#alias 2 : PISTON_EMERGE
20
#alias 3 : PISTON_FIRE
21
#alias 4 : PISTON_HIDE
22
23
// Gravity
24
#alias 0 : GRAVITY_GROUND
25
#alias 1 : GRAVITY_AIR
26
27
// Ink
28
#alias 2 : INK_ALPHA
29
30
// Time Periods
31
#alias 0 : TIME_PRESENT
32
#alias 1 : TIME_PAST
33
#alias 2 : TIME_GOOD_FUTURE
34
#alias 3 : TIME_BAD_FUTURE
35
36
37
sub ObjectMain
38
switch Object.State
39
case PISTON_DETECT_PLAYER
40
PlayerObjectCollision(C_TOUCH, -112, -256, 112, 256)
41
if CheckResult == true
42
if Object.Timer < 80
43
Object.Timer++
44
Object.Frame = 1
45
else
46
Object.Timer = 6
47
Object.State = PISTON_PREPARE_FIRE
48
end if
49
end if
50
break
51
52
case PISTON_PREPARE_FIRE
53
if Object.Timer < 33
54
Object.Timer++
55
Object.Frame = Object.Timer
56
Object.Frame /= 3
57
else
58
Object.Frame = 1
59
Object.Timer = 0
60
Object.State = PISTON_EMERGE
61
end if
62
break
63
64
case PISTON_EMERGE
65
if Object.YOffSet < 0x200000
66
Object.YOffSet += 0x80000
67
else
68
Object.State = PISTON_FIRE
69
end if
70
break
71
72
case PISTON_FIRE
73
if Object.Timer < 8
74
if Object.Timer == 0
75
switch HUD.CurrentTimePeriod
76
case TIME_PRESENT
77
case TIME_BAD_FUTURE
78
CreateTempObject(TypeName[Fireball], 0, Object.XPos, Object.YPos)
79
Object[TempObjectPos].XPos -= 0x180000
80
Object[TempObjectPos].YPos -= 0x140000
81
Object[TempObjectPos].Fade = 64
82
Object[TempObjectPos].XVelocity = -0x10000
83
Object[TempObjectPos].InkEffect = INK_ALPHA
84
Object[TempObjectPos].Alpha = 255
85
Object[TempObjectPos].Frame = 0
86
87
CreateTempObject(TypeName[Fireball], 0, Object.XPos, Object.YPos)
88
Object[TempObjectPos].XPos += 0x180000
89
Object[TempObjectPos].YPos -= 0x140000
90
Object[TempObjectPos].Fade = 64
91
Object[TempObjectPos].XVelocity = 0x10000
92
Object[TempObjectPos].InkEffect = INK_ALPHA
93
Object[TempObjectPos].Alpha = 255
94
Object[TempObjectPos].Frame = 1
95
96
end switch
97
end if
98
Object.Timer++
99
else
100
Object.Timer = 0
101
Object.State = PISTON_HIDE
102
end if
103
break
104
105
case PISTON_HIDE
106
if Object.YOffSet > 0
107
Object.YOffSet -= 0x40000
108
else
109
Object.State = PISTON_DETECT_PLAYER
110
end if
111
break
112
end switch
113
end sub
114
115
116
117
sub ObjectPlayerInteraction
118
TempValue0 = -0xC0000
119
TempValue0 -= Object.YOffSet
120
TempValue0 >>= 16
121
PlayerObjectCollision(C_BOX, -16, -12, 16, 16)
122
PlayerObjectCollision(C_PLATFORM, -16, TempValue0, 16, 16)
123
// if the player is on top when the piston emerges, launch it to the sky
124
if CheckResult == true
125
126
if Object.YOffSet == 0x200000
127
128
if Object.State == PISTON_EMERGE
129
Player.YVelocity = -0x70000
130
131
Player.Timer = 0
132
133
Player.Gravity = GRAVITY_AIR
134
Player.Animation = ANI_BOUNCING
135
136
#platform: Use_Origins
137
Player.State = Player_State_Air_NoDropDash
138
#endplatform
139
140
#platform: Use_Standalone
141
Player.State = Player_State_Air
142
#endplatform
143
end if
144
145
end if
146
147
end if
148
end sub
149
150
151
sub ObjectDraw
152
TempValue0 = Object.YPos
153
TempValue0 -= Object.YOffSet
154
DrawSpriteXY(Object.Frame, Object.XPos, TempValue0)
155
DrawSprite(0)
156
end sub
157
158
159
sub ObjectStartup
160
LoadSpriteSheet("R3/Objects.gif")
161
162
SpriteFrame(-16, -4, 32, 8, 214, 34) // #0 - Piston Head
163
SpriteFrame(-16, -12, 32, 40, 1, 34) // #1 - Piston
164
165
switch HUD.CurrentTimePeriod
166
case TIME_PRESENT
167
case TIME_BAD_FUTURE
168
SpriteFrame(-16, -12, 32, 40, 34, 34) // #2 - Piston Emerge Frame 0
169
SpriteFrame(-16, -12, 32, 40, 1, 34) // #3 - Piston Emerge Frame 1
170
SpriteFrame(-16, -12, 32, 40, 34, 34) // #4 - Piston Emerge Frame 2
171
SpriteFrame(-16, -12, 32, 40, 1, 34) // #5 - Piston Emerge Frame 3
172
SpriteFrame(-16, -12, 32, 40, 34, 34) // #6 - Piston Emerge Frame 4
173
SpriteFrame(-16, -12, 32, 40, 1, 34) // #7 - Piston Emerge Frame 5
174
SpriteFrame(-16, -12, 32, 40, 34, 34) // #8 - Piston Emerge Frame 6
175
SpriteFrame(-16, -12, 32, 40, 1, 34) // #9 - Piston Emerge Frame 7
176
SpriteFrame(-16, -12, 32, 40, 34, 34) // #10 - Piston Emerge Frame 8
177
SpriteFrame(-16, -12, 32, 40, 1, 34) // #11 - Piston Emerge Frame 9
178
break
179
180
case TIME_PAST
181
case TIME_GOOD_FUTURE
182
SpriteFrame(-16, -12, 32, 40, 1, 34) // #2 - Piston Emerge Frame 0
183
SpriteFrame(-16, -12, 32, 40, 1, 34) // #3 - Piston Emerge Frame 1
184
SpriteFrame(-16, -12, 32, 40, 1, 34) // #4 - Piston Emerge Frame 2
185
SpriteFrame(-16, -12, 32, 40, 1, 34) // #5 - Piston Emerge Frame 3
186
SpriteFrame(-16, -12, 32, 40, 1, 34) // #6 - Piston Emerge Frame 4
187
SpriteFrame(-16, -12, 32, 40, 1, 34) // #7 - Piston Emerge Frame 5
188
SpriteFrame(-16, -12, 32, 40, 1, 34) // #8 - Piston Emerge Frame 6
189
SpriteFrame(-16, -12, 32, 40, 1, 34) // #9 - Piston Emerge Frame 7
190
SpriteFrame(-16, -12, 32, 40, 1, 34) // #10 - Piston Emerge Frame 8
191
SpriteFrame(-16, -12, 32, 40, 1, 34) // #11 - Piston Emerge Frame 9
192
break
193
end switch
194
195
// Used to be below LoadSpriteSheet, moved here for consistency
196
ArrayPos0 = 32
197
while ArrayPos0 < 1056
198
if Object[ArrayPos0].Type == TypeName[Piston]
199
Object[ArrayPos0].Frame = 1
200
end if
201
ArrayPos0++
202
loop
203
end sub
204
205
206
// ========================
207
// Editor Subs
208
// ========================
209
210
sub RSDKDraw
211
DrawSprite(1)
212
DrawSprite(0)
213
214
if Editor.ShowGizmos == true
215
TempValue0 = Object.YPos
216
TempValue0 -= 0x200000
217
DrawArrow(Object.XPos, Object.YPos, Object.XPos, TempValue0, 255, 0, 0, 0)
218
end if
219
end sub
220
221
222
sub RSDKLoad
223
LoadSpriteSheet("R3/Objects.gif")
224
225
SpriteFrame(-16, -4, 32, 8, 214, 34) // #0 - Piston Head
226
SpriteFrame(-16, -12, 32, 40, 1, 34) // #1 - Piston
227
228
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
229
end sub
230
231