experiment and junk: panopticon - mobs can see you all the time

scrap bots now have a 33% chance to spawn for 10 seconds after killing a mob
  (was 20% chance for 20 seconds)
tech: scrap refit - killing a mob resets your functional scrap bots back to 10 seconds of operation

several damage tech have reduced damage by about 10%
spores do 20% more damage, but last 1 second shorter
This commit is contained in:
landgreen
2021-04-08 12:26:06 -07:00
parent 45fb86189b
commit b217a50f75
10 changed files with 254 additions and 148 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1814,14 +1814,14 @@ const b = {
friction: 0, friction: 0,
frictionAir: 0.025, frictionAir: 0.025,
thrust: (tech.isFastSpores ? 0.001 : 0.0004) * (1 + 0.3 * (Math.random() - 0.5)), thrust: (tech.isFastSpores ? 0.001 : 0.0004) * (1 + 0.3 * (Math.random() - 0.5)),
dmg: tech.isMutualism ? 12 : 5, //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",
collisionFilter: { collisionFilter: {
category: cat.bullet, category: cat.bullet,
mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body
}, },
endCycle: simulation.cycle + Math.floor((600 + Math.floor(Math.random() * 420)) * tech.isBulletsLastLonger), endCycle: simulation.cycle + Math.floor((540 + Math.floor(Math.random() * 420)) * tech.isBulletsLastLonger),
minDmgSpeed: 0, minDmgSpeed: 0,
playerOffPosition: { //used when moving towards player to keep spores separate playerOffPosition: { //used when moving towards player to keep spores separate
x: 100 * (Math.random() - 0.5), x: 100 * (Math.random() - 0.5),
@@ -2301,7 +2301,7 @@ const b = {
World.add(engine.world, bullet[me]); //add bullet to world World.add(engine.world, bullet[me]); //add bullet to world
Matter.Body.setVelocity(bullet[me], velocity); Matter.Body.setVelocity(bullet[me], velocity);
}, },
targetedNail(position, num = 1, speed = 50 + 10 * Math.random(), range = 1200, isRandomAim = true) { targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true) {
const targets = [] //target nearby mobs const targets = [] //target nearby mobs
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
if (mob[i].dropPowerUp) { if (mob[i].dropPowerUp) {
@@ -2321,7 +2321,7 @@ const b = {
x: targets[index].x + SPREAD * (Math.random() - 0.5), x: targets[index].x + SPREAD * (Math.random() - 0.5),
y: targets[index].y + SPREAD * (Math.random() - 0.5) y: targets[index].y + SPREAD * (Math.random() - 0.5)
} }
b.nail(position, Vector.mult(Vector.normalise(Vector.sub(WHERE, position)), speed), 1.1) b.nail(position, Vector.mult(Vector.normalise(Vector.sub(WHERE, position)), speed))
} else if (isRandomAim) { // aim in random direction } else if (isRandomAim) { // aim in random direction
const ANGLE = 2 * Math.PI * Math.random() const ANGLE = 2 * Math.PI * Math.random()
b.nail(position, { b.nail(position, {
@@ -2331,7 +2331,7 @@ const b = {
} }
} }
}, },
nail(pos, velocity, dmg = 0) { nail(pos, velocity, dmg = 1) {
const me = bullet.length; const me = bullet.length;
bullet[me] = Bodies.rectangle(pos.x, pos.y, 25, 2, b.fireAttributes(Math.atan2(velocity.y, velocity.x))); bullet[me] = Bodies.rectangle(pos.x, pos.y, 25, 2, b.fireAttributes(Math.atan2(velocity.y, velocity.x)));
Matter.Body.setVelocity(bullet[me], velocity); Matter.Body.setVelocity(bullet[me], velocity);
@@ -2492,7 +2492,7 @@ const b = {
if (Vector.magnitude(Vector.sub(this.position, player.position)) < 250) { //give energy if (Vector.magnitude(Vector.sub(this.position, player.position)) < 250) { //give energy
Matter.Body.setAngularVelocity(this, this.spin) Matter.Body.setAngularVelocity(this, this.spin)
if (this.isUpgraded) { if (this.isUpgraded) {
m.energy += 0.12 m.energy += 0.11
simulation.drawList.push({ //add dmg to draw queue simulation.drawList.push({ //add dmg to draw queue
x: this.position.x, x: this.position.x,
y: this.position.y, y: this.position.y,
@@ -2583,16 +2583,16 @@ const b = {
} else { //close to player } else { //close to player
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
if (this.lastLookCycle < simulation.cycle && !m.isCloak) { if (this.lastLookCycle < simulation.cycle && !m.isCloak) {
this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 15 : 80) this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 21 : 110)
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)); const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
if (dist < 3000000 && //1400*1400 if (dist < 3000000 && //1400*1400
Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
Matter.Query.ray(body, this.position, mob[i].position).length === 0 && Matter.Query.ray(body, this.position, mob[i].position).length === 0 &&
!mob[i].isShielded) { !mob[i].isShielded) {
const SPEED = 40 const SPEED = 35
const unit = Vector.normalise(Vector.sub(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60)), this.position)) const unit = Vector.normalise(Vector.sub(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60)), this.position))
b.nail(this.position, Vector.mult(unit, SPEED), 0.4) b.nail(this.position, Vector.mult(unit, SPEED))
this.force = Vector.mult(unit, -0.01 * this.mass) this.force = Vector.mult(unit, -0.01 * this.mass)
break; break;
} }
@@ -3343,14 +3343,13 @@ const b = {
}, },
baseFire(angle) { baseFire(angle) {
const speed = 30 + 6 * Math.random() + 9 * tech.nailInstantFireRate const speed = 30 + 6 * Math.random() + 9 * tech.nailInstantFireRate
const dmg = 0.9
b.nail({ b.nail({
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)
}, { }, {
x: m.Vx / 2 + speed * Math.cos(angle), x: m.Vx / 2 + speed * Math.cos(angle),
y: m.Vy / 2 + speed * Math.sin(angle) y: m.Vy / 2 + speed * Math.sin(angle)
}, dmg) //position, velocity, damage }) //position, velocity, damage
if (tech.isIceCrystals) { if (tech.isIceCrystals) {
bullet[bullet.length - 1].beforeDmg = function(who) { bullet[bullet.length - 1].beforeDmg = function(who) {
mobs.statusSlow(who, 60) mobs.statusSlow(who, 60)
@@ -3374,35 +3373,9 @@ const b = {
defaultAmmoPack: 5.5, defaultAmmoPack: 5.5,
have: false, have: false,
fire() { fire() {
// if (true) {
// const direction = {
// x: Math.cos(m.angle),
// y: Math.sin(m.angle)
// }
// for (let i = 0; i < 2; i++) {
// const push = Vector.mult(Vector.perp(direction), 0.08)
// const where = {
// x: m.pos.x + 40 * direction.x,
// y: m.pos.y + 40 * direction.y
// }
// b.missile(where, m.angle, 0, 0.5) //where, angle, speed, size = 1)
// // bullet[bullet.length - 1].force.x += push.x;
// // bullet[bullet.length - 1].force.y += push.y;
// }
// }
// setTimeout(() => {
// if (!simulation.paused) {
// b.foam(position, velocity, radius)
// bullet[bullet.length - 1].damage = (1 + 1.53 * tech.foamFutureFire) * (tech.isFastFoam ? 0.048 : 0.012) //double damage
// }
// }, 350 * tech.foamFutureFire);
let knock, spread let knock, spread
if (m.crouch) { if (m.crouch) {
spread = 0.75 spread = 0.65
m.fireCDcycle = m.cycle + Math.floor(55 * b.fireCD); // cool down m.fireCDcycle = m.cycle + Math.floor(55 * b.fireCD); // cool down
if (tech.isShotgunImmune && m.immuneCycle < m.cycle + Math.floor(58 * b.fireCD)) m.immuneCycle = m.cycle + Math.floor(58 * b.fireCD); //player is immune to damage for 30 cycles if (tech.isShotgunImmune && m.immuneCycle < m.cycle + Math.floor(58 * b.fireCD)) m.immuneCycle = m.cycle + Math.floor(58 * b.fireCD); //player is immune to damage for 30 cycles
knock = 0.01 knock = 0.01
@@ -3476,25 +3449,25 @@ const b = {
} }
} }
} else if (tech.isIncendiary) { } else if (tech.isIncendiary) {
const SPEED = m.crouch ? 35 : 25 spread *= 0.15
const END = Math.floor(m.crouch ? 9 : 6); const END = Math.floor(m.crouch ? 10 : 7);
const totalBullets = 8 const totalBullets = 10
const angleStep = (m.crouch ? 0.15 : 0.4) / totalBullets const angleStep = (m.crouch ? 0.4 : 1.3) / totalBullets
let dir = m.angle - angleStep * totalBullets / 2; let dir = m.angle - angleStep * totalBullets / 2;
for (let i = 0; i < totalBullets; i++) { //5 -> 7 for (let i = 0; i < totalBullets; i++) { //5 -> 7
dir += angleStep dir += angleStep
const me = bullet.length; const me = bullet.length;
bullet[me] = Bodies.rectangle(m.pos.x + 50 * Math.cos(m.angle), m.pos.y + 50 * Math.sin(m.angle), 17, 4, b.fireAttributes(dir)); bullet[me] = Bodies.rectangle(m.pos.x + 50 * Math.cos(m.angle), m.pos.y + 50 * Math.sin(m.angle), 17, 4, b.fireAttributes(dir));
const end = END + Math.random() * 3 const end = END + Math.random() * 4
bullet[me].endCycle = 2 * end + simulation.cycle bullet[me].endCycle = 2 * end + simulation.cycle
const speed = SPEED * end / END const speed = 25 * end / END
const dirOff = dir + 0.15 * (Math.random() - 0.5) const dirOff = dir + (Math.random() - 0.5) * spread
Matter.Body.setVelocity(bullet[me], { Matter.Body.setVelocity(bullet[me], {
x: speed * Math.cos(dirOff), x: speed * Math.cos(dirOff),
y: speed * Math.sin(dirOff) y: speed * Math.sin(dirOff)
}); });
bullet[me].onEnd = function() { bullet[me].onEnd = function() {
b.explosion(this.position, 100 + (Math.random() - 0.5) * 30); //makes bullet do explosive damage at end b.explosion(this.position, 135 + (Math.random() - 0.5) * 40); //makes bullet do explosive damage at end
} }
bullet[me].beforeDmg = function() { bullet[me].beforeDmg = function() {
this.endCycle = 0; //bullet ends cycle after hitting a mob and triggers explosion this.endCycle = 0; //bullet ends cycle after hitting a mob and triggers explosion
@@ -3503,33 +3476,32 @@ const b = {
World.add(engine.world, bullet[me]); //add bullet to world World.add(engine.world, bullet[me]); //add bullet to world
} }
} else if (tech.isNailShot) { } else if (tech.isNailShot) {
spread *= 0.4
if (m.crouch) { if (m.crouch) {
for (let i = 0; i < 11; i++) { for (let i = 0; i < 17; i++) {
const dir = m.angle + (Math.random() - 0.5) * 0.015 const dir = m.angle + (Math.random() - 0.5) * spread
const pos = { const pos = {
x: m.pos.x + 35 * Math.cos(m.angle) + 15 * (Math.random() - 0.5), x: m.pos.x + 35 * Math.cos(m.angle) + 15 * (Math.random() - 0.5),
y: m.pos.y + 35 * Math.sin(m.angle) + 15 * (Math.random() - 0.5) y: m.pos.y + 35 * Math.sin(m.angle) + 15 * (Math.random() - 0.5)
} }
speed = 39 + 7 * Math.random() speed = 48 + 8 * Math.random()
const velocity = { b.nail(pos, {
x: speed * Math.cos(dir), x: speed * Math.cos(dir),
y: speed * Math.sin(dir) y: speed * Math.sin(dir)
} })
b.nail(pos, velocity, 1.2)
} }
} else { } else {
for (let i = 0; i < 15; i++) { for (let i = 0; i < 17; i++) {
const dir = m.angle + (Math.random() - 0.5) * 0.42 const dir = m.angle + (Math.random() - 0.5) * spread
const pos = { const pos = {
x: m.pos.x + 35 * Math.cos(m.angle) + 15 * (Math.random() - 0.5), x: m.pos.x + 35 * Math.cos(m.angle) + 15 * (Math.random() - 0.5),
y: m.pos.y + 35 * Math.sin(m.angle) + 15 * (Math.random() - 0.5) y: m.pos.y + 35 * Math.sin(m.angle) + 15 * (Math.random() - 0.5)
} }
speed = 34 + 6 * Math.random() speed = 48 + 8 * Math.random()
const velocity = { b.nail(pos, {
x: speed * Math.cos(dir), x: speed * Math.cos(dir),
y: speed * Math.sin(dir) y: speed * Math.sin(dir)
} })
b.nail(pos, velocity, 1.2)
} }
} }
} else { } else {
@@ -3888,7 +3860,7 @@ 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: 3.5, ammoPack: 3,
have: false, have: false,
fire() { fire() {
const me = bullet.length; const me = bullet.length;

View File

@@ -400,7 +400,7 @@ const build = {
if (!tech.tech[i].isExperimentHide) { if (!tech.tech[i].isExperimentHide) {
if (tech.tech[i].allowed()) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment" if (tech.tech[i].allowed()) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment"
if (tech.tech[i].isExperimentalMode) { if (tech.tech[i].isExperimentalMode) {
text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')">${tech.tech[i].description}</div>` text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title">${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
} else { } else {
text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title"><div class="circle-grid tech"></div> &nbsp; ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>` text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title"><div class="circle-grid tech"></div> &nbsp; ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
} }

View File

@@ -12,15 +12,15 @@ const level = {
start() { start() {
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.enableConstructMode() //used to build maps in testing mode // simulation.enableConstructMode() //used to build maps in testing mode
// level.difficultyIncrease(125) // level.difficultyIncrease(50)
// simulation.zoomScale = 1000; // simulation.zoomScale = 1000;
// simulation.setZoom(); // simulation.setZoom();
// m.setField("nano-scale manufacturing") // m.setField("nano-scale manufacturing")
// b.giveGuns("spores") // b.giveGuns("shotgun")
// tech.isExplodeRadio = true // tech.isExplodeRadio = true
// for (let i = 0; i < 1; i++) tech.giveTech("dynamo-bot") // for (let i = 0; i < 1; i++) tech.giveTech("dynamo-bot")
// tech.giveTech("needle gun") // tech.giveTech("incendiary ammunition")
// tech.giveTech("ceramic needles") // tech.giveTech("flip-flop")
// tech.giveTech("causality bombs") // tech.giveTech("causality bombs")
// tech.giveTech("cardinality") // tech.giveTech("cardinality")
// tech.giveTech("Bayesian statistics") // tech.giveTech("Bayesian statistics")
@@ -1077,7 +1077,6 @@ const level = {
spawn.mapRect(6400, -200, 400, 300); //right wall spawn.mapRect(6400, -200, 400, 300); //right wall
spawn.mapRect(6700, -1800, 800, 2600); //right wall spawn.mapRect(6700, -1800, 800, 2600); //right wall
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
// spawn.boost(1500, 0, 900);
// simulation.difficulty = 30 // simulation.difficulty = 30
// spawn.starter(1900, -500, 200) //big boy // spawn.starter(1900, -500, 200) //big boy
@@ -1098,7 +1097,7 @@ const level = {
// 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);
spawn.nodeGroup(1200, -500, "sniper") spawn.nodeGroup(1200, -500, "pulsar")
// spawn.snakeBoss(1200, -500) // spawn.snakeBoss(1200, -500)
// spawn.powerUpBoss(2900, -500) // spawn.powerUpBoss(2900, -500)
// spawn.randomMob(1600, -500) // spawn.randomMob(1600, -500)
@@ -1715,7 +1714,30 @@ const level = {
const balance3 = level.spinner(2608, 1900, 584, 25, 0.001) //falling const balance3 = level.spinner(2608, 1900, 584, 25, 0.001) //falling
const balance4 = level.spinner(9300, 2205, 25, 380, 0.001) //exit const balance4 = level.spinner(9300, 2205, 25, 380, 0.001) //exit
const drip = {
x: 7150,
y: 0,
speed: 0
}
level.custom = () => { level.custom = () => {
const dripCycle = (simulation.cycle % 200) //drips
if (dripCycle < 70) {
if (!m.isBodiesAsleep) {
if (dripCycle === 0) {
drip.y = 1900
drip.x = 4600 + 4400 * Math.random()
drip.speed = 1
}
drip.speed += 0.35 //acceleration from gravity
drip.y += drip.speed
}
// if (drip.y > 2900) console.log(dripCycle)
ctx.fillStyle = "hsla(160, 100%, 35%, 0.5)" //"hsla(160, 100%, 35%,0.75)"
ctx.beginPath();
ctx.arc(drip.x, drip.y, 8, 0, 2 * Math.PI);
ctx.fill();
}
button.query(); button.query();
button.draw(); button.draw();
hazard.query(); hazard.query();
@@ -2579,7 +2601,7 @@ const level = {
spawn.mapRect(-4450, -3075, 450, 25); spawn.mapRect(-4450, -3075, 450, 25);
spawn.mapRect(-4025, -3075, 25, 100); spawn.mapRect(-4025, -3075, 25, 100);
spawn.mapRect(-4275, -2785, 100, 25); spawn.mapRect(-4275, -2785, 100, 25);
spawn.bodyRect(-3830, -2400, 50, 50); spawn.bodyRect(-3900, -2400, 50, 50);
//mobs //mobs
spawn.randomMob(-2500, -2700, 1); spawn.randomMob(-2500, -2700, 1);
@@ -2942,9 +2964,7 @@ const level = {
spawn.mapRect(3650, -1300, 50, 700); //exit wall spawn.mapRect(3650, -1300, 50, 700); //exit wall
spawn.mapRect(3650, -1300, 1350, 50); //exit wall spawn.mapRect(3650, -1300, 1350, 50); //exit wall
spawn.bodyRect(3665, -600, 20, 100); //door spawn.bodyRect(3665, -600, 20, 100); //door
spawn.mapRect(3000, -550, 375, 75); spawn.mapVertex(3160, -525, "625 0 300 0 300 -140 500 -140"); //entrance/exit ramp
spawn.mapRect(3000, -600, 225, 75);
spawn.mapRect(3000, -2000 * 0.5, 700, 50); //exit roof spawn.mapRect(3000, -2000 * 0.5, 700, 50); //exit roof
spawn.mapRect(3000, -2000 * 0.25, 2000 - 300, 50); //1st floor spawn.mapRect(3000, -2000 * 0.25, 2000 - 300, 50); //1st floor
spawn.spawnStairs(3000 + 2000 - 50, 0, 4, 250, 350, true); //stairs ground spawn.spawnStairs(3000 + 2000 - 50, 0, 4, 250, 350, true); //stairs ground
@@ -3928,7 +3948,7 @@ const level = {
}; };
level.customTopLayer = () => { level.customTopLayer = () => {
ctx.fillStyle = "rgba(64,64,64,0.97)"; ctx.fillStyle = "rgba(64,64,64,0.97)";
ctx.fillRect(1175, -400, 275, 175); ctx.fillRect(2800, -400, 275, 175);
hazard.draw(); hazard.draw();
doorBedroom.draw(); doorBedroom.draw();

View File

@@ -1053,9 +1053,14 @@ const mobs = {
} 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())
} }
if (Math.random() < tech.isBotSpawner) { if (tech.isBotSpawnerReset) {
for (let i = 0, len = bullet.length; i < len; i++) {
if (bullet[i].botType && !bullet[i].isKeep) bullet[i].endCycle = simulation.cycle + 660 //10 seconds and 1 extra second for fun
}
}
if (Math.random() < tech.botSpawner) {
b.randomBot(this.position, false) b.randomBot(this.position, false)
bullet[bullet.length - 1].endCycle = simulation.cycle + 1000 + Math.floor(400 * Math.random()) bullet[bullet.length - 1].endCycle = simulation.cycle + 660 //10 seconds and 1 extra second for fun
this.leaveBody = false; // no body since it turned into the bot this.leaveBody = false; // no body since it turned into the bot
} }
} else if (tech.isShieldAmmo && this.shield && !this.isBonusShield) { } else if (tech.isShieldAmmo && this.shield && !this.isBonusShield) {

View File

@@ -1600,16 +1600,23 @@ const m = {
name: "nano-scale manufacturing", name: "nano-scale manufacturing",
description: "use <strong class='color-f'>energy</strong> to <strong>block</strong> mobs<br>excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br><strong>double</strong> your default <strong class='color-f'>energy</strong> regeneration", description: "use <strong class='color-f'>energy</strong> to <strong>block</strong> mobs<br>excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br><strong>double</strong> your default <strong class='color-f'>energy</strong> regeneration",
effect: () => { effect: () => {
// m.fieldMeterColor = "#0c5"
// m.eyeFillColor = m.fieldMeterColor
m.hold = function() { m.hold = function() {
if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 200 && (m.cycle % 2)) { if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 200 && (m.cycle % 2)) {
if (tech.isSporeField) { if (tech.isSporeField) {
// const len = Math.floor(5 + 4 * Math.random()) for (let i = 0; i < 30; i++) {
const len = Math.ceil(m.energy * 10) m.energy -= 0.11
m.energy = 0; if (m.energy > 0) {
for (let i = 0; i < len; i++) b.spore(m.pos) b.spore(m.pos)
} else {
m.energy = 0.01
break;
}
}
} else if (tech.isMissileField) { } else if (tech.isMissileField) {
m.energy -= 0.5; m.energy -= 0.4;
b.missile({ x: m.pos.x, y: m.pos.y - 40 }, -Math.PI / 2, 0, 1) b.missile({ x: m.pos.x, y: m.pos.y - 40 }, -Math.PI / 2 + 0.5 * (Math.random() - 0.5), 0, 1)
} else if (tech.isIceField) { } else if (tech.isIceField) {
m.energy -= 0.057; m.energy -= 0.057;
b.iceIX(1) b.iceIX(1)
@@ -1907,7 +1914,7 @@ const m = {
}, },
{ {
name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency" name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency"
description: "<strong class='color-cloaked'>cloak</strong> after not using your gun or field<br>while <strong class='color-cloaked'>cloaked</strong> mobs can't see you<br>increase <strong class='color-d'>damage</strong> by <strong>133%</strong>", description: "<strong class='color-cloaked'>cloak</strong> after not using your gun or field<br>while <strong class='color-cloaked'>cloaked</strong> mobs can't see you<br>increase <strong class='color-d'>damage</strong> by <strong>121%</strong>",
effect: () => { effect: () => {
m.fieldFire = true; m.fieldFire = true;
m.fieldMeterColor = "#333"; m.fieldMeterColor = "#333";
@@ -1915,7 +1922,7 @@ const m = {
// m.eyeFillColor = '#333' // m.eyeFillColor = '#333'
m.fieldPhase = 0; m.fieldPhase = 0;
m.isCloak = false m.isCloak = false
m.fieldDamage = 2.33 // 1 + 111/100 m.fieldDamage = 2.21 // 1 + 111/100
m.fieldDrawRadius = 0 m.fieldDrawRadius = 0
const drawRadius = 1000 const drawRadius = 1000

View File

@@ -793,7 +793,7 @@ const simulation = {
if (tech.isFlipFlopOn) { if (tech.isFlipFlopOn) {
m.energy += 0.22; m.energy += 0.22;
} else { } else {
m.energy -= 0.031; m.energy -= 0.041;
if (m.energy < 0) m.energy = 0 if (m.energy < 0) m.energy = 0
} }
} }

View File

@@ -1580,6 +1580,8 @@ const spawn = {
const sub = Vector.sub(this.homePosition, this.position) const sub = Vector.sub(this.homePosition, this.position)
const dist = Vector.magnitude(sub) const dist = Vector.magnitude(sub)
if (dist > 250) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002) if (dist > 250) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002)
} else {
this.isFiring = false
} }
}; };
}, },
@@ -1700,6 +1702,8 @@ const spawn = {
const sub = Vector.sub(this.homePosition, this.position) const sub = Vector.sub(this.homePosition, this.position)
const dist = Vector.magnitude(sub) const dist = Vector.magnitude(sub)
if (dist > 350) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002) if (dist > 350) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002)
} else {
this.isFiring = false
} }
}; };
}, },

View File

@@ -124,31 +124,31 @@
damageFromTech() { damageFromTech() {
let dmg = m.fieldDamage let dmg = m.fieldDamage
if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ... if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ...
if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555 if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.45
if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599
if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.75 if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.4 : 0.85
if (tech.isTechDamage) dmg *= 2 if (tech.isTechDamage) dmg *= 1.9
if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance()) if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance())
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5 if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
if (tech.isMaxEnergyTech) dmg *= 1.4 if (tech.isMaxEnergyTech) dmg *= 1.4
if (tech.isEnergyNoAmmo) dmg *= 1.5 if (tech.isEnergyNoAmmo) dmg *= 1.5
if (tech.isDamageForGuns) dmg *= 1 + 0.17 * b.inventory.length if (tech.isDamageForGuns) dmg *= 1 + 0.14 * b.inventory.length
if (tech.isLowHealthDmg) dmg *= 1 + 0.6 * Math.max(0, 1 - m.health) if (tech.isLowHealthDmg) dmg *= 1 + 0.5 * Math.max(0, 1 - m.health)
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3; if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
if (tech.isEnergyLoss) dmg *= 1.5; if (tech.isEnergyLoss) dmg *= 1.45;
if (tech.isAcidDmg && m.health > 1) dmg *= 1.4; if (tech.isAcidDmg && m.health > 1) dmg *= 1.35;
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
if (tech.isEnergyDamage) dmg *= 1 + m.energy / 9; if (tech.isEnergyDamage) dmg *= 1 + m.energy / 9;
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038 if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038
if (tech.isRerollDamage) dmg *= 1 + 0.039 * powerUps.research.count if (tech.isRerollDamage) dmg *= 1 + 0.039 * powerUps.research.count
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25 if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.22
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2 if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 1.9
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.43, player.speed * 0.015) if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.43, player.speed * 0.015)
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots() if (tech.isBotDamage) dmg *= 1 + 0.05 * b.totalBots()
return dmg * tech.slowFire * tech.aimDamage return dmg * tech.slowFire * tech.aimDamage
}, },
duplicationChance() { duplicationChance() {
return (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + m.duplicateChance return (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.043 + tech.duplicateChance + m.duplicateChance
}, },
maxDuplicationEvent() { maxDuplicationEvent() {
if (tech.is100Duplicate && tech.duplicationChance() > 0.99) { if (tech.is100Duplicate && tech.duplicationChance() > 0.99) {
@@ -163,7 +163,7 @@
}, },
tech: [{ tech: [{
name: "integrated armament", name: "integrated armament",
description: `increase <strong class='color-d'>damage</strong> by <strong>25%</strong><br>your inventory can only hold 1 <strong class='color-g'>gun</strong>`, description: `increase <strong class='color-d'>damage</strong> by <strong>22%</strong><br>your inventory can only hold 1 <strong class='color-g'>gun</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -213,7 +213,7 @@
}, },
{ {
name: "arsenal", name: "arsenal",
description: "increase <strong class='color-d'>damage</strong> by <strong>17%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory", description: "increase <strong class='color-d'>damage</strong> by <strong>14%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -473,7 +473,7 @@
}, },
{ {
name: "dead reckoning", name: "dead reckoning",
description: "increase <strong class='color-d'>damage</strong> by <strong>33%</strong> when at <strong>rest</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>30%</strong> when at <strong>rest</strong>",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 4, frequency: 4,
@@ -483,7 +483,7 @@
}, },
requires: "inertial frame", requires: "inertial frame",
effect: () => { effect: () => {
tech.restDamage += 0.33 tech.restDamage += 0.3
}, },
remove() { remove() {
tech.restDamage = 1; tech.restDamage = 1;
@@ -833,7 +833,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isBotSpawner return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner
}, },
requires: "an explosive damage source, no other mob death tech", requires: "an explosive damage source, no other mob death tech",
effect: () => { effect: () => {
@@ -850,7 +850,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.isBotSpawner return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner
}, },
requires: "no other mob death tech", requires: "no other mob death tech",
effect: () => { effect: () => {
@@ -867,7 +867,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.isBotSpawner return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.botSpawner
}, },
requires: "no other mob death tech", requires: "no other mob death tech",
effect() { effect() {
@@ -887,7 +887,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.isBotSpawner return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner
}, },
requires: "any mob death tech", requires: "any mob death tech",
effect: () => { effect: () => {
@@ -921,7 +921,7 @@
}, },
{ {
name: "anticorrelation", name: "anticorrelation",
description: "increase <strong class='color-d'>damage</strong> by <strong>100%</strong><br>after not using your <strong class='color-g'>gun</strong> or <strong class='color-f'>field</strong> for <strong>2</strong> seconds", description: "increase <strong class='color-d'>damage</strong> by <strong>90%</strong><br>after not using your <strong class='color-g'>gun</strong> or <strong class='color-f'>field</strong> for <strong>2</strong> seconds",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -938,20 +938,38 @@
}, },
{ {
name: "scrap bots", name: "scrap bots",
description: "<strong>20%</strong> chance to build a <strong class='color-bot'>bot</strong> after killing a mob<br>the <strong class='color-bot'>bot</strong> lasts for about <strong>20</strong> seconds", description: "<strong>33%</strong> chance after killing a mob to build<br>a scrap <strong class='color-bot'>bot</strong> that operates for <strong>10</strong> seconds",
maxCount: 3, maxCount: 3,
count: 0, count: 0,
frequency: 1, frequency: 1,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return b.totalBots() > 0 && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isExplodeMob return !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isExplodeMob //b.totalBots() > 0 &&
}, },
requires: "a bot and no other mob death tech", requires: "no other mob death tech",
effect() { effect() {
tech.isBotSpawner += 0.20; tech.botSpawner += 0.33;
}, },
remove() { remove() {
tech.isBotSpawner = 0; tech.botSpawner = 0;
}
},
{
name: "scrap refit",
description: "killing a mob resets your functional scrap <strong class='color-bot'>bots</strong><br>to <strong>10</strong> seconds of operation",
maxCount: 1,
count: 0,
frequency: 1,
isBotTech: true,
allowed() {
return tech.botSpawner
},
requires: "scrap bots",
effect() {
tech.isBotSpawnerReset = true;
},
remove() {
tech.isBotSpawnerReset = false;
} }
}, },
{ {
@@ -1211,7 +1229,7 @@
}, },
{ {
name: "dynamo-bot upgrade", name: "dynamo-bot upgrade",
description: "<strong>convert</strong> your bots to <strong>dynamo-bots</strong><br>dynamo-bots <strong>regen</strong> <strong>24</strong> <strong class='color-f'>energy</strong> per second", description: "<strong>convert</strong> your bots to <strong>dynamo-bots</strong><br>increase regen to <strong>22</strong> <strong class='color-f'>energy</strong> per second",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -1302,7 +1320,7 @@
}, },
{ {
name: "network effect", name: "network effect",
description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for each of your permanent <strong class='color-bot'>bots</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>5%</strong><br>for each of your permanent <strong class='color-bot'>bots</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -1554,7 +1572,7 @@
}, },
{ {
name: "NAND gate", name: "NAND gate",
description: "if in the <strong class='color-flop'>ON</strong> state<br>do <strong>55.5%</strong> more <strong class='color-d'>damage</strong>", description: "if in the <strong class='color-flop'>ON</strong> state<br>do <strong>45%</strong> more <strong class='color-d'>damage</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 4, frequency: 4,
@@ -1572,7 +1590,7 @@
}, },
{ {
name: "transistor", name: "transistor",
description: "if <strong class='color-flop'>ON</strong> regen <strong>22</strong> <strong class='color-f'>energy</strong> per second<br>if <strong class='color-flop'>OFF</strong> drain <strong>3.1</strong> <strong class='color-f'>energy</strong> per second", description: "if <strong class='color-flop'>ON</strong> regen <strong>22</strong> <strong class='color-f'>energy</strong> per second<br>if <strong class='color-flop'>OFF</strong> drain <strong>4.1</strong> <strong class='color-f'>energy</strong> per second",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 4, frequency: 4,
@@ -1910,7 +1928,7 @@
}, },
{ {
name: "exothermic process", name: "exothermic process",
description: "increase <strong class='color-d'>damage</strong> by <strong>50%</strong><br>if a mob <strong>dies</strong> drain <strong class='color-f'>energy</strong> by <strong>25%</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>45%</strong><br>if a mob <strong>dies</strong> drain <strong class='color-f'>energy</strong> by <strong>25%</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -1933,9 +1951,9 @@
frequency: 4, frequency: 4,
frequencyDefault: 4, frequencyDefault: 4,
allowed() { allowed() {
return tech.isEnergyLoss && m.maxEnergy < 1.1 && !tech.isSporeField && !tech.isRewindAvoidDeath return tech.isEnergyLoss && !tech.isRewindAvoidDeath
}, },
requires: "exothermic process, not max energy increase, CPT, or spore nano-scale", requires: "exothermic process, CPT",
effect() { effect() {
tech.isMaxEnergyTech = true; tech.isMaxEnergyTech = true;
m.setMaxEnergy() m.setMaxEnergy()
@@ -1970,12 +1988,10 @@
count: 0, count: 0,
frequency: 1, frequency: 1,
allowed() { allowed() {
return m.maxEnergy > 0.99 return true
}, },
requires: "max energy >= 1", requires: "",
effect() { effect() {
// m.maxEnergy += 0.5
// m.energy += 0.5
tech.bonusEnergy += 0.5 tech.bonusEnergy += 0.5
m.setMaxEnergy() m.setMaxEnergy()
}, },
@@ -2057,7 +2073,7 @@
}, },
{ {
name: "dormancy", name: "dormancy",
description: "if a mob has <strong>died</strong> in the last <strong>5 seconds</strong><br><span style = 'font-size:93%;'>increase <strong class='color-d'>damage</strong> by <strong>50%</strong> else decrease it by <strong>25%</strong></span>", description: "if a mob has <strong>died</strong> in the last <strong>5 seconds</strong><br><span style = 'font-size:93%;'>increase <strong class='color-d'>damage</strong> by <strong>40%</strong> else decrease it by <strong>15%</strong></span>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -2092,7 +2108,7 @@
}, },
{ {
name: "negative feedback", name: "negative feedback",
description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for every <strong>10</strong> <strong class='color-h'>health</strong> below <strong>100</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>5%</strong><br>for every <strong>10</strong> <strong class='color-h'>health</strong> below <strong>100</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -2109,7 +2125,7 @@
}, },
{ {
name: "antiscience", name: "antiscience",
description: "increase <strong class='color-d'>damage</strong> by <strong>100%</strong><br>lose <strong>11</strong> <strong class='color-h'>health</strong> when you pick up a <strong class='color-m'>tech</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>90%</strong><br>lose <strong>11</strong> <strong class='color-h'>health</strong> when you pick up a <strong class='color-m'>tech</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -2144,7 +2160,7 @@
}, },
{ {
name: "fluoroantimonic acid", name: "fluoroantimonic acid",
description: "increase <strong class='color-d'>damage</strong> by <strong>40%</strong><br>when your <strong class='color-h'>health</strong> is above <strong>100</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>35%</strong><br>when your <strong class='color-h'>health</strong> is above <strong>100</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -2615,7 +2631,7 @@
}, },
{ {
name: "futures exchange", name: "futures exchange",
description: "clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>adds <strong>4.5%</strong> power up <strong class='color-dup'>duplication</strong> chance", description: "clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>adds <strong>4.3%</strong> power up <strong class='color-dup'>duplication</strong> chance",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3889,7 +3905,7 @@
}, },
{ {
name: "drone repair", name: "drone repair",
description: "broken <strong>drones</strong> <strong>repair</strong> if the drone <strong class='color-g'>gun</strong> is active<br><strong>repairing</strong> has a <strong>33%</strong> chance to use an <strong class='color-g'>ammo</strong>", description: "broken <strong>drones</strong> <strong>repair</strong> if the drone <strong class='color-g'>gun</strong> is active<br><strong>repairing</strong> has a <strong>33%</strong> chance to use <strong>1</strong> <strong class='color-g'>ammo</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4399,7 +4415,7 @@
}, },
{ {
name: "eddy current brake", name: "eddy current brake",
description: "your stored <strong class='color-f'>energy</strong> projects a field that<br>limits the <strong>top speed</strong> of mobs", description: "project a field that limits the <strong>top speed</strong> of mobs<br>field <strong>radius</strong> scales with stored <strong class='color-f'>energy</strong>",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4553,7 +4569,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
}, },
requires: "nano-scale manufacturing", requires: "nano-scale manufacturing",
effect() { effect() {
@@ -4848,7 +4864,7 @@
}, },
{ {
name: "discrete optimization", name: "discrete optimization",
description: "increase <strong class='color-d'>damage</strong> by <strong>66%</strong><br><strong>50%</strong> increased <strong><em>delay</em></strong> after firing", description: "increase <strong class='color-d'>damage</strong> by <strong>50%</strong><br><strong>50%</strong> increased <strong><em>delay</em></strong> after firing",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4858,7 +4874,7 @@
}, },
requires: "metamaterial cloaking", requires: "metamaterial cloaking",
effect() { effect() {
tech.aimDamage = 1.66 tech.aimDamage = 1.5
b.setFireCD(); b.setFireCD();
}, },
remove() { remove() {
@@ -4946,7 +4962,7 @@
//************************************************** //**************************************************
{ {
name: "ship", name: "ship",
description: "<strong>experiment:</strong> fly around with no legs<br>aim with the keyboard", description: "<strong style='color: #f55;'>experiment:</strong> fly around with no legs<br>aim with the keyboard",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -4964,7 +4980,7 @@
}, },
{ {
name: "quantum leap", name: "quantum leap",
description: "<strong>experiment:</strong> every 20 seconds<br>become an alternate version of yourself", description: "<strong style='color: #f55;'>experiment:</strong> every 20 seconds<br>become an alternate version of yourself",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -4979,13 +4995,13 @@
setInterval(() => { setInterval(() => {
m.switchWorlds() m.switchWorlds()
simulation.trails() simulation.trails()
}, 20000); //every 20 sections }, 20000); //every 20 seconds
}, },
remove() {} remove() {}
}, },
{ {
name: "shields", name: "shields",
description: "<strong>experiment:</strong> every 5 seconds<br>all mobs gain a shield", description: "<strong style='color: #f55;'>experiment:</strong> every 5 seconds<br>all mobs gain a shield",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -5001,13 +5017,13 @@
for (let i = 0; i < mob.length; i++) { for (let i = 0; i < mob.length; i++) {
if (!mob[i].isShielded && !mob[i].shield && mob[i].dropPowerUp) spawn.shield(mob[i], mob[i].position.x, mob[i].position.y, 1, true); if (!mob[i].isShielded && !mob[i].shield && mob[i].dropPowerUp) spawn.shield(mob[i], mob[i].position.x, mob[i].position.y, 1, true);
} }
}, 5000); //every 5 sections }, 5000); //every 5 seconds
}, },
remove() {} remove() {}
}, },
{ {
name: "aim", name: "Fourier analysis",
description: "<strong>experiment:</strong> your aiming is random", description: "<strong style='color: #f55;'>experiment:</strong> your aiming is random",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -5030,6 +5046,31 @@
}, },
remove() {} remove() {}
}, },
{
name: "panopticon",
description: "<strong style='color: #f55;'>experiment:</strong> mobs can see you all the time",
maxCount: 1,
count: 0,
frequency: 0,
isNonRefundable: true,
isBadRandomOption: true,
isExperimentalMode: true,
allowed() {
return build.isExperimentSelection
},
requires: "",
effect() {
setInterval(() => {
for (let i = 0; i < mob.length; i++) {
if (!mob[i].shield && mob[i].dropPowerUp) {
mob[i].locatePlayer()
mob[i].seePlayer.yes = true;
}
}
}, 1000); //every 1 seconds
},
remove() {}
},
//************************************************** //**************************************************
//************************************************** JUNK //************************************************** JUNK
//************************************************** tech //************************************************** tech
@@ -5052,6 +5093,55 @@
// }, // },
// remove() {} // remove() {}
// }, // },
{
name: "panopticon",
description: "<strong>experiment:</strong> mobs can see you all the time",
maxCount: 1,
count: 0,
frequency: 0,
isExperimentHide: true,
isNonRefundable: true,
isJunk: true,
allowed() {
return build.isExperimentSelection
},
requires: "",
effect() {
setInterval(() => {
for (let i = 0; i < mob.length; i++) {
if (!mob[i].shield && mob[i].dropPowerUp) {
mob[i].locatePlayer()
mob[i].seePlayer.yes = true;
}
}
}, 1000); //every 1 seconds
},
remove() {}
},
{
name: "inverted mouse",
description: "your mouse is scrambled<br>it's fine, just rotate it 90 degrees",
maxCount: 1,
count: 0,
frequency: 0,
isExperimentHide: true,
isNonRefundable: true,
isJunk: true,
allowed() {
return !m.isShipMode
},
requires: "not ship",
effect() {
document.body.addEventListener("mousemove", (e) => {
const ratio = window.innerWidth / window.innerHeight
simulation.mouse.x = e.clientY * ratio
simulation.mouse.y = e.clientX / ratio;
});
},
remove() {
// m.look = m.lookDefault
}
},
{ {
name: "Fourier analysis", name: "Fourier analysis",
description: "your aiming is now controlled by this equation:<br>2sin(0.0133t) + sin(0.013t) + 0.5sin(0.031t)+ 0.33sin(0.03t)", description: "your aiming is now controlled by this equation:<br>2sin(0.0133t) + sin(0.013t) + 0.5sin(0.031t)+ 0.33sin(0.03t)",
@@ -5068,6 +5158,7 @@
m.look = () => { m.look = () => {
m.angle = 2 * Math.sin(m.cycle * 0.0133) + Math.sin(m.cycle * 0.013) + 0.5 * Math.sin(m.cycle * 0.031) + 0.33 * Math.sin(m.cycle * 0.03) m.angle = 2 * Math.sin(m.cycle * 0.0133) + Math.sin(m.cycle * 0.013) + 0.5 * Math.sin(m.cycle * 0.031) + 0.33 * Math.sin(m.cycle * 0.03)
const scale = 0.8; const scale = 0.8;
simulation.mouse.y
m.transSmoothX = canvas.width2 - m.pos.x - (simulation.mouse.x - canvas.width2) * scale; m.transSmoothX = canvas.width2 - m.pos.x - (simulation.mouse.x - canvas.width2) * scale;
m.transSmoothY = canvas.height2 - m.pos.y - (simulation.mouse.y - canvas.height2) * scale; m.transSmoothY = canvas.height2 - m.pos.y - (simulation.mouse.y - canvas.height2) * scale;
m.transX += (m.transSmoothX - m.transX) * 0.07; m.transX += (m.transSmoothX - m.transX) * 0.07;
@@ -5193,7 +5284,7 @@
setInterval(() => { setInterval(() => {
m.switchWorlds() m.switchWorlds()
simulation.trails() simulation.trails()
}, 20000); //every 30 sections }, 20000); //every 30 seconds
}, },
remove() {} remove() {}
}, },
@@ -5213,7 +5304,7 @@
effect() { effect() {
setInterval(() => { setInterval(() => {
alert(`The best combo is ${tech.tech[Math.floor(Math.random() * tech.tech.length)].name} with ${tech.tech[Math.floor(Math.random() * tech.tech.length)].name}!`); alert(`The best combo is ${tech.tech[Math.floor(Math.random() * tech.tech.length)].name} with ${tech.tech[Math.floor(Math.random() * tech.tech.length)].name}!`);
}, 30000); //every 30 sections }, 30000); //every 30 seconds
}, },
remove() {} remove() {}
}, },
@@ -6119,7 +6210,8 @@
renormalization: null, renormalization: null,
fragments: null, fragments: null,
isEnergyDamage: null, isEnergyDamage: null,
isBotSpawner: null, botSpawner: null,
isBotSpawnerReset: null,
waveHelix: null, waveHelix: null,
isSporeFollow: null, isSporeFollow: null,
isNailRadiation: null, isNailRadiation: null,

View File

@@ -1,9 +1,13 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
tech: automatic - always fire, but get 2.5x ammo experiment and junk: panopticon - mobs can see you all the time
requires inertial frame
tech: drone repair - while drones are your active gun, drones respawn with a 50% chance to consume ammo scrap bots now have a 33% chance to spawn for 10 seconds after killing a mob
(was 20% chance for 20 seconds)
tech: scrap refit - killing a mob resets your functional scrap bots back to 10 seconds of operation
several damage tech have reduced damage by about 10%
spores do 20% more damage, but last 1 second shorter
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
@@ -33,17 +37,19 @@ fix door.isOpen actually meaning isClosed?
(repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping (repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
quantum foam: hold fire to charge up foam, release fire to let go an amount relative to hold long you held fire
foam gun fires a bullet that tracks how long mouse is down
when mouse is up it streams out a hose of foam based on how long foam was down
bullet is small and hidden
make some bullets move super fast, but do collisions checks in .do()
check for hitting mobs or map with fractional velocity
if velocity is above 40ish
flipflop, but toggles after a kill flipflop, but toggles after a kill
tech shotgun - crouching makes your spread very small
remove spread reduction on nail shot
doesn't apply to slug
add water drops to sewers
new level: procedural generation new level: procedural generation
several small rooms are linked by portals several small rooms are linked by portals
the portals have a randomized pattern the portals have a randomized pattern