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/MCZ/PullVine.txt
1487 views
1
// ----------------------------------
2
// RSDK Project: Sonic 2
3
// Script Description: Pull Vine 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.propertyValue : object.pulled
13
14
private alias object.value0 : object.timer
15
private alias object.value1 : object.startPos.y // Unused
16
private alias object.value2 : object.originPos.y // Used
17
private alias object.value3 : object.grabDelay
18
19
private alias object.state : player.state
20
private alias object.animation : player.animation
21
private alias object.gravity : player.gravity
22
private alias object.collisionTop : player.collisionTop
23
private alias object.xpos : player.xpos
24
private alias object.ypos : player.ypos
25
private alias object.xvel : player.xvel
26
private alias object.yvel : player.yvel
27
private alias object.speed : player.speed
28
private alias object.jumpPress : player.jumpPress
29
private alias object.down : player.down
30
31
32
// ========================
33
// Function Declarations
34
// ========================
35
36
reserve function PullVine_DebugDraw
37
reserve function PullVine_DebugSpawn
38
39
40
// ========================
41
// Function Definitions
42
// ========================
43
44
private function PullVine_DebugDraw
45
DrawSprite(1)
46
end function
47
48
49
private function PullVine_DebugSpawn
50
CreateTempObject(TypeName[Pull Vine], 0, object.xpos, object.ypos)
51
object[tempObjectPos].startPos.y = object[tempObjectPos].ypos
52
object[tempObjectPos].yvel = 0x20000
53
object[tempObjectPos].originPos.y = object[tempObjectPos].ypos
54
end function
55
56
57
// ========================
58
// Events
59
// ========================
60
61
event ObjectUpdate
62
if object.pulled == true
63
if object.timer < 88
64
object.timer++
65
object.ypos += object.yvel
66
end if
67
else
68
if object.timer > 0
69
object.timer--
70
object.ypos -= object.yvel
71
end if
72
end if
73
object.pulled = false
74
75
if object.grabDelay > 0
76
object.grabDelay--
77
end if
78
79
temp0 = object.ypos
80
temp0 += 0x380000
81
foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
82
if player[currentPlayer].state != Player_State_Static
83
if player[currentPlayer].down == false
84
if object.grabDelay == 0
85
if player[currentPlayer].ypos < temp0
86
BoxCollisionTest(C_TOUCH, object.entityPos, -8, 88, 8, 96, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
87
else
88
BoxCollisionTest(C_TOUCH, object.entityPos, -8, 40, 8, 48, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
89
end if
90
91
if checkResult == true
92
if player[currentPlayer].gravity == 1
93
player[currentPlayer].state = Player_State_Static
94
player[currentPlayer].animation = ANI_HANGING
95
player[currentPlayer].speed = 0
96
player[currentPlayer].xvel = 0
97
player[currentPlayer].yvel = 0
98
player[currentPlayer].xpos = object.xpos
99
player[currentPlayer].ypos = player[currentPlayer].collisionTop
100
FlipSign(player[currentPlayer].ypos)
101
player[currentPlayer].ypos += 36
102
player[currentPlayer].ypos <<= 16
103
player[currentPlayer].ypos += object.ypos
104
object.pulled |= true
105
end if
106
end if
107
end if
108
end if
109
else
110
BoxCollisionTest(C_TOUCH, object.entityPos, -8, -4, 8, 72, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)
111
if checkResult == true
112
if player[currentPlayer].jumpPress == true
113
#platform: USE_STANDALONE
114
player[currentPlayer].state = Player_State_Air
115
#endplatform
116
#platform: USE_ORIGINS
117
player[currentPlayer].state = Player_State_Air_NoDropDash
118
#endplatform
119
player[currentPlayer].yvel = -0x40000
120
player[currentPlayer].gravity = GRAVITY_AIR
121
object.grabDelay = 30 // Half a second before the player can grab the vine again
122
else
123
player[currentPlayer].xpos = object.xpos
124
player[currentPlayer].ypos = player[currentPlayer].collisionTop
125
FlipSign(player[currentPlayer].ypos)
126
player[currentPlayer].ypos += 36
127
player[currentPlayer].ypos <<= 16
128
player[currentPlayer].ypos += object.ypos
129
object.pulled |= true
130
end if
131
end if
132
end if
133
next
134
135
if object.frame == 0
136
if object.pulled == true
137
PlaySfx(SfxName[Catch], false)
138
end if
139
end if
140
141
object.frame = object.pulled
142
end event
143
144
145
event ObjectDraw
146
// Edit the sprite frame based on how low (or high) the vine should appear
147
temp0 = object.ypos
148
temp0 -= object.originPos.y
149
temp0 >>= 16
150
temp1 = 176
151
temp1 -= temp0
152
temp2 = -40
153
temp2 -= temp0
154
temp0 += 80
155
EditFrame(0, -12, temp2, 24, temp0, 232, temp1)
156
157
DrawSprite(0)
158
end event
159
160
161
event ObjectStartup
162
LoadSpriteSheet("MCZ/Objects.gif")
163
164
SpriteFrame(-12, -40, 24, 80, 232, 176)
165
SpriteFrame(-12, -40, 24, 80, 232, 176) // Debug mode preview frame, otherwise unused
166
167
foreach (TypeName[Pull Vine], arrayPos0, ALL_ENTITIES)
168
object[arrayPos0].originPos.y = object[arrayPos0].ypos
169
if object[arrayPos0].propertyValue == 0
170
// Moving down variant
171
object[arrayPos0].yvel = 0x20000
172
else
173
// Moving up variant
174
object[arrayPos0].yvel = -0x20000
175
object[arrayPos0].ypos += 0xB00000
176
end if
177
178
object[arrayPos0].startPos.y = object[arrayPos0].ypos
179
object[arrayPos0].pulled = false
180
next
181
182
SetTableValue(TypeName[Pull Vine], DebugMode_ObjCount, DebugMode_TypesTable)
183
SetTableValue(PullVine_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
184
SetTableValue(PullVine_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
185
DebugMode_ObjCount++
186
end event
187
188
189
// ========================
190
// Editor Events
191
// ========================
192
193
event RSDKEdit
194
if editor.returnVariable == true
195
switch editor.variableID
196
case EDIT_VAR_PROPVAL // property value
197
checkResult = object.propertyValue
198
break
199
200
case 0 // pull direction
201
checkResult = object.propertyValue
202
checkResult &= 1
203
break
204
205
end switch
206
else
207
switch editor.variableID
208
case EDIT_VAR_PROPVAL // property value
209
object.propertyValue = editor.variableValue
210
break
211
212
case 0 // pull direction
213
object.propertyValue = editor.variableValue
214
object.propertyValue &= 1
215
break
216
217
end switch
218
end if
219
end event
220
221
222
event RSDKDraw
223
// TODO: maybe something about offsetting the sprite for the up variant, in order to make it closer to how it appears in-game
224
DrawSprite(0)
225
end event
226
227
228
event RSDKLoad
229
LoadSpriteSheet("MCZ/Objects.gif")
230
SpriteFrame(-12, -40, 24, 80, 232, 176)
231
232
AddEditorVariable("pullDir")
233
SetActiveVariable("pullDir")
234
AddEnumVariable("down", 0)
235
AddEnumVariable("up" , 1)
236
end event
237
238