orbitals
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:
67
js/bullet.js
67
js/bullet.js
@@ -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
|
||||
|
||||
17
js/index.js
17
js/index.js
@@ -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)
|
||||
|
||||
13
js/level.js
13
js/level.js
@@ -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
|
||||
|
||||
128
js/player.js
128
js/player.js
@@ -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++) {
|
||||
|
||||
@@ -155,7 +155,7 @@ const powerUps = {
|
||||
}
|
||||
}
|
||||
if (tech.healGiveMaxEnergy) {
|
||||
tech.healMaxEnergyBonus += 0.04
|
||||
tech.healMaxEnergyBonus += 0.05
|
||||
m.setMaxEnergy();
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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) {
|
||||
|
||||
115
js/spawn.js
115
js/spawn.js
@@ -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,
|
||||
|
||||
260
js/tech.js
260
js/tech.js
@@ -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
|
||||
}
|
||||
14
style.css
14
style.css
@@ -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;
|
||||
|
||||
23
todo.txt
23
todo.txt
@@ -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?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user