wingbase/server/game/room/world/body/projectile/grapple.js
2016-03-29 22:35:08 +01:00

72 lines
1.4 KiB
JavaScript

'use strict';
const Projectile = require('./projectile.js');
const Rope = require('../../copula/rope.js');
class Grapple extends Projectile {
constructor(world, pos, source) {
super(world, pos);
this.r = pos.r;
this.x = pos.x;
this.y = pos.y;
this.xvel = pos.xvel;
this.yvel = pos.yvel;
this.xvel += Math.cos(this.r) * 0.25;
this.yvel += Math.sin(this.r) * 0.25;
this.welded = false;
this.source = source;
this.player = source.player;
this.type = 'grapple';
this.frame = [
[[0, -8], [5, -12], [2, 0], [0, 0]],
[[0, 0], [2, 0], [5, 12], [0, 8]]
];
}
release() {
this.source.grapple = false;
this.world.removeBody(this);
}
retract() {
if (this.rope.length > 0.05)
this.rope.length = this.rope.length - 0.1;
}
connect() {
let p1 = { x: 0.1, y: 0.5 };
let p2 = { x: 0.0625, y: 0 };
this.rope = new Rope(this.player.ship, this, p1, p2);
this.rope.initLength = 8;
this.world.addCopula(this.rope);
}
contact(body, contact) {
if (this.welded || body == this.source)
return;
let normal = this.world.physics.contactData(contact).worldNormal;
let angle = Math.atan2(normal.y, normal.x);
this.setRotation(angle + Math.PI);
this.b2body.SetAngularVelocity(0);
this.setVelocity(0, 0);
this.world.weld(this, body, { x: 0.15625, y: 0 });
this.welded = true;
}
tickType() {
}
packTypeDelta() {
return [];
}
packProjectileFull() {
return {};
}
}
module.exports = Grapple;