Path: blob/main/public/games/files/garbage-collector/js/main-dev.js
1036 views
/*jshint bitwise: false*/1/* globals requirejs, define*/2requirejs.config({3shim: {4box2d: {5exports: 'Box2D'6}7},8paths: {9box2d: 'Box2dWeb/Box2dWeb-2.1.a.3.min'10}11});1213define(function( require ) {14'use strict';1516var Game = require( 'game' ),17Level = require( 'level' ),18Circle = require( 'geometry/circle' ),19Rect = require( 'geometry/rect' ),20Polygon = require( 'geometry/polygon' ),21Segment = require( 'geometry/segment' ),22Player = require( 'entities/player' );2324var Utils = require( 'utils' );2526var Color = require( 'color' );27var Entity = require( 'entities/entity' );28var PhysicsEntity = require( 'entities/physics-entity' );2930var Emitter = require( 'entities/emitter' );31var TractorBeam = require( 'entities/tractor-beam' );32var Trail = require( 'effects/trail' );33var Laser = require( 'entities/laser' );34var Trigger = require( 'entities/trigger' );35var Door = require( 'entities/door' );36var TriggerWire = require( 'effects/trigger-wire' );37var CameraPath = require( 'effects/camera-path' );3839var Colors = require( 'config/colors' );40var Material = require( 'config/material' );4142var Settings = require( 'config/settings' );43if ( !Settings.background ) {44console.log( 'not high settings' );45}46Settings.low();47if ( Settings.background ) {48console.log( 'not low settings' );49}50Settings.high();5152var TitleView = require( 'views/title-view' );5354var SettingsView = require( 'views/settings-view' );55var settingsView = new SettingsView();56document.body.appendChild( settingsView.el );5758// Mixin normals drawing for debugging.59(function() {60var normalOptions = {61length: 1,62lineWidth: 0.263};6465function drawNormalsMixin( prototype ) {66var drawPathFn = prototype.drawPath;67prototype.drawPath = function( ctx ) {68this.drawNormals( ctx, normalOptions );69drawPathFn.call( this, ctx );70};71}7273drawNormalsMixin( Segment.prototype );74drawNormalsMixin( Polygon.prototype );75drawNormalsMixin( Laser.prototype );76}) ();7778var game = Game.instance = new Game();79game.debug = true;80game.initializeDebugView();8182game.background.fill.set({83red: 64,84green: 64,85blue: 96,86alpha: 187});88game.background.prerender();8990game.camera.stroke.set({91blue: 255,92alpha: 1.093});94game.camera.lineWidth = 0.2;9596game.level = new Level();97game.level.fill.set({98red: 32,99green: 32,100blue: 48,101alpha: 1.0102});103104var level = new Level();105level.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}}}}]}' );106console.log( level.entities.length );107game.load( level );108109// Circle.110var circleEntity = new Entity( -10, 25 );111112var circle = new Circle( 0, 0, 5 );113circle.fill.alpha = 0.5;114115circleEntity.add( circle );116game.add( circleEntity );117118// Rect.119var rectEntity = new Entity( 30, 5 );120121var rect = new Rect( 0, 0, 5, 10 );122rect.fill.alpha = 0.5;123124rectEntity.add( rect );125game.add( rectEntity );126127var rectInterval = setInterval(function() {128rectEntity.x -= 0.4;129rectEntity.angle += 10 * Math.PI / 180;130polyEntity.angle += 2 * Math.PI / 180;131segmentEntity.angle -= 2 * Math.PI / 180;132}, 16 );133134setTimeout(function() {135clearInterval( rectInterval );136}, 600 );137138// Polygon.139var polyEntity = new Entity( 55, 35 );140141var polygon = new Polygon();142polygon.vertices = [ 5, 3, -5, 3, 0, -5 ];143polygon.fill.alpha = 0.5;144145polyEntity.add( polygon );146game.add( polyEntity );147148// Segment.149var segmentEntity = new Entity();150segmentEntity.x = 20;151segmentEntity.y = 35;152153var testSegment = new Segment(-5, 0, 5, 0 );154testSegment.stroke.alpha = 1;155testSegment.lineWidth = 0.2;156157segmentEntity.add( testSegment );158game.add( segmentEntity );159160// Tractor beam.161var tractorBeam = new TractorBeam( 20, 30, 20, 5 );162tractorBeam.force = 1500;163game.add( tractorBeam );164165// Factory test.166var GeometryFactory = require( 'geometry/geometry-factory' );167var polygonClone = GeometryFactory.create( JSON.stringify( polygon ) );168if ( JSON.stringify( polygon ) !== JSON.stringify( polygonClone ) ) {169console.log( 'GeometryFactory clone failed.' );170}171172// Emitter.173var emitter = new Emitter( 25, 20 );174var emitterPolygon = new Polygon( 0, 0 );175emitterPolygon.vertices = [ 0.75, 0.75, -0.75, 0.75, -0.75, -0.75, 0.75, -0.75 ];176emitterPolygon.fill.set( Colors.Solid.ANTIMATTER );177emitterPolygon.stroke.set( Colors.White );178emitterPolygon.lineWidth = 0.2;179180emitter.spawnArea = new Segment( 0, -2, 0, 2 );181emitter.spawnArea.stroke.set({182red: 255,183alpha: 1184});185emitter.spawnArea.lineWidth = 0.2;186emitter.add( emitter.spawnArea );187188emitter.rate = 0.4;189emitter.lifeTime = 2;190emitter.speed = 100;191emitter.angle = -0.5 * Math.PI;192193emitter.particle = emitterPolygon;194emitter.properties = {195shape: 'polygon',196type: 'vector',197data: emitterPolygon.vertices.slice(),198fixture: {199density: 1.75,200friction: 0.5,201restitution: 0.2,202filter: {203categoryBits: Material.ANTIMATTER204}205},206body: {207angularVelocity: 3 * Math.PI,208linearDamping: 0.2,209type: 'dynamic'210}211};212213emitter.start( 500 );214game.add( emitter );215216// Matter emitter.217var matEmitter = new Emitter( 45, 20 );218matEmitter.spawnArea = new Segment( 0, -2, 0, 2 );219matEmitter.spawnArea.stroke.set({220red: 64,221green: 64,222blue: 255,223alpha: 1224});225matEmitter.spawnArea.lineWidth = 0.2;226matEmitter.add( matEmitter.spawnArea );227228matEmitter.rate = 0.4;229matEmitter.lifeTime = 2;230matEmitter.speed = 100;231matEmitter.angle = -0.5 * Math.PI;232233var matEmitterPolygon = new Polygon( 0, 0 );234matEmitterPolygon.vertices = emitterPolygon.vertices.slice();235matEmitterPolygon.fill.set( Colors.Solid.MATTER );236matEmitterPolygon.stroke.set( Colors.White );237matEmitterPolygon.lineWidth = emitterPolygon.lineWidth;238239matEmitter.particle = matEmitterPolygon;240matEmitter.properties = {241shape: 'polygon',242type: 'vector',243data: matEmitterPolygon.vertices.slice(),244fixture: {245density: 1.75,246friction: 0.5,247restitution: 0.2,248filter: {249categoryBits: Material.MATTER250}251},252body: {253angularVelocity: 3 * Math.PI,254linearDamping: 0.2,255type: 'dynamic'256}257};258259matEmitter.start( 500 );260game.add( matEmitter );261262// Laser.263var laser = new Laser( 0, 20, Material.ANTIMATTER );264var laserCircle = new Circle( 0, 0, 1 );265laserCircle.fill.set({266red: 255,267alpha: 0.2268});269laser.angle = -25 * Math.PI / 180;270laser.add( laserCircle );271game.add( laser );272273// Trigger.274var trigger = new Trigger( 48, 30, 3, Material.MATTER );275var triggerCircle = new Circle( 0, 0, 3 );276triggerCircle.stroke.set({277blue: 255,278alpha: 0.1279});280triggerCircle.lineWidth = 0.2;281trigger.add( triggerCircle );282game.add( trigger );283284// Trigger.285var antiTrigger = new Trigger( 15, 20, 3, Material.ANTIMATTER );286game.add( antiTrigger );287288// Door.289var door = new Door( 10, 40, 4 );290var doorCircle = new Circle( 0, 0, 3 );291doorCircle.fill.set({292alpha: 0.1293});294doorCircle.stroke.set( Colors.White );295doorCircle.stroke.alpha = 0.1;296doorCircle.lineWidth = 0.2;297door.add( doorCircle );298door.triggers.push( trigger );299door.triggers.push( antiTrigger );300game.add( door );301302// Trigger wire.303var triggerWire = new TriggerWire( trigger, door, {304vertices: [305-0.1, 0,306-0.1, 0.6,3070.2, 0.6,3080.2, 1309],310sourceDirection: TriggerWire.Direction.RIGHT,311targetDirection: TriggerWire.Direction.RIGHT312});313game.add( triggerWire );314315var antiTriggerWire = new TriggerWire( antiTrigger, door, {316vertices: [3170, 0.5,3181, 0.5319],320sourceDirection: TriggerWire.Direction.BOTTOM,321targetDirection: TriggerWire.Direction.TOP322});323game.add( antiTriggerWire );324325// Player.326game.setPlayer( new Player( 20, 20 ) );327328game.camera.target = game.player;329330// Trail.331var trail = new Trail();332trail.fill = new Color( 255, 255, 255, 0.2 );333game.add( trail );334trail.target = game.player;335336// Camera path.337var cameraPath = new CameraPath( 0, 60, 50, 10 );338cameraPath.stroke.set({339blue: 192,340alpha: 1341});342cameraPath.lineWidth = 0.2;343cameraPath.relativeTo( game.camera, 2, 40 * Utils.DEG_TO_RAD );344cameraPath.target = game.player;345cameraPath.camera = game.camera;346game.add( cameraPath );347348// Debug objects.349[350[351[ 3, 0, 3, 10 ],352[ 3, 10, 30, 15 ],353[ 30, 15, 50, 5 ],354[ 50, 5, 60, 5 ]355],356[357// Rectangle.358[ 10, 0, 10, -5 ],359[ 10, -5, 20, -5 ],360[ 20, -5, 20, 0 ],361[ 20, 0, 10, 0 ]362],363// Camera path.364[365[ -25, 55, 25, 55 ],366[ 25, 65, -25, 65 ]367]368].forEach(function( object ) {369object.forEach(function( edgeData ) {370var entity = new PhysicsEntity({371shape: 'polygon',372type: 'edge',373data: edgeData,374fixture: {375density: 1.0,376friction: 0.5,377restitution: 0.2,378filter: {379categoryBits: Material.BIMATTER380}381}382});383384var segment = new Segment( edgeData[0], edgeData[1], edgeData[2], edgeData[3] );385segment.stroke.set({386red: 255,387alpha: 1388});389segment.lineWidth = 0.2;390391entity.add( segment );392game.add( entity );393});394});395396// Debug polygons.397[398[ 5, -5, 5, 5, -5, 0 ]399].forEach(function( polyData ) {400var entity = new PhysicsEntity({401shape: 'polygon',402type: 'vector',403data: polyData,404fixture: {405density: 1.0,406friction: 0.5,407restitution: 0.2,408filter: {409categoryBits: Material.BIMATTER410}411},412body: {413type: 'static',414position: {415x: 50,416y: 45417}418},419shapes: [420{421type: 'polygon',422vertices: polyData,423fill: {424type: 'color',425alpha: 1426}427}428]429});430431game.add( entity );432});433434435// Add game element to body.436game.element.classList.add( 'game' );437document.body.insertBefore( game.element, document.body.firstChild );438439// Setup input.440var input = game.input;441442document.addEventListener( 'keydown', input.onKeyDown.bind( input ) );443document.addEventListener( 'keyup', input.onKeyUp.bind( input ) );444445if ( typeof window.ontouchstart !== 'undefined' ) {446game.canvas.addEventListener( 'touchstart', input.onTouchStart.bind( input ) );447game.canvas.addEventListener( 'touchmove', input.onTouchMove.bind( input ) );448game.canvas.addEventListener( 'touchend', input.onTouchEnd.bind( input ) );449}450451// Start game.452game.tick();453454// Toggle player material.455var materialBtn = document.getElementById( 'material-btn' );456function togglePlayerMaterial() {457game.player.toggleMaterial();458459if ( game.player.material & Material.MATTER ) {460materialBtn.innerHTML = 'matter';461materialBtn.classList.add( 'matter' );462materialBtn.classList.remove( 'antimatter' );463} else if ( game.player.material & Material.ANTIMATTER ) {464materialBtn.innerHTML = 'antimatter';465materialBtn.classList.add( 'antimatter' );466materialBtn.classList.remove( 'matter' );467}468}469470togglePlayerMaterial();471materialBtn.addEventListener( 'click', togglePlayerMaterial );472473// Add a checkbox to toggle continuous rendering,474var runCheckbox = document.getElementById( 'run-checkbox' );475function play() {476game.running = true;477game.tick();478runCheckbox.checked = true;479}480481function pause() {482game.running = false;483runCheckbox.checked = false;484}485486function toggleContinuousRendering() {487if ( !runCheckbox.checked ) {488play();489} else {490pause();491}492}493494runCheckbox.addEventListener( 'click', function() {495// Hacky. Since play() and pause() change the checked state, we need to496// toggle the checkbox state to back before it was clicked.497runCheckbox.checked = !runCheckbox.checked;498toggleContinuousRendering();499});500501// Add a checkbox to toggle Box2D debug view.502var debugCanvas = document.getElementById( 'box2d-debug-canvas' );503debugCanvas.style.display = 'none';504505var debugCheckbox = document.getElementById( 'box2d-debug-checkbox' );506function toggleDebug() {507debugCheckbox.checked = game.box2dDebug = !game.box2dDebug;508509// Toggle visibility.510if ( game.box2dDebug ) {511debugCanvas.style.display = 'block';512} else {513debugCanvas.style.display = 'none';514}515}516517debugCheckbox.addEventListener( 'click', function() {518debugCheckbox.checked = !debugCheckbox.checked;519toggleDebug();520});521522// Settings.523var settingsCheckbox = document.getElementById( 'settings-checkbox' );524settingsCheckbox.addEventListener( 'click', function() {525if ( settingsCheckbox.checked ) {526Settings.low();527} else {528Settings.high();529}530});531532// Load level data.533var levelDataEl = document.getElementById( 'level-data' );534levelDataEl.addEventListener( 'keydown', function( event ) {535// Alt + Enter.536if ( event.which === 13 && event.altKey ) {537loadBatch();538} else if ( event.which === 13 ) {539// Enter.540load();541}542});543544function load() {545var levelData = levelDataEl.value;546JSON.parse( levelData ).forEach(function( entityData ) {547game.add( new PhysicsEntity( entityData ) );548});549}550551function loadBatch() {552var batchDataObject = JSON.parse( levelDataEl.value );553var levelData = JSON.stringify({554batchPhysicsEntities: [ batchDataObject ]555});556557var batchLevel = new Level();558batchLevel.fromJSON( levelData );559game.load( batchLevel );560}561562var loadBtn = document.getElementById( 'level-data-btn' );563loadBtn.addEventListener( 'click', function() {564load();565});566567document.addEventListener( 'keydown', function( event ) {568// B.569if ( event.which === 66 ) {570toggleDebug();571}572573// R.574if ( event.which === 82 ) {575toggleContinuousRendering( event );576}577578// P.579if ( event.which === 80 ) {580event.preventDefault();581var loader = document.querySelector( '.loader' );582if ( !loader.style.display || loader.style.display === 'none' ) {583loader.style.display = 'inline';584levelDataEl.focus();585} else {586loader.style.display = 'none';587levelDataEl.blur();588}589}590591// Space.592if ( event.which === 32 ) {593if ( game && game.player ) {594event.preventDefault();595togglePlayerMaterial();596}597}598599// T. Show title screen.600if ( event.which === 77 ) {601// Title view.602var titleView = new TitleView();603document.body.insertBefore( titleView.el, document.body.firstChild );604setTimeout(function() {605titleView.remove();606}, 2000 );607}608});609610window.addEventListener( 'blur', function() {611pause();612613// Disable all inputs.614Object.keys( game.input.keys ).forEach(function( key ) {615game.input.keys[ key ] = false;616});617618Object.keys( game.input.controls ).forEach(function( control ) {619game.input.controls[ control ] = false;620});621});622623setTimeout(function() {624game.running = false;625}, 500 );626});627628629