-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathstupid_mobile_game.cbscript
More file actions
495 lines (413 loc) · 15.2 KB
/
stupid_mobile_game.cbscript
File metadata and controls
495 lines (413 loc) · 15.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
dir "Stupid Mobile Game Test"
desc "Physics engine for stupid mobile game."
scale 1000
import common
import transforms
import math
$Precision = 1000
$Half = 500
$Billion = 1000000000
reset
/scoreboard objectives add absorbed minecraft.custom:minecraft.damage_dealt_absorbed
initialize_transforms()
CubeSize = 1500
CubeInvMass = 800
CubeInvRotInt = 400
end
clock tick
define name collider = "collider_$(collider)"
# Apply gravity, integrate linear/angular velocity
for collider = 1 to max_collider
with
$(collider) = collider
do
if not collider.sleeping
collider_physics_tick() with macros
water_here = False
with
$(x) = collider.x / $Precision
$(y) = collider.y / $Precision
$(z) = collider.z / $Precision
do
/$execute if block $(x) $(y) $(z) minecraft:water run scoreboard players set Global water_here 1
end
if water_here
unless collider.buoyancy
collider.buoyancy = 200
end
water_above = False
with
$(y) = collider.y / $Precision + 1
do
/$execute if block $(x) $(y) $(z) minecraft:water run scoreboard players set Global water_above 1
end
if water_above
submerged = $Precision
else
submerged = $Precision - collider.y % $Precision
end
collider.velocity_y += submerged * collider.buoyancy / $Precision
collider.velocity_x *= 9
collider.velocity_x /= 10
collider.velocity_y *= 9
collider.velocity_y /= 10
collider.velocity_z *= 9
collider.velocity_z /= 10
collider.rotation_x *= 9
collider.rotation_x /= 10
collider.rotation_y *= 9
collider.rotation_y /= 10
collider.rotation_z *= 9
collider.rotation_z /= 10
collider_wake_up() with macros
end
end
end
end
# Update the penetration and normal for active collisions
update_active_collisions()
# Get collisions between colliders and the world
for collider = 1 to max_collider
with
$(collider) = collider
do
if not collider.sleeping
# New collisions
get_collider_world_collisions() with macros
end
end
end
# Get collisions between each pair of colliders
for col1 = 1 to max_collider
for col2 = col1+1 to max_collider
with
$(collider1) = col1
$(collider2) = col2
get_collider_collider_collision()
end
end
# Remove all new collisions, except for new collisions that have
# the deepest penetration for a collider
cull_collisions()
# Merge collision indices down so that there aren't any empties
merge_collisions_down()
# Resolve collisions
resolve_collision_velocity()
resolve_collision_penetration()
# Final collider update to render and check for sleeping
for collider = 1 to max_collider
with
$(collider) = collider
do
if not collider.sleeping
collider_set_transform() with macros
collider_check_sleep() with macros
end
end
end
end
function destroy_colliders()
for destroy.collider = max_collider to 1 by -1
destroy_collider()
end
/kill @PhysicsBlock
max_collider = 0
end
function destroy_collider()
with
$(collider) = destroy.collider
do
define name collider = "collider_$(collider)"
if max_collider == collider.id
max_collider--
end
as @PhysicsBlock
if @s.collider_id == collider.id
/kill @s
end
end
/scoreboard players reset collider_$(collider)
for vertex = 0 to 7
with
$(vertex) = vertex
do
/scoreboard players reset collider_$(collider)_v$(vertex)
end
end
for axis = 0 to 2
with
$(axis) = axis
do
/scoreboard players reset collider_$(collider)_a$(axis)
end
end
end
end
function add_chest()
block_type = 1
with
$(block_name) = "chest"
add_collider()
end
function add_cobblestone()
block_type = 2
with
$(block_name) = "cobblestone"
add_collider()
end
function add_tnt()
block_type = 3
with
$(block_name) = "tnt"
add_collider()
end
function add_collider()
id = get_unused_collider_id()
with
$(collider) = id
create_collider(new.x, new.y, new.z, CubeSize, CubeInvMass, CubeInvRotInt)
as @PhysicsBlock[age == 1]
@s.block_type = block_type
end
unless id <= max_collider
max_collider = id
end
end
function get_unused_collider_id()
for collider = 1 to max_collider+1
with
$(collider) = collider
do
define name collider = "collider_$(collider)"
unless collider.id
return_id = collider
collider = 1000000000
end
end
end
return return_id
end
function test_update_collision()
for collision = 1 to max_collision
with
$(collision) = collision
do
define name collision = "collision_$(collision)"
old_id = collision.id
old_type = collision.type
old_pen = collision.pen
old_x = collision.x
old_y = collision.y
old_z = collision.z
old_nx = collision.nx
old_ny = collision.ny
old_nz = collision.nz
update_collision() with macros
same = True
unless old_pen == collision.pen
same = False
end
unless old_x == collision.x
same = False
end
unless old_y == collision.y
same = False
end
unless old_z == collision.z
same = False
end
unless old_nx == collision.nx
same = False
end
unless old_ny == collision.ny
same = False
end
unless old_nz == collision.nz
same = False
end
unless same
tell @a "Collision #(old_id) changed"
if old_type == $CollisionCubePointWorldFace
tell @a "Cube Point - World Face"
end
if old_type == $CollisionCubeFaceWorldPoint
tell @a "Cube Face - World Point"
end
if old_type == $CollisionCubeEdgeWorldEdge
tell @a "Cube Edge - World Edge"
end
if old_type == $CollisionCubeFaceCubePoint
tell @a "Cube Face - Cube Point"
end
if old_type == $CollisionCubeEdgeCubeEdge
tell @a "Cube Edge - Cube Edge"
end
tell @a "(old_pen) pos (old_x), (old_y), (old_z) norm (old_nx), (old_ny), (old_nz)"
tell @a "(collision.pen) pos (collision.x), (collision.y), (collision.z) norm (collision.nx), (collision.ny), (collision.nz)"
end
end
end
end
function clear_save_state()
for collider_iter = 1 to save_state.max_collider
with
$(collider) = collider_iter
do
/scoreboard players reset save_state_collider_$(collider)
end
end
for collision_iter = 1 to save_state.max_collision
with
$(collision) = collision_iter
do
/scoreboard players reset save_state_collision_$(collision)
end
end
/scoreboard players reset save_state
end
function save_state()
clear_save_state()
save_state.max_collider = max_collider
for collider_iter = 1 to max_collider
with
$(collider) = collider_iter
do
define name collider = "collider_$(collider)"
define name save_state = "save_state_collider_$(collider)"
if collider.id
save_state.id = collider.id
save_state.x = collider.x
save_state.y = collider.y
save_state.z = collider.z
save_state.velocity_x = collider.velocity_x
save_state.velocity_y = collider.velocity_y
save_state.velocity_z = collider.velocity_z
save_state.rotation_x = collider.rotation_x
save_state.rotation_y = collider.rotation_y
save_state.rotation_z = collider.rotation_z
save_state.size = collider.size
save_state.inv_mass = collider.inv_mass
save_state.inv_rot_int = collider.inv_rot_int
save_state.w = collider.w
save_state.i = collider.i
save_state.j = collider.j
save_state.k = collider.k
save_state.recent_motion = collider.recent_motion
save_state.recent_rotation = collider.recent_rotation
save_state.sleeping = collider.sleeping
end
end
end
save_state.max_collision = max_collision
for collision_iter = 1 to max_collision
with
$(collision) = collision_iter
do
define name collision = "collision_$(collision)"
define name save_state = "save_state_collision_$(collision)"
if collision.active
save_state.id = collision.id
save_state.active = collision.active
save_state.pen = collision.pen
save_state.x = collision.x
save_state.y = collision.y
save_state.z = collision.z
save_state.nx = collision.nx
save_state.ny = collision.ny
save_state.nz = collision.nz
save_state.type = collision.type
save_state.collider1 = collision.collider1
save_state.collider2 = collision.collider2
save_state.vertex = collision.vertex
save_state.vertex1 = collision.vertex1
save_state.vertex2 = collision.vertex2
save_state.nvert1 = collision.nvert1
save_state.nvert2 = collision.nvert2
save_state.block_x = collision.block_x
save_state.block_y = collision.block_y
save_state.block_z = collision.block_z
save_state.lnx = collision.lnx
save_state.lny = collision.lny
save_state.lnz = collision.lnz
save_state.ox = collision.ox
save_state.oy = collision.oy
save_state.oz = collision.oz
save_state.ex = collision.ex
save_state.ey = collision.ey
save_state.ez = collision.ez
end
end
end
end
function load_state()
destroy_colliders()
delete_collisions()
collision_frame = 0
max_collider = save_state.max_collider
for collider_iter = 1 to save_state.max_collider
with
$(collider) = collider_iter
do
define name collider = "collider_$(collider)"
define name save_state = "save_state_collider_$(collider)"
if save_state.id
create_collider(save_state.x, save_state.y, save_state.z, save_state.size, save_state.inv_mass, save_state.inv_rot_int) with macros
collider.velocity_x = save_state.velocity_x
collider.velocity_y = save_state.velocity_y
collider.velocity_z = save_state.velocity_z
collider.rotation_x = save_state.rotation_x
collider.rotation_y = save_state.rotation_y
collider.rotation_z = save_state.rotation_z
collider.w = save_state.w
collider.i = save_state.i
collider.j = save_state.j
collider.k = save_state.k
collider_quaternion_to_transform() with macros
collider.recent_motion = save_state.recent_motion
collider.recent_rotation = save_state.recent_rotation
collider.sleeping = save_state.sleeping
collider_set_transform() with macros
end
end
end
max_collision = save_state.max_collision
for collision_iter = 1 to save_state.max_collision
with
$(collision) = collision_iter
do
define name collision = "collision_$(collision)"
define name save_state = "save_state_collision_$(collision)"
if save_state.active
collision.id = save_state.id
collision.active = save_state.active
collision.pen = save_state.pen
collision.x = save_state.x
collision.y = save_state.y
collision.z = save_state.z
collision.nx = save_state.nx
collision.ny = save_state.ny
collision.nz = save_state.nz
collision.type = save_state.type
collision.collider1 = save_state.collider1
collision.collider2 = save_state.collider2
collision.vertex = save_state.vertex
collision.vertex1 = save_state.vertex1
collision.vertex2 = save_state.vertex2
collision.nvert1 = save_state.nvert1
collision.nvert2 = save_state.nvert2
collision.block_x = save_state.block_x
collision.block_y = save_state.block_y
collision.block_z = save_state.block_z
collision.lnx = save_state.lnx
collision.lny = save_state.lny
collision.lnz = save_state.lnz
collision.ox = save_state.ox
collision.oy = save_state.oy
collision.oz = save_state.oz
collision.ex = save_state.ex
collision.ey = save_state.ey
collision.ez = save_state.ez
end
end
end
end