diff --git a/.DS_Store b/.DS_Store
index 37da533..ed02d81 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index 329ad80..8ad65bc 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -1518,7 +1518,7 @@ const b = {
didExtruderDrain: false,
canExtruderFire: true,
extruder() {
- const DRAIN = 0.0008 + m.fieldRegen
+ const DRAIN = 0.0011 + m.fieldRegen
if (m.energy > DRAIN && b.canExtruderFire) {
m.energy -= DRAIN
if (m.energy < 0) {
@@ -1526,18 +1526,18 @@ const b = {
m.energy = 0;
}
b.isExtruderOn = true
- const SPEED = 14
+ const SPEED = 10 + 10 * tech.isPlasmaRange
const me = bullet.length;
const where = Vector.add(m.pos, player.velocity)
bullet[me] = Bodies.polygon(where.x + 20 * Math.cos(m.angle), where.y + 20 * Math.sin(m.angle), 4, 0.01, {
cycle: -0.5,
isWave: true,
- endCycle: simulation.cycle + 53, // + 30 * tech.isPlasmaRange,
+ endCycle: simulation.cycle + 33, // + 30 * tech.isPlasmaRange,
inertia: Infinity,
frictionAir: 0,
isInHole: true, //this keeps the bullet from entering wormholes
minDmgSpeed: 0,
- dmg: b.dmgScale * 1.8, //damage also changes when you divide by mob.mass on in .do()
+ dmg: b.dmgScale * 2.5, //damage also changes when you divide by mob.mass on in .do()
classType: "bullet",
isBranch: false,
restitution: 0,
@@ -1555,25 +1555,31 @@ const b = {
if (Matter.Query.point(map, this.position).length) { //check if inside map
this.isBranch = true;
} else { //check if inside a body
- const q = Matter.Query.point(mob, this.position)
- for (let i = 0; i < q.length; i++) {
- Matter.Body.setVelocity(q[i], {
- x: q[i].velocity.x * 0.2,
- y: q[i].velocity.y * 0.2
- });
- Matter.Body.setPosition(this, Vector.add(this.position, q[i].velocity)) //move with the medium
- let dmg = this.dmg / Math.min(10, q[i].mass)
- q[i].damage(dmg);
- if (q[i].alive) q[i].foundPlayer();
- //removed to improve performance
- // simulation.drawList.push({ //add dmg to draw queue
- // x: this.position.x,
- // y: this.position.y,
- // radius: Math.log(2 * dmg + 1.1) * 40,
- // color: "rgba(255, 0, 119, 0.5)",
- // time: simulation.drawTime
- // });
+ for (let i = 0, len = mob.length; i < len; i++) {
+ const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position))
+ const radius = mob[i].radius + 20
+ if (dist < radius * radius) {
+ Matter.Body.setVelocity(mob[i], {
+ x: mob[i].velocity.x * 0.15,
+ y: mob[i].velocity.y * 0.15
+ });
+ Matter.Body.setPosition(this, Vector.add(this.position, mob[i].velocity)) //move with the medium
+ let dmg = this.dmg / Math.min(10, mob[i].mass)
+ mob[i].damage(dmg);
+ if (mob[i].alive) mob[i].foundPlayer();
+ }
}
+ // const q = Matter.Query.point(mob, this.position)
+ // for (let i = 0; i < q.length; i++) {
+ // Matter.Body.setVelocity(q[i], {
+ // x: q[i].velocity.x * 0.15,
+ // y: q[i].velocity.y * 0.15
+ // });
+ // Matter.Body.setPosition(this, Vector.add(this.position, q[i].velocity)) //move with the medium
+ // let dmg = this.dmg / Math.min(10, q[i].mass)
+ // q[i].damage(dmg);
+ // if (q[i].alive) q[i].foundPlayer();
+ // }
}
this.cycle++
const wiggleMag = (input.down ? 6 : 12) * Math.cos(simulation.cycle * 0.09)
@@ -4348,10 +4354,11 @@ const b = {
m.fireCDcycle = m.cycle + Math.floor((input.down ? 23 : 15) * b.fireCDscale); // cool down
const SPREAD = input.down ? 0.08 : 0.13
const num = tech.missileCount + 2
+ const radius = 11 * tech.bulletSize
let dir = m.angle - SPREAD * (num - 1) / 2;
for (let i = 0; i < num; i++) {
const me = bullet.length;
- bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 12, 11 * tech.bulletSize, b.fireAttributes(dir, false));
+ bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 12, radius, b.fireAttributes(dir, false));
Composite.add(engine.world, bullet[me]); //add bullet to world
Matter.Body.setVelocity(bullet[me], {
x: SPEED * Math.cos(dir),
diff --git a/js/index.js b/js/index.js
index 3b79e49..ee86224 100644
--- a/js/index.js
+++ b/js/index.js
@@ -174,9 +174,7 @@ window.onresize = () => {
//**********************************************************************
//set wikipedia link
for (let i = 0, len = tech.tech.length; i < len; i++) {
- if (!tech.tech[i].link) {
- tech.tech[i].link = `${tech.tech[i].name}`
- }
+ if (!tech.tech[i].link) tech.tech[i].link = `${tech.tech[i].name}`
}
const build = {
diff --git a/js/level.js b/js/level.js
index 017b440..2b33b25 100644
--- a/js/level.js
+++ b/js/level.js
@@ -15,9 +15,9 @@ const level = {
// localSettings.levelsClearedLastGame = 10
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
// simulation.isHorizontalFlipped = true
- // m.setField("pilot wave")
+ // m.setField("plasma torch")
// b.giveGuns("harpoon")
- // tech.giveTech("toggling harpoon")
+ // tech.giveTech("extruder")
// tech.giveTech("filament")
// tech.giveTech("mouth")
// tech.giveTech("all-stars")
@@ -128,18 +128,19 @@ const level = {
for (let i = 0; i < num; i++) {
simulation.difficulty++
b.dmgScale *= 0.914; //damage done by player decreases each level
- if (simulation.accelScale < 5) simulation.accelScale *= 1.02 //mob acceleration increases each level
- if (simulation.CDScale > 0.2) simulation.CDScale *= 0.97 //mob CD time decreases each level
+ if (simulation.accelScale < 6) simulation.accelScale *= 1.025 //mob acceleration increases each level
+ if (simulation.CDScale > 0.15) simulation.CDScale *= 0.965 //mob CD time decreases each level
}
simulation.dmgScale = 0.41 * simulation.difficulty //damage done by mobs increases each level
simulation.healScale = 1 / (1 + simulation.difficulty * 0.055) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
+ // console.log(`CD = ${simulation.CDScale}`)
},
difficultyDecrease(num = 1) { //used in easy mode for simulation.reset()
for (let i = 0; i < num; i++) {
simulation.difficulty--
b.dmgScale /= 0.914; //damage done by player decreases each level
- if (simulation.accelScale > 0.2) simulation.accelScale /= 1.02 //mob acceleration increases each level
- if (simulation.CDScale < 5) simulation.CDScale /= 0.97 //mob CD time decreases each level
+ if (simulation.accelScale > 1) simulation.accelScale /= 1.025 //mob acceleration increases each level
+ if (simulation.CDScale < 1) simulation.CDScale /= 0.965 //mob CD time decreases each level
}
if (simulation.difficulty < 1) simulation.difficulty = 0;
simulation.dmgScale = 0.41 * simulation.difficulty //damage done by mobs increases each level
@@ -2300,8 +2301,8 @@ const level = {
// spawn.laserBombingBoss(1900, -500)
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
- spawn.slashBoss(1900, -500)
- // spawn.ghoster(1900, -500, 200)
+ // spawn.slashBoss(1900, -500)
+ spawn.shooter(1900, -500)
// spawn.shield(mob[mob.length - 1], 1900, -500, 1);
// mob[mob.length - 1].isShielded = true
// spawn.growBossCulture(1200, -500)
diff --git a/js/player.js b/js/player.js
index 97ab0ab..ec8d23a 100644
--- a/js/player.js
+++ b/js/player.js
@@ -2006,20 +2006,30 @@ const m = {
b.wasExtruderOn = false
b.canExtruderFire = true
}
- ctx.lineWidth = 5;
- ctx.strokeStyle = "#f07"
ctx.beginPath(); //draw all the wave bullets
for (let i = 0, len = bullet.length; i < len; i++) {
if (bullet[i].isWave) {
if (bullet[i].isBranch) {
- ctx.stroke();
- ctx.beginPath(); //draw all the wave bullets
+ ctx.moveTo(bullet[i].position.x, bullet[i].position.y)
+
+ // ctx.lineWidth = 5;
+ // ctx.strokeStyle = "#f07"
+ // ctx.stroke();
+ // ctx.lineWidth = 30;
+ // ctx.strokeStyle = "rgba(255,0,110,0.05)"
+ // ctx.stroke();
+ // ctx.beginPath(); //draw all the wave bullets
} else {
ctx.lineTo(bullet[i].position.x, bullet[i].position.y)
}
}
}
if (b.wasExtruderOn && b.isExtruderOn) ctx.lineTo(m.pos.x + 15 * Math.cos(m.angle), m.pos.y + 15 * Math.sin(m.angle))
+ ctx.lineWidth = 5;
+ ctx.strokeStyle = "#f07"
+ ctx.stroke();
+ ctx.lineWidth = 35;
+ ctx.strokeStyle = "rgba(255,0,110,0.05)"
ctx.stroke();
}
}
diff --git a/js/tech.js b/js/tech.js
index fb2013a..3044d38 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -2832,6 +2832,7 @@
},
{
name: "non-unitary operator",
+ link: `non-unitary operator`,
description: "reduce combat difficulty by 2 levels, but
after a collision enter an alternate reality",
maxCount: 1,
count: 0,
@@ -2873,6 +2874,7 @@
},
{
name: "Ψ(t) collapse",
+ link: `Ψ(t) collapse`,
description: `enter an alternate reality after you research
spawn ${powerUps.orb.research(16)}`,
maxCount: 1,
count: 0,
@@ -3616,7 +3618,7 @@
allowed() {
return (b.totalBots() > 3 || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection ||
},
- requires: "bots > 3, plasma torch, nano-scale, pilot wave, not mass-energy equivalence, CPT",
+ requires: "bots > 3, plasma torch, assembler, pilot wave, not mass-energy equivalence, CPT",
effect() {
tech.isRewindGun = true
b.guns.push(b.gunRewind)
@@ -4197,7 +4199,7 @@
},
requires: "super balls",
effect() {
- tech.bulletSize += 0.15
+ tech.bulletSize += 0.14
},
remove() {
tech.bulletSize = 1;
@@ -5800,7 +5802,7 @@
}
simulation.makeTextLog(`tech.isOrbitalBotUpgrade = true`)
})
- for (let i = 0; i < 2; i++) { //double chance for dynamo-bot, since it's very good for nano-scale
+ for (let i = 0; i < 2; i++) { //double chance for dynamo-bot, since it's very good for assembler
notUpgradedBots.push(() => {
tech.giveTech("dynamo-bot upgrade")
for (let i = 0; i < num; i++) {
@@ -5817,8 +5819,8 @@
{
name: "mycelium manufacturing",
link: `mycelium manufacturing`,
- description: `use ${powerUps.orb.research(3)}to repurpose nano-scale field
excess energy used to grow spores`,
- // description: "use 3 research to repurpose nano-scale
excess energy used to grow spores",
+ description: `use ${powerUps.orb.research(3)}to repurpose molecular assembler
excess energy used to grow spores`,
+ // description: "use 3 research to repurpose assembler
excess energy used to grow spores",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -5844,8 +5846,8 @@
{
name: "missile manufacturing",
link: `missile manufacturing`,
- description: `use ${powerUps.orb.research(3)}to repurpose nano-scale field
excess energy used to construct missiles`,
- // description: "use 3 research to repurpose nano-scale
excess energy used to construct missiles",
+ description: `use ${powerUps.orb.research(3)}to repurpose molecular assembler
excess energy used to construct missiles`,
+ // description: "use 3 research to repurpose assembler
excess energy used to construct missiles",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -5871,8 +5873,8 @@
{
name: "ice IX manufacturing",
link: `ice IX manufacturing`,
- description: `use ${powerUps.orb.research(3)}to repurpose nano-scale field
excess energy used to condense ice IX`,
- // description: "use 3 research to repurpose nano-scale
excess energy used to condense ice IX",
+ description: `use ${powerUps.orb.research(3)}to repurpose molecular assembler
excess energy used to condense ice IX`,
+ // description: "use 3 research to repurpose assembler
excess energy used to condense ice IX",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -5966,7 +5968,7 @@
allowed() {
return !tech.isExtruder && m.fieldUpgrades[m.fieldMode].name === "plasma torch" && (build.isExperimentSelection || powerUps.research.count > 0)
},
- requires: "plasma torch, not micro-extruder",
+ requires: "plasma torch, not extruder",
effect() {
tech.plasmaBotCount++;
b.plasmaBot();
@@ -6002,9 +6004,9 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.plasmaBotCount || (m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isExtruder)) && (build.isExperimentSelection || powerUps.research.count > 0)
+ return (tech.plasmaBotCount || m.fieldUpgrades[m.fieldMode].name === "plasma torch") && (build.isExperimentSelection || powerUps.research.count > 0)
},
- requires: "plasma torch, not micro-extruder",
+ requires: "plasma torch",
effect() {
tech.isPlasmaRange += 0.5;
if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
@@ -6023,9 +6025,9 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && tech.isPlasmaRange === 1 && tech.plasmaBotCount === 0
+ return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && tech.plasmaBotCount === 0
},
- requires: "plasma torch, not plasma jet, plasma-bot",
+ requires: "plasma torch, not plasma-bot",
effect() {
tech.isExtruder = true;
},
@@ -6042,7 +6044,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "time dilation"
+ return m.fieldUpgrades[m.fieldMode].name === "time dilation" && !m.isShipMode
},
requires: "time dilation",
effect() {
diff --git a/todo.txt b/todo.txt
index 702e2b6..b3960f9 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,12 +1,20 @@
******************************************************** NEXT PATCH **************************************************
-tech, field, and gun names are now clickable wikipedia searches
- works in pause and experiment modes
- several names have also been adjusted
+plasma extruder
+ extruder lag issues should be fixed!
+ extruder graphics have a cool glow
+ 45% more damage
+ 20% more energy drain
+ slows mobs a bit more
+ extends faster
+ it can hit mobs that get near it now instead of just inside it
+ plasma jet now works with extruder
******************************************************** TODO ********************************************************
-bad links:
+toggle harpoon is weak and should be more obvious
+
+Tech: "Growth": Increase damage by 3% for every mob currently alive.
add link URL to all tech guns and field on page load
but only if URL is undefined so hard to search names can be added in by hand
@@ -475,6 +483,7 @@ possible names for tech
gnarl
SQUID (for superconducting quantum interference device) is a very sensitive magnetometer used to measure extremely subtle magnetic fields, based on superconducting loops containing Josephson junctions.
nuclear pasta - hard matter in neutron star
+ nonlocal
a tutorial / lore intro
needs to be optional so it doesn't slow experienced players