Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-CD-2011-Script-Decompilation
Path: blob/main/Scripts/Special/HWBackG_S6.txt
1319 views
1
//---------------Sonic CD HW Background 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
8
// These pair of values correspond to X coordinates on the sprite sheet
9
#alias Object.Value1 : Object.SpriteL
10
#alias Object.Value2 : Object.SpriteR
11
12
// These pair of values correspond to Y coodinates on the sprite sheet
13
// Value4 - SpriteB - is unused
14
#alias Object.Value3 : Object.SpriteT
15
#alias Object.Value4 : Object.SpriteB
16
17
// Used to determine the base X position for the background
18
#alias Object.Value5 : Object.Angle
19
20
// Between the initial game release and the latest mobile update, the offset for the background got changed
21
// Originally it was 64, but 48's what's used nowadays
22
// (Origins uses 48 too, so that's how we know it's truly an update change and not a HW renderer change)
23
24
#alias 48 : HWBACK_XOFFSET
25
26
// Priority
27
#alias 1 : PRIORITY_ACTIVE
28
29
// Face Buffer Flags
30
#alias 1 : FACE_FLAG_TEXTURED_2D
31
32
33
sub ObjectDraw
34
Object.Timer++
35
if Object.Timer > 3
36
Object.Timer = 0
37
38
Object.Frame++
39
Object.Frame %= 12
40
41
// Setup the new sprite bounds
42
43
// First, get the left bounds of the sprite
44
Object.SpriteL = Object.Frame
45
Object.SpriteL &= 3
46
Object.SpriteL <<= 7
47
48
// And then, the right bounds is just 127 pixels ot the left of that
49
Object.SpriteR = Object.SpriteL
50
Object.SpriteR += 127
51
52
// After that, comes the top bounds
53
Object.SpriteT = Object.Frame
54
Object.SpriteT >>= 2
55
Object.SpriteT <<= 7
56
57
// And similarly, the bottom bounds is just 127 pixels down from the top
58
Object.SpriteB = Object.SpriteT
59
Object.SpriteB += 127
60
end if
61
62
// Update the Angle for the background
63
Object.Angle += 2
64
Object.Angle &= 511
65
66
// Order of Values here:
67
// - TempValue0 is just a general loop counter
68
// - TempValue4 is the angle, it gets shifted a bit after every loop
69
// - TempValue1 is the upper Y mapping for the sprite, this gets changed a bit throughout
70
// - TempValue2 is the lower Y mapping for the sprite, this gets changed a bit throughout as well
71
// - ArrayPos0 is the index of the VertexBuffer to change
72
73
TempValue0 = 0
74
TempValue4 = Object.Angle
75
TempValue1 = Object.SpriteT
76
TempValue2 = Object.SpriteB
77
ArrayPos0 = 0
78
79
while TempValue0 < 16
80
81
// Get the base X change value
82
Sin(TempValue3, TempValue4)
83
84
// Adjust the change value as needed to get what we want
85
TempValue3 /= 12
86
TempValue3 -= HWBACK_XOFFSET
87
88
// Change the angle a bit so that future loops look different
89
TempValue4 += 56
90
TempValue4 &= 511
91
92
// And now, let's actually change those vertexes!
93
94
// ArrayPos0 + 0 - top left of a face + 0
95
VertexBuffer[ArrayPos0].u = Object.SpriteL
96
VertexBuffer[ArrayPos0].v = TempValue1
97
VertexBuffer[ArrayPos0].x = TempValue3
98
ArrayPos0++
99
100
TempValue3 += 128
101
102
// ArrayPos0 + 1 - top right of a face + 0
103
VertexBuffer[ArrayPos0].u = Object.SpriteR
104
VertexBuffer[ArrayPos0].v = TempValue1
105
VertexBuffer[ArrayPos0].x = TempValue3
106
ArrayPos0 += 3
107
108
// ArrayPos0 + 4 - top left of a face + 1
109
VertexBuffer[ArrayPos0].u = Object.SpriteR
110
VertexBuffer[ArrayPos0].v = TempValue2
111
VertexBuffer[ArrayPos0].x = TempValue3
112
ArrayPos0++
113
114
TempValue3 += 128
115
116
// ArrayPos0 + 5 - top right of a face + 1
117
VertexBuffer[ArrayPos0].u = Object.SpriteL
118
VertexBuffer[ArrayPos0].v = TempValue2
119
VertexBuffer[ArrayPos0].x = TempValue3
120
ArrayPos0 += 3
121
122
// ArrayPos0 + 8 - top left of a face + 2
123
VertexBuffer[ArrayPos0].u = Object.SpriteL
124
VertexBuffer[ArrayPos0].v = TempValue1
125
VertexBuffer[ArrayPos0].x = TempValue3
126
ArrayPos0++
127
128
TempValue3 += 128
129
130
// ArrayPos0 + 9 - top right of a face + 2
131
VertexBuffer[ArrayPos0].u = Object.SpriteR
132
VertexBuffer[ArrayPos0].v = TempValue1
133
VertexBuffer[ArrayPos0].x = TempValue3
134
ArrayPos0 += 3
135
136
// ArrayPos0 + 12 - top left of a face + 3
137
VertexBuffer[ArrayPos0].u = Object.SpriteR
138
VertexBuffer[ArrayPos0].v = TempValue2
139
VertexBuffer[ArrayPos0].x = TempValue3
140
ArrayPos0++
141
142
TempValue3 += 128
143
144
// ArrayPos0 + 13 - top right of a face + 3
145
VertexBuffer[ArrayPos0].u = Object.SpriteL
146
VertexBuffer[ArrayPos0].v = TempValue2
147
VertexBuffer[ArrayPos0].x = TempValue3
148
149
// Move to the lower half vertexes
150
ArrayPos0 -= 11
151
152
TempValue1 += 8
153
TempValue2 -= 8
154
155
// Get the new X change value
156
Sin(TempValue3, TempValue4)
157
158
TempValue3 /= 12
159
TempValue3 -= HWBACK_XOFFSET
160
161
// ArrayPos0 + 2 - bottom left of face + 0
162
VertexBuffer[ArrayPos0].u = Object.SpriteL
163
VertexBuffer[ArrayPos0].v = TempValue1
164
VertexBuffer[ArrayPos0].x = TempValue3
165
ArrayPos0++
166
167
TempValue3 += 128
168
169
// ArrayPos0 + 3 - bottom right of face + 0
170
VertexBuffer[ArrayPos0].u = Object.SpriteR
171
VertexBuffer[ArrayPos0].v = TempValue1
172
VertexBuffer[ArrayPos0].x = TempValue3
173
ArrayPos0 += 3
174
175
// ArrayPos0 + 6 - bottom left of face + 1
176
VertexBuffer[ArrayPos0].u = Object.SpriteR
177
VertexBuffer[ArrayPos0].v = TempValue2
178
VertexBuffer[ArrayPos0].x = TempValue3
179
ArrayPos0++
180
181
// ArrayPos0 + 7 - bottom right of face + 1
182
TempValue3 += 128
183
VertexBuffer[ArrayPos0].u = Object.SpriteL
184
VertexBuffer[ArrayPos0].v = TempValue2
185
VertexBuffer[ArrayPos0].x = TempValue3
186
ArrayPos0 += 3
187
188
// ArrayPos0 + 10 - bottom left of face + 2
189
VertexBuffer[ArrayPos0].u = Object.SpriteL
190
VertexBuffer[ArrayPos0].v = TempValue1
191
VertexBuffer[ArrayPos0].x = TempValue3
192
ArrayPos0++
193
194
TempValue3 += 128
195
196
// ArrayPos0 + 11 - bottom right of face + 2
197
VertexBuffer[ArrayPos0].u = Object.SpriteR
198
VertexBuffer[ArrayPos0].v = TempValue1
199
VertexBuffer[ArrayPos0].x = TempValue3
200
ArrayPos0 += 3
201
202
// ArrayPos0 + 14 - bottom left of face + 3
203
VertexBuffer[ArrayPos0].u = Object.SpriteR
204
VertexBuffer[ArrayPos0].v = TempValue2
205
VertexBuffer[ArrayPos0].x = TempValue3
206
ArrayPos0++
207
208
TempValue3 += 128
209
210
// ArrayPos0 + 15 - bottom left of face + 3
211
VertexBuffer[ArrayPos0].u = Object.SpriteL
212
VertexBuffer[ArrayPos0].v = TempValue2
213
VertexBuffer[ArrayPos0].x = TempValue3
214
ArrayPos0++
215
216
TempValue0++
217
loop
218
219
// Wow, that's quite the total!
220
3DScene.NoVertices = 256
221
3DScene.NoFaces = 64
222
223
// Now, draw all the 3d stuff we just set up
224
Draw3DScene()
225
226
// After that, draw a few purple boxes underneath, where the 3d stuff didn't reach
227
DrawSpriteScreenXY(0, 0, 0)
228
DrawSpriteScreenXY(0, 256, 0)
229
230
end sub
231
232
233
sub ObjectStartup
234
235
// This Object should only exist if the game is using the Hardware Renderer,
236
// as the Software Renderer doesn't need this
237
#platform: HW_Rendering
238
239
// Purple rectangle background Frame
240
SpriteFrame(0, 128, 256, 128, 256, 384)
241
242
// Reset all the 3d stuff
243
MatrixTranslateXYZ(MAT_WORLD, 0, 0, 0)
244
MatrixTranslateXYZ(MAT_VIEW, 0, 0, 0)
245
246
// Disable the stage background, in favour of what's gonna be done by this Object
247
Stage[0].ActiveLayer = 9
248
249
// Load the Sprite Sheet for the Object
250
// Yeah, the Sprite Frames were set up before the Sprite Sheet itself was even loaded...
251
LoadSpriteSheet("Special/SSBG6.gif")
252
253
// Place a HW Background object into the last of the Reserved Object Slots
254
Object[31].Type = TypeName[HW Background]
255
256
// Make it always active, and since it's to be a background, give it the Draw Order of such accordingly
257
Object[31].Priority = PRIORITY_ACTIVE
258
Object[31].DrawOrder = 0
259
260
// Make its initial Sprite values be the first, top left frame
261
Object[31].SpriteL = 0
262
Object[31].SpriteR = 128
263
Object[31].SpriteT = 0
264
Object[31].SpriteB = 128
265
266
// Setup all the faces
267
ArrayPos0 = 0
268
TempValue0 = 0
269
while ArrayPos0 < 64
270
271
// Set the face's corners to their corresponding Vertexes
272
FaceBuffer[ArrayPos0].a = TempValue0
273
TempValue0++
274
FaceBuffer[ArrayPos0].b = TempValue0
275
TempValue0++
276
FaceBuffer[ArrayPos0].c = TempValue0
277
TempValue0++
278
FaceBuffer[ArrayPos0].d = TempValue0
279
TempValue0++
280
281
FaceBuffer[ArrayPos0].Flag = FACE_FLAG_TEXTURED_2D
282
283
// And onto the next face!
284
ArrayPos0++
285
286
loop
287
288
// Make all Vertexes have a depth of 1
289
// This doesn't really matter much, though, as they all belond to a 2D vertex anyway, where depth isn't used
290
ArrayPos0 = 0
291
while ArrayPos0 < 256
292
VertexBuffer[ArrayPos0].z = 1
293
ArrayPos0++
294
loop
295
296
// Set the Y values for all the vertexes
297
TempValue0 = 0
298
ArrayPos0 = 0
299
while TempValue0 < 128
300
301
// First, do all the upper vertexes
302
303
// First face
304
VertexBuffer[ArrayPos0].y = TempValue0
305
ArrayPos0++
306
VertexBuffer[ArrayPos0].y = TempValue0
307
ArrayPos0 += 3
308
309
// Second face
310
VertexBuffer[ArrayPos0].y = TempValue0
311
ArrayPos0++
312
VertexBuffer[ArrayPos0].y = TempValue0
313
ArrayPos0 += 3
314
315
// Third face
316
VertexBuffer[ArrayPos0].y = TempValue0
317
ArrayPos0++
318
VertexBuffer[ArrayPos0].y = TempValue0
319
ArrayPos0 += 3
320
321
// Fourth face
322
VertexBuffer[ArrayPos0].y = TempValue0
323
ArrayPos0++
324
VertexBuffer[ArrayPos0].y = TempValue0
325
326
// Now, go back to the bottom half vertexes
327
ArrayPos0 -= 11
328
329
TempValue0 += 8
330
331
// First face
332
VertexBuffer[ArrayPos0].y = TempValue0
333
ArrayPos0++
334
VertexBuffer[ArrayPos0].y = TempValue0
335
ArrayPos0 += 3
336
337
// Second face
338
VertexBuffer[ArrayPos0].y = TempValue0
339
ArrayPos0++
340
VertexBuffer[ArrayPos0].y = TempValue0
341
ArrayPos0 += 3
342
343
// Third face
344
VertexBuffer[ArrayPos0].y = TempValue0
345
ArrayPos0++
346
VertexBuffer[ArrayPos0].y = TempValue0
347
ArrayPos0 += 3
348
349
// Fourth face
350
VertexBuffer[ArrayPos0].y = TempValue0
351
ArrayPos0++
352
VertexBuffer[ArrayPos0].y = TempValue0
353
ArrayPos0++
354
loop
355
#endplatform
356
357
end sub
358
359
360
// ========================
361
// Editor Subs
362
// ========================
363
364
sub RSDKDraw
365
DrawSprite(0)
366
end sub
367
368
369
sub RSDKLoad
370
LoadSpriteSheet("Special/SSBG6.gif")
371
SpriteFrame(-32, -32, 64, 64, 1, 143)
372
373
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
374
end sub
375
376