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/Enemies/Clucker.txt
1482 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Clucker 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.startPos.y
13
private alias object.value1 : object.timer
14
private alias object.value2 : object.cannonOffset.x
15
16
// States
17
private alias 0 : CLUCKER_HIDDEN
18
private alias 1 : CLUCKER_APPEAR
19
private alias 2 : CLUCKER_ADJUSTCANNON
20
private alias 3 : CLUCKER_ATTACKING
21
22
// Player Aliases
23
private alias object.xpos : player.xpos
24
25
private alias object.value40 : player.hitboxLeft
26
private alias object.value38 : player.hitboxTop
27
private alias object.value41 : player.hitboxRight
28
private alias object.value39 : player.hitboxBottom
29
30
// ========================
31
// Function Declarations
32
// ========================
33
34
reserve function Clucker_Setup
35
reserve function Clucker_DebugDraw
36
reserve function Clucker_DebugSpawn
37
38
// ========================
39
// Static Values
40
// ========================
41
42
private value Clucker_sheetX = 0
43
private value Clucker_sheetY = 0
44
45
private function Clucker_Setup
46
object[arrayPos0].ypos = object[arrayPos0].startPos.y
47
object[arrayPos0].timer = 0
48
object[arrayPos0].state = CLUCKER_HIDDEN
49
object[arrayPos0].priority = PRIORITY_BOUNDS
50
end function
51
52
53
private function Clucker_DebugDraw
54
EditFrame(0, -16, -16, 32, 32, Clucker_sheetX, Clucker_sheetY)
55
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
56
end function
57
58
59
private function Clucker_DebugSpawn
60
CreateTempObject(TypeName[Clucker], 0, object.xpos, object.ypos)
61
object[tempObjectPos].ypos += 0x200000
62
object[tempObjectPos].startPos.y = object[tempObjectPos].ypos
63
object[tempObjectPos].direction = object.direction
64
65
arrayPos0 = object[tempObjectPos].entityPos
66
CallFunction(Clucker_Setup)
67
end function
68
69
70
// ========================
71
// Events
72
// ========================
73
74
event ObjectUpdate
75
switch object.state
76
case CLUCKER_HIDDEN
77
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
78
BoxCollisionTest(C_TOUCH, object.entityPos, -128, -256, 128, 32, currentPlayer, -1, -1, 1, 1)
79
if checkResult == true
80
object.timer = 16
81
if player[currentPlayer].xpos > object.xpos
82
object.direction = FLIP_X
83
object.cannonOffset.x = -0x80000
84
else
85
object.direction = FLIP_NONE
86
object.cannonOffset.x = 0x80000
87
end if
88
object.priority = PRIORITY_ACTIVE
89
object.state = CLUCKER_APPEAR
90
end if
91
next
92
break
93
94
case CLUCKER_APPEAR
95
object.ypos -= 0x20000
96
97
object.timer--
98
if object.timer == 0
99
object.timer = 8
100
object.state = CLUCKER_ADJUSTCANNON
101
end if
102
break
103
104
case CLUCKER_ADJUSTCANNON
105
if object.direction == FLIP_NONE
106
object.cannonOffset.x -= 0x10000
107
else
108
object.cannonOffset.x += 0x10000
109
end if
110
111
object.timer--
112
if object.timer == 0
113
object.timer = 14
114
object.state = CLUCKER_ATTACKING
115
end if
116
break
117
118
case CLUCKER_ATTACKING
119
switch object.timer
120
case 4
121
if object.direction == FLIP_NONE
122
object.cannonOffset.x += 0x20000
123
else
124
object.cannonOffset.x -= 0x20000
125
end if
126
break
127
128
case 0
129
PlaySfx(SfxName[Octus Shot], false)
130
temp0 = object.xpos
131
temp1 = object.ypos
132
temp1 += 0xB0000
133
134
if object.direction == FLIP_NONE
135
object.cannonOffset.x -= 0x20000
136
temp0 -= 0x130000
137
CreateTempObject(TypeName[Clucker Shot], 0, temp0, temp1)
138
object[tempObjectPos].xvel = -0x20000
139
else
140
object.cannonOffset.x += 0x20000
141
temp0 += 0x130000
142
CreateTempObject(TypeName[Clucker Shot], 0, temp0, temp1)
143
object[tempObjectPos].xvel = 0x20000
144
end if
145
object[tempObjectPos].direction = object.direction
146
147
object.timer = 68
148
break
149
150
end switch
151
152
object.timer--
153
break
154
155
end switch
156
157
temp0 = object.ypos
158
object.ypos = object.startPos.y
159
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
160
BoxCollisionTest(C_SOLID, object.entityPos, -16, -8, 16, 8, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
161
next
162
163
object.ypos = temp0
164
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
165
BoxCollisionTest(C_TOUCH, object.entityPos, -14, -16, 14, 16, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
166
if checkResult == true
167
CallFunction(Player_BadnikBreak)
168
end if
169
next
170
171
if object.outOfBounds == true
172
temp1 = object.ypos
173
object.ypos = object.startPos.y
174
if object.outOfBounds == true
175
arrayPos0 = object.entityPos
176
CallFunction(Clucker_Setup)
177
else
178
object.ypos = temp1
179
end if
180
end if
181
end event
182
183
184
event ObjectDraw
185
if object.state >= CLUCKER_ADJUSTCANNON
186
temp0 = object.xpos
187
temp0 += object.cannonOffset.x
188
DrawSpriteFX(1, FX_FLIP, temp0, object.ypos)
189
end if
190
191
temp0 = object.startPos.y
192
temp0 -= object.ypos
193
temp0 >>= 16
194
EditFrame(0, -16, -16, 32, temp0, Clucker_sheetX, Clucker_sheetY)
195
DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
196
end event
197
198
199
event ObjectStartup
200
CheckCurrentStageFolder("Zone11")
201
if checkResult == true
202
LoadSpriteSheet("SCZ/Objects.gif")
203
SpriteFrame(-16, -16, 32, 32, 9, 223) // Clucker - #0
204
SpriteFrame(-24, 7, 8, 7, 1, 246) // Cannon - #1
205
Clucker_sheetX = 9
206
Clucker_sheetY = 223
207
else
208
LoadSpriteSheet("MBZ/Objects.gif")
209
SpriteFrame(-16, -16, 32, 32, 845, 256) // Clucker - #0
210
SpriteFrame(-24, 7, 8, 7, 837, 279) // Cannon - #1
211
Clucker_sheetX = 845
212
Clucker_sheetY = 256
213
end if
214
215
foreach (TypeName[Clucker], arrayPos0, ALL_ENTITIES)
216
object[arrayPos0].ypos += 0x200000
217
object[arrayPos0].startPos.y = object[arrayPos0].ypos
218
CallFunction(Clucker_Setup)
219
next
220
221
SetTableValue(TypeName[Clucker], DebugMode_ObjCount, DebugMode_TypesTable)
222
SetTableValue(Clucker_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
223
SetTableValue(Clucker_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
224
DebugMode_ObjCount++
225
end event
226
227
228
// ========================
229
// Editor Events
230
// ========================
231
232
event RSDKDraw
233
DrawSprite(1)
234
DrawSprite(0)
235
end event
236
237
238
event RSDKLoad
239
CheckCurrentStageFolder("Zone11")
240
if checkResult == true
241
LoadSpriteSheet("SCZ/Objects.gif")
242
SpriteFrame(-16, -16, 32, 32, 9, 223) // Clucker - #0
243
SpriteFrame(-24, 7, 8, 7, 1, 246) // Cannon - #1
244
else
245
LoadSpriteSheet("MBZ/Objects.gif")
246
SpriteFrame(-16, -16, 32, 32, 845, 256) // Clucker - #0
247
SpriteFrame(-24, 7, 8, 7, 837, 279) // Cannon - #1
248
end if
249
250
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
251
end event
252
253