bug fixes, pulse stun mod
This commit is contained in:
545
js/player.js
545
js/player.js
@@ -886,8 +886,8 @@ const mech = {
|
||||
throwBlock() {
|
||||
if (mech.holdingTarget) {
|
||||
if (keys[32] || game.mouseDownRight) {
|
||||
if (mech.energy > 0.0007) {
|
||||
mech.energy -= 0.0007;
|
||||
if (mech.energy > 0.001) {
|
||||
mech.energy -= 0.001 / b.modThrowChargeRate;
|
||||
mech.throwCharge += 0.5 * b.modThrowChargeRate / mech.holdingTarget.mass
|
||||
//draw charge
|
||||
const x = mech.pos.x + 15 * Math.cos(mech.angle);
|
||||
@@ -1261,6 +1261,46 @@ const mech = {
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "standing wave harmonics",
|
||||
description: "three oscillating <strong>shields</strong> are permanently active<br><strong class='color-f'>energy</strong> regenerates while field is active",
|
||||
isEasyToAim: true,
|
||||
effect: () => {
|
||||
mech.hold = function () {
|
||||
if (mech.isHolding) {
|
||||
mech.drawHold(mech.holdingTarget);
|
||||
mech.holding();
|
||||
mech.throwBlock();
|
||||
} else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { //not hold but field button is pressed
|
||||
mech.grabPowerUp();
|
||||
mech.lookForPickUp();
|
||||
} else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released
|
||||
mech.pickUp();
|
||||
} else {
|
||||
mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
||||
}
|
||||
if (mech.energy > 0.1 && mech.fieldCDcycle < mech.cycle) {
|
||||
const fieldRange1 = (0.55 + 0.35 * Math.sin(mech.cycle / 23)) * mech.fieldRange
|
||||
const fieldRange2 = (0.5 + 0.4 * Math.sin(mech.cycle / 37)) * mech.fieldRange
|
||||
const fieldRange3 = (0.45 + 0.45 * Math.sin(mech.cycle / 47)) * mech.fieldRange
|
||||
const netfieldRange = Math.max(fieldRange1, fieldRange2, fieldRange3)
|
||||
ctx.fillStyle = "rgba(110,170,200," + (0.04 + mech.energy * (0.12 + 0.13 * Math.random())) + ")";
|
||||
ctx.beginPath();
|
||||
ctx.arc(mech.pos.x, mech.pos.y, fieldRange1, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
ctx.beginPath();
|
||||
ctx.arc(mech.pos.x, mech.pos.y, fieldRange2, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
ctx.beginPath();
|
||||
ctx.arc(mech.pos.x, mech.pos.y, fieldRange3, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
mech.pushMobs360(netfieldRange);
|
||||
// mech.pushBody360(netfieldRange); //can't throw block when pushhing blocks away
|
||||
}
|
||||
mech.drawFieldMeter()
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "perfect diamagnetism",
|
||||
// description: "gain <strong class='color-f'>energy</strong> when <strong>blocking</strong><br>no <strong>recoil</strong> when <strong>blocking</strong>",
|
||||
@@ -1320,97 +1360,192 @@ const mech = {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "time dilation field",
|
||||
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br><em>you can move and fire while time is stopped</em>",
|
||||
name: "nano-scale manufacturing",
|
||||
description: "excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br><strong>2x</strong> <strong class='color-f'>energy</strong> regeneration",
|
||||
isEasyToAim: true,
|
||||
effect: () => {
|
||||
// mech.fieldMeterColor = "#000"
|
||||
mech.fieldFire = true;
|
||||
mech.isBodiesAsleep = false;
|
||||
// mech.fieldRegen *= 2;
|
||||
mech.hold = function () {
|
||||
if (mech.energy > mech.fieldEnergyMax - 0.02 && mech.fieldCDcycle < mech.cycle) {
|
||||
if (b.isModSporeField) {
|
||||
// mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones
|
||||
const len = Math.floor(6 + 4 * Math.random())
|
||||
mech.energy -= len * 0.074;
|
||||
for (let i = 0; i < len; i++) {
|
||||
b.spore(player)
|
||||
}
|
||||
} else if (b.isModMissileField) {
|
||||
// mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones
|
||||
mech.energy -= 0.5;
|
||||
b.missile({
|
||||
x: mech.pos.x + 40 * Math.cos(mech.angle),
|
||||
y: mech.pos.y + 40 * Math.sin(mech.angle) - 3
|
||||
},
|
||||
mech.angle + (0.5 - Math.random()) * (mech.crouch ? 0 : 0.2),
|
||||
-3 * (0.5 - Math.random()) + (mech.crouch ? 25 : -8) * b.modFireRate,
|
||||
1, b.modBabyMissiles)
|
||||
} else if (b.isModIceField) {
|
||||
// mech.fieldCDcycle = mech.cycle + 17; // set cool down to prevent +energy from making huge numbers of drones
|
||||
mech.energy -= 0.061;
|
||||
b.iceIX(1)
|
||||
} else {
|
||||
// mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones
|
||||
mech.energy -= 0.33;
|
||||
b.drone(1)
|
||||
}
|
||||
|
||||
}
|
||||
if (mech.isHolding) {
|
||||
mech.wakeCheck();
|
||||
mech.drawHold(mech.holdingTarget);
|
||||
mech.holding();
|
||||
mech.throwBlock();
|
||||
} else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) {
|
||||
} else if ((keys[32] || game.mouseDownRight && mech.fieldCDcycle < mech.cycle)) { //not hold but field button is pressed
|
||||
mech.grabPowerUp();
|
||||
mech.lookForPickUp(180);
|
||||
|
||||
const DRAIN = 0.0017
|
||||
if (mech.energy > DRAIN) {
|
||||
mech.energy -= DRAIN;
|
||||
if (mech.energy < DRAIN) {
|
||||
mech.fieldCDcycle = mech.cycle + 120;
|
||||
mech.energy = 0;
|
||||
mech.wakeCheck();
|
||||
}
|
||||
//draw field everywhere
|
||||
ctx.globalCompositeOperation = "saturation"
|
||||
// ctx.fillStyle = "rgba(100,200,230," + (0.25 + 0.06 * Math.random()) + ")";
|
||||
ctx.fillStyle = "#ccc";
|
||||
ctx.fillRect(-100000, -100000, 200000, 200000)
|
||||
ctx.globalCompositeOperation = "source-over"
|
||||
//stop time
|
||||
mech.isBodiesAsleep = true;
|
||||
|
||||
function sleep(who) {
|
||||
for (let i = 0, len = who.length; i < len; ++i) {
|
||||
if (!who[i].isSleeping) {
|
||||
who[i].storeVelocity = who[i].velocity
|
||||
who[i].storeAngularVelocity = who[i].angularVelocity
|
||||
}
|
||||
Matter.Sleeping.set(who[i], true)
|
||||
}
|
||||
}
|
||||
sleep(mob);
|
||||
sleep(body);
|
||||
sleep(bullet);
|
||||
//doesn't really work, just slows down constraints
|
||||
for (let i = 0, len = cons.length; i < len; i++) {
|
||||
if (cons[i].stiffness !== 0) {
|
||||
cons[i].storeStiffness = cons[i].stiffness;
|
||||
cons[i].stiffness = 0;
|
||||
}
|
||||
}
|
||||
|
||||
game.cycle--; //pause all functions that depend on game cycle increasing
|
||||
if (b.isModTimeSkip) {
|
||||
game.isTimeSkipping = true;
|
||||
mech.cycle++;
|
||||
game.gravity();
|
||||
Engine.update(engine, game.delta);
|
||||
// level.checkZones();
|
||||
// level.checkQuery();
|
||||
mech.move();
|
||||
game.checks();
|
||||
// mobs.loop();
|
||||
// mech.draw();
|
||||
mech.walk_cycle += mech.flipLegs * mech.Vx;
|
||||
// mech.hold();
|
||||
mech.energy += 0.5 * DRAIN; //x1 to undo the energy drain from time speed up, x1.5 to cut energy drain in half
|
||||
b.fire();
|
||||
// b.bulletRemove();
|
||||
b.bulletDo();
|
||||
game.isTimeSkipping = false;
|
||||
}
|
||||
// game.cycle--; //pause all functions that depend on game cycle increasing
|
||||
// if (b.isModTimeSkip && !game.isTimeSkipping) { //speed up the rate of time
|
||||
// game.timeSkip(1)
|
||||
// mech.energy += 1.5 * DRAIN; //x1 to undo the energy drain from time speed up, x1.5 to cut energy drain in half
|
||||
// }
|
||||
mech.lookForPickUp();
|
||||
if (mech.energy > 0.05) {
|
||||
mech.drawField();
|
||||
mech.pushMobsFacing();
|
||||
}
|
||||
} else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released
|
||||
mech.wakeCheck();
|
||||
mech.pickUp();
|
||||
} else {
|
||||
mech.wakeCheck();
|
||||
mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
||||
}
|
||||
mech.energy += mech.fieldRegen;
|
||||
mech.drawFieldMeter()
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "negative mass field",
|
||||
description: "use <strong class='color-f'>energy</strong> to nullify <strong style='letter-spacing: 12px;'>gravity</strong><br>reduce <strong>harm</strong> by <strong>80%</strong> while field is active", //<br><strong>launch</strong> larger blocks at much higher speeds
|
||||
fieldDrawRadius: 0,
|
||||
isEasyToAim: true,
|
||||
effect: () => {
|
||||
mech.fieldFire = true;
|
||||
mech.holdingMassScale = 0.03; //can hold heavier blocks with lower cost to jumping
|
||||
mech.fieldMeterColor = "#000"
|
||||
|
||||
mech.hold = function () {
|
||||
mech.fieldDamageResistance = 1;
|
||||
if (mech.isHolding) {
|
||||
mech.drawHold(mech.holdingTarget);
|
||||
mech.holding();
|
||||
mech.throwBlock();
|
||||
} else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { //push away
|
||||
mech.grabPowerUp();
|
||||
mech.lookForPickUp();
|
||||
const DRAIN = 0.00035
|
||||
if (mech.energy > DRAIN) {
|
||||
mech.fieldDamageResistance = 0.2; // 1 - 0.8
|
||||
// mech.pushMobs360();
|
||||
|
||||
//repulse mobs
|
||||
// for (let i = 0, len = mob.length; i < len; ++i) {
|
||||
// sub = Vector.sub(mob[i].position, mech.pos);
|
||||
// dist2 = Vector.magnitudeSquared(sub);
|
||||
// if (dist2 < this.fieldDrawRadius * this.fieldDrawRadius && mob[i].speed > 6) {
|
||||
// const force = Vector.mult(Vector.perp(Vector.normalise(sub)), 0.00004 * mob[i].speed * mob[i].mass)
|
||||
// mob[i].force.x = force.x
|
||||
// mob[i].force.y = force.y
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
//look for nearby objects to make zero-g
|
||||
function zeroG(who, range, mag = 1.06) {
|
||||
for (let i = 0, len = who.length; i < len; ++i) {
|
||||
sub = Vector.sub(who[i].position, mech.pos);
|
||||
dist = Vector.magnitude(sub);
|
||||
if (dist < range) {
|
||||
who[i].force.y -= who[i].mass * (game.g * mag); //add a bit more then standard gravity
|
||||
}
|
||||
}
|
||||
}
|
||||
// zeroG(bullet); //works fine, but not that noticeable and maybe not worth the possible performance hit
|
||||
// zeroG(mob); //mobs are too irregular to make this work?
|
||||
|
||||
if (keys[83] || keys[40]) { //down
|
||||
player.force.y -= 0.5 * player.mass * mech.gravity;
|
||||
this.fieldDrawRadius = this.fieldDrawRadius * 0.97 + 400 * 0.03;
|
||||
zeroG(powerUp, this.fieldDrawRadius, 0.7);
|
||||
zeroG(body, this.fieldDrawRadius, 0.7);
|
||||
} else if (keys[87] || keys[38]) { //up
|
||||
mech.energy -= 5 * DRAIN;
|
||||
this.fieldDrawRadius = this.fieldDrawRadius * 0.97 + 850 * 0.03;
|
||||
player.force.y -= 1.45 * player.mass * mech.gravity;
|
||||
zeroG(powerUp, this.fieldDrawRadius, 1.38);
|
||||
zeroG(body, this.fieldDrawRadius, 1.38);
|
||||
} else {
|
||||
mech.energy -= DRAIN;
|
||||
this.fieldDrawRadius = this.fieldDrawRadius * 0.97 + 650 * 0.03;
|
||||
player.force.y -= 1.07 * player.mass * mech.gravity; // slow upward drift
|
||||
zeroG(powerUp, this.fieldDrawRadius);
|
||||
zeroG(body, this.fieldDrawRadius);
|
||||
}
|
||||
if (mech.energy < 0.001) {
|
||||
mech.fieldCDcycle = mech.cycle + 120;
|
||||
mech.energy = 0;
|
||||
}
|
||||
//add extra friction for horizontal motion
|
||||
if (keys[65] || keys[68] || keys[37] || keys[39]) {
|
||||
Matter.Body.setVelocity(player, {
|
||||
x: player.velocity.x * 0.99,
|
||||
y: player.velocity.y * 0.97
|
||||
});
|
||||
} else { //slow rise and fall
|
||||
Matter.Body.setVelocity(player, {
|
||||
x: player.velocity.x,
|
||||
y: player.velocity.y * 0.97
|
||||
});
|
||||
}
|
||||
|
||||
//draw zero-G range
|
||||
ctx.beginPath();
|
||||
ctx.arc(mech.pos.x, mech.pos.y, this.fieldDrawRadius, 0, 2 * Math.PI);
|
||||
ctx.fillStyle = "#f5f5ff";
|
||||
ctx.globalCompositeOperation = "difference";
|
||||
ctx.fill();
|
||||
if (b.isModHawking) {
|
||||
for (let i = 0, len = mob.length; i < len; i++) {
|
||||
if (mob[i].distanceToPlayer2() < this.fieldDrawRadius * this.fieldDrawRadius && Matter.Query.ray(map, mech.pos, mob[i].position).length === 0 && Matter.Query.ray(body, mech.pos, mob[i].position).length === 0) {
|
||||
mob[i].damage(b.dmgScale * 0.085);
|
||||
mob[i].locatePlayer();
|
||||
|
||||
//draw electricity
|
||||
const sub = Vector.sub(mob[i].position, mech.pos)
|
||||
const unit = Vector.normalise(sub);
|
||||
const steps = 6
|
||||
const step = Vector.magnitude(sub) / steps;
|
||||
ctx.beginPath();
|
||||
let x = mech.pos.x + 30 * unit.x;
|
||||
let y = mech.pos.y + 30 * unit.y;
|
||||
ctx.moveTo(x, y);
|
||||
for (let i = 0; i < steps; i++) {
|
||||
x += step * (unit.x + 0.7 * (Math.random() - 0.5))
|
||||
y += step * (unit.y + 0.7 * (Math.random() - 0.5))
|
||||
ctx.lineTo(x, y);
|
||||
}
|
||||
ctx.lineWidth = 1;
|
||||
ctx.strokeStyle = "rgba(0,255,0,0.5)" //"#fff";
|
||||
ctx.stroke();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.globalCompositeOperation = "source-over";
|
||||
}
|
||||
} else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released
|
||||
mech.pickUp();
|
||||
this.fieldDrawRadius = 0
|
||||
} else {
|
||||
mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
||||
this.fieldDrawRadius = 0
|
||||
}
|
||||
mech.drawFieldMeter("rgba(0,0,0,0.2)")
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "plasma torch",
|
||||
description: "use <strong class='color-f'>energy</strong> to emit <strong class='color-d'>damaging</strong> plasma<br><em>effective at close range</em>",
|
||||
@@ -1578,228 +1713,93 @@ const mech = {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "negative mass field",
|
||||
description: "use <strong class='color-f'>energy</strong> to nullify <strong style='letter-spacing: 12px;'>gravity</strong><br>reduce <strong>harm</strong> by <strong>80%</strong> while field is active", //<br><strong>launch</strong> larger blocks at much higher speeds
|
||||
fieldDrawRadius: 0,
|
||||
name: "time dilation field",
|
||||
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br><em>you can move and fire while time is stopped</em>",
|
||||
isEasyToAim: true,
|
||||
effect: () => {
|
||||
// mech.fieldMeterColor = "#000"
|
||||
mech.fieldFire = true;
|
||||
mech.holdingMassScale = 0.03; //can hold heavier blocks with lower cost to jumping
|
||||
mech.fieldMeterColor = "#000"
|
||||
|
||||
mech.isBodiesAsleep = false;
|
||||
mech.hold = function () {
|
||||
mech.fieldDamageResistance = 1;
|
||||
if (mech.isHolding) {
|
||||
mech.wakeCheck();
|
||||
mech.drawHold(mech.holdingTarget);
|
||||
mech.holding();
|
||||
mech.throwBlock();
|
||||
} else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { //push away
|
||||
} else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) {
|
||||
mech.grabPowerUp();
|
||||
mech.lookForPickUp();
|
||||
const DRAIN = 0.00035
|
||||
mech.lookForPickUp(180);
|
||||
|
||||
const DRAIN = 0.0017
|
||||
if (mech.energy > DRAIN) {
|
||||
mech.fieldDamageResistance = 0.2; // 1 - 0.8
|
||||
// mech.pushMobs360();
|
||||
|
||||
//repulse mobs
|
||||
// for (let i = 0, len = mob.length; i < len; ++i) {
|
||||
// sub = Vector.sub(mob[i].position, mech.pos);
|
||||
// dist2 = Vector.magnitudeSquared(sub);
|
||||
// if (dist2 < this.fieldDrawRadius * this.fieldDrawRadius && mob[i].speed > 6) {
|
||||
// const force = Vector.mult(Vector.perp(Vector.normalise(sub)), 0.00004 * mob[i].speed * mob[i].mass)
|
||||
// mob[i].force.x = force.x
|
||||
// mob[i].force.y = force.y
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
//look for nearby objects to make zero-g
|
||||
function zeroG(who, range, mag = 1.06) {
|
||||
for (let i = 0, len = who.length; i < len; ++i) {
|
||||
sub = Vector.sub(who[i].position, mech.pos);
|
||||
dist = Vector.magnitude(sub);
|
||||
if (dist < range) {
|
||||
who[i].force.y -= who[i].mass * (game.g * mag); //add a bit more then standard gravity
|
||||
}
|
||||
}
|
||||
}
|
||||
// zeroG(bullet); //works fine, but not that noticeable and maybe not worth the possible performance hit
|
||||
// zeroG(mob); //mobs are too irregular to make this work?
|
||||
|
||||
if (keys[83] || keys[40]) { //down
|
||||
player.force.y -= 0.5 * player.mass * mech.gravity;
|
||||
this.fieldDrawRadius = this.fieldDrawRadius * 0.97 + 400 * 0.03;
|
||||
zeroG(powerUp, this.fieldDrawRadius, 0.7);
|
||||
zeroG(body, this.fieldDrawRadius, 0.7);
|
||||
} else if (keys[87] || keys[38]) { //up
|
||||
mech.energy -= 5 * DRAIN;
|
||||
this.fieldDrawRadius = this.fieldDrawRadius * 0.97 + 850 * 0.03;
|
||||
player.force.y -= 1.45 * player.mass * mech.gravity;
|
||||
zeroG(powerUp, this.fieldDrawRadius, 1.38);
|
||||
zeroG(body, this.fieldDrawRadius, 1.38);
|
||||
} else {
|
||||
mech.energy -= DRAIN;
|
||||
this.fieldDrawRadius = this.fieldDrawRadius * 0.97 + 650 * 0.03;
|
||||
player.force.y -= 1.07 * player.mass * mech.gravity; // slow upward drift
|
||||
zeroG(powerUp, this.fieldDrawRadius);
|
||||
zeroG(body, this.fieldDrawRadius);
|
||||
}
|
||||
if (mech.energy < 0.001) {
|
||||
mech.energy -= DRAIN;
|
||||
if (mech.energy < DRAIN) {
|
||||
mech.fieldCDcycle = mech.cycle + 120;
|
||||
mech.energy = 0;
|
||||
mech.wakeCheck();
|
||||
}
|
||||
//add extra friction for horizontal motion
|
||||
if (keys[65] || keys[68] || keys[37] || keys[39]) {
|
||||
Matter.Body.setVelocity(player, {
|
||||
x: player.velocity.x * 0.99,
|
||||
y: player.velocity.y * 0.97
|
||||
});
|
||||
} else { //slow rise and fall
|
||||
Matter.Body.setVelocity(player, {
|
||||
x: player.velocity.x,
|
||||
y: player.velocity.y * 0.97
|
||||
});
|
||||
}
|
||||
|
||||
//draw zero-G range
|
||||
ctx.beginPath();
|
||||
ctx.arc(mech.pos.x, mech.pos.y, this.fieldDrawRadius, 0, 2 * Math.PI);
|
||||
ctx.fillStyle = "#f5f5ff";
|
||||
ctx.globalCompositeOperation = "difference";
|
||||
ctx.fill();
|
||||
if (b.isModHawking) {
|
||||
for (let i = 0, len = mob.length; i < len; i++) {
|
||||
if (mob[i].distanceToPlayer2() < this.fieldDrawRadius * this.fieldDrawRadius && Matter.Query.ray(map, mech.pos, mob[i].position).length === 0 && Matter.Query.ray(body, mech.pos, mob[i].position).length === 0) {
|
||||
mob[i].damage(b.dmgScale * 0.085);
|
||||
mob[i].locatePlayer();
|
||||
|
||||
//draw electricity
|
||||
const sub = Vector.sub(mob[i].position, mech.pos)
|
||||
const unit = Vector.normalise(sub);
|
||||
const steps = 6
|
||||
const step = Vector.magnitude(sub) / steps;
|
||||
ctx.beginPath();
|
||||
let x = mech.pos.x + 30 * unit.x;
|
||||
let y = mech.pos.y + 30 * unit.y;
|
||||
ctx.moveTo(x, y);
|
||||
for (let i = 0; i < steps; i++) {
|
||||
x += step * (unit.x + 0.7 * (Math.random() - 0.5))
|
||||
y += step * (unit.y + 0.7 * (Math.random() - 0.5))
|
||||
ctx.lineTo(x, y);
|
||||
}
|
||||
ctx.lineWidth = 1;
|
||||
ctx.strokeStyle = "rgba(0,255,0,0.5)" //"#fff";
|
||||
ctx.stroke();
|
||||
//draw field everywhere
|
||||
ctx.globalCompositeOperation = "saturation"
|
||||
// ctx.fillStyle = "rgba(100,200,230," + (0.25 + 0.06 * Math.random()) + ")";
|
||||
ctx.fillStyle = "#ccc";
|
||||
ctx.fillRect(-100000, -100000, 200000, 200000)
|
||||
ctx.globalCompositeOperation = "source-over"
|
||||
//stop time
|
||||
mech.isBodiesAsleep = true;
|
||||
|
||||
function sleep(who) {
|
||||
for (let i = 0, len = who.length; i < len; ++i) {
|
||||
if (!who[i].isSleeping) {
|
||||
who[i].storeVelocity = who[i].velocity
|
||||
who[i].storeAngularVelocity = who[i].angularVelocity
|
||||
}
|
||||
Matter.Sleeping.set(who[i], true)
|
||||
}
|
||||
}
|
||||
ctx.globalCompositeOperation = "source-over";
|
||||
}
|
||||
} else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released
|
||||
mech.pickUp();
|
||||
this.fieldDrawRadius = 0
|
||||
} else {
|
||||
mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
||||
this.fieldDrawRadius = 0
|
||||
}
|
||||
mech.drawFieldMeter("rgba(0,0,0,0.2)")
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "standing wave harmonics",
|
||||
description: "three oscillating <strong>shields</strong> are permanently active<br><strong class='color-f'>energy</strong> regenerates while field is active",
|
||||
isEasyToAim: true,
|
||||
effect: () => {
|
||||
mech.hold = function () {
|
||||
if (mech.isHolding) {
|
||||
mech.drawHold(mech.holdingTarget);
|
||||
mech.holding();
|
||||
mech.throwBlock();
|
||||
} else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) { //not hold but field button is pressed
|
||||
mech.grabPowerUp();
|
||||
mech.lookForPickUp();
|
||||
} else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released
|
||||
mech.pickUp();
|
||||
} else {
|
||||
mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
||||
}
|
||||
if (mech.energy > 0.1 && mech.fieldCDcycle < mech.cycle) {
|
||||
const fieldRange1 = (0.55 + 0.35 * Math.sin(mech.cycle / 23)) * mech.fieldRange
|
||||
const fieldRange2 = (0.5 + 0.4 * Math.sin(mech.cycle / 37)) * mech.fieldRange
|
||||
const fieldRange3 = (0.45 + 0.45 * Math.sin(mech.cycle / 47)) * mech.fieldRange
|
||||
const netfieldRange = Math.max(fieldRange1, fieldRange2, fieldRange3)
|
||||
ctx.fillStyle = "rgba(110,170,200," + (0.04 + mech.energy * (0.12 + 0.13 * Math.random())) + ")";
|
||||
ctx.beginPath();
|
||||
ctx.arc(mech.pos.x, mech.pos.y, fieldRange1, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
ctx.beginPath();
|
||||
ctx.arc(mech.pos.x, mech.pos.y, fieldRange2, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
ctx.beginPath();
|
||||
ctx.arc(mech.pos.x, mech.pos.y, fieldRange3, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
mech.pushMobs360(netfieldRange);
|
||||
// mech.pushBody360(netfieldRange); //can't throw block when pushhing blocks away
|
||||
}
|
||||
mech.drawFieldMeter()
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "nano-scale manufacturing",
|
||||
description: "excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br><strong>2x</strong> <strong class='color-f'>energy</strong> regeneration",
|
||||
isEasyToAim: true,
|
||||
effect: () => {
|
||||
// mech.fieldRegen *= 2;
|
||||
mech.hold = function () {
|
||||
if (mech.energy > mech.fieldEnergyMax - 0.02 && mech.fieldCDcycle < mech.cycle) {
|
||||
if (b.isModSporeField) {
|
||||
// mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones
|
||||
const len = Math.floor(6 + 4 * Math.random())
|
||||
mech.energy -= len * 0.074;
|
||||
for (let i = 0; i < len; i++) {
|
||||
b.spore(player)
|
||||
sleep(mob);
|
||||
sleep(body);
|
||||
sleep(bullet);
|
||||
//doesn't really work, just slows down constraints
|
||||
for (let i = 0, len = cons.length; i < len; i++) {
|
||||
if (cons[i].stiffness !== 0) {
|
||||
cons[i].storeStiffness = cons[i].stiffness;
|
||||
cons[i].stiffness = 0;
|
||||
}
|
||||
}
|
||||
} else if (b.isModMissileField) {
|
||||
// mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones
|
||||
mech.energy -= 0.5;
|
||||
b.missile({
|
||||
x: mech.pos.x + 40 * Math.cos(mech.angle),
|
||||
y: mech.pos.y + 40 * Math.sin(mech.angle) - 3
|
||||
},
|
||||
mech.angle + (0.5 - Math.random()) * (mech.crouch ? 0 : 0.2),
|
||||
-3 * (0.5 - Math.random()) + (mech.crouch ? 25 : -8) * b.modFireRate,
|
||||
1, b.modBabyMissiles)
|
||||
} else if (b.isModIceField) {
|
||||
// mech.fieldCDcycle = mech.cycle + 17; // set cool down to prevent +energy from making huge numbers of drones
|
||||
mech.energy -= 0.061;
|
||||
b.iceIX(1)
|
||||
} else {
|
||||
// mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones
|
||||
mech.energy -= 0.33;
|
||||
b.drone(1)
|
||||
}
|
||||
|
||||
}
|
||||
if (mech.isHolding) {
|
||||
mech.drawHold(mech.holdingTarget);
|
||||
mech.holding();
|
||||
mech.throwBlock();
|
||||
} else if ((keys[32] || game.mouseDownRight && mech.fieldCDcycle < mech.cycle)) { //not hold but field button is pressed
|
||||
mech.grabPowerUp();
|
||||
mech.lookForPickUp();
|
||||
if (mech.energy > 0.05) {
|
||||
mech.drawField();
|
||||
mech.pushMobsFacing();
|
||||
game.cycle--; //pause all functions that depend on game cycle increasing
|
||||
if (b.isModTimeSkip) {
|
||||
game.isTimeSkipping = true;
|
||||
mech.cycle++;
|
||||
game.gravity();
|
||||
Engine.update(engine, game.delta);
|
||||
// level.checkZones();
|
||||
// level.checkQuery();
|
||||
mech.move();
|
||||
game.checks();
|
||||
// mobs.loop();
|
||||
// mech.draw();
|
||||
mech.walk_cycle += mech.flipLegs * mech.Vx;
|
||||
// mech.hold();
|
||||
mech.energy += 0.5 * DRAIN; //x1 to undo the energy drain from time speed up, x1.5 to cut energy drain in half
|
||||
b.fire();
|
||||
// b.bulletRemove();
|
||||
b.bulletDo();
|
||||
game.isTimeSkipping = false;
|
||||
}
|
||||
// game.cycle--; //pause all functions that depend on game cycle increasing
|
||||
// if (b.isModTimeSkip && !game.isTimeSkipping) { //speed up the rate of time
|
||||
// game.timeSkip(1)
|
||||
// mech.energy += 1.5 * DRAIN; //x1 to undo the energy drain from time speed up, x1.5 to cut energy drain in half
|
||||
// }
|
||||
}
|
||||
} else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released
|
||||
mech.wakeCheck();
|
||||
mech.pickUp();
|
||||
} else {
|
||||
mech.wakeCheck();
|
||||
mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
||||
}
|
||||
mech.energy += mech.fieldRegen;
|
||||
mech.drawFieldMeter()
|
||||
}
|
||||
}
|
||||
@@ -2009,6 +2009,7 @@ const mech = {
|
||||
if (mech.energy > DRAIN) {
|
||||
mech.energy -= DRAIN;
|
||||
Matter.Body.setVelocity(body[i], velocity); //give block mouse velocity
|
||||
Matter.Body.setAngularVelocity(body[i], body[i].angularVelocity * 0.8)
|
||||
body[i].force.y -= body[i].mass * game.g; //remove gravity effects
|
||||
} else {
|
||||
mech.fieldOn = false
|
||||
|
||||
Reference in New Issue
Block a user