pressure vessel

default foam gun fires a stream
tech: pressure vessel - in addition to the stream, foam gun builds up charges.
  charges release after you stop firing
  capacitor tech doubles pressure vessel effect
tech: syntactic foam - foam does 41% more damage per second
  quantum foam removed

spore gun has 25% more ammo and fires 25% more often
spores and worms move 25% faster

nail gun has 5% more ammo
all versions of nail gun have a much higher fire rate

harpoon/grapple density reduced by 20%
  this also lowers damage about 10%
harpoon/grapple properly follow conservation of momentum
  (a small jerk when it retracts)

bug fixes
This commit is contained in:
landgreen
2022-05-05 06:20:15 -07:00
parent 936741a4e7
commit f412e029f5
7 changed files with 205 additions and 159 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -208,8 +208,10 @@ const b = {
} }
if (b.inventory.length > 0) { if (b.inventory.length > 0) {
b.activeGun = b.inventory[0]; b.activeGun = b.inventory[0];
b.inventoryGun = 0;
} else { } else {
b.activeGun = null; b.activeGun = null;
b.inventoryGun = 0;
} }
simulation.makeGunHUD(); simulation.makeGunHUD();
break break
@@ -974,7 +976,7 @@ const b = {
bullet[me] = Bodies.polygon(where.x, where.y, 10, 4, b.fireAttributes(angle, false)); bullet[me] = Bodies.polygon(where.x, where.y, 10, 4, b.fireAttributes(angle, false));
b.fireProps((input.down ? 45 : 25) / Math.pow(0.92, tech.missileCount), input.down ? 35 : 20, angle, me); //cd , speed b.fireProps((input.down ? 45 : 25) / Math.pow(0.92, tech.missileCount), input.down ? 35 : 20, angle, me); //cd , speed
Matter.Body.setDensity(bullet[me], 0.000001); Matter.Body.setDensity(bullet[me], 0.000001);
bullet[me].endCycle = Infinity; bullet[me].endCycle = 500 + simulation.cycle;
bullet[me].frictionAir = 0; bullet[me].frictionAir = 0;
bullet[me].friction = 1; bullet[me].friction = 1;
bullet[me].frictionStatic = 1; bullet[me].frictionStatic = 1;
@@ -1132,6 +1134,8 @@ const b = {
} }
} }
} }
let gunIndex = null let gunIndex = null
for (let i = 0, len = b.guns.length; i < len; i++) { for (let i = 0, len = b.guns.length; i < len; i++) {
if (b.guns[i].name === "grenades") { if (b.guns[i].name === "grenades") {
@@ -1364,7 +1368,7 @@ const b = {
}, },
minDmgSpeed: 4, minDmgSpeed: 4,
lookFrequency: Math.floor(7 + Math.random() * 3), lookFrequency: Math.floor(7 + Math.random() * 3),
density: tech.harpoonDensity, //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed density: tech.harpoonDensity, //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
drain: 0.004, drain: 0.004,
beforeDmg(who) { beforeDmg(who) {
if (tech.isShieldPierce && who.isShielded) { //disable shields if (tech.isShieldPierce && who.isShielded) { //disable shields
@@ -1397,7 +1401,7 @@ const b = {
this.caughtPowerUp.effect(); this.caughtPowerUp.effect();
Matter.Composite.remove(engine.world, this.caughtPowerUp); Matter.Composite.remove(engine.world, this.caughtPowerUp);
powerUp.splice(index, 1); powerUp.splice(index, 1);
if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.005 * 6 //0.005 is normal if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.004 * 6 //0.005 is normal
} else { } else {
this.dropCaughtPowerUp() this.dropCaughtPowerUp()
} }
@@ -1446,7 +1450,7 @@ const b = {
if (m.energy < 0.05) this.dropCaughtPowerUp() if (m.energy < 0.05) this.dropCaughtPowerUp()
//recoil on catching //recoil on catching
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.00015 : 0.0003)) const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
player.force.x += momentum.x player.force.x += momentum.x
player.force.y += momentum.y player.force.y += momentum.y
// refund ammo // refund ammo
@@ -1519,6 +1523,10 @@ const b = {
Matter.Body.setDensity(this, 0.0005); //reduce density on return Matter.Body.setDensity(this, 0.0005); //reduce density on return
if (this.angularSpeed < 0.5) this.torque += this.inertia * 0.001 * (Math.random() - 0.5) //(Math.round(Math.random()) ? 1 : -1) if (this.angularSpeed < 0.5) this.torque += this.inertia * 0.001 * (Math.random() - 0.5) //(Math.round(Math.random()) ? 1 : -1)
this.collisionFilter.mask = cat.map | cat.mob | cat.mobBullet | cat.mobShield // | cat.body this.collisionFilter.mask = cat.map | cat.mob | cat.mobBullet | cat.mobShield // | cat.body
//recoil on catching
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
player.force.x += momentum.x
player.force.y += momentum.y
// } // }
} }
//grappling hook //grappling hook
@@ -1576,6 +1584,10 @@ const b = {
this.do = this.returnToPlayer this.do = this.returnToPlayer
this.endCycle = simulation.cycle + 60 this.endCycle = simulation.cycle + 60
m.fireCDcycle = m.cycle + 120; //fire cooldown m.fireCDcycle = m.cycle + 120; //fire cooldown
//recoil on catching
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
player.force.x += momentum.x
player.force.y += momentum.y
} }
} }
} else { } else {
@@ -1584,6 +1596,10 @@ const b = {
this.collisionFilter.mask = 0 this.collisionFilter.mask = 0
this.do = this.returnToPlayer this.do = this.returnToPlayer
this.endCycle = simulation.cycle + 60 this.endCycle = simulation.cycle + 60
//recoil on catching
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
player.force.x += momentum.x
player.force.y += momentum.y
} }
this.draw(); this.draw();
} }
@@ -1617,7 +1633,7 @@ const b = {
}, },
minDmgSpeed: 4, minDmgSpeed: 4,
lookFrequency: Math.floor(7 + Math.random() * 3), lookFrequency: Math.floor(7 + Math.random() * 3),
density: tech.harpoonDensity, //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed density: tech.harpoonDensity, //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
beforeDmg(who) { beforeDmg(who) {
if (tech.isShieldPierce && who.isShielded) { //disable shields if (tech.isShieldPierce && who.isShielded) { //disable shields
who.isShielded = false who.isShielded = false
@@ -1659,7 +1675,7 @@ const b = {
this.caughtPowerUp.effect(); this.caughtPowerUp.effect();
Matter.Composite.remove(engine.world, this.caughtPowerUp); Matter.Composite.remove(engine.world, this.caughtPowerUp);
powerUp.splice(index, 1); powerUp.splice(index, 1);
if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.005 * 6 //0.006 is normal if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.004 * 6 //0.006 is normal
} else { } else {
this.dropCaughtPowerUp() this.dropCaughtPowerUp()
} }
@@ -1712,7 +1728,7 @@ const b = {
m.fireCDcycle = m.cycle + 35 * b.fireCDscale //lower cd to 25 if it is above 25 m.fireCDcycle = m.cycle + 35 * b.fireCDscale //lower cd to 25 if it is above 25
} }
//recoil on catching //recoil on catching
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.00015 : 0.0003)) const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
player.force.x += momentum.x player.force.x += momentum.x
player.force.y += momentum.y player.force.y += momentum.y
// refund ammo // refund ammo
@@ -1769,6 +1785,10 @@ const b = {
this.collisionFilter.category = 0 this.collisionFilter.category = 0
this.collisionFilter.mask = 0 this.collisionFilter.mask = 0
this.endCycle = simulation.cycle + 60 this.endCycle = simulation.cycle + 60
//recoil on jerking line
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.00015 : 0.0003))
player.force.x += momentum.x
player.force.y += momentum.y
} else { } else {
this.grabPowerUp() this.grabPowerUp()
} }
@@ -2605,7 +2625,7 @@ const b = {
// angle: Math.random() * 2 * Math.PI, // angle: Math.random() * 2 * Math.PI,
friction: 0, friction: 0,
frictionAir: 0.025, frictionAir: 0.025,
thrust: (tech.isFastSpores ? 0.001 : 0.0005) * (1 + 0.5 * (Math.random() - 0.5)), thrust: (tech.isFastSpores ? 0.0012 : 0.00055) * (1 + 0.5 * (Math.random() - 0.5)),
wormSize: wormSize, wormSize: wormSize,
wormTail: 1 + Math.max(4, Math.min(wormSize - 2 * tech.wormSize, 30)), wormTail: 1 + Math.max(4, Math.min(wormSize - 2 * tech.wormSize, 30)),
dmg: (tech.isMutualism ? 7 : 2.9) * wormSize, //bonus damage from tech.isMutualism //2.5 is extra damage as worm dmg: (tech.isMutualism ? 7 : 2.9) * wormSize, //bonus damage from tech.isMutualism //2.5 is extra damage as worm
@@ -2723,7 +2743,7 @@ const b = {
angle: Math.random() * 2 * Math.PI, angle: Math.random() * 2 * Math.PI,
friction: 0, friction: 0,
frictionAir: 0.025, frictionAir: 0.025,
thrust: (tech.isFastSpores ? 0.0009 : 0.00045) * (1 + 0.3 * (Math.random() - 0.5)), thrust: (tech.isFastSpores ? 0.0011 : 0.0005) * (1 + 0.3 * (Math.random() - 0.5)),
dmg: tech.isMutualism ? 16.8 : 7, //bonus damage from tech.isMutualism dmg: tech.isMutualism ? 16.8 : 7, //bonus damage from tech.isMutualism
lookFrequency: 100 + Math.floor(117 * Math.random()), lookFrequency: 100 + Math.floor(117 * Math.random()),
classType: "bullet", classType: "bullet",
@@ -3496,7 +3516,7 @@ const b = {
inertia: Infinity, inertia: Infinity,
frictionAir: 0.003, frictionAir: 0.003,
dmg: 0, //damage on impact dmg: 0, //damage on impact
damage: (tech.isFastFoam ? 0.0275 : 0.011) * (tech.isBulletTeleport ? 1.43 : 1), //damage done over time damage: tech.foamDamage * (tech.isFastFoam ? 2.5 : 1) * (tech.isBulletTeleport ? 1.43 : 1), //damage done over time
scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1), scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1),
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
@@ -3575,6 +3595,35 @@ const b = {
const SCALE = 1 - 0.004 / tech.isBulletsLastLonger //shrink if mob is shielded const SCALE = 1 - 0.004 / tech.isBulletsLastLonger //shrink if mob is shielded
Matter.Body.scale(this, SCALE, SCALE); Matter.Body.scale(this, SCALE, SCALE);
this.radius *= SCALE; this.radius *= SCALE;
// if (true && !(simulation.cycle % 20)) {
// let electricity = (who) => {
// who.damage(2 * m.dmgScale, true)
// const unit = Vector.normalise(Vector.sub(this.position, who.position))
// //draw electricity
// const step = 80
// ctx.beginPath();
// let x = this.position.x - 20 * unit.x;
// let y = this.position.y - 20 * unit.y;
// ctx.moveTo(x, y);
// for (let i = 0; i < 3; i++) {
// x += step * (-unit.x + 1.5 * (Math.random() - 0.5))
// y += step * (-unit.y + 1.5 * (Math.random() - 0.5))
// ctx.lineTo(x, y);
// }
// ctx.lineWidth = 3;
// ctx.strokeStyle = "#f0f";
// ctx.stroke();
// }
// //find mobs that are close
// for (let i = 0, len = mob.length; i < len; ++i) {
// if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) - mob[i].radius < 5000 && !mob[i].isBadTarget) {
// electricity(mob[0])
// }
// }
// }
} else { } else {
this.target.damage(m.dmgScale * this.damage); this.target.damage(m.dmgScale * this.damage);
} }
@@ -3650,7 +3699,7 @@ const b = {
Composite.add(engine.world, bullet[me]); //add bullet to world Composite.add(engine.world, bullet[me]); //add bullet to world
Matter.Body.setVelocity(bullet[me], velocity); Matter.Body.setVelocity(bullet[me], velocity);
}, },
targetedBlock(who, isSpin = false, speed = 50 - Math.min(20, who.mass * 2), range = 1600) { targetedBlock(who, speed = 50 - Math.min(20, who.mass * 2), range = 1600) {
let closestMob, dist let closestMob, dist
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
if (who !== mob[i]) { if (who !== mob[i]) {
@@ -4809,8 +4858,8 @@ const b = {
name: "nail gun", name: "nail gun",
description: "use compressed air to fire a stream of <strong>nails</strong><br><strong><em>delay</em></strong> after firing <strong>decreases</strong> as you shoot", description: "use compressed air to fire a stream of <strong>nails</strong><br><strong><em>delay</em></strong> after firing <strong>decreases</strong> as you shoot",
ammo: 0, ammo: 0,
ammoPack: 45, ammoPack: 50,
defaultAmmoPack: 45, defaultAmmoPack: 50,
recordedAmmo: 0, recordedAmmo: 0,
have: false, have: false,
nextFireCycle: 0, //use to remember how longs its been since last fire, used to reset count nextFireCycle: 0, //use to remember how longs its been since last fire, used to reset count
@@ -4824,8 +4873,6 @@ const b = {
} }
} else if (tech.isRivets) { } else if (tech.isRivets) {
this.fire = this.fireRivets this.fire = this.fireRivets
} else if (tech.isDarts) {
this.fire = this.fireDarts
} else if (tech.isNeedles) { } else if (tech.isNeedles) {
this.fire = this.fireNeedles this.fire = this.fireNeedles
} else if (tech.nailInstantFireRate) { } else if (tech.nailInstantFireRate) {
@@ -4838,29 +4885,13 @@ const b = {
}, },
do() {}, do() {},
fire() {}, fire() {},
// for (let i = 0; i < 5; i++) {
// b.dart(where, m.angle + 0.1 * i)
// b.dart(where, m.angle - 0.1 * i)
// }
fireDarts() {
const where = {
x: m.pos.x + 30 * Math.cos(m.angle),
y: m.pos.y + 30 * Math.sin(m.angle)
}
m.fireCDcycle = m.cycle + 10 * b.fireCDscale; // cool down
b.dart(where, m.angle) //+ 0.6 * (Math.random() - 0.5)
// const spread = 0.5
// b.dart(where, m.angle + spread)
// b.dart(where, m.angle)
// b.dart(where, m.angle - spread)
},
fireRecoilNails() { fireRecoilNails() {
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
const CD = Math.max(11 - 0.08 * (m.cycle - this.startingHoldCycle), 1) //CD scales with cycles fire is held down const CD = Math.max(11 - 0.06 * (m.cycle - this.startingHoldCycle), 0.99) //CD scales with cycles fire is held down
this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
this.baseFire(m.angle + (Math.random() - 0.5) * (input.down ? 0.1 : 0.13) / CD, 45 + 6 * Math.random()) this.baseFire(m.angle + (Math.random() - 0.5) * (input.down ? 0.04 : 0.13) / CD, 45 + 6 * Math.random())
//very complex recoil system //very complex recoil system
if (m.onGround) { if (m.onGround) {
if (input.down) { if (input.down) {
@@ -4887,28 +4918,28 @@ const b = {
}, },
fireNormal() { fireNormal() {
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
const CD = Math.max(11 - 0.06 * (m.cycle - this.startingHoldCycle), 2) //CD scales with cycles fire is held down const CD = Math.max(11 - 0.06 * (m.cycle - this.startingHoldCycle), 1) //CD scales with cycles fire is held down
this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (input.down ? 1.35 : 3.2) / CD) this.baseFire(m.angle + (Math.random() - 0.5) * (input.down ? 0.05 : 0.3) / CD)
}, },
fireNeedles() { fireNeedles() {
if (input.down) { if (input.down) {
m.fireCDcycle = m.cycle + 38 * b.fireCDscale; // cool down m.fireCDcycle = m.cycle + 30 * b.fireCDscale; // cool down
b.needle() b.needle()
function cycle() { function cycle() {
if (simulation.paused || m.isBodiesAsleep) { requestAnimationFrame(cycle) } else { if (simulation.paused || m.isBodiesAsleep) { requestAnimationFrame(cycle) } else {
count++ count++
if (count % 2) b.needle() if (count % 2) b.needle()
if (count < 5 && m.alive) requestAnimationFrame(cycle); if (count < 7 && m.alive) requestAnimationFrame(cycle);
} }
} }
let count = -1 let count = -1
requestAnimationFrame(cycle); requestAnimationFrame(cycle);
} else { } else {
m.fireCDcycle = m.cycle + 28 * b.fireCDscale; // cool down m.fireCDcycle = m.cycle + 22 * b.fireCDscale; // cool down
b.needle() b.needle()
function cycle() { function cycle() {
@@ -4923,15 +4954,14 @@ const b = {
} }
}, },
fireRivets() { fireRivets() {
m.fireCDcycle = m.cycle + Math.floor((input.down ? 25 : 17) * b.fireCDscale); // cool down m.fireCDcycle = m.cycle + Math.floor((input.down ? 22 : 14) * b.fireCDscale); // cool down
const me = bullet.length; const me = bullet.length;
const size = tech.bulletSize * 8 const size = tech.bulletSize * 8
bullet[me] = Bodies.rectangle(m.pos.x + 35 * Math.cos(m.angle), m.pos.y + 35 * Math.sin(m.angle), 5 * size, size, b.fireAttributes(m.angle)); bullet[me] = Bodies.rectangle(m.pos.x + 35 * Math.cos(m.angle), m.pos.y + 35 * Math.sin(m.angle), 5 * size, size, b.fireAttributes(m.angle));
bullet[me].dmg = tech.isNailRadiation ? 0 : 2.75 bullet[me].dmg = tech.isNailRadiation ? 0 : 2.75
Matter.Body.setDensity(bullet[me], 0.002); Matter.Body.setDensity(bullet[me], 0.002);
Composite.add(engine.world, bullet[me]); //add bullet to world Composite.add(engine.world, bullet[me]); //add bullet to world
const SPEED = input.down ? 55 : 44 const SPEED = input.down ? 60 : 44
Matter.Body.setVelocity(bullet[me], { Matter.Body.setVelocity(bullet[me], {
x: SPEED * Math.cos(m.angle), x: SPEED * Math.cos(m.angle),
y: SPEED * Math.sin(m.angle) y: SPEED * Math.sin(m.angle)
@@ -4993,7 +5023,7 @@ const b = {
fireRecoilRivets() { fireRecoilRivets() {
// m.fireCDcycle = m.cycle + Math.floor((input.down ? 25 : 17) * b.fireCDscale); // cool down // m.fireCDcycle = m.cycle + Math.floor((input.down ? 25 : 17) * b.fireCDscale); // cool down
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
const CD = Math.max(25 - 0.14 * (m.cycle - this.startingHoldCycle), 6) //CD scales with cycles fire is held down const CD = Math.max(25 - 0.14 * (m.cycle - this.startingHoldCycle), 5) //CD scales with cycles fire is held down
this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
@@ -5003,7 +5033,7 @@ const b = {
bullet[me].dmg = tech.isNailRadiation ? 0 : 2.75 bullet[me].dmg = tech.isNailRadiation ? 0 : 2.75
Matter.Body.setDensity(bullet[me], 0.002); Matter.Body.setDensity(bullet[me], 0.002);
Composite.add(engine.world, bullet[me]); //add bullet to world Composite.add(engine.world, bullet[me]); //add bullet to world
const SPEED = input.down ? 60 : 50 const SPEED = input.down ? 62 : 52
Matter.Body.setVelocity(bullet[me], { Matter.Body.setVelocity(bullet[me], {
x: SPEED * Math.cos(m.angle), x: SPEED * Math.cos(m.angle),
y: SPEED * Math.sin(m.angle) y: SPEED * Math.sin(m.angle)
@@ -5071,8 +5101,8 @@ const b = {
} }
}, },
fireInstantFireRate() { fireInstantFireRate() {
m.fireCDcycle = m.cycle + Math.floor(2 * b.fireCDscale); // cool down m.fireCDcycle = m.cycle + Math.floor(1 * b.fireCDscale); // cool down
this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (input.down ? 1.35 : 3.2) / 2) this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (input.down ? 1.15 : 2) / 2)
}, },
baseFire(angle, speed = 30 + 6 * Math.random()) { baseFire(angle, speed = 30 + 6 * Math.random()) {
b.nail({ b.nail({
@@ -5102,8 +5132,8 @@ const b = {
name: "shotgun", name: "shotgun",
description: "fire a wide <strong>burst</strong> of short range <strong> bullets</strong>", description: "fire a wide <strong>burst</strong> of short range <strong> bullets</strong>",
ammo: 0, ammo: 0,
ammoPack: 3.8, ammoPack: 3.5,
defaultAmmoPack: 3.8, defaultAmmoPack: 3.5,
have: false, have: false,
do() {}, do() {},
fire() { fire() {
@@ -5910,14 +5940,14 @@ const b = {
name: "spores", name: "spores",
description: "fire a <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> that discharges <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> seek out nearby mobs", description: "fire a <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> that discharges <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> seek out nearby mobs",
ammo: 0, ammo: 0,
ammoPack: 2.3, ammoPack: 2.6,
have: false, have: false,
do() {}, do() {},
fire() { fire() {
const me = bullet.length; const me = bullet.length;
const dir = m.angle; const dir = m.angle;
bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 20, 4.5, b.fireAttributes(dir, false)); bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 20, 4.5, b.fireAttributes(dir, false));
b.fireProps(input.down ? 45 : 25, input.down ? 30 : 16, dir, me); //cd , speed b.fireProps(input.down ? 40 : 20, input.down ? 30 : 16, dir, me); //cd , speed
Matter.Body.setDensity(bullet[me], 0.000001); Matter.Body.setDensity(bullet[me], 0.000001);
bullet[me].endCycle = simulation.cycle + 480 + Math.max(0, 120 - 2 * bullet.length); bullet[me].endCycle = simulation.cycle + 480 + Math.max(0, 120 - 2 * bullet.length);
bullet[me].frictionAir = 0; bullet[me].frictionAir = 0;
@@ -6074,19 +6104,19 @@ const b = {
charge: 0, charge: 0,
isDischarge: false, isDischarge: false,
chooseFireMethod() { chooseFireMethod() {
if (tech.isCapacitor) { if (tech.isFoamPressure) {
this.do = this.doCharges
this.fire = this.fireCharges
} else {
this.do = this.doStream this.do = this.doStream
this.fire = this.fireStream this.fire = this.fireStream
} else {
this.do = this.doCharges // () => {}
this.fire = this.fireCharges
} }
}, },
doStream() {}, doStream() {},
fireStream() { fireStream() {
const spread = (input.down ? 0.04 : 0.3) * (Math.random() - 0.5) const spread = (input.down ? 0.04 : 0.3) * (Math.random() - 0.5)
const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12 const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12
const SPEED = Math.max(2, 14 - radius * 0.25) const SPEED = (input.down ? 1.2 : 1) * Math.max(2, 14 - radius * 0.25)
const dir = m.angle + 0.15 * (Math.random() - 0.5) const dir = m.angle + 0.15 * (Math.random() - 0.5)
const velocity = { const velocity = {
x: SPEED * Math.cos(dir), x: SPEED * Math.cos(dir),
@@ -6096,23 +6126,7 @@ const b = {
x: m.pos.x + 30 * Math.cos(m.angle), x: m.pos.x + 30 * Math.cos(m.angle),
y: m.pos.y + 30 * Math.sin(m.angle) y: m.pos.y + 30 * Math.sin(m.angle)
} }
if (tech.foamFutureFire) { b.foam(position, Vector.rotate(velocity, spread), radius)
simulation.drawList.push({ //add dmg to draw queue
x: position.x,
y: position.y,
radius: 5,
color: "rgba(0,50,50,0.3)",
time: 15 * tech.foamFutureFire
});
setTimeout(() => {
if (!simulation.paused) {
b.foam(position, Vector.rotate(velocity, spread), radius)
bullet[bullet.length - 1].damage *= (1 + 0.7 * tech.foamFutureFire)
}
}, 210 * tech.foamFutureFire);
} else {
b.foam(position, Vector.rotate(velocity, spread), radius)
}
m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale); m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale);
}, },
doCharges() { doCharges() {
@@ -6120,16 +6134,16 @@ const b = {
//draw charge level //draw charge level
ctx.fillStyle = "rgba(0,50,50,0.3)"; ctx.fillStyle = "rgba(0,50,50,0.3)";
ctx.beginPath(); ctx.beginPath();
const radius = 10 * Math.sqrt(this.charge) const radius = 5 * Math.sqrt(this.charge)
const mag = 11 + radius const mag = 11 + radius
ctx.arc(m.pos.x + mag * Math.cos(m.angle), m.pos.y + mag * Math.sin(m.angle), radius, 0, 2 * Math.PI); ctx.arc(m.pos.x + mag * Math.cos(m.angle), m.pos.y + mag * Math.sin(m.angle), radius, 0, 2 * Math.PI);
ctx.fill(); ctx.fill();
if (this.isDischarge) { if (this.isDischarge && m.cycle % 2) {
this.charge-- this.charge--
const spread = (input.down ? 0.04 : 0.5) * (Math.random() - 0.5) const spread = (input.down ? 0.04 : 0.5) * (Math.random() - 0.5)
const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12 const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12
const SPEED = 18 - radius * 0.4; const SPEED = (input.down ? 1.2 : 1) * 10 - radius * 0.4 + Math.min(5, Math.sqrt(this.charge));
const dir = m.angle + 0.15 * (Math.random() - 0.5) const dir = m.angle + 0.15 * (Math.random() - 0.5)
const velocity = { const velocity = {
x: SPEED * Math.cos(dir), x: SPEED * Math.cos(dir),
@@ -6139,25 +6153,8 @@ const b = {
x: m.pos.x + 30 * Math.cos(m.angle), x: m.pos.x + 30 * Math.cos(m.angle),
y: m.pos.y + 30 * Math.sin(m.angle) y: m.pos.y + 30 * Math.sin(m.angle)
} }
if (tech.foamFutureFire) { b.foam(position, Vector.rotate(velocity, spread), radius)
simulation.drawList.push({ //add dmg to draw queue m.fireCDcycle = m.cycle + 2; //disable firing and adding more charge until empty
x: position.x,
y: position.y,
radius: 5,
color: "rgba(0,50,50,0.3)",
time: 15 * tech.foamFutureFire
});
setTimeout(() => {
if (!simulation.paused) {
b.foam(position, Vector.rotate(velocity, spread), radius)
// (tech.isFastFoam ? 0.044 : 0.011) * (tech.isBulletTeleport ? 1.60 : 1)
bullet[bullet.length - 1].damage *= (1 + 0.7 * tech.foamFutureFire)
}
}, 250 * tech.foamFutureFire);
} else {
b.foam(position, Vector.rotate(velocity, spread), radius)
}
m.fireCDcycle = m.cycle + 1; //disable firing and adding more charge
} else if (!input.fire) { } else if (!input.fire) {
this.isDischarge = true; this.isDischarge = true;
} }
@@ -6169,14 +6166,37 @@ const b = {
} }
}, },
fireCharges() { fireCharges() {
const capacity = 20 const spread = (input.down ? 0.04 : 0.3) * (Math.random() - 0.5)
if (tech.isCapacitor && this.charge === 0 && b.guns[b.activeGun].ammo > capacity) { const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12
this.charge = capacity const SPEED = (input.down ? 1.2 : 1) * Math.max(2, 14 - radius * 0.25)
b.guns[b.activeGun].ammo -= capacity const dir = m.angle + 0.15 * (Math.random() - 0.5)
simulation.updateGunHUD(); const velocity = {
x: SPEED * Math.cos(dir),
y: SPEED * Math.sin(dir)
} }
this.charge++ const position = {
m.fireCDcycle = m.cycle + Math.floor(1 + 0.3 * this.charge); x: m.pos.x + 30 * Math.cos(m.angle),
y: m.pos.y + 30 * Math.sin(m.angle)
}
// if (tech.foamFutureFire) {
// simulation.drawList.push({ //add dmg to draw queue
// x: position.x,
// y: position.y,
// radius: 5,
// color: "rgba(0,50,50,0.3)",
// time: 15 * tech.foamFutureFire
// });
// setTimeout(() => {
// if (!simulation.paused) {
// b.foam(position, Vector.rotate(velocity, spread), radius)
// bullet[bullet.length - 1].damage *= (1 + 0.7 * tech.foamFutureFire)
// }
// }, 210 * tech.foamFutureFire);
// } else {
// }
b.foam(position, Vector.rotate(velocity, spread), radius)
m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale);
this.charge += 1 + tech.isCapacitor
}, },
fire() {}, fire() {},
do() {}, do() {},
@@ -6215,7 +6235,7 @@ const b = {
} }
//fire //fire
if ((!input.fire && this.charge > 0.6)) { if ((!input.fire && this.charge > 0.6)) {
tech.harpoonDensity = 0.008 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed tech.harpoonDensity = 0.0065 //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
const where = { const where = {
x: m.pos.x + 30 * Math.cos(m.angle), x: m.pos.x + 30 * Math.cos(m.angle),
y: m.pos.y + 30 * Math.sin(m.angle) y: m.pos.y + 30 * Math.sin(m.angle)
@@ -6270,7 +6290,7 @@ const b = {
const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.03 : 0.06) const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.03 : 0.06)
player.force.x -= recoil.x player.force.x -= recoil.x
player.force.y -= recoil.y player.force.y -= recoil.y
tech.harpoonDensity = 0.008 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed tech.harpoonDensity = 0.0065 //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
const harpoonSize = tech.isLargeHarpoon ? 1 + 0.1 * Math.sqrt(this.ammo) : 1 const harpoonSize = tech.isLargeHarpoon ? 1 + 0.1 * Math.sqrt(this.ammo) : 1
if (tech.extraHarpoons) { if (tech.extraHarpoons) {
@@ -6475,7 +6495,7 @@ const b = {
const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.015 : 0.035) const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.015 : 0.035)
player.force.x -= recoil.x player.force.x -= recoil.x
player.force.y -= recoil.y player.force.y -= recoil.y
tech.harpoonDensity = 0.005 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed tech.harpoonDensity = 0.004 //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
}, },
// railGun2() { // railGun2() {
// const where = { // const where = {

View File

@@ -17,13 +17,13 @@ const level = {
if (level.levelsCleared === 0) { //this code only runs on the first level if (level.levelsCleared === 0) { //this code only runs on the first level
// simulation.isHorizontalFlipped = true // simulation.isHorizontalFlipped = true
// m.setField("time dilation") // m.setField("time dilation")
// b.giveGuns("matter wave") // b.giveGuns("foam")
// tech.giveTech("phonon") // tech.giveTech("rocket-propelled grenade")
// tech.giveTech("eternalism") // tech.giveTech("needle gun")
// tech.giveTech("isotropic radiator") // tech.giveTech("rivet gun")
// tech.giveTech("polyurethane balls") // tech.giveTech("capacitor bank")
// tech.giveTech("grappling hook") // tech.giveTech("rotary cannon")
// tech.giveTech("paradigm shift") // tech.giveTech("pneumatic actuator")
// for (let i = 0; i < 1; i++) powerUps.directSpawn(450, -50, "tech"); // for (let i = 0; i < 1; i++) powerUps.directSpawn(450, -50, "tech");
// for (let i = 0; i < 15; i++) tech.giveTech() // for (let i = 0; i < 15; i++) tech.giveTech()
// for (let i = 10; i < tech.tech.length; i++) { tech.tech[i].isBanished = true } // for (let i = 10; i < tech.tech.length; i++) { tech.tech[i].isBanished = true }
@@ -2642,11 +2642,11 @@ const level = {
spawn.mapRect(4850, -275, 50, 175); spawn.mapRect(4850, -275, 50, 175);
//??? //???
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
m.addHealth(Infinity) m.addHealth(Infinity)
// spawn.starter(1900, -500, 200) //big boy // spawn.starter(1900, -500, 200) //big boy
// for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500) for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500)
// spawn.slashBoss(1900, -500) // spawn.slashBoss(1900, -500)
// spawn.launcherBoss(3200, -500) // spawn.launcherBoss(3200, -500)
// spawn.laserTargetingBoss(1700, -500) // spawn.laserTargetingBoss(1700, -500)
@@ -2672,7 +2672,7 @@ const level = {
// spawn.shieldingBoss(1700, -500) // spawn.shieldingBoss(1700, -500)
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40); // for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
for (let i = 0; i < 4; i++) spawn.starter(1900, -500) // for (let i = 0; i < 4; i++) spawn.starter(1900, -500)
// spawn.pulsar(1900, -500) // spawn.pulsar(1900, -500)
// spawn.shield(mob[mob.length - 1], 1900, -500, 1); // spawn.shield(mob[mob.length - 1], 1900, -500, 1);
// mob[mob.length - 1].isShielded = true // mob[mob.length - 1].isShielded = true

View File

@@ -1365,7 +1365,7 @@ const mobs = {
mob.splice(i, 1); mob.splice(i, 1);
if (tech.isMobBlockFling) { if (tech.isMobBlockFling) {
const who = body[body.length - 1] const who = body[body.length - 1]
b.targetedBlock(who, true) b.targetedBlock(who)
Matter.Body.setAngularVelocity(who, (0.5 + 0.2 * Math.random()) * (Math.random() < 0.5 ? -1 : 1)); Matter.Body.setAngularVelocity(who, (0.5 + 0.2 * Math.random()) * (Math.random() < 0.5 ? -1 : 1));
} }
} else { } else {

View File

@@ -3218,10 +3218,10 @@ const m = {
{ {
name: "wormhole", name: "wormhole",
//<strong class='color-worm'>wormholes</strong> attract <strong class='color-block'>blocks</strong> and power ups<br> //<strong class='color-worm'>wormholes</strong> attract <strong class='color-block'>blocks</strong> and power ups<br>
description: "use <strong class='color-f'>energy</strong> to <strong>tunnel</strong> through a <strong class='color-worm'>wormhole</strong><br><strong>5%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second", //<br>bullets may also traverse <strong class='color-worm'>wormholes</strong> description: "use <strong class='color-f'>energy</strong> to <strong>tunnel</strong> through a <strong class='color-worm'>wormhole</strong><br><strong>4%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second", //<br>bullets may also traverse <strong class='color-worm'>wormholes</strong>
drain: 0, drain: 0,
effect: function() { effect: function() {
m.duplicateChance = 0.05 m.duplicateChance = 0.04
m.fieldRange = 0 m.fieldRange = 0
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance

View File

@@ -5078,7 +5078,7 @@ const tech = {
{ {
name: "tinsellated flagella", name: "tinsellated flagella",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Zoospore#Flagella_types' class="link">tinsellated flagella</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Zoospore#Flagella_types' class="link">tinsellated flagella</a>`,
description: "<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> release <strong>2</strong> more <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> accelerate <strong>40% faster</strong>", description: "<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> release <strong>2</strong> more <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> accelerate <strong>50% faster</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5481,9 +5481,9 @@ const tech = {
isBot: true, isBot: true,
isBotTech: true, isBotTech: true,
isNonRefundable: true, isNonRefundable: true,
requires: "at least 3 guns, foam gun, NOT EXPERIMENT MODE, bot upgrades, fractionation, quantum foam, capacitor", requires: "at least 2 guns, foam gun, NOT EXPERIMENT MODE, bot upgrades, fractionation, pressure vessel",
allowed() { allowed() {
return b.inventory.length > 2 && tech.haveGunCheck("foam", false) && !b.hasBotUpgrade() && !tech.isAmmoFoamSize && !tech.foamFutureFire && !tech.isCapacitor return b.inventory.length > 1 && tech.haveGunCheck("foam", false) && !b.hasBotUpgrade() && !tech.isAmmoFoamSize && !tech.isFoamPressure
}, },
effect() { effect() {
tech.giveTech("foam-bot upgrade") tech.giveTech("foam-bot upgrade")
@@ -5532,7 +5532,7 @@ const tech = {
allowed() { allowed() {
return (!tech.isFoamAttract && (tech.haveGunCheck("foam") || tech.foamBotCount > 1 || tech.isFoamShot || tech.isFoamBall)) || (tech.haveGunCheck("matter wave") && !tech.isLongitudinal) return (!tech.isFoamAttract && (tech.haveGunCheck("foam") || tech.foamBotCount > 1 || tech.isFoamShot || tech.isFoamBall)) || (tech.haveGunCheck("matter wave") && !tech.isLongitudinal)
}, },
requires: "foam, not electrostatic induction, matter wave, not phonon", requires: "foam, matter wave, not electrostatic induction, not phonon",
effect() { effect() {
tech.isBulletTeleport = true tech.isBulletTeleport = true
}, },
@@ -5581,22 +5581,22 @@ const tech = {
} }
}, },
{ {
name: "quantum foam", name: "surface tension",
description: "<strong>foam</strong> gun fires <strong>0.25</strong> seconds into the <strong>future</strong><br>increase <strong>foam</strong> gun <strong class='color-d'>damage</strong> by <strong>66%</strong>", description: "<strong>foam</strong> bubbles have improved adhesion which<br>does <strong>41%</strong> more <strong class='color-d'>damage</strong> per second",
isGunTech: true, isGunTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("foam") return tech.haveGunCheck("foam") || tech.foamBotCount > 1 || tech.isFoamShot || tech.isFoamBall
}, },
requires: "foam", requires: "foam",
effect() { effect() {
tech.foamFutureFire++ tech.foamDamage += 0.011 * 0.41
}, },
remove() { remove() {
tech.foamFutureFire = 0; tech.foamDamage = 0.011;
} }
}, },
{ {
@@ -5618,6 +5618,37 @@ const tech = {
tech.isAmmoFoamSize = false; tech.isAmmoFoamSize = false;
} }
}, },
{
name: "pressure vessel",
description: "the <strong>foam</strong> gun builds up pressure as you fire<br>that discharges <strong>foam</strong> after firing",
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("foam")
},
requires: "foam",
effect() {
tech.isFoamPressure = true;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "foam") {
b.guns[i].chooseFireMethod()
break
}
}
},
remove() {
tech.isFoamPressure = false;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "foam") {
b.guns[i].chooseFireMethod()
break
}
}
}
},
{ {
name: "capacitor bank", name: "capacitor bank",
// description: "<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, foam, railgun, pulse, tokamak</em>", // description: "<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, foam, railgun, pulse, tokamak</em>",
@@ -5628,26 +5659,14 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.blockDamage > 0.075 || tech.isRailGun || tech.haveGunCheck("foam") || tech.isTokamak || tech.isPulseLaser || tech.isPlasmaBall return tech.blockDamage > 0.075 || tech.isRailGun || (tech.haveGunCheck("foam") && tech.isFoamPressure) || tech.isTokamak || tech.isPulseLaser || tech.isPlasmaBall
}, },
requires: "throwing blocks, railgun, foam, pulse, tokamak, plasma ball", requires: "throwing blocks, railgun, foam, pulse, tokamak, plasma ball",
effect() { effect() {
tech.isCapacitor = true; tech.isCapacitor = true;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "foam") {
b.guns[i].chooseFireMethod()
break
}
}
}, },
remove() { remove() {
tech.isCapacitor = false; tech.isCapacitor = false;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "foam") {
b.guns[i].chooseFireMethod()
break
}
}
} }
}, },
{ {
@@ -5909,7 +5928,7 @@ const tech = {
}, },
remove() { remove() {
tech.isHarpoonPowerUp = false tech.isHarpoonPowerUp = false
tech.harpoonDensity = 0.005 tech.harpoonDensity = 0.004
} }
}, },
{ {
@@ -9802,7 +9821,6 @@ const tech = {
is111Duplicate: null, is111Duplicate: null,
isDynamoBotUpgrade: null, isDynamoBotUpgrade: null,
isBlockPowerUps: null, isBlockPowerUps: null,
foamFutureFire: null,
isDamageAfterKillNoRegen: null, isDamageAfterKillNoRegen: null,
isHarmReduceNoKill: null, isHarmReduceNoKill: null,
isSwitchReality: null, isSwitchReality: null,
@@ -9891,7 +9909,6 @@ const tech = {
isFreeWormHole: null, isFreeWormHole: null,
isRewindField: null, isRewindField: null,
isCrouchRegen: null, isCrouchRegen: null,
isDarts: null,
OccamDamage: null, OccamDamage: null,
isAxion: null, isAxion: null,
isWormholeMapIgnore: null, isWormholeMapIgnore: null,
@@ -9918,5 +9935,7 @@ const tech = {
missileFireCD: null, missileFireCD: null,
isBotField: null, isBotField: null,
isFoamBall: null, isFoamBall: null,
isNoDraftPause: null isNoDraftPause: null,
isFoamPressure: null,
foamDamage: null
} }

View File

@@ -1,41 +1,48 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
time dilation field rework default foam gun fires a stream
2x energy regen, but pausing time now uses much more energy tech: pressure vessel - in addition to the stream, foam gun builds up charges.
you are immune to harm while time is paused charges release after you stop firing
but this stops energy regen capacitor tech doubles pressure vessel effect
tech timelike is removed tech: syntactic foam - foam does 41% more damage per second
quantum foam removed
eternalism gives 50% damage instead of ammo spore gun has 25% more ammo and fires 25% more often
also disables the pause button, and other pause effects spores and worms move 25% faster
tech: polyurethane foam - super balls turn into foam after hitting a mob nail gun has 5% more ammo
supertemporal renamed autocannon all versions of nail gun have a much higher fire rate
now gives +1 ball, and has a shorter delay between balls
harpoon and grapple no longer lose ammo when you run out of energy harpoon/grapple density reduced by 20%
they just trigger a 2 second fire CD this also lowers damage about 10%
slashBoss doesn't slash as often at higher difficulty levels harpoon/grapple properly follow conservation of momentum
field descriptions rewritten (a small jerk when it retracts)
bug fixes bug fixes
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
gunIndex section at the end seems pointless
merge with the choosing functions?
add foam tech that makes foam stronger vs. shields
tech: eternalism - don't pause time during draft tech: eternalism - don't pause time during draft
bugs bugs?
requirements change after draft is generated requirements change after draft is generated
check for requirements onclick and give random tech if not met? check for requirements onclick and give random tech if not met?
tech expansion: should also make other fields do things tech expansion: should also make other fields do things
how to make the description work
change description based on your current field?
perfect diamagnetism moves forward when you hold down the shield perfect diamagnetism moves forward when you hold down the shield
maybe only with crouch? maybe only with crouch?
time dilation drains 1/2 as much energy when paused time dilation drains 1/2 as much energy when paused
grow plasma torch as you hold it down grow plasma torch as you hold it down
negative mass effects much more space negative mass effects much more space
needs more benefit needs more benefit?
reduces the cloaking vision effect? reduces the cloaking vision effect?
needs more benefit needs more benefit?
nonrefundable tech don't display, this is confusing nonrefundable tech don't display, this is confusing
maybe they can show up but greyed out or something maybe they can show up but greyed out or something