diff --git a/dist/audio/rocket2.mp3 b/dist/audio/rocket2.mp3 new file mode 100644 index 0000000..59404d0 Binary files /dev/null and b/dist/audio/rocket2.mp3 differ diff --git a/dist/audio/rocket2.ogg b/dist/audio/rocket2.ogg new file mode 100644 index 0000000..96a51b1 Binary files /dev/null and b/dist/audio/rocket2.ogg differ diff --git a/dist/index.html b/dist/index.html index f835d3a..40f0bc1 100644 --- a/dist/index.html +++ b/dist/index.html @@ -3,6 +3,7 @@
+ diff --git a/js/assets.mjs b/js/assets.mjs index 4da7cda..7b93028 100644 --- a/js/assets.mjs +++ b/js/assets.mjs @@ -38,7 +38,8 @@ export const audio = { itemPickup: 'up1.mp3', fuelPickup: 'blip2.mp3', endEdit: 'release1.mp3', - newPlanet: 'up2.mp3' + newPlanet: 'up2.mp3', + engine: 'rocket2.ogg' }; export async function init() { @@ -56,9 +57,11 @@ export async function init() { return img; }); parse(audio, str => { - let audio = new Audio('audio/' + str); + let audio = new Howl({ + src: ['audio/' + str] + }); promises.push(new Promise((res, rej) => { - audio.addEventListener('canplaythrough', res); + audio.once('load', res); })); return audio; }); diff --git a/js/game/audio.mjs b/js/game/audio.mjs index 3e00707..473bf45 100644 --- a/js/game/audio.mjs +++ b/js/game/audio.mjs @@ -1,5 +1,23 @@ import {audio} from '../assets.mjs'; +const playing = new Map(); + export function play(name) { - audio[name].cloneNode(true).play(); + audio[name].play(); +} + +export function start(name) { + if (!playing.has(name)) + playing.set(name, audio[name]); + + let howl = playing.get(name); + howl.loop(true); + howl.play(); +} + +export function stop(name) { + if (!playing.has(name)) return; + let howl = playing.get(name); + if (howl.playing()) + howl.stop(); } diff --git a/js/game/control.mjs b/js/game/control.mjs index 9b8211e..6033390 100644 --- a/js/game/control.mjs +++ b/js/game/control.mjs @@ -2,6 +2,7 @@ import * as input from '../input.mjs'; import * as events from './events.mjs'; import * as graphics from '../graphics/index.mjs'; import * as inventory from './inventory.mjs'; +import * as audio from './audio.mjs'; import {playerShip} from '../world/index.mjs'; import {state} from './index.mjs'; @@ -38,6 +39,12 @@ export function tick() { function tickPlaying() { if (held[mapping.thrust]) { playerShip.applyThrust({ forward: 1 }); + } else { + audio.stop('engine'); + } + + if (pressed[mapping.thrust]) { + audio.start('engine'); } if (held[mapping.left]) { diff --git a/js/game/events.mjs b/js/game/events.mjs index 1b8b71c..e4e7bb7 100644 --- a/js/game/events.mjs +++ b/js/game/events.mjs @@ -45,7 +45,7 @@ export function landShip(planet) { } function newPlanet(planet) { - let value = (planet.radius + 30) | 0; + let value = (planet.radius * 2 + 50) | 0; landedPlanets.add(planet); audio.play('newPlanet'); score += value; @@ -70,6 +70,7 @@ export function toggleEdit() { export function toggleTrace() { let trace = graphics.toggleTrace(); notify('Path prediction: ' + (trace ? 'on' : 'off')); + audio.start('engine'); } export function toggleMarkers() { diff --git a/js/game/index.mjs b/js/game/index.mjs index 119c862..966493b 100644 --- a/js/game/index.mjs +++ b/js/game/index.mjs @@ -24,7 +24,7 @@ export async function init() { gui.init(); input.init(); - events.startGame(); + //events.startGame(); //tick(); return; diff --git a/js/game/inventory.mjs b/js/game/inventory.mjs index 3819a4b..dd53f0c 100644 --- a/js/game/inventory.mjs +++ b/js/game/inventory.mjs @@ -11,6 +11,9 @@ let onupdate = () => {}; export function init() { items.clear(); addItem('connector', 'xheavy'); + addItem('connector', 'xheavy'); + addItem('connector', 'xheavy'); + addItem('connector', 'xheavy'); } export function getTiles() { diff --git a/js/graphics/index.mjs b/js/graphics/index.mjs index 8567f1a..9b0042c 100644 --- a/js/graphics/index.mjs +++ b/js/graphics/index.mjs @@ -24,8 +24,13 @@ export function init() { perspective = new Perspective(); - draw.text('Loading...', canvas.width / 2, canvas.height / 2, - { align: 'center', valign: 'middle' }); + context.fillStyle = '#000'; + context.fillRect(0, 0, canvas.width, canvas.height); + context.font = '36px Consolas'; + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = '#fff'; + context.fillText('Loading...', canvas.width / 2, canvas.height / 2); } export function render() { diff --git a/js/world/body.mjs b/js/world/body.mjs index 569f11c..d45f3ef 100644 --- a/js/world/body.mjs +++ b/js/world/body.mjs @@ -114,9 +114,10 @@ export default class Body { this.gravity = true; let speed = Math.sqrt(G * cel.mass / (altitude + cel.radius)); let [cx, cy] = cel.com; + let [comX, comY] = this.localCom; let [dx, dy] = this.rotateVector(0, -(altitude + cel.radius), angle); [this.xvel, this.yvel] = this.rotateVector(speed, 0, angle); - this.x = cx + dx; - this.y = cy + dy; + this.x = cx + dx - comX; + this.y = cy + dy - comY; } } diff --git a/js/world/entity.mjs b/js/world/entity.mjs index 5010844..847275d 100644 --- a/js/world/entity.mjs +++ b/js/world/entity.mjs @@ -38,6 +38,10 @@ export default class Entity extends Body { return [this.x + this.width / 2, this.y + this.height / 2]; } + get localCom() { + return [this.width / 2, this.height / 2]; + } + remove() { entities.delete(this); } diff --git a/js/world/spawn.mjs b/js/world/spawn.mjs index 56e8bfa..9af7dd0 100644 --- a/js/world/spawn.mjs +++ b/js/world/spawn.mjs @@ -53,24 +53,39 @@ function spawnSector(x, y) { spawnedSectors.add(`${x}.${y}`); } -function randomPlanet(x, y) { - let rad = Math.random() * 60 + 30; +function randomPlanet(x, y, { + radius = Math.random() * 60 + 30, + type = 'green', + density = 3 + } = {}) { + let [cel, dis] = nearest(x, y, world.celestials); let mcs = consts.MIN_CELESTIAL_SPACING; - if (dis < Math.max(rad, cel.radius) * mcs) return; + if (cel !== null && dis < Math.max(radius, cel.radius) * mcs) return; - let planet = celestial(x, y, rad, { - density: 3, - type: 'green' + let planet = celestial(x, y, radius, { + density: density, + type: type }); - for (let i = 1.5; i < 8; i += 1) { + for (let i = 0.1; i < 4; i += 1) { if (Math.random() > consts.ENTITY_SPAWN_RATE) { let e = randomEntity(); - e.orbit(planet, i * rad, Math.random() * Math.PI * 2); + e.orbit(planet, i * radius, Math.random() * Math.PI * 2); } } + + for (let i = 0; i < 5; i++) { + if (Math.random() > consts.ENTITY_SPAWN_RATE || true) { + let e = randomEntity(); + e.orbit(planet, 1.5, Math.random() * Math.PI * 2); + e.gravity = false; + e.halt(); + } + } + + return planet; } function randomEntity(x, y) { @@ -107,7 +122,8 @@ export function player() { } export function startPlanet() { - return celestial(0, 0, 40, { + return randomPlanet(0, 0, { + radius: 40, density: 3, type: 'green' });