add boilerplate for mounts and fixtures

This commit is contained in:
Asraelite 2016-03-27 15:08:49 +01:00
parent 0ea163dfb7
commit 0a90b6b77a
15 changed files with 158 additions and 17 deletions

View file

@ -11,11 +11,17 @@ class Body {
this.r = 0; this.r = 0;
this.b2body = false; this.b2body = false;
this.type = 'asteroid'; this.type = 'asteroid';
this.mounts = [];
this.health = 1; this.health = 1;
this.world = world; this.world = world;
this.id = uuid.v4().slice(0, 8); this.id = uuid.v4().slice(0, 8);
} }
destruct() {
this.mounts.forEach(mount => mount.destruct());
this.world.physics.remove(this);
}
applyDelta() { applyDelta() {
this.world.applyDelta(this.id, this.packDelta()); this.world.applyDelta(this.id, this.packDelta());
} }

View file

@ -4,27 +4,39 @@ const defaults = require('../traits/defaults.json');
const shipTraits = require('../traits/ships.json'); const shipTraits = require('../traits/ships.json');
const Body = require('./body.js'); const Body = require('./body.js');
const Mount = require('./turret/mount.js');
class Ship extends Body { class Ship extends Body {
constructor(world, pos, player, build) { constructor(world, pos, player, build) {
super(world); super(world);
build = build || defaults.spawnShip;
// Body data.
this.x = pos.x || 0; this.x = pos.x || 0;
this.y = pos.y || 0; this.y = pos.y || 0;
build = build || {};
this.class = build.ship || defaults.spawnShip.ship;
this.turrets = build.turrets || defaults.spawnShip.turrets;
let traits = shipTraits[this.class];
this.frame = traits.hull;
this.power = traits.power;
this.mounts = traits.mounts;
this.size = traits.size;
this.player = player;
this.type = 'ship'; this.type = 'ship';
this.class = build.ship;
this.player = player;
this.inputs = {}; this.inputs = {};
this.grapple = false; this.grapple = false;
// Traits.
let traits = shipTraits[this.class];
this.traits = traits;
this.frame = traits.frame;
this.power = traits.power;
this.size = traits.size;
// Mounts
traits.mounts.forEach((mount, i) => {
let mounts = new Mount(this, mount);
this.mounts.push(mount);
});
this.turrets = [];
this.thrust = { this.thrust = {
forward: 0, forward: 0,
left: 0, left: 0,
@ -100,7 +112,7 @@ class Ship extends Body {
name: this.player.name, name: this.player.name,
frame: this.frame, frame: this.frame,
power: this.power, power: this.power,
mounts: this.mounts, mounts: this.traits.mounts,
turrets: this.turrets, turrets: this.turrets,
size: this.size, size: this.size,
delta: this.packDelta() delta: this.packDelta()

View file

@ -0,0 +1,20 @@
'use strict';
const Fixture = require('./fixture.js');
const Laser = require('./shot/laser.js');
class Blaster extends Fixture {
constructor(hardpoint, data) {
super(hardpoint, data);
}
fire() {
wingbase.debug('pew pew');
let data = {
speed: 1
};
}
}
module.exports = Blaster;

View file

@ -0,0 +1,34 @@
'use strict';
const traits = require('../../traits/turrets.json');
class Fixture {
constructor(hardpoint, data) {
this.hardpoint = hardpoint;
this.projectiles = new WeakSet();
let turretTraits = traits[data.type];
this.rof = turretTraits.rateOfFire;
this.traversal = this.hardpoint.traversal || false;
this._angle = this.traversal ? this.traversal.cw : 0;
}
destruct() {
this.projectiles.forEach(p => p.world.removeBody(p));
}
get angle() {
return this._angle;
}
set angle(angle) {
// TODO: Check if within traversal limit if on mount.
if (this.type == 'fixed') return;
this._angle = angle;
}
}
module.exports = Fixture;

View file

@ -0,0 +1,24 @@
'use strict';
const Blaster = require('./blaster.js');
class Mount {
constructor(ship, data, fixture) {
this.ship = ship;
this.type = data.type || 'turret';
this.fixture = false; // TODO: Create fixture.
this.traversal = data.traversal ? {
cw: data.bounds[0],
ccw: data.bounds[1]
} : false;
}
destruct() {
if (!this.fixture) return;
this.fixture.destruct();
}
}
module.exports = Mount;

View file

@ -0,0 +1,11 @@
'use strict';
const Shot = require('./shot.js');
class Laser extends Shot {
constructor() {
super();
}
}
module.exports = Laser;

View file

@ -2,8 +2,8 @@
class Shot { class Shot {
constructor() { constructor() {
} }
} }
module.exports = Beam; module.exports = Shot;

View file

@ -124,7 +124,7 @@ class World {
} }
removeBody(body) { removeBody(body) {
this.physics.remove(body); body.destruct();
this.bodies.delete(body); this.bodies.delete(body);
this.ships.delete(body); this.ships.delete(body);
this.structures.delete(body); this.structures.delete(body);

View file

@ -1,6 +1,6 @@
{ {
"spawnShip": { "spawnShip": {
"ship": "01", "ship": "01",
"turrets": ["01", "01"] "fixtures": ["01", "01"]
} }
} }

View file

@ -7,7 +7,7 @@
"back": 0, "back": 0,
"rotation": 0.003 "rotation": 0.003
}, },
"hull": [ "frame": [
[ [
[12, 1], [12, 1],
[29, 13], [29, 13],
@ -18,8 +18,11 @@
] ]
], ],
"mounts": [ "mounts": [
[18, 4], {
[18, 28] "pos": [18, 4],
"type": "fixed",
"traversal": false
}
] ]
} }
} }

View file

@ -0,0 +1,27 @@
{
"01": {
"name": "Basic Blaster",
"type": "blaster",
"damage": {
"thermal": 5,
"kinetic": 1
},
"speed": 1,
"range": 10,
"autofire": true,
"rateOfFire": 4,
"overheat": {
"cooldown": 0.01,
"heat": 0.1
},
"cost": {
},
"appearance": {
"type": "laser",
"color": "#ff5f45",
"trail": 3,
"size": 2
}
}
}

View file

@ -23,6 +23,10 @@ class ServerInterface {
`${pad(('' + d.getUTCMilliseconds()).slice(0, 2), 2, true)}> `; `${pad(('' + d.getUTCMilliseconds()).slice(0, 2), 2, true)}> `;
console.log(timestamp.gray, msg); console.log(timestamp.gray, msg);
} }
debug(msg) {
this.log(msg.cyan);
}
} }
module.exports = ServerInterface; module.exports = ServerInterface;