Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
FogNetwork
GitHub Repository: FogNetwork/Tsunami
Path: blob/main/public/games/files/garbage-collector/js/main-dev.js
1036 views
1
/*jshint bitwise: false*/
2
/* globals requirejs, define*/
3
requirejs.config({
4
shim: {
5
box2d: {
6
exports: 'Box2D'
7
}
8
},
9
paths: {
10
box2d: 'Box2dWeb/Box2dWeb-2.1.a.3.min'
11
}
12
});
13
14
define(function( require ) {
15
'use strict';
16
17
var Game = require( 'game' ),
18
Level = require( 'level' ),
19
Circle = require( 'geometry/circle' ),
20
Rect = require( 'geometry/rect' ),
21
Polygon = require( 'geometry/polygon' ),
22
Segment = require( 'geometry/segment' ),
23
Player = require( 'entities/player' );
24
25
var Utils = require( 'utils' );
26
27
var Color = require( 'color' );
28
var Entity = require( 'entities/entity' );
29
var PhysicsEntity = require( 'entities/physics-entity' );
30
31
var Emitter = require( 'entities/emitter' );
32
var TractorBeam = require( 'entities/tractor-beam' );
33
var Trail = require( 'effects/trail' );
34
var Laser = require( 'entities/laser' );
35
var Trigger = require( 'entities/trigger' );
36
var Door = require( 'entities/door' );
37
var TriggerWire = require( 'effects/trigger-wire' );
38
var CameraPath = require( 'effects/camera-path' );
39
40
var Colors = require( 'config/colors' );
41
var Material = require( 'config/material' );
42
43
var Settings = require( 'config/settings' );
44
if ( !Settings.background ) {
45
console.log( 'not high settings' );
46
}
47
Settings.low();
48
if ( Settings.background ) {
49
console.log( 'not low settings' );
50
}
51
Settings.high();
52
53
var TitleView = require( 'views/title-view' );
54
55
var SettingsView = require( 'views/settings-view' );
56
var settingsView = new SettingsView();
57
document.body.appendChild( settingsView.el );
58
59
// Mixin normals drawing for debugging.
60
(function() {
61
var normalOptions = {
62
length: 1,
63
lineWidth: 0.2
64
};
65
66
function drawNormalsMixin( prototype ) {
67
var drawPathFn = prototype.drawPath;
68
prototype.drawPath = function( ctx ) {
69
this.drawNormals( ctx, normalOptions );
70
drawPathFn.call( this, ctx );
71
};
72
}
73
74
drawNormalsMixin( Segment.prototype );
75
drawNormalsMixin( Polygon.prototype );
76
drawNormalsMixin( Laser.prototype );
77
}) ();
78
79
var game = Game.instance = new Game();
80
game.debug = true;
81
game.initializeDebugView();
82
83
game.background.fill.set({
84
red: 64,
85
green: 64,
86
blue: 96,
87
alpha: 1
88
});
89
game.background.prerender();
90
91
game.camera.stroke.set({
92
blue: 255,
93
alpha: 1.0
94
});
95
game.camera.lineWidth = 0.2;
96
97
game.level = new Level();
98
game.level.fill.set({
99
red: 32,
100
green: 32,
101
blue: 48,
102
alpha: 1.0
103
});
104
105
var level = new Level();
106
level.fromJSON( '{"batchPhysicsEntities":[{"data":[{"x":-28.67,"y":9.53,"angle":1.571,"data":[-7.17,8.47,-1.57,-8.53,8.73,0.07]},{"x":-19.63,"y":7.67,"angle":0,"data":[9.53,-2.17,-0.57,9.03,-8.97,-6.87]},{"x":-11.8,"y":11.6,"angle":0,"data":[6.7,1,-8.4,5.1,1.7,-6.1]}],"properties":{"shape":"polygon","type":"vector","fixture":{"density":1,"friction":0.5,"restitution":0.2,"filter":{"categoryBits":6}}}}]}' );
107
console.log( level.entities.length );
108
game.load( level );
109
110
// Circle.
111
var circleEntity = new Entity( -10, 25 );
112
113
var circle = new Circle( 0, 0, 5 );
114
circle.fill.alpha = 0.5;
115
116
circleEntity.add( circle );
117
game.add( circleEntity );
118
119
// Rect.
120
var rectEntity = new Entity( 30, 5 );
121
122
var rect = new Rect( 0, 0, 5, 10 );
123
rect.fill.alpha = 0.5;
124
125
rectEntity.add( rect );
126
game.add( rectEntity );
127
128
var rectInterval = setInterval(function() {
129
rectEntity.x -= 0.4;
130
rectEntity.angle += 10 * Math.PI / 180;
131
polyEntity.angle += 2 * Math.PI / 180;
132
segmentEntity.angle -= 2 * Math.PI / 180;
133
}, 16 );
134
135
setTimeout(function() {
136
clearInterval( rectInterval );
137
}, 600 );
138
139
// Polygon.
140
var polyEntity = new Entity( 55, 35 );
141
142
var polygon = new Polygon();
143
polygon.vertices = [ 5, 3, -5, 3, 0, -5 ];
144
polygon.fill.alpha = 0.5;
145
146
polyEntity.add( polygon );
147
game.add( polyEntity );
148
149
// Segment.
150
var segmentEntity = new Entity();
151
segmentEntity.x = 20;
152
segmentEntity.y = 35;
153
154
var testSegment = new Segment(-5, 0, 5, 0 );
155
testSegment.stroke.alpha = 1;
156
testSegment.lineWidth = 0.2;
157
158
segmentEntity.add( testSegment );
159
game.add( segmentEntity );
160
161
// Tractor beam.
162
var tractorBeam = new TractorBeam( 20, 30, 20, 5 );
163
tractorBeam.force = 1500;
164
game.add( tractorBeam );
165
166
// Factory test.
167
var GeometryFactory = require( 'geometry/geometry-factory' );
168
var polygonClone = GeometryFactory.create( JSON.stringify( polygon ) );
169
if ( JSON.stringify( polygon ) !== JSON.stringify( polygonClone ) ) {
170
console.log( 'GeometryFactory clone failed.' );
171
}
172
173
// Emitter.
174
var emitter = new Emitter( 25, 20 );
175
var emitterPolygon = new Polygon( 0, 0 );
176
emitterPolygon.vertices = [ 0.75, 0.75, -0.75, 0.75, -0.75, -0.75, 0.75, -0.75 ];
177
emitterPolygon.fill.set( Colors.Solid.ANTIMATTER );
178
emitterPolygon.stroke.set( Colors.White );
179
emitterPolygon.lineWidth = 0.2;
180
181
emitter.spawnArea = new Segment( 0, -2, 0, 2 );
182
emitter.spawnArea.stroke.set({
183
red: 255,
184
alpha: 1
185
});
186
emitter.spawnArea.lineWidth = 0.2;
187
emitter.add( emitter.spawnArea );
188
189
emitter.rate = 0.4;
190
emitter.lifeTime = 2;
191
emitter.speed = 100;
192
emitter.angle = -0.5 * Math.PI;
193
194
emitter.particle = emitterPolygon;
195
emitter.properties = {
196
shape: 'polygon',
197
type: 'vector',
198
data: emitterPolygon.vertices.slice(),
199
fixture: {
200
density: 1.75,
201
friction: 0.5,
202
restitution: 0.2,
203
filter: {
204
categoryBits: Material.ANTIMATTER
205
}
206
},
207
body: {
208
angularVelocity: 3 * Math.PI,
209
linearDamping: 0.2,
210
type: 'dynamic'
211
}
212
};
213
214
emitter.start( 500 );
215
game.add( emitter );
216
217
// Matter emitter.
218
var matEmitter = new Emitter( 45, 20 );
219
matEmitter.spawnArea = new Segment( 0, -2, 0, 2 );
220
matEmitter.spawnArea.stroke.set({
221
red: 64,
222
green: 64,
223
blue: 255,
224
alpha: 1
225
});
226
matEmitter.spawnArea.lineWidth = 0.2;
227
matEmitter.add( matEmitter.spawnArea );
228
229
matEmitter.rate = 0.4;
230
matEmitter.lifeTime = 2;
231
matEmitter.speed = 100;
232
matEmitter.angle = -0.5 * Math.PI;
233
234
var matEmitterPolygon = new Polygon( 0, 0 );
235
matEmitterPolygon.vertices = emitterPolygon.vertices.slice();
236
matEmitterPolygon.fill.set( Colors.Solid.MATTER );
237
matEmitterPolygon.stroke.set( Colors.White );
238
matEmitterPolygon.lineWidth = emitterPolygon.lineWidth;
239
240
matEmitter.particle = matEmitterPolygon;
241
matEmitter.properties = {
242
shape: 'polygon',
243
type: 'vector',
244
data: matEmitterPolygon.vertices.slice(),
245
fixture: {
246
density: 1.75,
247
friction: 0.5,
248
restitution: 0.2,
249
filter: {
250
categoryBits: Material.MATTER
251
}
252
},
253
body: {
254
angularVelocity: 3 * Math.PI,
255
linearDamping: 0.2,
256
type: 'dynamic'
257
}
258
};
259
260
matEmitter.start( 500 );
261
game.add( matEmitter );
262
263
// Laser.
264
var laser = new Laser( 0, 20, Material.ANTIMATTER );
265
var laserCircle = new Circle( 0, 0, 1 );
266
laserCircle.fill.set({
267
red: 255,
268
alpha: 0.2
269
});
270
laser.angle = -25 * Math.PI / 180;
271
laser.add( laserCircle );
272
game.add( laser );
273
274
// Trigger.
275
var trigger = new Trigger( 48, 30, 3, Material.MATTER );
276
var triggerCircle = new Circle( 0, 0, 3 );
277
triggerCircle.stroke.set({
278
blue: 255,
279
alpha: 0.1
280
});
281
triggerCircle.lineWidth = 0.2;
282
trigger.add( triggerCircle );
283
game.add( trigger );
284
285
// Trigger.
286
var antiTrigger = new Trigger( 15, 20, 3, Material.ANTIMATTER );
287
game.add( antiTrigger );
288
289
// Door.
290
var door = new Door( 10, 40, 4 );
291
var doorCircle = new Circle( 0, 0, 3 );
292
doorCircle.fill.set({
293
alpha: 0.1
294
});
295
doorCircle.stroke.set( Colors.White );
296
doorCircle.stroke.alpha = 0.1;
297
doorCircle.lineWidth = 0.2;
298
door.add( doorCircle );
299
door.triggers.push( trigger );
300
door.triggers.push( antiTrigger );
301
game.add( door );
302
303
// Trigger wire.
304
var triggerWire = new TriggerWire( trigger, door, {
305
vertices: [
306
-0.1, 0,
307
-0.1, 0.6,
308
0.2, 0.6,
309
0.2, 1
310
],
311
sourceDirection: TriggerWire.Direction.RIGHT,
312
targetDirection: TriggerWire.Direction.RIGHT
313
});
314
game.add( triggerWire );
315
316
var antiTriggerWire = new TriggerWire( antiTrigger, door, {
317
vertices: [
318
0, 0.5,
319
1, 0.5
320
],
321
sourceDirection: TriggerWire.Direction.BOTTOM,
322
targetDirection: TriggerWire.Direction.TOP
323
});
324
game.add( antiTriggerWire );
325
326
// Player.
327
game.setPlayer( new Player( 20, 20 ) );
328
329
game.camera.target = game.player;
330
331
// Trail.
332
var trail = new Trail();
333
trail.fill = new Color( 255, 255, 255, 0.2 );
334
game.add( trail );
335
trail.target = game.player;
336
337
// Camera path.
338
var cameraPath = new CameraPath( 0, 60, 50, 10 );
339
cameraPath.stroke.set({
340
blue: 192,
341
alpha: 1
342
});
343
cameraPath.lineWidth = 0.2;
344
cameraPath.relativeTo( game.camera, 2, 40 * Utils.DEG_TO_RAD );
345
cameraPath.target = game.player;
346
cameraPath.camera = game.camera;
347
game.add( cameraPath );
348
349
// Debug objects.
350
[
351
[
352
[ 3, 0, 3, 10 ],
353
[ 3, 10, 30, 15 ],
354
[ 30, 15, 50, 5 ],
355
[ 50, 5, 60, 5 ]
356
],
357
[
358
// Rectangle.
359
[ 10, 0, 10, -5 ],
360
[ 10, -5, 20, -5 ],
361
[ 20, -5, 20, 0 ],
362
[ 20, 0, 10, 0 ]
363
],
364
// Camera path.
365
[
366
[ -25, 55, 25, 55 ],
367
[ 25, 65, -25, 65 ]
368
]
369
].forEach(function( object ) {
370
object.forEach(function( edgeData ) {
371
var entity = new PhysicsEntity({
372
shape: 'polygon',
373
type: 'edge',
374
data: edgeData,
375
fixture: {
376
density: 1.0,
377
friction: 0.5,
378
restitution: 0.2,
379
filter: {
380
categoryBits: Material.BIMATTER
381
}
382
}
383
});
384
385
var segment = new Segment( edgeData[0], edgeData[1], edgeData[2], edgeData[3] );
386
segment.stroke.set({
387
red: 255,
388
alpha: 1
389
});
390
segment.lineWidth = 0.2;
391
392
entity.add( segment );
393
game.add( entity );
394
});
395
});
396
397
// Debug polygons.
398
[
399
[ 5, -5, 5, 5, -5, 0 ]
400
].forEach(function( polyData ) {
401
var entity = new PhysicsEntity({
402
shape: 'polygon',
403
type: 'vector',
404
data: polyData,
405
fixture: {
406
density: 1.0,
407
friction: 0.5,
408
restitution: 0.2,
409
filter: {
410
categoryBits: Material.BIMATTER
411
}
412
},
413
body: {
414
type: 'static',
415
position: {
416
x: 50,
417
y: 45
418
}
419
},
420
shapes: [
421
{
422
type: 'polygon',
423
vertices: polyData,
424
fill: {
425
type: 'color',
426
alpha: 1
427
}
428
}
429
]
430
});
431
432
game.add( entity );
433
});
434
435
436
// Add game element to body.
437
game.element.classList.add( 'game' );
438
document.body.insertBefore( game.element, document.body.firstChild );
439
440
// Setup input.
441
var input = game.input;
442
443
document.addEventListener( 'keydown', input.onKeyDown.bind( input ) );
444
document.addEventListener( 'keyup', input.onKeyUp.bind( input ) );
445
446
if ( typeof window.ontouchstart !== 'undefined' ) {
447
game.canvas.addEventListener( 'touchstart', input.onTouchStart.bind( input ) );
448
game.canvas.addEventListener( 'touchmove', input.onTouchMove.bind( input ) );
449
game.canvas.addEventListener( 'touchend', input.onTouchEnd.bind( input ) );
450
}
451
452
// Start game.
453
game.tick();
454
455
// Toggle player material.
456
var materialBtn = document.getElementById( 'material-btn' );
457
function togglePlayerMaterial() {
458
game.player.toggleMaterial();
459
460
if ( game.player.material & Material.MATTER ) {
461
materialBtn.innerHTML = 'matter';
462
materialBtn.classList.add( 'matter' );
463
materialBtn.classList.remove( 'antimatter' );
464
} else if ( game.player.material & Material.ANTIMATTER ) {
465
materialBtn.innerHTML = 'antimatter';
466
materialBtn.classList.add( 'antimatter' );
467
materialBtn.classList.remove( 'matter' );
468
}
469
}
470
471
togglePlayerMaterial();
472
materialBtn.addEventListener( 'click', togglePlayerMaterial );
473
474
// Add a checkbox to toggle continuous rendering,
475
var runCheckbox = document.getElementById( 'run-checkbox' );
476
function play() {
477
game.running = true;
478
game.tick();
479
runCheckbox.checked = true;
480
}
481
482
function pause() {
483
game.running = false;
484
runCheckbox.checked = false;
485
}
486
487
function toggleContinuousRendering() {
488
if ( !runCheckbox.checked ) {
489
play();
490
} else {
491
pause();
492
}
493
}
494
495
runCheckbox.addEventListener( 'click', function() {
496
// Hacky. Since play() and pause() change the checked state, we need to
497
// toggle the checkbox state to back before it was clicked.
498
runCheckbox.checked = !runCheckbox.checked;
499
toggleContinuousRendering();
500
});
501
502
// Add a checkbox to toggle Box2D debug view.
503
var debugCanvas = document.getElementById( 'box2d-debug-canvas' );
504
debugCanvas.style.display = 'none';
505
506
var debugCheckbox = document.getElementById( 'box2d-debug-checkbox' );
507
function toggleDebug() {
508
debugCheckbox.checked = game.box2dDebug = !game.box2dDebug;
509
510
// Toggle visibility.
511
if ( game.box2dDebug ) {
512
debugCanvas.style.display = 'block';
513
} else {
514
debugCanvas.style.display = 'none';
515
}
516
}
517
518
debugCheckbox.addEventListener( 'click', function() {
519
debugCheckbox.checked = !debugCheckbox.checked;
520
toggleDebug();
521
});
522
523
// Settings.
524
var settingsCheckbox = document.getElementById( 'settings-checkbox' );
525
settingsCheckbox.addEventListener( 'click', function() {
526
if ( settingsCheckbox.checked ) {
527
Settings.low();
528
} else {
529
Settings.high();
530
}
531
});
532
533
// Load level data.
534
var levelDataEl = document.getElementById( 'level-data' );
535
levelDataEl.addEventListener( 'keydown', function( event ) {
536
// Alt + Enter.
537
if ( event.which === 13 && event.altKey ) {
538
loadBatch();
539
} else if ( event.which === 13 ) {
540
// Enter.
541
load();
542
}
543
});
544
545
function load() {
546
var levelData = levelDataEl.value;
547
JSON.parse( levelData ).forEach(function( entityData ) {
548
game.add( new PhysicsEntity( entityData ) );
549
});
550
}
551
552
function loadBatch() {
553
var batchDataObject = JSON.parse( levelDataEl.value );
554
var levelData = JSON.stringify({
555
batchPhysicsEntities: [ batchDataObject ]
556
});
557
558
var batchLevel = new Level();
559
batchLevel.fromJSON( levelData );
560
game.load( batchLevel );
561
}
562
563
var loadBtn = document.getElementById( 'level-data-btn' );
564
loadBtn.addEventListener( 'click', function() {
565
load();
566
});
567
568
document.addEventListener( 'keydown', function( event ) {
569
// B.
570
if ( event.which === 66 ) {
571
toggleDebug();
572
}
573
574
// R.
575
if ( event.which === 82 ) {
576
toggleContinuousRendering( event );
577
}
578
579
// P.
580
if ( event.which === 80 ) {
581
event.preventDefault();
582
var loader = document.querySelector( '.loader' );
583
if ( !loader.style.display || loader.style.display === 'none' ) {
584
loader.style.display = 'inline';
585
levelDataEl.focus();
586
} else {
587
loader.style.display = 'none';
588
levelDataEl.blur();
589
}
590
}
591
592
// Space.
593
if ( event.which === 32 ) {
594
if ( game && game.player ) {
595
event.preventDefault();
596
togglePlayerMaterial();
597
}
598
}
599
600
// T. Show title screen.
601
if ( event.which === 77 ) {
602
// Title view.
603
var titleView = new TitleView();
604
document.body.insertBefore( titleView.el, document.body.firstChild );
605
setTimeout(function() {
606
titleView.remove();
607
}, 2000 );
608
}
609
});
610
611
window.addEventListener( 'blur', function() {
612
pause();
613
614
// Disable all inputs.
615
Object.keys( game.input.keys ).forEach(function( key ) {
616
game.input.keys[ key ] = false;
617
});
618
619
Object.keys( game.input.controls ).forEach(function( control ) {
620
game.input.controls[ control ] = false;
621
});
622
});
623
624
setTimeout(function() {
625
game.running = false;
626
}, 500 );
627
});
628
629