diff --git a/.DS_Store b/.DS_Store
index 8271bdb..fe1ba07 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/index.html b/index.html
index 9969afa..25ede8b 100644
--- a/index.html
+++ b/index.html
@@ -183,7 +183,7 @@
- Chat about n-gon in the discord . Let me know about ideas, or bugs.
+ Chat about n-gon in the discord . Let me know about ideas, or bugs.
diff --git a/js/bullet.js b/js/bullet.js
index 53a46cf..b4af594 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -430,18 +430,18 @@ const b = {
m.energy -= 0.15
m.damage(0.01 * harm); //remove 99% of the damage 1-0.99
// console.log(Math.max(0, Math.min(0.15 - 0.01 * player.speed, 0.15)))
- knock = Vector.mult(Vector.normalise(sub), 0.6 * player.mass * Math.max(0, Math.min(0.15 - 0.002 * player.speed, 0.15)) * tech.implosion);
+ knock = Vector.mult(Vector.normalise(sub), -0.6 * player.mass * Math.max(0, Math.min(0.15 - 0.002 * player.speed, 0.15)));
player.force.x = knock.x; // not += so crazy forces can't build up with MIRV
player.force.y = knock.y - 0.3; //some extra vertical kick
} else {
if (simulation.dmgScale) m.damage(harm);
- knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg) * player.mass * 0.013 * tech.implosion);
+ knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * player.mass * 0.013);
player.force.x += knock.x;
player.force.y += knock.y;
}
}
} else if (dist < alertRange) {
- knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg) * player.mass * 0.005 * tech.implosion);
+ knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * player.mass * 0.005);
player.force.x += knock.x;
player.force.y += knock.y;
}
@@ -453,7 +453,7 @@ const b = {
sub = Vector.sub(where, body[i].position);
dist = Vector.magnitude(sub);
if (dist < radius) {
- knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg) * body[i].mass * 0.022 * tech.implosion);
+ knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * body[i].mass * 0.022);
body[i].force.x += knock.x;
body[i].force.y += knock.y;
if (tech.isBlockExplode) {
@@ -468,7 +468,7 @@ const b = {
}, 150 + 300 * Math.random());
}
} else if (dist < alertRange) {
- knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg) * body[i].mass * 0.011 * tech.implosion);
+ knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * body[i].mass * 0.011);
body[i].force.x += knock.x;
body[i].force.y += knock.y;
}
@@ -480,11 +480,11 @@ const b = {
sub = Vector.sub(where, powerUp[i].position);
dist = Vector.magnitude(sub);
if (dist < radius) {
- knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg) * powerUp[i].mass * 0.013 * tech.implosion);
+ knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * powerUp[i].mass * 0.013);
powerUp[i].force.x += knock.x;
powerUp[i].force.y += knock.y;
} else if (dist < alertRange) {
- knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg) * powerUp[i].mass * 0.007 * tech.implosion);
+ knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg) * powerUp[i].mass * 0.007);
powerUp[i].force.x += knock.x;
powerUp[i].force.y += knock.y;
}
@@ -501,12 +501,10 @@ const b = {
if (Matter.Query.ray(map, mob[i].position, where).length > 0) dmg *= 0.5 //reduce damage if a wall is in the way
mob[i].damage(dmg * damageScale * m.dmgScale);
mob[i].locatePlayer();
+ knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg * damageScale) * mob[i].mass * (mob[i].isBoss ? 0.003 : 0.01));
if (tech.isExplosionStun) {
mobs.statusStun(mob[i], 120)
- knock *= 0.1
- }
- knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg * damageScale) * mob[i].mass * (mob[i].isBoss ? 0.005 : 0.01) * tech.implosion);
- if (!mob[i].isInvulnerable) {
+ } else if (!mob[i].isInvulnerable) {
mob[i].force.x += knock.x;
mob[i].force.y += knock.y;
}
@@ -514,12 +512,10 @@ const b = {
damageScale *= 0.87 //reduced damage for each additional explosion target
} else if (!mob[i].seePlayer.recall && dist < alertRange) {
mob[i].locatePlayer();
- knock = Vector.mult(Vector.normalise(sub), Math.sqrt(dmg * damageScale) * mob[i].mass * (mob[i].isBoss ? 0.002 : 0.006) * tech.implosion);
+ knock = Vector.mult(Vector.normalise(sub), -Math.sqrt(dmg * damageScale) * mob[i].mass * (mob[i].isBoss ? 0 : 0.006));
if (tech.isExplosionStun) {
mobs.statusStun(mob[i], 60)
- knock *= 0.1
- }
- if (!mob[i].isInvulnerable) {
+ } else if (!mob[i].isInvulnerable) {
mob[i].force.x += knock.x;
mob[i].force.y += knock.y;
}
@@ -773,10 +769,10 @@ const b = {
const cycle = () => {
if (simulation.paused || m.isBodiesAsleep) { requestAnimationFrame(cycle) } else {
count++
- if (count < 60 && m.alive) requestAnimationFrame(cycle);
- if (!(count % 8)) {
+ if (count < 110 && m.alive) requestAnimationFrame(cycle);
+ if (!(count % 10)) {
const unit = Vector.rotate({ x: 1, y: 0 }, 6.28 * Math.random())
- b.explosion(Vector.add(where, Vector.mult(unit, size * (count * 0.011 + 0.03 * Math.random()))), size * (0.5 + Math.random() * 0.35), `hsla(${360*Math.random()},100%,66%,0.6)`); //makes bullet do explosive damage at end
+ b.explosion(Vector.add(where, Vector.mult(unit, size * (count * 0.01 + 0.02 * Math.random()))), size * (0.4 + Math.random() * 0.35), `hsla(${360*Math.random()},100%,66%,0.6)`); //makes bullet do explosive damage at end
}
}
}
@@ -791,7 +787,7 @@ const b = {
if (count < 21 && m.alive) requestAnimationFrame(cycle);
if (count % 2) {
const unit = Vector.rotate({ x: 1, y: 0 }, curl * 6.28 * count / 18 + off)
- b.explosion(Vector.add(where, Vector.mult(unit, size * 0.8)), size * 0.75, color); //makes bullet do explosive damage at end
+ b.explosion(Vector.add(where, Vector.mult(unit, size * 0.75)), size * 0.7, color); //makes bullet do explosive damage at end
}
}
}
@@ -800,6 +796,48 @@ const b = {
let count = 0
requestAnimationFrame(cycle);
},
+ fireFlower(where, size) { //can occur after grenades detonate
+ // size *= b.explosionRange()
+ const range = size * Math.sqrt(b.explosionRange())
+ const cycle = () => {
+ if (simulation.paused || m.isBodiesAsleep) { requestAnimationFrame(cycle) } else {
+ if (count < 30 && m.alive) requestAnimationFrame(cycle);
+ if (count === 0) {
+ const color = `hsla(${360*Math.random()},100%,66%,0.6)`
+ b.explosion(where, size * 0.8, color);
+ }
+ if (count === 8) {
+ const color = `hsla(${360*Math.random()},100%,66%,0.6)`
+ for (let i = 0, len = 6; i < len; i++) {
+ const unit = Vector.rotate({ x: 1, y: 0 }, 6.28 * i / len)
+ b.explosion(Vector.add(where, Vector.mult(unit, 1.2 * range)), size * 0.6, color); //makes bullet do explosive damage at end
+ }
+ }
+ if (count === 16) {
+ const color = `hsla(${360*Math.random()},100%,66%,0.6)`
+ for (let i = 0, len = 10; i < len; i++) {
+ const unit = Vector.rotate({ x: 1, y: 0 }, 6.28 * i / len)
+ b.explosion(Vector.add(where, Vector.mult(unit, 1.75 * range)), size * 0.45, color); //makes bullet do explosive damage at end
+ }
+ }
+ count++
+ }
+ }
+ let count = 0
+ requestAnimationFrame(cycle);
+ },
+ grenadeEnd() {
+ if (tech.isCircleExplode) {
+ b.starburst(this.position, this.explodeRad)
+ } else if (tech.isPetalsExplode) {
+ b.fireFlower(this.position, this.explodeRad)
+ } else if (tech.isClusterExplode) {
+ b.fireworks(this.position, this.explodeRad)
+ } else {
+ b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
+ }
+ if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random()))
+ },
grenade() {
},
@@ -808,17 +846,8 @@ const b = {
const me = bullet.length;
bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false));
Matter.Body.setDensity(bullet[me], 0.0003);
- bullet[me].explodeRad = (tech.implosion ? 375 : 300) * size + 100 * tech.isBlockExplode;
- bullet[me].onEnd = function() {
- if (tech.isCircleExplode) {
- b.starburst(this.position, this.explodeRad)
- } else if (tech.isClusterExplode) {
- b.fireworks(this.position, this.explodeRad)
- } else {
- b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
- }
- if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random()))
- }
+ bullet[me].explodeRad = 300 * size + 100 * tech.isBlockExplode;
+ bullet[me].onEnd = b.grenadeEnd
bullet[me].minDmgSpeed = 1;
bullet[me].beforeDmg = function() {
this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion
@@ -839,16 +868,8 @@ const b = {
const me = bullet.length;
bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false));
Matter.Body.setDensity(bullet[me], 0.0003);
- bullet[me].explodeRad = (tech.implosion ? 375 : 300) * size + 100 * tech.isBlockExplode;
- bullet[me].onEnd = function() {
- if (tech.isCircleExplode) {
- b.starburst(this.position, this.explodeRad)
- } else if (tech.isClusterExplode) {
- b.fireworks(this.position, this.explodeRad)
- }
- b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
- if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random()))
- }
+ bullet[me].explodeRad = 300 * size + 100 * tech.isBlockExplode;
+ bullet[me].onEnd = b.grenadeEnd
bullet[me].minDmgSpeed = 1;
bullet[me].beforeDmg = function() {
this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion
@@ -879,28 +900,18 @@ const b = {
const me = bullet.length;
bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false));
Matter.Body.setDensity(bullet[me], 0.0003);
- bullet[me].explodeRad = (tech.implosion ? 425 : 350) * size + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100
- bullet[me].onEnd = function() {
- if (tech.isCircleExplode) {
- b.starburst(this.position, this.explodeRad)
- } else if (tech.isClusterExplode) {
- b.fireworks(this.position, this.explodeRad)
- }
- b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
- if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random()))
- }
+ bullet[me].explodeRad = 350 * size + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100
+ bullet[me].onEnd = b.grenadeEnd
bullet[me].minDmgSpeed = 1;
bullet[me].beforeDmg = function() {
this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion
};
speed = input.down ? 46 : 32
-
Matter.Body.setVelocity(bullet[me], {
x: m.Vx / 2 + speed * Math.cos(angle),
y: m.Vy / 2 + speed * Math.sin(angle)
});
Composite.add(engine.world, bullet[me]); //add bullet to world
-
bullet[me].endCycle = simulation.cycle + 70;
bullet[me].frictionAir = 0.07;
const MAG = 0.015
@@ -961,16 +972,8 @@ const b = {
const me = bullet.length;
bullet[me] = Bodies.circle(where.x, where.y, 20, b.fireAttributes(angle, false));
Matter.Body.setDensity(bullet[me], 0.0002);
- bullet[me].explodeRad = (tech.implosion ? 425 : 350) * size + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100
- bullet[me].onEnd = function() {
- if (tech.isCircleExplode) {
- b.starburst(this.position, this.explodeRad)
- } else if (tech.isClusterExplode) {
- b.fireworks(this.position, this.explodeRad)
- }
- b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
- if (tech.fragments) b.targetedNail(this.position, tech.fragments * Math.floor(2 + 1.5 * Math.random()))
- }
+ bullet[me].explodeRad = 350 * size + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100
+ bullet[me].onEnd = b.grenadeEnd
bullet[me].beforeDmg = function() {
this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion
};
@@ -1056,15 +1059,12 @@ const b = {
if (tech.isRPG) {
const SCALE = 2
Matter.Body.scale(bullet[me], SCALE, SCALE);
-
speed = input.down ? 25 : 15
// speed = input.down ? 43 : 32
-
Matter.Body.setVelocity(bullet[me], {
x: m.Vx / 2 + speed * Math.cos(angle),
y: m.Vy / 2 + speed * Math.sin(angle)
});
-
const MAG = 0.005
bullet[me].thrust = {
x: bullet[me].mass * MAG * Math.cos(angle),
@@ -5643,7 +5643,7 @@ const b = {
ctx.lineTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5));
}
}
- this.waves[i].radius += tech.waveBeamSpeed * this.waves[i].expanding //expand / move
+ this.waves[i].radius += 0.9 * tech.waveBeamSpeed * this.waves[i].expanding //expand / move
// if (this.waves[i].radius > end) this.waves.splice(i, 1) //end
if (this.waves[i].radius > end) {
this.waves[i].expanding = -1
@@ -5738,7 +5738,7 @@ const b = {
}
// ctx.stroke(); //draw vibes
- this.waves[i].radius += tech.waveBeamSpeed * 2 * this.waves[i].expanding //expand / move
+ this.waves[i].radius += tech.waveBeamSpeed * 1.8 * this.waves[i].expanding //expand / move
if (this.waves[i].radius > end) {
this.waves[i].expanding = -1
this.waves[i].reflection--
@@ -5857,9 +5857,9 @@ const b = {
let waveSpeedMap = 0.1
let waveSpeedBody = 0.25
if (tech.isPhaseVelocity) {
- waveSpeedMap = 3
- waveSpeedBody = 1.9
- bullet[me].dmg *= 1.15
+ waveSpeedMap = 3.5
+ waveSpeedBody = 2
+ bullet[me].dmg *= 1.2
}
if (tech.waveReflections) {
bullet[me].reflectCycle = totalCycles / tech.waveReflections //tech.waveLengthRange
diff --git a/js/level.js b/js/level.js
index 4822128..93c7754 100644
--- a/js/level.js
+++ b/js/level.js
@@ -15,16 +15,16 @@ const level = {
levels: [],
start() {
if (level.levelsCleared === 0) { //this code only runs on the first level
- // simulation.isHorizontalFlipped = true
- // m.setField("perfect diamagnetism")
- // b.giveGuns("grenades")
- // tech.giveTech("rule 30")
- // tech.giveTech("cherenkov radiation")
+ // // simulation.isHorizontalFlipped = true
+ // m.setField("wormhole")
+ // b.giveGuns("matter wave")
+ // tech.giveTech("chain reaction")
+ // tech.giveTech("fireworks")
// tech.giveTech("flame test")
// tech.giveTech("pyrotechnics")
// for (let i = 0; i < 10; i++) tech.giveTech("replication")
- // tech.giveTech("decoherence")
- // tech.giveTech("pneumatic actuator")
+ // tech.giveTech("acetone peroxide")
+ // for (let i = 0; i < 10; i++) tech.giveTech("ammonium nitrate")
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "tech");
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "research");
// for (let i = 0; i < 15; i++) tech.giveTech()
@@ -2652,7 +2652,7 @@ const level = {
// spawn.slashBoss(1900, -500)
// spawn.launcherBoss(3200, -500)
// spawn.laserTargetingBoss(1700, -500)
- // spawn.powerUpBoss(1900, -500)
+ spawn.powerUpBoss(1900, -500)
// spawn.powerUpBossBaby(3200, -500)
// spawn.snakeBoss(1700, -500)
// spawn.streamBoss(3200, -500)
@@ -2663,7 +2663,7 @@ const level = {
// spawn.blinkBoss(1700, -500)
// spawn.snakeSpitBoss(3200, -500)
// spawn.laserBombingBoss(1700, -500)
- spawn.launcherBoss(3200, -500)
+ // spawn.launcherBoss(3200, -500)
// spawn.blockBoss(1700, -500)
// spawn.blinkBoss(3200, -500)
// spawn.spiderBoss(1700, -500)
diff --git a/js/tech.js b/js/tech.js
index 5e64ae0..ed6e33e 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -301,7 +301,7 @@ const tech = {
}
},
tech: [{
- name: "gun sciences",
+ name: "ordnance",
description: "triple the frequency of finding gun tech spawn a gun ",
maxCount: 1,
count: 0,
@@ -4396,7 +4396,7 @@ const tech = {
//
{
name: "phase velocity",
- description: "matter wave propagates faster through solids increase matter wave damage by 15% ",
+ description: "matter wave propagates faster through solids increase matter wave damage by 20% ",
// description: "matter wave propagates faster through solids up by 3000% in the map and 760% in blocks ",
isGunTech: true,
maxCount: 1,
@@ -4471,7 +4471,7 @@ const tech = {
tech.waveBeamDamage += 1.5 * 0.37 //this sets base matter wave damage
},
remove() {
- tech.waveBeamSpeed = 10;
+ tech.waveBeamSpeed = 12;
tech.waveBeamDamage = 1.5 //this sets base matter wave damage
}
},
@@ -4789,25 +4789,25 @@ const tech = {
// },
{
name: "controlled explosion",
- description: `use ${powerUps.orb.research(3)} to dynamically reduce allexplosions until they do no harm `,
+ description: `use ${powerUps.orb.research(4)} to dynamically reduce allexplosions until they do no harm `,
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
- return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 2) && (tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb))
+ return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 3) && (tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb))
},
requires: "an explosive damage source, not electric reactive armor",
effect: () => {
tech.isSmartRadius = true;
- for (let i = 0; i < 3; i++) {
+ for (let i = 0; i < 4; i++) {
if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
}
},
remove() {
tech.isSmartRadius = false;
- if (this.count > 0) powerUps.research.changeRerolls(3)
+ if (this.count > 0) powerUps.research.changeRerolls(4)
}
},
{
@@ -4891,25 +4891,6 @@ const tech = {
b.setGrenadeMode()
}
},
- {
- name: "implosion",
- description: "explosions pull objects towards them increase grenade radius and damage 25% ",
- isGunTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- frequencyDefault: 2,
- allowed() {
- return tech.haveGunCheck("grenades") && !tech.isExplodeRadio && !tech.isNeutronBomb
- },
- requires: "grenades, not iridium-192, neutron bomb",
- effect: () => {
- tech.implosion = 1;
- },
- remove() {
- tech.implosion = -1;
- }
- },
{
name: "chain reaction",
description: "increase grenade radius and damage 33% blocks caught in explosions also explode ",
@@ -4938,9 +4919,9 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("grenades") && !tech.isNeutronBomb
+ return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && !tech.isCircleExplode && !tech.isPetalsExplode
},
- requires: "grenades, not neutron bomb",
+ requires: "grenades, not neutron bomb, pyrotechnics, fireworks",
effect() {
tech.isClusterExplode = true;
},
@@ -4957,9 +4938,9 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && tech.isClusterExplode
+ return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && !tech.isClusterExplode && !tech.isPetalsExplode
},
- requires: "grenades, flame test, not neutron bomb",
+ requires: "grenades, not neutron bomb, flame test, fireworks",
effect() {
tech.isCircleExplode = true;
},
@@ -4967,6 +4948,25 @@ const tech = {
tech.isCircleExplode = false;
}
},
+ {
+ name: "fireworks",
+ description: "when grenades detonate they release colorful rings petals of explosions ",
+ isGunTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return tech.haveGunCheck("grenades") && !tech.isNeutronBomb && !tech.isClusterExplode && !tech.isCircleExplode
+ },
+ requires: "grenades, not neutron bomb, pyrotechnics, flame test",
+ effect() {
+ tech.isPetalsExplode = true;
+ },
+ remove() {
+ tech.isPetalsExplode = false;
+ }
+ },
{
name: "neutron bomb",
description: "grenades are irradiated with Cf-252 does damage , harm , and drains energy ",
@@ -10185,7 +10185,7 @@ const tech = {
isNoDraftPause: null,
isFoamPressure: null,
foamDamage: null,
- implosion: null,
isClusterExplode: null,
- isCircleExplode: null
+ isCircleExplode: null,
+ isPetalsExplode: null
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 07b16e9..8fa9723 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,44 +1,22 @@
******************************************************** NEXT PATCH **************************************************
-grenade tech: flame test - grenades release a cluster of smaller explosions
-grenade tech: pyrotechnics - grenades release a circle of smaller explosions
-grenade tech: implosion - explosions pull things in, not out, +25% to grenade explosion damage and radius
-chain reaction no longer requires vacuum bomb
-bosses and mobs have much less knock back from explosions
- invulnerable mobs have no knock back
+grenade now has 3 fireworks options, you can only have 1 at a time
+ flame test, fireworks, pyrotechnics
+implosion has been removed
+controlled explosion 3->4 research
-alternator harpoon/grapple/railgun energy drain reduced by 100->60%
-bots no longer unlock tech until you upgrade to a bot type
-JUNK tech rule 30 is now sometimes rule 90 instead
-disabled testing for why? mode
-
-wave beam
- amplitude 50->37% damage
- propagation 50->37% damage
-worms
- annelids 10-120% -> about 37% damage
-radiation
- nuclear transmutation stacks 9x
- gives 70->47% damage per stack
-explosions
- ammonium nitrate 27->24% damage and radius
+base matter wave moves 20% faster
+gun science renamed ordnance
+bug fixes
******************************************************** TODO ********************************************************
buff early matter wave without phonon
-some grenade tech made all the bosses go away and not drop anything
- check: fireworks, vacuum, stun, chain reaction, implosion
-
more fireworks themed grenade tech
- shotting star - fire a series of explosions higher and higher up, also increase radius with height
- star burst - 5 explosions in star shape
- delay - explosion in same place
- pulse
- 30s of lasers
+ shooting star - fire a series of explosions higher and higher up, also increase radius with height
-merge mines and grenades?
tech - neutron bombs deal 100% more damage, but finishes detonating much faster
tech - neutron bombs will explode into a small iridum explosion after it expires