triple point

perfect diamagnetism now has a 1/6 of a second cooldown after blocking (same as other fields)
perfect diamagnetism can get bremsstrahlung now

standing wave harmonic field blocks now block large mobs more reliably

tech: triple point - blocking makes iceIX crystals
  unlocked with: standing wave harmonic field or perfect diamagnetism
This commit is contained in:
landgreen
2021-04-21 19:57:53 -07:00
parent b50e2ba9ce
commit 29dee3536f
9 changed files with 97 additions and 63 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1908,12 +1908,11 @@ const b = {
} }
} }
}, },
iceIX(speed = 0, spread = 2 * Math.PI) { iceIX(speed = 0, dir = m.angle + Math.PI * 2 * Math.random(), where = { x: m.pos.x + 30 * Math.cos(m.angle), y: m.pos.y + 30 * Math.sin(m.angle) }) {
const me = bullet.length; const me = bullet.length;
const THRUST = 0.004 const THRUST = 0.004
const dir = m.angle + spread * (Math.random() - 0.5);
const RADIUS = 18 const RADIUS = 18
bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 3, RADIUS, { bullet[me] = Bodies.polygon(where.x, where.y, 3, RADIUS, {
angle: dir - Math.PI, angle: dir - Math.PI,
inertia: Infinity, inertia: Infinity,
friction: 0, friction: 0,

View File

@@ -1107,7 +1107,7 @@ const level = {
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump
// simulation.difficulty = 30 // simulation.difficulty = 30
// spawn.starter(1900, -500, 200) //big boy spawn.starter(1900, -500, 100) //big boy
// spawn.grower(1900, -500) // spawn.grower(1900, -500)
// spawn.pulsarBoss(1900, -500) // spawn.pulsarBoss(1900, -500)
// spawn.shooterBoss(1900, -500) // spawn.shooterBoss(1900, -500)
@@ -1119,7 +1119,7 @@ const level = {
// spawn.sniper(1800, -120) // spawn.sniper(1800, -120)
// spawn.streamBoss(1600, -500) // spawn.streamBoss(1600, -500)
// spawn.orbitalBoss(1600, -500) // spawn.orbitalBoss(1600, -500)
spawn.cellBossCulture(1600, -500) // spawn.cellBossCulture(1600, -500)
// spawn.shieldingBoss(1600, -500) // spawn.shieldingBoss(1600, -500)
// spawn.beamer(1200, -500) // spawn.beamer(1200, -500)
// spawn.shield(mob[mob.length - 1], 1800, -120, 1); // spawn.shield(mob[mob.length - 1], 1800, -120, 1);

View File

@@ -70,7 +70,7 @@ const mobs = {
who.isSlowed = true; who.isSlowed = true;
who.status.push({ who.status.push({
effect() { effect() {
const speedCap = 3 const speedCap = 2
const drag = 0.95 const drag = 0.95
Matter.Body.setVelocity(who, { Matter.Body.setVelocity(who, {
x: Math.min(speedCap, who.velocity.x) * drag, x: Math.min(speedCap, who.velocity.x) * drag,
@@ -1067,7 +1067,7 @@ const mobs = {
const len = Math.min(25, Math.floor(2 + this.mass * (0.5 + 0.5 * Math.random()))) const len = Math.min(25, Math.floor(2 + this.mass * (0.5 + 0.5 * Math.random())))
for (let i = 0; i < len; i++) b.spore(this.position) for (let i = 0; i < len; i++) b.spore(this.position)
} else if (tech.isExplodeMob) { } else if (tech.isExplodeMob) {
b.explosion(this.position, Math.min(600, Math.sqrt(this.mass + 2.75) * 55)) b.explosion(this.position, Math.min(600, Math.sqrt(this.mass + 1.5) * (22 + 60 * Math.random())))
} else if (tech.nailsDeathMob) { } else if (tech.nailsDeathMob) {
b.targetedNail(this.position, tech.nailsDeathMob, 39 + 6 * Math.random()) b.targetedNail(this.position, tech.nailsDeathMob, 39 + 6 * Math.random())
} }

View File

@@ -1266,8 +1266,14 @@ const m = {
if (m.energy > fieldBlockCost * 0.2) { //shield needs at least some of the cost to block if (m.energy > fieldBlockCost * 0.2) { //shield needs at least some of the cost to block
m.energy -= fieldBlockCost m.energy -= fieldBlockCost
if (m.energy < 0) m.energy = 0; if (m.energy < 0) m.energy = 0;
// if (m.energy > m.maxEnergy) m.energy = m.maxEnergy; m.fieldCDcycle = m.cycle + m.fieldBlockCD;
if (tech.blockingIce) {
if (m.fieldShieldingScale) {
for (let i = 0; i < fieldBlockCost * 35 * tech.blockingIce; i++) b.iceIX(3, m.angle + Math.random() - 0.5, m.pos)
} else {
for (let i = 0; i < tech.blockingIce; i++) b.iceIX(10, m.angle + Math.random() - 0.5, m.pos)
}
}
if (tech.blockDmg) { if (tech.blockDmg) {
who.damage(tech.blockDmg * b.dmgScale) who.damage(tech.blockDmg * b.dmgScale)
//draw electricity //draw electricity
@@ -1299,7 +1305,6 @@ const m = {
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
}); });
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
if (m.crouch) { if (m.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,
@@ -1340,12 +1345,9 @@ const m = {
} }
} }
}, },
pushMobs360(range = m.fieldRange * 0.75) { // find mobs in range in any direction pushMobs360(range) { // find mobs in range in any direction
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, m.pos)) - mob[i].radius < range && Matter.Query.ray(map, mob[i].position, m.pos).length === 0) {
Vector.magnitude(Vector.sub(mob[i].position, m.pos)) < range &&
Matter.Query.ray(map, mob[i].position, m.pos).length === 0
) {
mob[i].locatePlayer(); mob[i].locatePlayer();
m.pushMass(mob[i]); m.pushMass(mob[i]);
} }
@@ -1483,11 +1485,11 @@ const m = {
}, },
{ {
name: "standing wave harmonics", name: "standing wave harmonics",
description: "<strong>3</strong> oscillating <strong>shields</strong> are permanently active<br><strong>blocking</strong> drains <strong class='color-f'>energy</strong> with no <strong>cool down</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>20%</strong>", description: "<strong>3</strong> oscillating <strong>shields</strong> are permanently active<br><strong>blocking</strong> drains <strong class='color-f'>energy</strong> with no <strong>cool down</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>25%</strong>",
effect: () => { effect: () => {
// m.fieldHarmReduction = 0.80; // m.fieldHarmReduction = 0.80;
m.fieldBlockCD = 0; m.fieldBlockCD = 0;
m.fieldHarmReduction = 0.8; m.fieldHarmReduction = 0.75;
m.fieldRange = 175 + 175 * 0.25 * tech.frequencyResonance m.fieldRange = 175 + 175 * 0.25 * tech.frequencyResonance
m.fieldShieldingScale = Math.pow(0.5, tech.frequencyResonance) m.fieldShieldingScale = Math.pow(0.5, tech.frequencyResonance)
m.hold = function() { m.hold = function() {
@@ -1508,7 +1510,7 @@ const m = {
const fieldRange2 = (0.63 + 0.37 * Math.sin(m.cycle / 37)) * m.fieldRange const fieldRange2 = (0.63 + 0.37 * Math.sin(m.cycle / 37)) * m.fieldRange
const fieldRange3 = (0.65 + 0.35 * Math.sin(m.cycle / 47)) * m.fieldRange const fieldRange3 = (0.65 + 0.35 * Math.sin(m.cycle / 47)) * m.fieldRange
const netfieldRange = Math.max(fieldRange1, fieldRange2, fieldRange3) const netfieldRange = Math.max(fieldRange1, fieldRange2, fieldRange3)
ctx.fillStyle = "rgba(110,170,200," + (0.04 + m.energy * (0.12 + 0.13 * Math.random())) + ")"; ctx.fillStyle = "rgba(110,170,200," + Math.min(0.73, (0.04 + m.energy * (0.11 + 0.13 * Math.random()))) + ")";
ctx.beginPath(); ctx.beginPath();
ctx.arc(m.pos.x, m.pos.y, fieldRange1, 0, 2 * Math.PI); ctx.arc(m.pos.x, m.pos.y, fieldRange1, 0, 2 * Math.PI);
ctx.fill(); ctx.fill();
@@ -1528,9 +1530,10 @@ const m = {
{ {
name: "perfect diamagnetism", 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: "gain <strong class='color-f'>energy</strong> when <strong>blocking</strong><br>no <strong>recoil</strong> when <strong>blocking</strong>",
description: "<strong>blocking</strong> does not drain <strong class='color-f'>energy</strong><br><strong>blocking</strong> has no <strong>cool down</strong> and less <strong>recoil</strong><br><strong>attract</strong> power ups from <strong>far away</strong>", description: "<strong>blocking</strong> does not drain <strong class='color-f'>energy</strong><br><strong>blocking</strong> has less <strong>recoil</strong><br><strong>attract</strong> power ups from <strong>far away</strong>",
effect: () => { effect: () => {
m.fieldShieldingScale = 0; m.fieldShieldingScale = 0;
m.fieldBlockCD = 4;
m.grabPowerUpRange2 = 10000000 m.grabPowerUpRange2 = 10000000
m.hold = function() { m.hold = function() {
const wave = Math.sin(m.cycle * 0.022); const wave = Math.sin(m.cycle * 0.022);
@@ -1676,7 +1679,6 @@ const m = {
m.isFieldActive = true; //used with tech.isHarmReduce m.isFieldActive = true; //used with tech.isHarmReduce
m.airSpeedLimit = 400 // 7* player.mass * player.mass m.airSpeedLimit = 400 // 7* player.mass * player.mass
m.FxAir = 0.005 m.FxAir = 0.005
// m.pushMobs360();
//repulse mobs //repulse mobs
// for (let i = 0, len = mob.length; i < len; ++i) { // for (let i = 0, len = mob.length; i < len; ++i) {
@@ -1736,7 +1738,7 @@ const m = {
}); });
} }
if (tech.isFreezeMobs) { if (tech.isFreezeMobs) {
const ICE_DRAIN = 0.0005 const ICE_DRAIN = 0.0002
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
if (((mob[i].distanceToPlayer() + mob[i].radius) < this.fieldDrawRadius) && !mob[i].shield && !mob[i].isShielded) { if (((mob[i].distanceToPlayer() + mob[i].radius) < this.fieldDrawRadius) && !mob[i].shield && !mob[i].isShielded) {
if (m.energy > ICE_DRAIN * 2) { if (m.energy > ICE_DRAIN * 2) {

View File

@@ -266,7 +266,7 @@ const powerUps = {
if (powerUps.research.count) { if (powerUps.research.count) {
text += `<div class="choose-grid-module" onclick="powerUps.research.use('field')"><div class="grid-title"> <span style="position:relative;">` text += `<div class="choose-grid-module" onclick="powerUps.research.use('field')"><div class="grid-title"> <span style="position:relative;">`
for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>` for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>`
text += `</span><span class='research-select'>research</span></div></div>` text += `</span>&nbsp; <span class='research-select'>research</span></div></div>`
} }
//(${powerUps.research.count}) //(${powerUps.research.count})
// text += `<div style = 'color:#fff'>${simulation.SVGrightMouse} activate the shield with the right mouse<br>fields shield you from damage <br>and let you pick up and throw blocks</div>` // text += `<div style = 'color:#fff'>${simulation.SVGrightMouse} activate the shield with the right mouse<br>fields shield you from damage <br>and let you pick up and throw blocks</div>`
@@ -373,8 +373,24 @@ const powerUps = {
if (powerUps.research.count) { if (powerUps.research.count) {
text += `<div class="choose-grid-module" onclick="powerUps.research.use('tech')"><div class="grid-title"> <span style="position:relative;">` text += `<div class="choose-grid-module" onclick="powerUps.research.use('tech')"><div class="grid-title"> <span style="position:relative;">`
for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>` for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px;opacity:0.8; border: 1px #fff solid;"></div>`
text += `</span><span class='research-select'>research</span></div></div>` text += `</span>&nbsp; <span class='research-select'>research</span></div></div>`
// text += `
// <div class="choose-grid-module" onclick="powerUps.research.use('tech')"><div class="grid-title">
// <span style="position:relative;">
// <div class="circle-grid research" style="position:absolute; top:0; left:5px;opacity:0.8; border: 1px #fff solid;"></div>
// <div class="circle-grid research" style="position:absolute; top:0; left:5px;opacity:0.8; border: 1px #fff solid;"></div>
// </span>
// &nbsp; <span class='research-select'>research</span></div></div>`
// text += `<div class="choose-grid-module" onclick="powerUps.choose('tech',${choose})"><div class="grid-title">
// <span style="position:relative;">
// <div class="circle-grid tech" style="position:absolute; top:0; left:0;opacity:0.8;"></div>
// <div class="circle-grid gun" style="position:absolute; top:0; left:10px; opacity:0.65;"></div>
// </span>
// &nbsp; &nbsp; &nbsp; &nbsp; ${tech.tech[choose].name} ${isCount}</div>${tech.tech[choose].description}</div></div>`
} }
document.getElementById("choose-grid").innerHTML = text document.getElementById("choose-grid").innerHTML = text
@@ -460,7 +476,7 @@ const powerUps = {
if (powerUps.research.count) { if (powerUps.research.count) {
text += `<div class="choose-grid-module" onclick="powerUps.research.use('gun')"><div class="grid-title"> <span style="position:relative;">` text += `<div class="choose-grid-module" onclick="powerUps.research.use('gun')"><div class="grid-title"> <span style="position:relative;">`
for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>` for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.3)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>`
text += `</span><span class='research-select'>research</span></div></div>` text += `</span>&nbsp; <span class='research-select'>research</span></div></div>`
} }
// console.log(powerUps.gun.choiceLog) // console.log(powerUps.gun.choiceLog)
// console.log(choice1, choice2, choice3) // console.log(choice1, choice2, choice3)

View File

@@ -678,7 +678,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb || tech.isIceField || tech.relayIce return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb || tech.isIceField || tech.relayIce || tech.blockingIce > 1
}, },
requires: "drones, spores, missiles, foam, wave beam, neutron bomb, ice IX", requires: "drones, spores, missiles, foam, wave beam, neutron bomb, ice IX",
effect() { effect() {
@@ -1690,7 +1690,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return tech.isStunField || tech.isPulseStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.relayIce || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage return tech.isStunField || tech.isPulseStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.relayIce || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage || tech.blockingIce > 1
}, },
requires: "a freezing or stunning effect", requires: "a freezing or stunning effect",
effect() { effect() {
@@ -1707,7 +1707,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce return tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1
}, },
requires: "a localized freeze effect", requires: "a localized freeze effect",
effect() { effect() {
@@ -2915,7 +2915,7 @@
isNonRefundable: true, isNonRefundable: true,
isBadRandomOption: true, isBadRandomOption: true,
allowed() { allowed() {
return powerUps.tech.choiceLog.length > 5 && !tech.isDeterminism return powerUps.tech.choiceLog.length > 10 && !tech.isDeterminism
}, },
requires: "rejected an option in the last tech selection", requires: "rejected an option in the last tech selection",
effect: () => { effect: () => {
@@ -4363,16 +4363,16 @@
//************************************************** tech //************************************************** tech
//************************************************** //**************************************************
{ {
name: "bremsstrahlung radiation", name: "bremsstrahlung",
description: "<strong>blocking</strong> with <strong>standing wave harmonics</strong><br> does <strong class='color-d'>damage</strong> to mobs", description: "<strong>blocking</strong> with <strong>standing wave harmonics</strong><br> does <strong class='color-d'>damage</strong> to mobs",
isFieldTech: true, isFieldTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
}, },
requires: "standing wave harmonics", requires: "standing wave harmonics, perfect diamagnetism",
effect() { effect() {
tech.blockDmg += 1.25 //if you change this value also update the for loop in the electricity graphics in m.pushMass tech.blockDmg += 1.25 //if you change this value also update the for loop in the electricity graphics in m.pushMass
}, },
@@ -4380,6 +4380,24 @@
tech.blockDmg = 0; tech.blockDmg = 0;
} }
}, },
{
name: "triple point",
description: "the pressure from <strong>blocking</strong> is used<br>to condense <strong class='color-s'>ice IX</strong> crystals",
isFieldTech: true,
maxCount: 9,
count: 0,
frequency: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
},
requires: "standing wave harmonics, perfect diamagnetism",
effect() {
tech.blockingIce++
},
remove() {
tech.blockingIce = 0;
}
},
{ {
name: "frequency resonance", name: "frequency resonance",
description: "<strong>standing wave harmonics</strong> shield is retuned<br>increase <strong>size</strong> and <strong>blocking</strong> efficiency by <strong>50%</strong>", description: "<strong>standing wave harmonics</strong> shield is retuned<br>increase <strong>size</strong> and <strong>blocking</strong> efficiency by <strong>50%</strong>",
@@ -4648,7 +4666,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return tech.isIceField || tech.relayIce return tech.isIceField || tech.relayIce || tech.blockingIce
}, },
requires: "ice IX", requires: "ice IX",
effect() { effect() {
@@ -6433,5 +6451,6 @@
isAlwaysFire: null, isAlwaysFire: null,
isDroneRespawn: null, isDroneRespawn: null,
deathSpawns: null, deathSpawns: null,
isMobBlockFling: null isMobBlockFling: null,
blockingIce: null
} }

View File

@@ -568,19 +568,19 @@ summary {
/* text-decoration: underline; */ /* text-decoration: underline; */
} }
.color-bot { /* .color-bot { */
/* background-color: #eee; */ /* background-color: #eee; */
/* color: #555; */ /* color: #555; */
/* letter-spacing: -1.5px; */ /* letter-spacing: -1.5px; */
/* text-transform: uppercase; */ /* text-transform: uppercase; */
/* font-variant: all-caps; */ /* font-variant: all-caps; */
/* text-decoration: underline solid; */ /* text-decoration: underline solid; */
/* border: 1px solid #000; */ /* border: 1px solid #000; */
/* padding: 10px; */ /* padding: 10px; */
/* border-radius: 10%; */ /* border-radius: 10%; */
/* font-family: Lucida Console, Courier, monospace; */ /* font-family: Lucida Console, Courier, monospace; */
/* color: #777; */ /* color: #777; */
} /* } */
.color-cloaked { .color-cloaked {
opacity: 0.25; opacity: 0.25;
@@ -679,7 +679,7 @@ summary {
} }
.junk { .junk {
background: hsl(254, 44%, 75%); background-color: hsl(254, 44%, 75%);
border-radius: 25%; border-radius: 25%;
/* animation: 3s linear infinite alternate pulse; */ /* animation: 3s linear infinite alternate pulse; */
} }
@@ -705,13 +705,13 @@ summary {
} */ } */
.field { .field {
background: #0cf; background-color: #0cf;
} }
.tech { .tech {
/* background: rgb(116, 102, 238); */ /* background: rgb(116, 102, 238); */
/* background: hsl(253, 57%, 52%); */ /* background: hsl(253, 57%, 52%); */
background: hsl(255, 100%, 71%); background-color: hsl(255, 100%, 71%);
/* background: hsl(282, 100%, 64%); */ /* background: hsl(282, 100%, 64%); */
} }
@@ -720,16 +720,16 @@ summary {
} */ } */
.gun { .gun {
background: rgb(0, 80, 218); background-color: rgb(0, 80, 218);
} }
.heal { .heal {
background: #0d9; background-color: #0d9;
} }
.research { .research {
/* #f84 #f99*/ /* #f84 #f99*/
background: #f7b; background-color: #f7b;
} }
.research-select { .research-select {

View File

@@ -1,12 +1,12 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
diffraction grating only gains 1 extra beam, but no longer gets a damage reduction perfect diamagnetism now has a 1/12 of a second cooldown after blocking (1/2 other fields)
also the beam split is wider than before perfect diamagnetism can get bremsstrahlung now
needle move twice as fast (was 50, now is 100) standing wave harmonic field blocks now block large mobs more reliably
and they are 50% longer and 25% thinner
damage was improved about 20% tech: triple point - blocking makes iceIX crystals
delay between each needle in a volley is slightly longer unlocked with: standing wave harmonic field or perfect diamagnetism
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
@@ -38,9 +38,7 @@ fix door.isOpen actually meaning isClosed?
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
make some bullets move super fast, but do collisions checks in .do() tech: pressing the gun switch keys instead cycles through bot upgrades, switching all of your bots accordingly
check for hitting mobs or map with fractional velocity
if velocity is above 40ish
import the procedural level generation from one of the older versions of the game as one single level import the procedural level generation from one of the older versions of the game as one single level