ship mode can be found in the experimental menu

some mobs now have orbitals at random
new level boss: orbitalBoss

most late game bot tech has been buffed
tech: get 2 random bots, also when you switch guns cycle all bots to the same type
This commit is contained in:
landgreen
2021-02-17 06:44:33 -08:00
parent 4ebd87c6a8
commit 7e963881f6
11 changed files with 5421 additions and 5251 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -231,7 +231,7 @@ const b = {
fireCD: 1,
setFireCD() {
b.fireCD = tech.fireRate * tech.slowFire * tech.researchHaste * tech.aimDamage / tech.fastTime
if (tech.isFireRateForGuns) b.fireCD *= Math.pow(0.85, b.inventory.length)
if (tech.isFireRateForGuns) b.fireCD *= Math.pow(0.83, b.inventory.length)
if (tech.isFireNotMove) b.fireCD *= 0.33
},
fireAttributes(dir, rotate = true) {
@@ -2227,21 +2227,21 @@ const b = {
// **************************************************************************************************
// **************************************************************************************************
respawnBots() {
for (let i = 0; i < tech.dynamoBotCount; i++) b.dynamoBot({ x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.laserBotCount; i++) b.laserBot({ x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.nailBotCount; i++) b.nailBot({ x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.foamBotCount; i++) b.foamBot({ x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.boomBotCount; i++) b.boomBot({ x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.orbitBotCount; i++) b.orbitBot({ x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.plasmaBotCount; i++) b.plasmaBot({ x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.missileBotCount; i++) b.missileBot({ x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.dynamoBotCount; i++) b.dynamoBot({ x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.laserBotCount; i++) b.laserBot({ x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.nailBotCount; i++) b.nailBot({ x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.foamBotCount; i++) b.foamBot({ x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.boomBotCount; i++) b.boomBot({ x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.orbitBotCount; i++) b.orbitBot({ x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.plasmaBotCount; i++) b.plasmaBot({ x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, false)
for (let i = 0; i < tech.missileBotCount; i++) b.missileBot({ x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, false)
if (tech.isIntangible && m.isCloak) {
for (let i = 0; i < bullet.length; i++) {
if (bullet[i].botType) bullet[i].collisionFilter.mask = cat.map | cat.bullet | cat.mobBullet | cat.mobShield
}
}
},
randomBot(where = m.pos, isKeep = true, isAll = true) {
randomBot(where = player.position, isKeep = true, isAll = true) {
if (Math.random() < 0.167 && isAll) {
b.dynamoBot(where)
if (isKeep) tech.dynamoBotCount++;
@@ -2277,7 +2277,7 @@ const b = {
}
}
},
dynamoBot(position = m.pos, isConsole = true) {
dynamoBot(position = player.position, isConsole = true) {
if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.dynamoBot()`);
const me = bullet.length;
bullet[me] = Bodies.polygon(position.x, position.y, 5, 10, {
@@ -2305,17 +2305,17 @@ const b = {
followDelay: 0,
phase: Math.floor(60 * Math.random()),
do() {
// if (Vector.magnitude(Vector.sub(this.position, m.pos)) < 150) {
// if (Vector.magnitude(Vector.sub(this.position, player.position)) < 150) {
// ctx.fillStyle = "rgba(0,0,0,0.06)";
// ctx.beginPath();
// ctx.arc(this.position.x, this.position.y, 150, 0, 2 * Math.PI);
// ctx.fill();
// }
if (!((m.cycle + this.phase) % 30)) { //twice a second
if (Vector.magnitude(Vector.sub(this.position, m.pos)) < 250) { //give energy
if (Vector.magnitude(Vector.sub(this.position, player.position)) < 250) { //give energy
Matter.Body.setAngularVelocity(this, this.spin)
if (this.isUpgraded) {
m.energy += 0.06
m.energy += 0.12
simulation.drawList.push({ //add dmg to draw queue
x: this.position.x,
y: this.position.y,
@@ -2324,7 +2324,7 @@ const b = {
time: simulation.drawTime
});
} else {
m.energy += 0.02
m.energy += 0.03
simulation.drawList.push({ //add dmg to draw queue
x: this.position.x,
y: this.position.y,
@@ -2371,7 +2371,7 @@ const b = {
World.add(engine.world, bullet[me]); //add bullet to world
b.setDynamoBotDelay()
},
nailBot(position = { x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
nailBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.nailBot()`);
const me = bullet.length;
const dir = m.angle;
@@ -2406,13 +2406,14 @@ const b = {
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) {
this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 15 : 80)
this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 13 : 80)
let target
for (let i = 0, len = mob.length; i < len; i++) {
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
if (dist < 3000000 && //1400*1400
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) {
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60))
const SPEED = 50
const unit = Vector.normalise(Vector.sub(target, this.position))
@@ -2427,7 +2428,7 @@ const b = {
})
World.add(engine.world, bullet[me]); //add bullet to world
},
missileBot(position = { x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
missileBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.missileBot()`);
const me = bullet.length;
bullet[me] = Bodies.rectangle(position.x, position.y, 28, 11, {
@@ -2478,7 +2479,7 @@ const b = {
})
World.add(engine.world, bullet[me]); //add bullet to world
},
foamBot(position = { x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
foamBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.foamBot()`);
const me = bullet.length;
const dir = m.angle;
@@ -2493,7 +2494,7 @@ const b = {
restitution: 0.6 * (1 + 0.5 * Math.random()),
dmg: 0, // 0.14 //damage done in addition to the damage from momentum
minDmgSpeed: 2,
lookFrequency: 60 + Math.floor(17 * Math.random()) - 30 * tech.isFoamBotUpgrade,
lookFrequency: 60 + Math.floor(17 * Math.random()) - 35 * tech.isFoamBotUpgrade,
cd: 0,
delay: 100,
acceleration: 0.005 * (1 + 0.5 * Math.random()),
@@ -2523,7 +2524,7 @@ const b = {
const radius = 6 + 7 * Math.random()
const SPEED = 29 - radius * 0.5; //(m.crouch ? 32 : 20) - radius * 0.7;
const velocity = Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED)
b.foam(this.position, velocity, radius + 7 * this.isUpgraded)
b.foam(this.position, velocity, radius + 8 * this.isUpgraded)
break;
}
}
@@ -2533,7 +2534,7 @@ const b = {
})
World.add(engine.world, bullet[me]); //add bullet to world
},
laserBot(position = { x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
laserBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.laserBot()`);
const me = bullet.length;
const dir = m.angle;
@@ -2605,7 +2606,7 @@ const b = {
//hit target with laser
if (this.lockedOn && this.lockedOn.alive && m.energy > this.drainThreshold) {
m.energy -= tech.laserFieldDrain * tech.isLaserDiode
b.laser(this.vertices[0], this.lockedOn.position, b.dmgScale * (0.38 * tech.laserDamage + this.isUpgraded * 0.21), tech.laserReflections, false, 0.4) //tech.laserDamage = 0.16
b.laser(this.vertices[0], this.lockedOn.position, b.dmgScale * (0.38 * tech.laserDamage + this.isUpgraded * 0.25), tech.laserReflections, false, 0.4) //tech.laserDamage = 0.16
// laser(where = {
// x: m.pos.x + 20 * Math.cos(m.angle),
// y: m.pos.y + 20 * Math.sin(m.angle)
@@ -2618,7 +2619,7 @@ const b = {
})
World.add(engine.world, bullet[me]); //add bullet to world
},
boomBot(position = { x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
boomBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.boomBot()`);
const me = bullet.length;
const dir = m.angle;
@@ -2633,9 +2634,10 @@ const b = {
restitution: 1,
dmg: 0,
minDmgSpeed: 0,
lookFrequency: 43 + Math.floor(7 * Math.random()),
lookFrequency: 43 + Math.floor(7 * Math.random()) - 10 * tech.isBoomBotUpgrade,
acceleration: 0.005 * (1 + 0.5 * Math.random()),
range: 500 * (1 + 0.1 * Math.random()) + 350 * tech.isBoomBotUpgrade,
attackAcceleration: 0.012 + 0.005 * tech.isBoomBotUpgrade,
range: 500 * (1 + 0.1 * Math.random()) + 400 * tech.isBoomBotUpgrade,
endCycle: Infinity,
classType: "bullet",
collisionFilter: {
@@ -2646,7 +2648,7 @@ const b = {
explode: 0,
beforeDmg() {
if (this.lockedOn) {
const explosionRadius = Math.min(170 + 200 * this.isUpgraded, Vector.magnitude(Vector.sub(this.position, m.pos)) - 30)
const explosionRadius = Math.min(170 + 220 * this.isUpgraded, Vector.magnitude(Vector.sub(this.position, m.pos)) - 30)
if (explosionRadius > 60) {
this.explode = explosionRadius
//
@@ -2690,14 +2692,14 @@ const b = {
if (DIST - this.lockedOn.radius < this.range &&
Matter.Query.ray(map, this.position, this.lockedOn.position).length === 0) {
//move towards the target
this.force = Vector.add(this.force, Vector.mult(Vector.normalise(Vector.sub(this.lockedOn.position, this.position)), 0.012 * this.mass))
this.force = Vector.add(this.force, Vector.mult(Vector.normalise(Vector.sub(this.lockedOn.position, this.position)), this.attackAcceleration * this.mass))
}
}
}
})
World.add(engine.world, bullet[me]); //add bullet to world
},
plasmaBot(position = { x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
plasmaBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.plasmaBot()`);
const me = bullet.length;
const dir = m.angle;
@@ -2882,7 +2884,7 @@ const b = {
})
World.add(engine.world, bullet[me]); //add bullet to world
},
orbitBot(position = m.pos, isConsole = true) {
orbitBot(position = player.position, isConsole = true) {
if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.orbitBot()`);
const me = bullet.length;
bullet[me] = Bodies.polygon(position.x, position.y, 9, 12, {
@@ -2921,6 +2923,7 @@ const b = {
orbitalSpeed: 0,
phase: 2 * Math.PI * Math.random(),
do() {
//check for damage
if (!m.isCloak && !m.isBodiesAsleep) { //if time dilation isn't active
// q = Matter.Query.point(mob, this.position)
@@ -2938,7 +2941,7 @@ const b = {
})
for (let i = 0; i < q.length; i++) {
mobs.statusStun(q[i], 180)
const dmg = 0.5 * b.dmgScale * (this.isUpgraded ? 2.5 : 1) * (tech.isCrit ? 4 : 1)
const dmg = 0.5 * b.dmgScale * (this.isUpgraded ? 3 : 1) * (tech.isCrit ? 4 : 1)
q[i].damage(dmg);
q[i].foundPlayer();
simulation.drawList.push({ //add dmg to draw queue

View File

@@ -297,7 +297,7 @@ const build = {
//update tech text //disable not allowed tech
for (let i = 0, len = tech.tech.length; i < len; i++) {
const techID = document.getElementById("tech-" + i)
if (!tech.tech[i].isCustomHide) {
if (!tech.tech[i].isExperimentHide) {
if (tech.tech[i].allowed() || isAllowed || tech.tech[i].count > 0) {
const isCount = tech.tech[i].count > 1 ? `(${tech.tech[i].count}x)` : "";
if (tech.tech[i].isFieldTech) {
@@ -384,7 +384,7 @@ const build = {
}
for (let i = 0, len = tech.tech.length; i < len; i++) {
if (!tech.tech[i].isCustomHide) {
if (!tech.tech[i].isExperimentHide) {
if (!tech.tech[i].allowed()) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment"
text += `<div id="tech-${i}" class="experiment-grid-module experiment-grid-disabled"><div class="grid-title">${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>`
// } else if (tech.tech[i].count > 1) {
@@ -754,7 +754,9 @@ window.addEventListener("keydown", function(event) {
simulation.testing = false;
simulation.loop = simulation.normalLoop
if (simulation.isConstructionMode) document.getElementById("construct").style.display = 'none'
simulation.makeTextLog(`<em>exiting testing mode</em>`);
// document.getElementById("text-log").innerHTML = ""
simulation.lastLogTime = 0 //clear text log
// simulation.makeTextLog(`<em>exiting testing mode</em>`);
} else { //if (keys[191])
simulation.testing = true;
simulation.loop = simulation.testingLoop
@@ -783,7 +785,7 @@ window.addEventListener("keydown", function(event) {
</tr>
<tr>
<td class='key-input-pause'>H</td>
<td class='key-used'>infinite health</td>
<td class='key-used'>brief harm immunity</td>
</tr>
<tr>
<td class='key-input-pause'>N</td>
@@ -872,10 +874,11 @@ window.addEventListener("keydown", function(event) {
b.giveGuns("all", 1000)
break
case "h":
m.health = Infinity
// m.health = Infinity
m.immuneCycle = Infinity
// m.energy = Infinity
document.getElementById("health").style.display = "none"
document.getElementById("health-bg").style.display = "none"
// document.getElementById("health").style.display = "none"
// document.getElementById("health-bg").style.display = "none"
break
case "n":
m.addHealth(Infinity)

View File

@@ -29,10 +29,13 @@ const level = {
// tech.isMineSentry = true
// for (let i = 0; i < 60; i++) tech.giveTech("rivet diameter")
// tech.giveTech("missile-bot")
// for (let i = 0; i < 5; i++)
// tech.giveTech("nail-bot")
// for (let i = 0; i < 2; i++) tech.giveTech("foam-bot")
// for (let i = 0; i < 15; i++) tech.giveTech("plasma jet")
// tech.isBlockPowerUps = true;
// m.shipMode()
// tech.isBotSwap = true;
level.intro(); //starting level
// level.testing(); //not in rotation
@@ -80,7 +83,7 @@ const level = {
b.respawnBots();
m.resetHistory();
if (tech.isArmorFromPowerUps) {
tech.armorFromPowerUps += Math.min(0.03 * powerUps.totalPowerUps, 0.42)
tech.armorFromPowerUps += Math.min(0.03 * powerUps.totalPowerUps, 0.51)
m.setMaxHealth();
}
if (tech.isHealLowHealth) {
@@ -1090,7 +1093,7 @@ const level = {
// spawn.streamBoss(1600, -500)
// spawn.cellBossCulture(1600, -500)
// spawn.cellBossCulture(1600, -500)
// spawn.bomberBoss(1600, -500)
spawn.orbitalBoss(1600, -500)
// spawn.beamer(1200, -500)
// spawn.shield(mob[mob.length - 1], 1800, -120, 1);
@@ -1420,7 +1423,7 @@ const level = {
powerUps.spawn(2050, -150, "heal", false); //starting gun
// powerUps.spawn(2050, -150, "field", false); //starting gun
if (localSettings.levelsClearedLastGame < 6) {
if (!simulation.isCheating) {
if (!simulation.isCheating && !m.isShipMode) {
spawn.wireFoot();
spawn.wireFootLeft();
spawn.wireKnee();
@@ -1896,7 +1899,7 @@ const level = {
spawn.randomMob(3600, 1725, 0.9);
spawn.randomMob(4100, 1225, 0.9);
spawn.randomMob(2825, 400, 0.9);
if (simulation.difficulty > 3) spawn.randomLevelBoss(6000, 2300, ["spiderBoss", "launcherBoss", "laserTargetingBoss", "streamBoss", "historyBoss"]);
if (simulation.difficulty > 3) spawn.randomLevelBoss(6000, 2300, ["spiderBoss", "launcherBoss", "laserTargetingBoss", "streamBoss", "historyBoss", "orbitalBoss"]);
powerUps.addRerollToLevel() //needs to run after mobs are spawned
if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) spawn.randomLevelBoss(7725, 2275);
},
@@ -4123,7 +4126,7 @@ const level = {
World.add(engine.world, cons[cons.length - 1]);
if (simulation.difficulty > 4) spawn.nodeGroup(8000, 630, "spawns", 8, 20, 105);
} else {
spawn.randomLevelBoss(8000, 630, ["shooterBoss", "launcherBoss", "laserTargetingBoss", "spiderBoss", "laserBoss", "bomberBoss"]);
spawn.randomLevelBoss(8000, 630, ["shooterBoss", "launcherBoss", "laserTargetingBoss", "spiderBoss", "laserBoss", "bomberBoss", "orbitalBoss"]);
let me = mob[mob.length - 1];
me.onDeath = function() {
this.removeCons(); //remove constraint

View File

@@ -40,17 +40,6 @@ const m = {
});
Matter.Body.setMass(player, m.mass);
World.add(engine.world, [player]);
m.holdConstraint = Constraint.create({
//holding body constraint
pointA: {
x: 0,
y: 0
},
bodyB: jumpSensor, //setting constraint to jump sensor because it has to be on something until the player picks up things
stiffness: 0.4
});
World.add(engine.world, m.holdConstraint);
},
cycle: 600, //starts at 600 cycles instead of 0 to prevent bugs with m.history
lastKillCycle: 0,
@@ -484,15 +473,15 @@ const m = {
harmReduction() {
let dmg = 1
dmg *= m.fieldHarmReduction
if (tech.isBlockHarm && m.isHolding) dmg *= 0.25
if (tech.isBlockHarm && m.isHolding) dmg *= 0.2
if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage
if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.0185, 0.55)
if (tech.isSlowFPS) dmg *= 0.8
if (tech.isPiezo) dmg *= 0.85
if (tech.isHarmReduce && m.fieldUpgrades[m.fieldMode].name === "negative mass field" && m.isFieldActive) dmg *= 0.6
if (tech.isBotArmor) dmg *= 0.96 ** tech.totalBots()
if (tech.isHarmReduce && m.fieldUpgrades[m.fieldMode].name === "negative mass field" && m.isFieldActive) dmg *= 0.5
if (tech.isBotArmor) dmg *= 0.94 ** tech.totalBots()
if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33;
if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.6
if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.34
if (tech.energyRegen === 0) dmg *= 0.34
if (tech.isTurret && m.crouch) dmg *= 0.5;
if (tech.isFireMoveLock && input.fire) dmg *= 0.4;
@@ -2575,8 +2564,12 @@ const m = {
},
],
isShipMode: false,
shipMode() {
shipMode(thrust = 0.03, drag = 0.99, torque = 1.15, rotationDrag = 0.92) { // m.shipMode() //thrust = 0.03, drag = 0.99, torque = 1.15, rotationDrag = 0.92
if (!m.isShipMode) {
//if wires remove them
for (let i = 0; i < mob.length; i++) {
if (!mob[i].freeOfWires) mob[i].freeOfWires = true
}
m.isShipMode = true
simulation.isCheating = true
const points = [
@@ -2611,7 +2604,8 @@ const m = {
// Matter.Body.setDensity(player, 0.01); //extra dense //normal is 0.001 //makes effective life much larger
m.defaultMass = 30
Matter.Body.setMass(player, m.defaultMass);
player.friction = 0.07
player.friction = 0.05
player.restitution = 0.2
// player.frictionStatic = 0.1
// Matter.Body.setInertia(player, Infinity); //disable rotation
@@ -2620,14 +2614,40 @@ const m = {
// console.log(player.parts[0])
// Matter.Body.setVertices(player.parts[0], Matter.Vertices.create(points, player.parts[0]))
// console.log(player.parts[0].vertices)
m.spin = 0
// m.groundControl = () => {} //disable entering ground
m.onGround = false
playerOnGroundCheck = () => {}
m.airControl = () => { //tank controls
player.force.y -= player.mass * simulation.g; //undo gravity
Matter.Body.setVelocity(player, {
x: drag * player.velocity.x,
y: drag * player.velocity.y
});
if (input.up) { //forward thrust
player.force.x += thrust * Math.cos(m.angle) * tech.squirrelJump
player.force.y += thrust * Math.sin(m.angle) * tech.squirrelJump
} else if (input.down) {
player.force.x -= 0.6 * thrust * Math.cos(m.angle)
player.force.y -= 0.6 * thrust * Math.sin(m.angle)
}
//rotation
Matter.Body.setAngularVelocity(player, player.angularVelocity * rotationDrag)
if (input.right) {
player.torque += torque
} else if (input.left) {
player.torque -= torque
}
m.angle += m.spin
m.angle = player.angle
}
level.playerExitCheck = () => {
if (
player.position.x > level.exit.x &&
player.position.x < level.exit.x + 100 &&
player.position.y > level.exit.y - 150 &&
player.position.y < level.exit.y - 40 &&
player.speed < 4
player.position.y < level.exit.y - 40
) {
level.nextLevel()
}
@@ -2694,6 +2714,34 @@ const m = {
ctx.translate(player.position.x, player.position.y);
ctx.rotate(player.angle);
//thrust
if (input.up) {
var grd2 = ctx.createLinearGradient(0, 0, -150, 0);
// grd2.addColorStop(0, 'rgba(255, 255, 155, 0.8)');
// grd2.addColorStop(1, 'rgba(255, 200, 0, 0.1)');
grd2.addColorStop(0, 'rgba(150, 200, 255, 0.7)');
grd2.addColorStop(1, 'rgba(150, 200, 255, 0)');
ctx.fillStyle = grd2;
ctx.beginPath();
ctx.moveTo(-18, -25);
//10 * (Math.random() - 0.5), 10 * (Math.random() - 0.5)
ctx.lineTo(-18, 25);
ctx.lineTo(-50 - 100 * Math.random(), 0);
ctx.fill();
} else if (input.down) {
var grd2 = ctx.createLinearGradient(0, 0, 80, 0);
grd2.addColorStop(0, 'rgba(150, 200, 255, 0.7)');
grd2.addColorStop(1, 'rgba(150, 200, 255, 0)');
ctx.fillStyle = grd2;
ctx.beginPath();
ctx.moveTo(20, -16);
//10 * (Math.random() - 0.5), 10 * (Math.random() - 0.5)
ctx.lineTo(20, 16);
ctx.lineTo(35 + 43 * Math.random(), 0);
ctx.fill();
}
//body
ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI);
let grd = ctx.createLinearGradient(-30, 0, 30, 0);
@@ -2705,50 +2753,10 @@ const m = {
ctx.strokeStyle = "#333";
ctx.lineWidth = 2;
ctx.stroke();
ctx.restore();
}
m.spin = 0
// m.groundControl = () => {} //disable entering ground
m.onGround = false
playerOnGroundCheck = () => {}
m.airControl = () => { //tank controls
player.force.y -= player.mass * simulation.g; //undo gravity
const thrust = 0.03 * tech.squirrelJump //Math.max(0.1 / (0.01 + player.speed), 0.03) * tech.squirrelJump
// console.log(player.speed, thrust)
if (input.up) { //thrust
player.force.x += thrust * Math.cos(m.angle)
player.force.y += thrust * Math.sin(m.angle)
const friction = 0.99
Matter.Body.setVelocity(player, {
x: friction * player.velocity.x,
y: friction * player.velocity.y
});
} else if (input.down) {
player.force.x -= 0.7 * thrust * Math.cos(m.angle)
player.force.y -= 0.7 * thrust * Math.sin(m.angle)
const friction = 0.96
Matter.Body.setVelocity(player, {
x: friction * player.velocity.x,
y: friction * player.velocity.y
});
}
const spinChange = 1.1
if (input.right) {
player.torque += spinChange
// m.spin += spinChange
} else if (input.left) {
// m.spin -= spinChange
player.torque -= spinChange
}
Matter.Body.setAngularVelocity(player, player.angularVelocity * 0.9)
// m.spin *= 0.88 //spin friction
m.angle += m.spin //
m.angle = player.angle
}
//fix collisions
collisionChecks = (event) => {
const pairs = event.pairs;
for (let i = 0, j = pairs.length; i != j; i++) {

View File

@@ -155,7 +155,7 @@ const powerUps = {
}
}
if (tech.healGiveMaxEnergy) {
tech.healMaxEnergyBonus += 0.04
tech.healMaxEnergyBonus += 0.05
m.setMaxEnergy();
}
},

View File

@@ -362,7 +362,26 @@ const simulation = {
b.activeGun = b.inventory[b.inventoryGun];
simulation.updateGunHUD();
simulation.boldActiveGunHUD();
// m.drop();
if (tech.isBotSwap) {
//get total count
const countPermanent = tech.dynamoBotCount + tech.laserBotCount + tech.nailBotCount + tech.foamBotCount + tech.boomBotCount + tech.orbitBotCount
//remove all bots
tech.dynamoBotCount = 0
tech.laserBotCount = 0
tech.nailBotCount = 0
tech.foamBotCount = 0
tech.boomBotCount = 0
tech.orbitBotCount = 0
for (let i = 0; i < bullet.length; i++) {
if (bullet[i].botType && bullet[i].endCycle === Infinity) bullet[i].endCycle = 0 //don't remove temp bots
}
//set to a new type
options = [() => { tech.laserBotCount = countPermanent }, () => { tech.nailBotCount = countPermanent }, () => { tech.foamBotCount = countPermanent }, () => { tech.boomBotCount = countPermanent }, () => { tech.orbitBotCount = countPermanent }, () => { tech.dynamoBotCount = countPermanent }, ]
options[tech.botSwapCycleIndex]()
tech.botSwapCycleIndex++
if (tech.botSwapCycleIndex > options.length - 1) tech.botSwapCycleIndex = 0
b.respawnBots()
}
},
zoom: null,
zoomScale: 1000,
@@ -492,7 +511,11 @@ const simulation = {
document.getElementById("splash").style.display = "none"; //hides the element that spawned the function
document.getElementById("dmg").style.display = "inline";
document.getElementById("health-bg").style.display = "inline";
if (!m.isShipMode) {
m.spawn(); //spawns the player
} else {
World.add(engine.world, [player])
}
level.levels = level.playableLevels.slice(0) //copy array, not by just by assignment
if (simulation.isCommunityMaps) {

View File

@@ -68,6 +68,7 @@ const spawn = {
} else {
if (Math.random() < 0.07) {
this[pick](x, y, 90 + Math.random() * 40); //one extra large mob
spawn.spawnOrbitals(mob[mob.length - 1], radius + 50 + 200 * Math.random(), 1)
} else if (Math.random() < 0.35) {
this.blockGroup(x, y) //hidden grouping blocks
} else {
@@ -81,8 +82,8 @@ const spawn = {
}
}
},
randomLevelBoss(x, y, options = ["historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "snakeBoss", "streamBoss"]) {
// other bosses: suckerBoss, laserBoss, tetherBoss, //all need a particular level to work so they are not included
randomLevelBoss(x, y, options = ["orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "snakeBoss", "streamBoss"]) {
// other bosses: suckerBoss, laserBoss, tetherBoss, //these need a particular level to work so they are not included in the random pool
spawn[options[Math.floor(Math.random() * options.length)]](x, y)
},
//mob templates *********************************************************************************************
@@ -159,7 +160,7 @@ const spawn = {
const pushUp = Vector.add(velocity, { x: 0, y: -0.5 })
Matter.Body.setVelocity(body[i], Vector.add(body[i].velocity, pushUp));
}
//push away mobs
//damage all mobs
for (let i = 0, len = mob.length; i < len; ++i) {
if (mob[i] !== this) {
mob[i].damage(Infinity, true);
@@ -522,9 +523,9 @@ const spawn = {
}
},
cellBoss(x, y, radius = 20, cellID) {
mobs.spawn(x + Math.random(), y + Math.random(), 20, radius * (1 + 1.2 * Math.random()), "rgba(0,100,105,0)");
mobs.spawn(x + Math.random(), y + Math.random(), 20, radius * (1 + 1.2 * Math.random()), "rgba(0,100,105,0.4)");
let me = mob[mob.length - 1];
me.stroke = "#099"
me.stroke = "transparent"
me.isBoss = true;
me.isCell = true;
me.cellID = cellID
@@ -1198,7 +1199,7 @@ const spawn = {
},
historyBoss(x, y, radius = 30) {
if (tech.dynamoBotCount > 0) {
spawn.randomLevelBoss(x, y, ["cellBossCulture", "bomberBoss", "powerUpBoss"])
spawn.randomLevelBoss(x, y, ["cellBossCulture", "bomberBoss", "powerUpBoss", "orbitalBoss"])
return
}
mobs.spawn(x, y, 0, radius, "transparent");
@@ -1370,6 +1371,7 @@ const spawn = {
}
Matter.Body.setDensity(me, 0.023); //extra dense //normal is 0.001 //makes effective life much larger
spawn.shield(me, x, y, 1);
spawn.spawnOrbitals(me, radius + 100 + 100 * Math.random())
me.onHit = function() {
//run this function on hitting player
// this.explode();
@@ -1517,6 +1519,7 @@ const spawn = {
me.count = 0;
me.frictionAir = 0.03;
// me.torque -= me.inertia * 0.002
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
Matter.Body.setDensity(me, 0.05); //extra dense //normal is 0.001 //makes effective life much larger
// spawn.shield(me, x, y, 1); //not working, not sure why
me.onDeath = function() {
@@ -1875,8 +1878,8 @@ const spawn = {
}
ctx.lineTo(vertices[0].x, vertices[0].y);
ctx.lineWidth = 1;
ctx.strokeStyle = `rgba(0,0,0,${this.alpha * this.alpha})`;
ctx.stroke();
ctx.fillStyle = `rgba(255,255,255,${this.alpha * this.alpha})`;
ctx.fill();
} else if (this.canTouchPlayer) {
this.canTouchPlayer = false;
this.collisionFilter.mask = cat.bullet; //can't touch player or walls
@@ -1929,14 +1932,14 @@ const spawn = {
// },
bomberBoss(x, y, radius = 88) {
//boss that drops bombs from above and holds a set distance from player
mobs.spawn(x, y, 3, radius, "transparent");
mobs.spawn(x, y, 3, radius, "rgba(255,0,200,0.5)");
let me = mob[mob.length - 1];
me.isBoss = true;
Matter.Body.setDensity(me, 0.0014 + 0.0003 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
Matter.Body.setDensity(me, 0.004 + 0.00035 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.stroke = "rgba(255,0,200)"; //used for drawGhost
me.stroke = "transparent"; //used for drawGhost
me.seeAtDistance2 = 1500000;
me.fireFreq = Math.floor(120 * simulation.CDScale);
me.fireFreq = Math.floor(100 * simulation.CDScale);
me.searchTarget = map[Math.floor(Math.random() * (map.length - 1))].position; //required for search
me.hoverElevation = 460 + (Math.random() - 0.5) * 200; //squared
me.hoverXOff = (Math.random() - 0.5) * 100;
@@ -1949,6 +1952,7 @@ const spawn = {
// Matter.Body.setDensity(me, 0.0015); //extra dense //normal is 0.001
me.collisionFilter.mask = cat.player | cat.bullet
spawn.shield(me, x, y, 1);
spawn.spawnOrbitals(me, radius + 150 + 250 * Math.random(), 1)
me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
};
@@ -2062,7 +2066,6 @@ const spawn = {
this.explode(this.mass * 120);
};
me.onDeath = function() {
if (simulation.difficulty > 4) {
spawn.bullet(this.position.x, this.position.y, this.radius / 3, 5);
spawn.bullet(this.position.x, this.position.y, this.radius / 3, 5);
spawn.bullet(this.position.x, this.position.y, this.radius / 3, 5);
@@ -2090,7 +2093,6 @@ const spawn = {
y: -mag * v3.y
});
}
}
Matter.Body.setDensity(me, 0.00005); //normal is 0.001
me.timeLeft = 140 + Math.floor(Math.random() * 30);
me.g = 0.001; //required if using 'gravity'
@@ -2283,6 +2285,8 @@ const spawn = {
me.memory = 420;
me.repulsionRange = 1200000; //squared
spawn.shield(me, x, y, 1);
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
Matter.Body.setDensity(me, 0.004 + 0.0005 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
@@ -2326,6 +2330,8 @@ const spawn = {
me.memory = 240;
me.repulsionRange = 1200000; //squared
spawn.shield(me, x, y, 1);
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
Matter.Body.setDensity(me, 0.025); //extra dense //normal is 0.001 //makes effective life much larger
me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
@@ -2564,6 +2570,8 @@ const spawn = {
me.memory = 20;
Matter.Body.setDensity(me, 0.001 + 0.0005 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
spawn.shield(me, x, y, 1);
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
this.removeCons(); //remove constraint
@@ -2659,8 +2667,83 @@ const spawn = {
this.checkStatus();
};
},
//fan made mobs *****************************************************************************************
//*******************************************************************************************************
spawnOrbitals(who, radius, chance = Math.min(0.25 + simulation.difficulty * 0.005)) {
if (Math.random() < chance) {
// simulation.difficulty = 50
const len = Math.floor(Math.min(15, 3 + Math.sqrt(simulation.difficulty))) // simulation.difficulty = 40 on hard mode level 10
const speed = (0.007 + 0.003 * Math.random() + 0.004 * Math.sqrt(simulation.difficulty)) * ((Math.random() < 0.5) ? 1 : -1)
for (let i = 0; i < len; i++) spawn.orbital(who, radius, i / len * 2 * Math.PI, speed)
}
},
orbital(who, radius, phase, speed) {
// for (let i = 0, len = 7; i < len; i++) spawn.orbital(me, radius + 250, 2 * Math.PI / len * i)
mobs.spawn(0, 0, 8, 12, "rgb(255,0,150)");
let me = mob[mob.length - 1];
me.stroke = "transparent";
// Matter.Body.setDensity(me, 0.00004); //normal is 0.001
me.leaveBody = false;
me.dropPowerUp = false;
me.showHealthBar = false;
me.isShielded = true
me.collisionFilter.category = cat.mobBullet;
me.collisionFilter.mask = cat.bullet; //cat.player | cat.map | cat.body
me.do = function() {
//if host is gone
if (!who || !who.alive) {
this.death();
return
}
//set orbit
const time = simulation.cycle * speed + phase
const orbit = {
x: Math.cos(time),
y: Math.sin(time)
}
Matter.Body.setPosition(this, Vector.add(who.position, Vector.mult(orbit, radius))) //bullets move with player
//damage player
if (Matter.Query.collides(this, [player]).length > 0) {
m.damage(0.1 * simulation.dmgScale);
this.death();
}
};
},
orbitalBoss(x, y, radius = 88) {
const nodes = Math.floor(3 + 1 * Math.sqrt(simulation.difficulty))
mobs.spawn(x, y, nodes, radius, "rgb(255,0,150)");
let me = mob[mob.length - 1];
me.isBoss = true;
Matter.Body.setDensity(me, 0.004 + 0.00035 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.stroke = "transparent"; //used for drawGhost
me.seeAtDistance2 = 2000000;
me.accelMag = Math.floor(10 * (Math.random() + 4.5)) * 0.00001 * simulation.accelScale;
me.frictionAir = 0.005;
me.accelMag = 0.00017 * simulation.accelScale;
me.memory = Infinity;
me.collisionFilter.mask = cat.player | cat.bullet
spawn.shield(me, x, y, 1);
let speed = (0.006 + 0.002 * Math.sqrt(simulation.difficulty)) * ((Math.random() < 0.5) ? 1 : -1)
let range = radius + 125 + 250 * Math.random() + nodes * 5
for (let i = 0; i < nodes; i++) spawn.orbital(me, range, i / nodes * 2 * Math.PI, speed)
const orbitalIndexes = [] //find indexes for all the current nodes
for (let i = 0; i < nodes; i++) orbitalIndexes.push(mob.length - 1 - i)
// add orbitals for each orbital
range = 70 + Math.max(0, 140 * Math.random() - nodes * 3)
speed = speed * (1.5 + 2 * Math.random())
for (let j = 0; j < nodes; j++) {
for (let i = 0, len = nodes - 1; i < len; i++) spawn.orbital(mob[orbitalIndexes[j]], range, i / len * 2 * Math.PI, speed)
}
me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
};
me.do = function() {
this.seePlayerCheckByDistance();
this.checkStatus();
this.attraction();
};
},
//complex constrained mob templates**********************************************************************
//*******************************************************************************************************
allowShields: true,

View File

@@ -114,7 +114,7 @@ const tech = {
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
if (tech.isMaxEnergyTech) dmg *= 1.4
if (tech.isEnergyNoAmmo) dmg *= 1.5
if (tech.isDamageForGuns) dmg *= 1 + 0.15 * b.inventory.length
if (tech.isDamageForGuns) dmg *= 1 + 0.17 * b.inventory.length
if (tech.isLowHealthDmg) dmg *= 1 + 0.6 * Math.max(0, 1 - m.health)
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
if (tech.isEnergyLoss) dmg *= 1.5;
@@ -122,11 +122,11 @@ const tech = {
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
if (tech.isEnergyDamage) dmg *= 1 + m.energy / 9;
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038
if (tech.isRerollDamage) dmg *= 1 + 0.035 * 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.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 1.66
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.4, player.speed * 0.013)
if (tech.isBotDamage) dmg *= 1 + 0.04 * tech.totalBots()
if (tech.isBotDamage) dmg *= 1 + 0.06 * tech.totalBots()
return dmg * tech.slowFire * tech.aimDamage
},
duplicationChance() {
@@ -136,7 +136,7 @@ const tech = {
if (tech.is100Duplicate && tech.duplicationChance() > 0.99) {
tech.is100Duplicate = false
const range = 1000
const bossOptions = ["historyBoss", "cellBossCulture", "bomberBoss", "powerUpBoss", "suckerBoss"]
const bossOptions = ["historyBoss", "cellBossCulture", "bomberBoss", "powerUpBoss", "orbitalBoss"]
spawn.randomLevelBoss(m.pos.x + range, m.pos.y, bossOptions);
spawn.randomLevelBoss(m.pos.x, m.pos.y + range, bossOptions);
spawn.randomLevelBoss(m.pos.x - range, m.pos.y, bossOptions);
@@ -161,7 +161,6 @@ const tech = {
for (let i = 0; i < tech.tech.length; i++) {
if (tech.tech[i].name === "CPT gun") tech.tech[i].description = `adds the <strong>CPT</strong> <strong class='color-g'>gun</strong> to your inventory<br>it <strong>rewinds</strong> your <strong class='color-h'>health</strong>, <strong>velocity</strong>, and <strong>position</strong><br><div style = 'color: #f24'>replaces your current gun</div>`
}
},
remove() {
tech.isOneGun = false;
@@ -198,7 +197,7 @@ const tech = {
},
{
name: "arsenal",
description: "increase <strong class='color-d'>damage</strong> by <strong>15%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",
description: "increase <strong class='color-d'>damage</strong> by <strong>17%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",
maxCount: 1,
count: 0,
allowed() {
@@ -214,7 +213,7 @@ const tech = {
},
{
name: "active cooling",
description: "<strong>15%</strong> decreased <strong><em>delay</em></strong> after firing<br>for each <strong class='color-g'>gun</strong> in your inventory",
description: "<strong>17%</strong> decreased <strong><em>delay</em></strong> after firing<br>for each <strong class='color-g'>gun</strong> in your inventory",
maxCount: 1,
count: 0,
allowed() {
@@ -254,11 +253,11 @@ const tech = {
maxCount: 1, //random power up
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return tech.isGunCycle
return b.inventory.length > 2
},
requires: "generalist",
requires: "at least 3 guns",
effect() {
for (let i = 0; i < b.inventory.length; i++) {
if (Math.random() < 0.2) {
@@ -272,7 +271,6 @@ const tech = {
} else {
powerUps.spawn(m.pos.x + 10 * Math.random(), m.pos.y + 10 * Math.random(), "research");
}
}
},
remove() {}
@@ -707,7 +705,7 @@ const tech = {
},
{
name: "decorrelation",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>40%</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: "reduce <strong class='color-harm'>harm</strong> by <strong>66%</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,
count: 0,
allowed() {
@@ -723,7 +721,7 @@ const tech = {
},
{
name: "anticorrelation",
description: "increase <strong class='color-d'>damage</strong> by <strong>66%</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>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",
maxCount: 1,
count: 0,
allowed() {
@@ -739,7 +737,7 @@ const tech = {
},
{
name: "scrap bots",
description: "<strong>20%</strong> chance to build a <strong>bot</strong> after killing a mob<br>the bot lasts for about <strong>20</strong> seconds",
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",
maxCount: 3,
count: 0,
allowed() {
@@ -755,7 +753,7 @@ const tech = {
},
{
name: "nail-bot",
description: "a bot fires <strong>nails</strong> at mobs in line of sight",
description: "a <strong class='color-bot'>bot</strong> fires <strong>nails</strong> at mobs in line of sight",
maxCount: 9,
count: 0,
allowed() {
@@ -772,7 +770,7 @@ const tech = {
},
{
name: "nail-bot upgrade",
description: "<strong>500%</strong> increased <strong> fire rate</strong><br><em>applies to all current and future nail-bots</em>",
description: "<strong>500%</strong> increased <strong> fire rate</strong><br><em>applies to all current and future <strong class='color-bot'>nail-bots</strong></em>",
maxCount: 1,
count: 0,
allowed() {
@@ -794,7 +792,7 @@ const tech = {
},
{
name: "foam-bot",
description: "a bot fires <strong>foam</strong> at nearby mobs",
description: "a <strong class='color-bot'>bot</strong> fires <strong>foam</strong> at nearby mobs",
maxCount: 9,
count: 0,
allowed() {
@@ -811,7 +809,7 @@ const tech = {
},
{
name: "foam-bot upgrade",
description: "<strong>200%</strong> increased <strong>foam</strong> <strong>size</strong> and <strong>fire rate</strong><br><em>applies to all current and future foam-bots</em>",
description: "<strong>250%</strong> increased <strong>foam</strong> <strong>size</strong> and <strong>fire rate</strong><br><em>applies to all current and future <strong class='color-bot'>foam-bots</strong></em>",
maxCount: 1,
count: 0,
allowed() {
@@ -833,7 +831,7 @@ const tech = {
},
{
name: "boom-bot",
description: "a bot <strong>defends</strong> the space around you<br>ignites an <strong class='color-e'>explosion</strong> after hitting a mob",
description: "a <strong class='color-bot'>bot</strong> <strong>defends</strong> the space around you<br>ignites an <strong class='color-e'>explosion</strong> after hitting a mob",
maxCount: 9,
count: 0,
allowed() {
@@ -850,7 +848,7 @@ const tech = {
},
{
name: "boom-bot upgrade",
description: "<strong>250%</strong> increased <strong class='color-e'>explosion</strong> <strong class='color-d'>damage</strong> and size<br><em>applies to all current and future boom-bots</em>",
description: "<strong>250%</strong> increased <strong class='color-e'>explosion</strong> <strong class='color-d'>damage</strong> and size<br><em>applies to all current and future <strong class='color-bot'>boom-bots</strong></em>",
maxCount: 1,
count: 0,
allowed() {
@@ -872,7 +870,7 @@ const tech = {
},
{
name: "laser-bot",
description: "a bot uses <strong class='color-f'>energy</strong> to emit a <strong class='color-laser'>laser</strong> beam<br>that targets nearby mobs",
description: "a <strong class='color-bot'>bot</strong> uses <strong class='color-f'>energy</strong> to emit a <strong class='color-laser'>laser</strong> beam<br>that targets nearby mobs",
maxCount: 9,
count: 0,
allowed() {
@@ -889,7 +887,7 @@ const tech = {
},
{
name: "laser-bot upgrade",
description: "<strong>350%</strong> increased <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong><br><em>applies to all current and future laser-bots</em>",
description: "<strong>400%</strong> increased <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong><br><em>applies to all current and future <strong class='color-bot'>laser-bots</strong></em>",
maxCount: 1,
count: 0,
allowed() {
@@ -911,7 +909,7 @@ const tech = {
},
{
name: "orbital-bot",
description: "a bot is locked in <strong>orbit</strong> around you<br><strong>stuns</strong> and <strong class='color-d'>damages</strong> mobs on <strong>contact</strong>",
description: "a <strong class='color-bot'>bot</strong> is locked in <strong>orbit</strong> around you<br><strong>stuns</strong> and <strong class='color-d'>damages</strong> mobs on <strong>contact</strong>",
maxCount: 9,
count: 0,
allowed() {
@@ -928,7 +926,7 @@ const tech = {
},
{
name: "orbital-bot upgrade",
description: "increase <strong class='color-d'>damage</strong> by <strong>150%</strong> and <strong>radius</strong> by <strong>30%</strong><br><em>applies to all current and future orbit-bots</em>",
description: "increase <strong class='color-d'>damage</strong> by <strong>200%</strong> and <strong>radius</strong> by <strong>30%</strong><br><em>applies to all current and future <strong class='color-bot'>orbit-bots</strong></em>",
maxCount: 1,
count: 0,
allowed() {
@@ -960,7 +958,7 @@ const tech = {
},
{
name: "dynamo-bot",
description: "a bot <strong class='color-d'>damages</strong> mobs while it <strong>traces</strong> your path<br>regen <strong>4</strong> <strong class='color-f'>energy</strong> per second when it's near",
description: "a <strong class='color-bot'>bot</strong> <strong class='color-d'>damages</strong> mobs while it <strong>traces</strong> your path<br>regen <strong>6</strong> <strong class='color-f'>energy</strong> per second when it's near",
maxCount: 9,
count: 0,
allowed() {
@@ -977,7 +975,7 @@ const tech = {
},
{
name: "dynamo-bot upgrade",
description: "dynamo-bots <strong>regen</strong> <strong>12</strong> <strong class='color-f'>energy</strong> per second<br><em>applies to all current and future dynamo-bots</em>",
description: "<strong class='color-bot'>dynamo-bots</strong> <strong>regen</strong> <strong>24</strong> <strong class='color-f'>energy</strong> per second<br><em>applies to all current and future dynamo-bots</em>",
maxCount: 1,
count: 0,
allowed() {
@@ -999,13 +997,13 @@ const tech = {
},
{
name: "bot fabrication",
description: "anytime you collect <strong>5</strong> <strong class='color-r'>research</strong><br>use them to build a <strong>random bot</strong>",
description: "anytime you collect <strong>4</strong> <strong class='color-r'>research</strong><br>use them to build a random <strong class='color-bot'>bot</strong>",
maxCount: 1,
count: 0,
allowed() {
return powerUps.research.count > 5 || build.isExperimentSelection
return powerUps.research.count > 3 || build.isExperimentSelection
},
requires: "at least 6 research",
requires: "at least 4 research",
effect() {
tech.isRerollBots = true;
powerUps.research.changeRerolls(0)
@@ -1015,15 +1013,35 @@ const tech = {
tech.isRerollBots = false;
}
},
{
name: "electroactive polymers",
description: "build <strong>2</strong> random <strong class='color-bot'>bots</strong><br><strong>switching</strong> <strong>guns</strong> cycles <strong class='color-bot'>bots</strong> to the <strong>same</strong> type",
maxCount: 1,
isNonRefundable: true,
count: 0,
allowed() {
return tech.totalBots() > 2 && b.inventory.length > 1
},
requires: "at least 3 bots and 2 guns",
effect() {
tech.isBotSwap = true
b.randomBot()
b.randomBot()
},
remove() {
tech.isBotSwap = false
tech.botSwapCycleIndex = 0
}
},
{
name: "perimeter defense",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>4%</strong><br>for each of your permanent <strong>bots</strong>",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>6%</strong><br>for each of your permanent <strong class='color-bot'>bots</strong>",
maxCount: 1,
count: 0,
allowed() {
return tech.totalBots() > 5 && !tech.isEnergyHealth
return tech.totalBots() > 3 && !tech.isEnergyHealth
},
requires: "5 or more bots",
requires: "at least 4 bots",
effect() {
tech.isBotArmor = true
},
@@ -1032,13 +1050,13 @@ const tech = {
}
}, {
name: "network effect",
description: "increase <strong class='color-d'>damage</strong> by <strong>4%</strong><br>for each of your permanent <strong>bots</strong>",
description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for each of your permanent <strong class='color-bot'>bots</strong>",
maxCount: 1,
count: 0,
allowed() {
return tech.totalBots() > 6
return tech.totalBots() > 3
},
requires: "6 or more bots",
requires: "at least 4 bots",
effect() {
tech.isBotDamage = true
},
@@ -1048,46 +1066,34 @@ const tech = {
},
{
name: "bot replication",
description: "<strong class='color-dup'>duplicate</strong> your permanent <strong>bots</strong><br>remove <strong>all</strong> of your <strong class='color-g'>guns</strong>",
description: "<strong class='color-dup'>duplicate</strong> your permanent <strong class='color-bot'>bots</strong><br>remove <strong>all</strong> of your <strong class='color-g'>guns</strong>",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return tech.totalBots() > 3
},
requires: "at least 3 bots",
requires: "at least 4 bots",
effect() {
b.removeAllGuns();
simulation.makeGunHUD();
//double bots
for (let i = 0; i < tech.nailBotCount; i++) {
b.nailBot();
}
for (let i = 0; i < tech.nailBotCount; i++) b.nailBot();
tech.nailBotCount *= 2
for (let i = 0; i < tech.laserBotCount; i++) {
b.laserBot();
}
for (let i = 0; i < tech.laserBotCount; i++) b.laserBot();
tech.laserBotCount *= 2
for (let i = 0; i < tech.foamBotCount; i++) {
b.foamBot();
}
for (let i = 0; i < tech.foamBotCount; i++) b.foamBot();
tech.foamBotCount *= 2
for (let i = 0; i < tech.boomBotCount; i++) {
b.boomBot();
}
for (let i = 0; i < tech.boomBotCount; i++) b.boomBot();
tech.boomBotCount *= 2
for (let i = 0; i < tech.orbitBotCount; i++) {
b.orbitBot();
}
for (let i = 0; i < tech.orbitBotCount; i++) b.orbitBot();
tech.orbitBotCount *= 2
for (let i = 0; i < tech.plasmaBotCount; i++) {
b.plasmaBot();
}
for (let i = 0; i < tech.dynamoBotCount; i++) b.dynamoBot();
tech.dynamoBotCount *= 2
for (let i = 0; i < tech.plasmaBotCount; i++) b.plasmaBot();
tech.plasmaBotCount *= 2
for (let i = 0; i < tech.missileBotCount; i++) {
b.missileBot();
}
for (let i = 0; i < tech.missileBotCount; i++) b.missileBot();
tech.missileBotCount *= 2
},
remove() {}
@@ -1126,7 +1132,7 @@ const tech = {
},
{
name: "inelastic collision",
description: "while you are <strong>holding</strong> a <strong>block</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>75%</strong>",
description: "while you are <strong>holding</strong> a <strong>block</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>80%</strong>",
maxCount: 1,
count: 0,
allowed() {
@@ -1306,7 +1312,7 @@ const tech = {
},
{
name: "causality bots",
description: "when you <strong class='color-rewind'>rewind</strong>, build several <strong>bots</strong><br>that protect you for about <strong>9</strong> seconds",
description: "when you <strong class='color-rewind'>rewind</strong>, build several <strong class='color-bot'>bots</strong><br>that protect you for about <strong>9</strong> seconds",
maxCount: 3,
count: 0,
allowed() {
@@ -1355,7 +1361,7 @@ const tech = {
},
{
name: "ground state",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>60%</strong><br>you <strong>no longer</strong> passively regenerate <strong class='color-f'>energy</strong>",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>66%</strong><br>you <strong>no longer</strong> passively regenerate <strong class='color-f'>energy</strong>",
maxCount: 1,
count: 0,
allowed() {
@@ -1400,7 +1406,7 @@ const tech = {
},
{
name: "1st ionization energy",
description: "each <strong class='color-h'>heal</strong> <strong>power up</strong> you collect<br>increases your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>4</strong>",
description: "each <strong class='color-h'>heal</strong> <strong>power up</strong> you collect<br>increases your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>5</strong>",
maxCount: 1,
count: 0,
allowed() {
@@ -1674,7 +1680,7 @@ const tech = {
},
{
name: "inductive coupling",
description: "for each unused <strong>power up</strong> at the end of a <strong>level</strong><br>add 3 <strong>max</strong> <strong class='color-h'>health</strong> <em>(up to 42 health per level)</em>",
description: "for each unused <strong>power up</strong> at the end of a <strong>level</strong><br>add 3 <strong>max</strong> <strong class='color-h'>health</strong> <em>(up to 51 health per level)</em>",
maxCount: 1,
count: 0,
allowed() {
@@ -1931,6 +1937,7 @@ const tech = {
requires: "parthenogenesis",
effect() {
tech.is100Duplicate = true;
tech.maxDuplicationEvent()
},
remove() {
tech.is100Duplicate = false;
@@ -1942,7 +1949,7 @@ const tech = {
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return (tech.totalCount > 3) && !tech.isSuperDeterminism
},
@@ -1972,7 +1979,7 @@ const tech = {
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return (tech.totalCount > 3) && !tech.isSuperDeterminism && tech.duplicationChance() > 0
},
@@ -1999,7 +2006,7 @@ const tech = {
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return !tech.isSuperDeterminism && tech.duplicationChance() > 0 && powerUps.research.count > 1
},
@@ -2034,7 +2041,7 @@ const tech = {
},
{
name: "unified field theory",
description: `in the pause menu, change your <strong class='color-f'>field</strong><br>by <strong>clicking</strong> on your <strong class='color-f'>field's</strong> box`,
description: `in the <strong>pause</strong> menu, change your <strong class='color-f'>field</strong><br>by <strong>clicking</strong> on your <strong class='color-f'>field's</strong> box`,
maxCount: 1,
count: 0,
allowed() {
@@ -2053,7 +2060,7 @@ const tech = {
description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>16</strong> junk <strong class='color-m'>tech</strong> to the potential pool",
maxCount: 1,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
count: 0,
allowed() {
return powerUps.research.count === 0 && level.onLevel < 6
@@ -2193,8 +2200,8 @@ const tech = {
}
},
{
name: "perturbation theory",
description: "increase <strong class='color-d'>damage</strong> by <strong>3.5%</strong><br>for each <strong class='color-r'>research</strong> in your inventory",
name: "Bayesian statistics",
description: "increase <strong class='color-d'>damage</strong> by <strong>3.9%</strong><br>for each <strong class='color-r'>research</strong> in your inventory",
maxCount: 1,
count: 0,
allowed() {
@@ -2214,7 +2221,7 @@ const tech = {
maxCount: 1,
count: 0,
// isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return (tech.totalCount > 6)
},
@@ -2889,7 +2896,7 @@ const tech = {
},
{
name: "missile-bot",
description: "a bot fires <strong>missiles</strong> at far away mobs",
description: "a <strong class='color-bot'>bot</strong> fires <strong>missiles</strong> at far away mobs",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -3653,12 +3660,12 @@ const tech = {
},
{
name: "bot manufacturing",
description: "use <strong>nano-scale manufacturing</strong><br>to build <strong>3</strong> random <strong>bots</strong>",
description: "use <strong>nano-scale manufacturing</strong><br>to build <strong>3</strong> random <strong class='color-bot'>bots</strong>",
isFieldTech: true,
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing"
},
@@ -3673,12 +3680,12 @@ const tech = {
},
{
name: "bot prototypes",
description: "use <strong>nano-scale manufacturing</strong> to <strong>upgrade</strong><br>all bots of a random type and <strong>build</strong> <strong>2</strong> of that <strong>bot</strong>",
description: "use <strong>nano-scale manufacturing</strong> to <strong>upgrade</strong><br>all <strong class='color-bot'>bots</strong> of a random type and <strong>build</strong> <strong>2</strong> of that <strong class='color-bot'>bot</strong>",
isFieldTech: true,
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isNailBotUpgrade && tech.isFoamBotUpgrade && tech.isBoomBotUpgrade && tech.isLaserBotUpgrade && tech.isOrbitBotUpgrade)
},
@@ -3826,7 +3833,7 @@ const tech = {
},
{
name: "degenerate matter",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>40%</strong><br>while <strong>negative mass field</strong> is active",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>50%</strong><br>while <strong>negative mass field</strong> is active",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -3911,7 +3918,7 @@ const tech = {
},
{
name: "plasma-bot",
description: "a bot uses <strong class='color-f'>energy</strong> to emit <strong class='color-plasma'>plasma</strong><br>that <strong class='color-d'>damages</strong> and <strong>pushes</strong> mobs",
description: "a <strong class='color-bot'>bot</strong> uses <strong class='color-f'>energy</strong> to emit <strong class='color-plasma'>plasma</strong><br>that <strong class='color-d'>damages</strong> and <strong>pushes</strong> mobs",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -4138,7 +4145,7 @@ const tech = {
maxCount: 9,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return true
},
@@ -4155,7 +4162,7 @@ const tech = {
maxCount: 9,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return !tech.isEnergyNoAmmo
},
@@ -4172,7 +4179,7 @@ const tech = {
maxCount: 9,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return !tech.isSuperDeterminism
},
@@ -4189,7 +4196,7 @@ const tech = {
maxCount: 9,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return !tech.isSuperDeterminism
},
@@ -4206,7 +4213,7 @@ const tech = {
maxCount: 9,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return !tech.isSuperDeterminism
},
@@ -4217,6 +4224,21 @@ const tech = {
},
remove() {}
},
{
name: "ship",
description: "<strong>experimental mode:</strong> fly around with no legs",
maxCount: 1,
count: 0,
isNonRefundable: true,
allowed() {
return !m.isShipMode && m.fieldUpgrades[m.fieldMode].name !== "negative mass field" && build.isExperimentSelection
},
requires: "",
effect() {
m.shipMode()
},
remove() {}
},
],
addLoreTechToPool() { //adds lore tech to tech pool
if (!simulation.isCheating) {
@@ -4227,7 +4249,7 @@ const tech = {
count: 0,
isLore: true,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
allowed() {
return true
},
@@ -4257,7 +4279,7 @@ const tech = {
// count: 0,
// numberInPool: 0,
// isNonRefundable: true,
// isCustomHide: true,
// isExperimentHide: true,
// isJunk: true,
// allowed() {
// return true
@@ -4275,14 +4297,18 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
tech.removeJunkTechFromPool()
setTimeout(() => { //have to wait a sec so that the tech that is this doesn't get removed before it is done running
for (let i = tech.tech.length - 1; i > 0; i--) {
if (tech.tech[i].isJunk && tech.tech[i] !== this) tech.tech.splice(i, 1)
}
}, 1000);
},
remove() {}
},
@@ -4293,10 +4319,10 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode
return !m.isShipMode && m.fieldUpgrades[m.fieldMode].name !== "negative mass field"
},
requires: "",
effect() {
@@ -4312,7 +4338,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4333,7 +4359,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4351,7 +4377,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4370,7 +4396,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return m.fieldUpgrades[m.fieldMode].name !== "negative mass field"
@@ -4388,7 +4414,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4408,7 +4434,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4438,7 +4464,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4456,7 +4482,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4475,7 +4501,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4501,7 +4527,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4527,7 +4553,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4554,7 +4580,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4578,7 +4604,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode
@@ -4627,7 +4653,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode
@@ -4671,7 +4697,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode
@@ -4743,7 +4769,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4764,12 +4790,12 @@ const tech = {
},
{
name: "assimilation",
description: "all your <strong>bots</strong> are converted to the <strong>same</strong> random model",
description: "all your <strong class='color-bot'>bots</strong> are converted to the <strong>same</strong> random model",
maxCount: 1,
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return tech.totalBots() > 2
@@ -4827,7 +4853,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4845,7 +4871,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4863,7 +4889,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return b.inventory.length > 0
@@ -4891,7 +4917,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return powerUps.research.count > 3
@@ -4910,7 +4936,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -4929,7 +4955,7 @@ const tech = {
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -5147,5 +5173,7 @@ const tech = {
isDynamoBotUpgrade: null,
isBlockPowerUps: null,
isBlockHarm: null,
foamFutureFire: null
foamFutureFire: null,
isBotSwap: null,
botSwapCycleIndex: null
}

View File

@@ -552,6 +552,20 @@ summary {
/* text-decoration: underline; */
}
.color-bot {
/* background-color: #eee; */
/* color: #555; */
/* letter-spacing: -1.5px; */
/* text-transform: uppercase; */
/* font-variant: all-caps; */
/* text-decoration: underline solid; */
/* border: 1px solid #000; */
/* padding: 10px; */
/* border-radius: 10%; */
/* font-family: Lucida Console, Courier, monospace; */
/* color: #777; */
}
.color-cloaked {
opacity: 0.25;
letter-spacing: 1px;

View File

@@ -1,8 +1,12 @@
******************************************************** NEXT PATCH ********************************************************
added 2 new testing keys: J = clear mobs, H = infinity health
added junk tech: ship (it's hard to control, but you get better with practice)
m.shipMode() in console
ship mode can be found in the experimental menu
some mobs now have orbitals at random
new level boss: orbitalBoss
most late game bot tech has been buffed
tech: get 2 random bots, also when you switch guns cycle all bots to the same type
******************************************************** BUGS ********************************************************
@@ -32,14 +36,16 @@ use the floor of portal sensor on the player? to unstuck player
******************************************************** TODO ********************************************************
add a shipMode tech that only shows up in experimental mode
tech: spawn a bot after taking collision damage
tech: standing wave freezes the mobs it hits
tech: health becomes drones
requires mass-energy?
junk tech?
tech: 1/3 of the time foam fires 1 extra backwards foam
make a secret only accessible to the ship (very small + flying)
map: laboratory
rooms with switches that change physics
gravity room
@@ -66,7 +72,6 @@ copy time-like foam to other guns?
shotgun
nail gun
tech: when you switch guns switch all bots to a different bot
lore: a tutorial / lore intro
needs to be optional so it doesn't slow experienced players
@@ -360,7 +365,7 @@ n-gon outreach ideas
******************************************************** LORE ********************************************************
cool names for tech
strange loop, ansatz, Bayesian statistics
strange loop, ansatz, perturbation theory
voice singing with pitch?