field - perfect diamagnetism

This commit is contained in:
landgreen
2020-03-14 09:40:44 -07:00
parent 582314cdd0
commit cc8ecb8a82
4 changed files with 97 additions and 42 deletions

View File

@@ -239,7 +239,7 @@ const b = {
}, },
{ {
name: "mass driver", name: "mass driver",
description: "<strong>blocks</strong> do <strong>3x</strong> more <strong class='color-d'>damage</strong> to mobs<br>charge block <strong>throws</strong> in <strong>3x</strong> less time", description: "<strong>objects</strong> do <strong>3x</strong> more <strong class='color-d'>damage</strong> to mobs<br>charge <strong>throws</strong> in <strong>3x</strong> less time",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1099,13 +1099,13 @@ const b = {
}, },
{ {
name: "bremsstrahlung radiation", name: "bremsstrahlung radiation",
description: "<strong>blocking</strong> with <strong>standing wave harmonics</strong><br><strong class='color-d'>damages</strong> the blocked mob ", description: "<strong>blocking</strong> with your field does <strong class='color-d'>damage</strong>",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
allowed() { allowed() {
return mech.fieldUpgrades[mech.fieldMode].name === "standing wave harmonics" return mech.fieldUpgrades[mech.fieldMode].name === "standing wave harmonics" || mech.fieldUpgrades[mech.fieldMode].name === "diamagnetic field"
}, },
requires: "standing wave harmonics", requires: "standing wave harmonics<br>or diamagnetic field",
effect() { effect() {
b.modBlockDmg += 0.6 //if you change this value also update the for loop in the electricity graphics in mech.pushMass b.modBlockDmg += 0.6 //if you change this value also update the for loop in the electricity graphics in mech.pushMass
}, },
@@ -1131,24 +1131,6 @@ const b = {
mech.fieldShieldingScale = 1; mech.fieldShieldingScale = 1;
} }
}, },
{
name: "perfect diamagnetism",
description: "you <strong>don't</strong> lose <strong class='color-f'>energy</strong> when <strong>blocking</strong><br>with <strong>nano-scale manufacturing</strong>",
maxCount: 1,
count: 0,
allowed() {
return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing"
},
requires: "nano-scale manufacturing",
effect() {
b.modFieldEfficiency = 0
mech.fieldShieldingScale = b.modFieldEfficiency;
},
remove() {
b.modFieldEfficiency = 1;
if (mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing") mech.fieldShieldingScale = b.modFieldEfficiency;
}
},
{ {
name: "mycelium manufacturing", name: "mycelium manufacturing",
description: "<strong>nano-scale manufacturing</strong> is repurposed<br>excess <strong class='color-f'>energy</strong> used to grow <strong class='color-p' style='letter-spacing: 2px;'>spores</strong>", description: "<strong>nano-scale manufacturing</strong> is repurposed<br>excess <strong class='color-f'>energy</strong> used to grow <strong class='color-p' style='letter-spacing: 2px;'>spores</strong>",

View File

@@ -15,7 +15,7 @@ const level = {
if (level.levelsCleared === 0) { if (level.levelsCleared === 0) {
// level.difficultyIncrease(9) // level.difficultyIncrease(9)
// b.giveGuns("mine") // b.giveGuns("mine")
// mech.setField("negative mass field") mech.setField("perfect diamagnetism")
// b.giveMod("irradiated needles"); // b.giveMod("irradiated needles");
// b.giveMod("reflective cavity"); // b.giveMod("reflective cavity");

View File

@@ -666,7 +666,7 @@ const mech = {
fieldEnergyMax: 1, //can be increased by a mod fieldEnergyMax: 1, //can be increased by a mod
holdingTarget: null, holdingTarget: null,
fieldShieldingScale: 1, fieldShieldingScale: 1,
fieldRange: 175, fieldRange: 155,
// these values are set on reset by setHoldDefaults() // these values are set on reset by setHoldDefaults()
energy: 0, energy: 0,
fieldRegen: 0, fieldRegen: 0,
@@ -866,7 +866,7 @@ const mech = {
ctx.strokeStyle = "rgba(110, 200, 235, " + (0.6 + 0.2 * Math.random()) + ")" //"#9bd" //"rgba(110, 200, 235, " + (0.5 + 0.1 * Math.random()) + ")" ctx.strokeStyle = "rgba(110, 200, 235, " + (0.6 + 0.2 * Math.random()) + ")" //"#9bd" //"rgba(110, 200, 235, " + (0.5 + 0.1 * Math.random()) + ")"
} }
// const off = 2 * Math.cos(game.cycle * 0.1) // const off = 2 * Math.cos(game.cycle * 0.1)
const range = mech.fieldRange - 20; const range = mech.fieldRange;
ctx.beginPath(); ctx.beginPath();
ctx.arc(mech.pos.x, mech.pos.y, range, mech.angle - Math.PI * mech.fieldArc, mech.angle + Math.PI * mech.fieldArc, false); ctx.arc(mech.pos.x, mech.pos.y, range, mech.angle - Math.PI * mech.fieldArc, mech.angle + Math.PI * mech.fieldArc, false);
ctx.lineWidth = 2; ctx.lineWidth = 2;
@@ -895,6 +895,34 @@ const mech = {
ctx.lineWidth = 1; ctx.lineWidth = 1;
ctx.stroke(); ctx.stroke();
}, },
drawDiamagneticField(wave) {
if (mech.holdingTarget) {
ctx.fillStyle = "rgba(110,170,200," + (0.06 + 0.03 * Math.random()) + ")";
ctx.strokeStyle = "rgba(110, 200, 235, " + (0.35 + 0.05 * Math.random()) + ")" //"#9bd" //"rgba(110, 200, 235, " + (0.5 + 0.1 * Math.random()) + ")"
} else {
ctx.fillStyle = "rgba(110,170,200," + (0.20 + 0.07 * Math.random() - 0.07 * wave) + ")";
ctx.strokeStyle = "rgba(110, 200, 235, " + (0.3 + 0.5 * Math.random()) + ")" //"#9bd" //"rgba(110, 200, 235, " + (0.5 + 0.1 * Math.random()) + ")"
}
// const off = 2 * Math.cos(game.cycle * 0.1)
const range = mech.fieldRange;
ctx.beginPath();
ctx.arc(mech.pos.x, mech.pos.y, range, mech.angle - Math.PI * mech.fieldArc, mech.angle + Math.PI * mech.fieldArc, false);
ctx.lineWidth = 2.5 - 1.5 * wave;
ctx.lineCap = "butt"
ctx.stroke();
let eye = 13;
const curve = 0.6 + 0.08 * wave
let aMag = (1 - curve) * Math.PI * mech.fieldArc
let a = mech.angle + aMag
let cp1x = mech.pos.x + curve * range * Math.cos(a)
let cp1y = mech.pos.y + curve * range * Math.sin(a)
ctx.quadraticCurveTo(cp1x, cp1y, mech.pos.x + eye * Math.cos(mech.angle), mech.pos.y + eye * Math.sin(mech.angle))
a = mech.angle - aMag
cp1x = mech.pos.x + curve * range * Math.cos(a)
cp1y = mech.pos.y + curve * range * Math.sin(a)
ctx.quadraticCurveTo(cp1x, cp1y, mech.pos.x + 1 * range * Math.cos(mech.angle - Math.PI * mech.fieldArc), mech.pos.y + 1 * range * Math.sin(mech.angle - Math.PI * mech.fieldArc))
ctx.fill();
},
grabPowerUp() { //look for power ups to grab with field grabPowerUp() { //look for power ups to grab with field
const grabPowerUpRange2 = 156000 //(mech.fieldRange + 220) * (mech.fieldRange + 220) const grabPowerUpRange2 = 156000 //(mech.fieldRange + 220) * (mech.fieldRange + 220)
for (let i = 0, len = powerUp.length; i < len; ++i) { for (let i = 0, len = powerUp.length; i < len; ++i) {
@@ -935,7 +963,6 @@ const mech = {
if (mech.energy < 0) mech.energy = 0; if (mech.energy < 0) mech.energy = 0;
if (mech.energy > mech.fieldEnergyMax) mech.energy = mech.fieldEnergyMax; if (mech.energy > mech.fieldEnergyMax) mech.energy = mech.fieldEnergyMax;
mech.drawHold(who); mech.drawHold(who);
mech.fieldCDcycle = mech.cycle + 10;
mech.holdingTarget = null mech.holdingTarget = null
const unit = Vector.normalise(Vector.sub(player.position, who.position)) const unit = Vector.normalise(Vector.sub(player.position, who.position))
if (b.modBlockDmg) { if (b.modBlockDmg) {
@@ -958,11 +985,13 @@ const mech = {
ctx.stroke(); ctx.stroke();
} }
//knock backs //knock backs
if (mech.fieldShieldingScale > 0) {
const massRoot = Math.sqrt(Math.min(12, Math.max(0.15, who.mass))); // masses above 12 can start to overcome the push back const massRoot = Math.sqrt(Math.min(12, Math.max(0.15, who.mass))); // masses above 12 can start to overcome the push back
Matter.Body.setVelocity(who, { Matter.Body.setVelocity(who, {
x: player.velocity.x - (15 * unit.x) / massRoot, x: player.velocity.x - (15 * unit.x) / massRoot,
y: player.velocity.y - (15 * unit.y) / massRoot y: player.velocity.y - (15 * unit.y) / massRoot
}); });
mech.fieldCDcycle = mech.cycle + 10;
if (mech.crouch) { if (mech.crouch) {
Matter.Body.setVelocity(player, { Matter.Body.setVelocity(player, {
x: player.velocity.x + 0.4 * unit.x * massRoot, x: player.velocity.x + 0.4 * unit.x * massRoot,
@@ -974,13 +1003,20 @@ const mech = {
y: player.velocity.y + 5 * unit.y * massRoot y: player.velocity.y + 5 * unit.y * massRoot
}); });
} }
} else {
const massRoot = Math.sqrt(Math.max(0.15, who.mass)); // masses above 12 can start to overcome the push back
Matter.Body.setVelocity(who, {
x: player.velocity.x - (15 * unit.x) / massRoot,
y: player.velocity.y - (15 * unit.y) / massRoot
});
}
} }
}, },
pushMobsFacing() { // find mobs in range and in direction looking pushMobsFacing() { // find mobs in range and in direction looking
for (let i = 0, len = mob.length; i < len; ++i) { for (let i = 0, len = mob.length; i < len; ++i) {
if ( if (
Vector.magnitude(Vector.sub(mob[i].position, player.position)) < mech.fieldRange && Vector.magnitude(Vector.sub(mob[i].position, player.position)) - mob[i].radius < mech.fieldRange &&
mech.lookingAt(mob[i]) && mech.lookingAt(mob[i]) &&
Matter.Query.ray(map, mob[i].position, mech.pos).length === 0 Matter.Query.ray(map, mob[i].position, mech.pos).length === 0
) { ) {
@@ -1119,7 +1155,7 @@ const mech = {
}, },
fieldUpgrades: [{ fieldUpgrades: [{
name: "field emitter", name: "field emitter",
description: "use <strong class='color-f'>energy</strong> to <strong>shield</strong> yourself from <strong class='color-d'>damage</strong><br>lets you <strong>pick up</strong> and <strong>throw</strong> objects", description: "use <strong class='color-f'>energy</strong> to <strong>shield</strong> yourself from <strong class='color-d'>damage</strong><br><strong>pick up</strong> and <strong>throw</strong> objects",
isEasyToAim: false, isEasyToAim: false,
effect: () => { effect: () => {
game.replaceTextLog = true; //allow text over write game.replaceTextLog = true; //allow text over write
@@ -1142,6 +1178,38 @@ const mech = {
} }
} }
}, },
{
name: "perfect diamagnetism",
// description: "gain <strong class='color-f'>energy</strong> when <strong>blocking</strong><br>no <strong>recoil</strong> when <strong>blocking</strong>",
description: "<strong>blocking</strong> produces <strong class='color-f'>energy</strong><br><strong>blocking</strong> has no <strong>recoil</strong> or <strong>cool down</strong>",
isEasyToAim: false,
effect: () => {
mech.fieldShieldingScale = -2;
// mech.fieldArc = 0.3; //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob)
// mech.calculateFieldThreshold();
mech.hold = function () {
const wave = Math.sin(mech.cycle * 0.025);
mech.fieldRange = 165 + 10 * wave
mech.fieldArc = 0.31 + 0.03 * wave //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob)
mech.calculateFieldThreshold();
if (mech.isHolding) {
mech.drawHold(mech.holdingTarget);
mech.holding();
mech.throwBlock();
} else if ((keys[32] || game.mouseDownRight && mech.energy > 0.05 && mech.fieldCDcycle < mech.cycle)) { //not hold but field button is pressed
mech.drawDiamagneticField(wave);
mech.grabPowerUp();
mech.lookForPickUp();
mech.pushMobsFacing();
} else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle && mech.energy > 0.05) { //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)
}
mech.drawFieldMeter()
}
}
},
{ {
name: "time dilation field", name: "time dilation field",
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br><em>can fire bullets while field is active</em>", description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br><em>can fire bullets while field is active</em>",
@@ -1375,7 +1443,7 @@ const mech = {
}, },
{ {
name: "negative mass field", name: "negative mass field",
description: "use <strong class='color-f'>energy</strong> to nullify &nbsp; <strong style='letter-spacing: 12px;'>gravity</strong><br>and reduce <strong>harm</strong> by <strong>66%</strong>", //<br><strong>launch</strong> larger blocks at much higher speeds description: "use <strong class='color-f'>energy</strong> to nullify &nbsp; <strong style='letter-spacing: 12px;'>gravity</strong><br>reduce <strong>harm</strong> by <strong>66%</strong> while field is active", //<br><strong>launch</strong> larger blocks at much higher speeds
fieldDrawRadius: 0, fieldDrawRadius: 0,
isEasyToAim: true, isEasyToAim: true,
effect: () => { effect: () => {

View File

@@ -1,6 +1,11 @@
************** TODO - n-gon ************** ************** TODO - n-gon **************
field - the basic field emitter, but no energy loss and no knock back on blocks
this field should make blocking a viable strategy
gain energy on blocking?
call it diamagnetic field and remove the diamagnetism mod?
mod - nails do poison damage mod - nails do poison damage
mod - increase laser bot range, and reduce energy drain mod - increase laser bot range, and reduce energy drain