refit
experiment and junk: panopticon - mobs can see you all the time scrap bots now have a 33% chance to spawn for 10 seconds after killing a mob (was 20% chance for 20 seconds) tech: scrap refit - killing a mob resets your functional scrap bots back to 10 seconds of operation several damage tech have reduced damage by about 10% spores do 20% more damage, but last 1 second shorter
This commit is contained in:
90
js/bullet.js
90
js/bullet.js
@@ -1814,14 +1814,14 @@ const b = {
|
|||||||
friction: 0,
|
friction: 0,
|
||||||
frictionAir: 0.025,
|
frictionAir: 0.025,
|
||||||
thrust: (tech.isFastSpores ? 0.001 : 0.0004) * (1 + 0.3 * (Math.random() - 0.5)),
|
thrust: (tech.isFastSpores ? 0.001 : 0.0004) * (1 + 0.3 * (Math.random() - 0.5)),
|
||||||
dmg: tech.isMutualism ? 12 : 5, //bonus damage from tech.isMutualism
|
dmg: tech.isMutualism ? 16.8 : 7, //bonus damage from tech.isMutualism
|
||||||
lookFrequency: 100 + Math.floor(117 * Math.random()),
|
lookFrequency: 100 + Math.floor(117 * Math.random()),
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body
|
mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body
|
||||||
},
|
},
|
||||||
endCycle: simulation.cycle + Math.floor((600 + Math.floor(Math.random() * 420)) * tech.isBulletsLastLonger),
|
endCycle: simulation.cycle + Math.floor((540 + Math.floor(Math.random() * 420)) * tech.isBulletsLastLonger),
|
||||||
minDmgSpeed: 0,
|
minDmgSpeed: 0,
|
||||||
playerOffPosition: { //used when moving towards player to keep spores separate
|
playerOffPosition: { //used when moving towards player to keep spores separate
|
||||||
x: 100 * (Math.random() - 0.5),
|
x: 100 * (Math.random() - 0.5),
|
||||||
@@ -2301,7 +2301,7 @@ const b = {
|
|||||||
World.add(engine.world, bullet[me]); //add bullet to world
|
World.add(engine.world, bullet[me]); //add bullet to world
|
||||||
Matter.Body.setVelocity(bullet[me], velocity);
|
Matter.Body.setVelocity(bullet[me], velocity);
|
||||||
},
|
},
|
||||||
targetedNail(position, num = 1, speed = 50 + 10 * Math.random(), range = 1200, isRandomAim = true) {
|
targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true) {
|
||||||
const targets = [] //target nearby mobs
|
const targets = [] //target nearby mobs
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
if (mob[i].dropPowerUp) {
|
if (mob[i].dropPowerUp) {
|
||||||
@@ -2321,7 +2321,7 @@ const b = {
|
|||||||
x: targets[index].x + SPREAD * (Math.random() - 0.5),
|
x: targets[index].x + SPREAD * (Math.random() - 0.5),
|
||||||
y: targets[index].y + SPREAD * (Math.random() - 0.5)
|
y: targets[index].y + SPREAD * (Math.random() - 0.5)
|
||||||
}
|
}
|
||||||
b.nail(position, Vector.mult(Vector.normalise(Vector.sub(WHERE, position)), speed), 1.1)
|
b.nail(position, Vector.mult(Vector.normalise(Vector.sub(WHERE, position)), speed))
|
||||||
} else if (isRandomAim) { // aim in random direction
|
} else if (isRandomAim) { // aim in random direction
|
||||||
const ANGLE = 2 * Math.PI * Math.random()
|
const ANGLE = 2 * Math.PI * Math.random()
|
||||||
b.nail(position, {
|
b.nail(position, {
|
||||||
@@ -2331,7 +2331,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nail(pos, velocity, dmg = 0) {
|
nail(pos, velocity, dmg = 1) {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
bullet[me] = Bodies.rectangle(pos.x, pos.y, 25, 2, b.fireAttributes(Math.atan2(velocity.y, velocity.x)));
|
bullet[me] = Bodies.rectangle(pos.x, pos.y, 25, 2, b.fireAttributes(Math.atan2(velocity.y, velocity.x)));
|
||||||
Matter.Body.setVelocity(bullet[me], velocity);
|
Matter.Body.setVelocity(bullet[me], velocity);
|
||||||
@@ -2492,7 +2492,7 @@ const b = {
|
|||||||
if (Vector.magnitude(Vector.sub(this.position, player.position)) < 250) { //give energy
|
if (Vector.magnitude(Vector.sub(this.position, player.position)) < 250) { //give energy
|
||||||
Matter.Body.setAngularVelocity(this, this.spin)
|
Matter.Body.setAngularVelocity(this, this.spin)
|
||||||
if (this.isUpgraded) {
|
if (this.isUpgraded) {
|
||||||
m.energy += 0.12
|
m.energy += 0.11
|
||||||
simulation.drawList.push({ //add dmg to draw queue
|
simulation.drawList.push({ //add dmg to draw queue
|
||||||
x: this.position.x,
|
x: this.position.x,
|
||||||
y: this.position.y,
|
y: this.position.y,
|
||||||
@@ -2583,16 +2583,16 @@ const b = {
|
|||||||
} else { //close to player
|
} else { //close to player
|
||||||
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
|
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
|
||||||
if (this.lastLookCycle < simulation.cycle && !m.isCloak) {
|
if (this.lastLookCycle < simulation.cycle && !m.isCloak) {
|
||||||
this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 15 : 80)
|
this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 21 : 110)
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
||||||
if (dist < 3000000 && //1400*1400
|
if (dist < 3000000 && //1400*1400
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0 &&
|
||||||
!mob[i].isShielded) {
|
!mob[i].isShielded) {
|
||||||
const SPEED = 40
|
const SPEED = 35
|
||||||
const unit = Vector.normalise(Vector.sub(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60)), this.position))
|
const unit = Vector.normalise(Vector.sub(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60)), this.position))
|
||||||
b.nail(this.position, Vector.mult(unit, SPEED), 0.4)
|
b.nail(this.position, Vector.mult(unit, SPEED))
|
||||||
this.force = Vector.mult(unit, -0.01 * this.mass)
|
this.force = Vector.mult(unit, -0.01 * this.mass)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3343,14 +3343,13 @@ const b = {
|
|||||||
},
|
},
|
||||||
baseFire(angle) {
|
baseFire(angle) {
|
||||||
const speed = 30 + 6 * Math.random() + 9 * tech.nailInstantFireRate
|
const speed = 30 + 6 * Math.random() + 9 * tech.nailInstantFireRate
|
||||||
const dmg = 0.9
|
|
||||||
b.nail({
|
b.nail({
|
||||||
x: m.pos.x + 30 * Math.cos(m.angle),
|
x: m.pos.x + 30 * Math.cos(m.angle),
|
||||||
y: m.pos.y + 30 * Math.sin(m.angle)
|
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||||
}, {
|
}, {
|
||||||
x: m.Vx / 2 + speed * Math.cos(angle),
|
x: m.Vx / 2 + speed * Math.cos(angle),
|
||||||
y: m.Vy / 2 + speed * Math.sin(angle)
|
y: m.Vy / 2 + speed * Math.sin(angle)
|
||||||
}, dmg) //position, velocity, damage
|
}) //position, velocity, damage
|
||||||
if (tech.isIceCrystals) {
|
if (tech.isIceCrystals) {
|
||||||
bullet[bullet.length - 1].beforeDmg = function(who) {
|
bullet[bullet.length - 1].beforeDmg = function(who) {
|
||||||
mobs.statusSlow(who, 60)
|
mobs.statusSlow(who, 60)
|
||||||
@@ -3374,35 +3373,9 @@ const b = {
|
|||||||
defaultAmmoPack: 5.5,
|
defaultAmmoPack: 5.5,
|
||||||
have: false,
|
have: false,
|
||||||
fire() {
|
fire() {
|
||||||
|
|
||||||
// if (true) {
|
|
||||||
// const direction = {
|
|
||||||
// x: Math.cos(m.angle),
|
|
||||||
// y: Math.sin(m.angle)
|
|
||||||
// }
|
|
||||||
// for (let i = 0; i < 2; i++) {
|
|
||||||
// const push = Vector.mult(Vector.perp(direction), 0.08)
|
|
||||||
// const where = {
|
|
||||||
// x: m.pos.x + 40 * direction.x,
|
|
||||||
// y: m.pos.y + 40 * direction.y
|
|
||||||
// }
|
|
||||||
// b.missile(where, m.angle, 0, 0.5) //where, angle, speed, size = 1)
|
|
||||||
// // bullet[bullet.length - 1].force.x += push.x;
|
|
||||||
// // bullet[bullet.length - 1].force.y += push.y;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// setTimeout(() => {
|
|
||||||
// if (!simulation.paused) {
|
|
||||||
// b.foam(position, velocity, radius)
|
|
||||||
// bullet[bullet.length - 1].damage = (1 + 1.53 * tech.foamFutureFire) * (tech.isFastFoam ? 0.048 : 0.012) //double damage
|
|
||||||
// }
|
|
||||||
// }, 350 * tech.foamFutureFire);
|
|
||||||
|
|
||||||
|
|
||||||
let knock, spread
|
let knock, spread
|
||||||
if (m.crouch) {
|
if (m.crouch) {
|
||||||
spread = 0.75
|
spread = 0.65
|
||||||
m.fireCDcycle = m.cycle + Math.floor(55 * b.fireCD); // cool down
|
m.fireCDcycle = m.cycle + Math.floor(55 * b.fireCD); // cool down
|
||||||
if (tech.isShotgunImmune && m.immuneCycle < m.cycle + Math.floor(58 * b.fireCD)) m.immuneCycle = m.cycle + Math.floor(58 * b.fireCD); //player is immune to damage for 30 cycles
|
if (tech.isShotgunImmune && m.immuneCycle < m.cycle + Math.floor(58 * b.fireCD)) m.immuneCycle = m.cycle + Math.floor(58 * b.fireCD); //player is immune to damage for 30 cycles
|
||||||
knock = 0.01
|
knock = 0.01
|
||||||
@@ -3476,25 +3449,25 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (tech.isIncendiary) {
|
} else if (tech.isIncendiary) {
|
||||||
const SPEED = m.crouch ? 35 : 25
|
spread *= 0.15
|
||||||
const END = Math.floor(m.crouch ? 9 : 6);
|
const END = Math.floor(m.crouch ? 10 : 7);
|
||||||
const totalBullets = 8
|
const totalBullets = 10
|
||||||
const angleStep = (m.crouch ? 0.15 : 0.4) / totalBullets
|
const angleStep = (m.crouch ? 0.4 : 1.3) / totalBullets
|
||||||
let dir = m.angle - angleStep * totalBullets / 2;
|
let dir = m.angle - angleStep * totalBullets / 2;
|
||||||
for (let i = 0; i < totalBullets; i++) { //5 -> 7
|
for (let i = 0; i < totalBullets; i++) { //5 -> 7
|
||||||
dir += angleStep
|
dir += angleStep
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
bullet[me] = Bodies.rectangle(m.pos.x + 50 * Math.cos(m.angle), m.pos.y + 50 * Math.sin(m.angle), 17, 4, b.fireAttributes(dir));
|
bullet[me] = Bodies.rectangle(m.pos.x + 50 * Math.cos(m.angle), m.pos.y + 50 * Math.sin(m.angle), 17, 4, b.fireAttributes(dir));
|
||||||
const end = END + Math.random() * 3
|
const end = END + Math.random() * 4
|
||||||
bullet[me].endCycle = 2 * end + simulation.cycle
|
bullet[me].endCycle = 2 * end + simulation.cycle
|
||||||
const speed = SPEED * end / END
|
const speed = 25 * end / END
|
||||||
const dirOff = dir + 0.15 * (Math.random() - 0.5)
|
const dirOff = dir + (Math.random() - 0.5) * spread
|
||||||
Matter.Body.setVelocity(bullet[me], {
|
Matter.Body.setVelocity(bullet[me], {
|
||||||
x: speed * Math.cos(dirOff),
|
x: speed * Math.cos(dirOff),
|
||||||
y: speed * Math.sin(dirOff)
|
y: speed * Math.sin(dirOff)
|
||||||
});
|
});
|
||||||
bullet[me].onEnd = function() {
|
bullet[me].onEnd = function() {
|
||||||
b.explosion(this.position, 100 + (Math.random() - 0.5) * 30); //makes bullet do explosive damage at end
|
b.explosion(this.position, 135 + (Math.random() - 0.5) * 40); //makes bullet do explosive damage at end
|
||||||
}
|
}
|
||||||
bullet[me].beforeDmg = function() {
|
bullet[me].beforeDmg = function() {
|
||||||
this.endCycle = 0; //bullet ends cycle after hitting a mob and triggers explosion
|
this.endCycle = 0; //bullet ends cycle after hitting a mob and triggers explosion
|
||||||
@@ -3503,33 +3476,32 @@ const b = {
|
|||||||
World.add(engine.world, bullet[me]); //add bullet to world
|
World.add(engine.world, bullet[me]); //add bullet to world
|
||||||
}
|
}
|
||||||
} else if (tech.isNailShot) {
|
} else if (tech.isNailShot) {
|
||||||
|
spread *= 0.4
|
||||||
if (m.crouch) {
|
if (m.crouch) {
|
||||||
for (let i = 0; i < 11; i++) {
|
for (let i = 0; i < 17; i++) {
|
||||||
const dir = m.angle + (Math.random() - 0.5) * 0.015
|
const dir = m.angle + (Math.random() - 0.5) * spread
|
||||||
const pos = {
|
const pos = {
|
||||||
x: m.pos.x + 35 * Math.cos(m.angle) + 15 * (Math.random() - 0.5),
|
x: m.pos.x + 35 * Math.cos(m.angle) + 15 * (Math.random() - 0.5),
|
||||||
y: m.pos.y + 35 * Math.sin(m.angle) + 15 * (Math.random() - 0.5)
|
y: m.pos.y + 35 * Math.sin(m.angle) + 15 * (Math.random() - 0.5)
|
||||||
}
|
}
|
||||||
speed = 39 + 7 * Math.random()
|
speed = 48 + 8 * Math.random()
|
||||||
const velocity = {
|
b.nail(pos, {
|
||||||
x: speed * Math.cos(dir),
|
x: speed * Math.cos(dir),
|
||||||
y: speed * Math.sin(dir)
|
y: speed * Math.sin(dir)
|
||||||
}
|
})
|
||||||
b.nail(pos, velocity, 1.2)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (let i = 0; i < 15; i++) {
|
for (let i = 0; i < 17; i++) {
|
||||||
const dir = m.angle + (Math.random() - 0.5) * 0.42
|
const dir = m.angle + (Math.random() - 0.5) * spread
|
||||||
const pos = {
|
const pos = {
|
||||||
x: m.pos.x + 35 * Math.cos(m.angle) + 15 * (Math.random() - 0.5),
|
x: m.pos.x + 35 * Math.cos(m.angle) + 15 * (Math.random() - 0.5),
|
||||||
y: m.pos.y + 35 * Math.sin(m.angle) + 15 * (Math.random() - 0.5)
|
y: m.pos.y + 35 * Math.sin(m.angle) + 15 * (Math.random() - 0.5)
|
||||||
}
|
}
|
||||||
speed = 34 + 6 * Math.random()
|
speed = 48 + 8 * Math.random()
|
||||||
const velocity = {
|
b.nail(pos, {
|
||||||
x: speed * Math.cos(dir),
|
x: speed * Math.cos(dir),
|
||||||
y: speed * Math.sin(dir)
|
y: speed * Math.sin(dir)
|
||||||
}
|
})
|
||||||
b.nail(pos, velocity, 1.2)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -3888,7 +3860,7 @@ const b = {
|
|||||||
name: "spores",
|
name: "spores",
|
||||||
description: "fire a <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> that discharges <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> seek out nearby mobs",
|
description: "fire a <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> that discharges <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> seek out nearby mobs",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 3.5,
|
ammoPack: 3,
|
||||||
have: false,
|
have: false,
|
||||||
fire() {
|
fire() {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
|
|||||||
@@ -400,7 +400,7 @@ const build = {
|
|||||||
if (!tech.tech[i].isExperimentHide) {
|
if (!tech.tech[i].isExperimentHide) {
|
||||||
if (tech.tech[i].allowed()) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment"
|
if (tech.tech[i].allowed()) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment"
|
||||||
if (tech.tech[i].isExperimentalMode) {
|
if (tech.tech[i].isExperimentalMode) {
|
||||||
text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')">${tech.tech[i].description}</div>`
|
text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title">${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
|
||||||
} else {
|
} else {
|
||||||
text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title"><div class="circle-grid tech"></div> ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
|
text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title"><div class="circle-grid tech"></div> ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
|
||||||
}
|
}
|
||||||
|
|||||||
42
js/level.js
42
js/level.js
@@ -12,15 +12,15 @@ const level = {
|
|||||||
start() {
|
start() {
|
||||||
if (level.levelsCleared === 0) { //this code only runs on the first level
|
if (level.levelsCleared === 0) { //this code only runs on the first level
|
||||||
// simulation.enableConstructMode() //used to build maps in testing mode
|
// simulation.enableConstructMode() //used to build maps in testing mode
|
||||||
// level.difficultyIncrease(125)
|
// level.difficultyIncrease(50)
|
||||||
// simulation.zoomScale = 1000;
|
// simulation.zoomScale = 1000;
|
||||||
// simulation.setZoom();
|
// simulation.setZoom();
|
||||||
// m.setField("nano-scale manufacturing")
|
// m.setField("nano-scale manufacturing")
|
||||||
// b.giveGuns("spores")
|
// b.giveGuns("shotgun")
|
||||||
// tech.isExplodeRadio = true
|
// tech.isExplodeRadio = true
|
||||||
// for (let i = 0; i < 1; i++) tech.giveTech("dynamo-bot")
|
// for (let i = 0; i < 1; i++) tech.giveTech("dynamo-bot")
|
||||||
// tech.giveTech("needle gun")
|
// tech.giveTech("incendiary ammunition")
|
||||||
// tech.giveTech("ceramic needles")
|
// tech.giveTech("flip-flop")
|
||||||
// tech.giveTech("causality bombs")
|
// tech.giveTech("causality bombs")
|
||||||
// tech.giveTech("cardinality")
|
// tech.giveTech("cardinality")
|
||||||
// tech.giveTech("Bayesian statistics")
|
// tech.giveTech("Bayesian statistics")
|
||||||
@@ -1077,7 +1077,6 @@ const level = {
|
|||||||
spawn.mapRect(6400, -200, 400, 300); //right wall
|
spawn.mapRect(6400, -200, 400, 300); //right wall
|
||||||
spawn.mapRect(6700, -1800, 800, 2600); //right wall
|
spawn.mapRect(6700, -1800, 800, 2600); //right wall
|
||||||
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump
|
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump
|
||||||
// spawn.boost(1500, 0, 900);
|
|
||||||
|
|
||||||
// simulation.difficulty = 30
|
// simulation.difficulty = 30
|
||||||
// spawn.starter(1900, -500, 200) //big boy
|
// spawn.starter(1900, -500, 200) //big boy
|
||||||
@@ -1098,7 +1097,7 @@ const level = {
|
|||||||
// spawn.beamer(1200, -500)
|
// spawn.beamer(1200, -500)
|
||||||
// spawn.shield(mob[mob.length - 1], 1800, -120, 1);
|
// spawn.shield(mob[mob.length - 1], 1800, -120, 1);
|
||||||
|
|
||||||
spawn.nodeGroup(1200, -500, "sniper")
|
spawn.nodeGroup(1200, -500, "pulsar")
|
||||||
// spawn.snakeBoss(1200, -500)
|
// spawn.snakeBoss(1200, -500)
|
||||||
// spawn.powerUpBoss(2900, -500)
|
// spawn.powerUpBoss(2900, -500)
|
||||||
// spawn.randomMob(1600, -500)
|
// spawn.randomMob(1600, -500)
|
||||||
@@ -1715,7 +1714,30 @@ const level = {
|
|||||||
const balance3 = level.spinner(2608, 1900, 584, 25, 0.001) //falling
|
const balance3 = level.spinner(2608, 1900, 584, 25, 0.001) //falling
|
||||||
const balance4 = level.spinner(9300, 2205, 25, 380, 0.001) //exit
|
const balance4 = level.spinner(9300, 2205, 25, 380, 0.001) //exit
|
||||||
|
|
||||||
|
const drip = {
|
||||||
|
x: 7150,
|
||||||
|
y: 0,
|
||||||
|
speed: 0
|
||||||
|
}
|
||||||
level.custom = () => {
|
level.custom = () => {
|
||||||
|
const dripCycle = (simulation.cycle % 200) //drips
|
||||||
|
if (dripCycle < 70) {
|
||||||
|
if (!m.isBodiesAsleep) {
|
||||||
|
if (dripCycle === 0) {
|
||||||
|
drip.y = 1900
|
||||||
|
drip.x = 4600 + 4400 * Math.random()
|
||||||
|
drip.speed = 1
|
||||||
|
}
|
||||||
|
drip.speed += 0.35 //acceleration from gravity
|
||||||
|
drip.y += drip.speed
|
||||||
|
}
|
||||||
|
// if (drip.y > 2900) console.log(dripCycle)
|
||||||
|
ctx.fillStyle = "hsla(160, 100%, 35%, 0.5)" //"hsla(160, 100%, 35%,0.75)"
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(drip.x, drip.y, 8, 0, 2 * Math.PI);
|
||||||
|
ctx.fill();
|
||||||
|
}
|
||||||
|
|
||||||
button.query();
|
button.query();
|
||||||
button.draw();
|
button.draw();
|
||||||
hazard.query();
|
hazard.query();
|
||||||
@@ -2579,7 +2601,7 @@ const level = {
|
|||||||
spawn.mapRect(-4450, -3075, 450, 25);
|
spawn.mapRect(-4450, -3075, 450, 25);
|
||||||
spawn.mapRect(-4025, -3075, 25, 100);
|
spawn.mapRect(-4025, -3075, 25, 100);
|
||||||
spawn.mapRect(-4275, -2785, 100, 25);
|
spawn.mapRect(-4275, -2785, 100, 25);
|
||||||
spawn.bodyRect(-3830, -2400, 50, 50);
|
spawn.bodyRect(-3900, -2400, 50, 50);
|
||||||
|
|
||||||
//mobs
|
//mobs
|
||||||
spawn.randomMob(-2500, -2700, 1);
|
spawn.randomMob(-2500, -2700, 1);
|
||||||
@@ -2942,9 +2964,7 @@ const level = {
|
|||||||
spawn.mapRect(3650, -1300, 50, 700); //exit wall
|
spawn.mapRect(3650, -1300, 50, 700); //exit wall
|
||||||
spawn.mapRect(3650, -1300, 1350, 50); //exit wall
|
spawn.mapRect(3650, -1300, 1350, 50); //exit wall
|
||||||
spawn.bodyRect(3665, -600, 20, 100); //door
|
spawn.bodyRect(3665, -600, 20, 100); //door
|
||||||
spawn.mapRect(3000, -550, 375, 75);
|
spawn.mapVertex(3160, -525, "625 0 300 0 300 -140 500 -140"); //entrance/exit ramp
|
||||||
spawn.mapRect(3000, -600, 225, 75);
|
|
||||||
|
|
||||||
spawn.mapRect(3000, -2000 * 0.5, 700, 50); //exit roof
|
spawn.mapRect(3000, -2000 * 0.5, 700, 50); //exit roof
|
||||||
spawn.mapRect(3000, -2000 * 0.25, 2000 - 300, 50); //1st floor
|
spawn.mapRect(3000, -2000 * 0.25, 2000 - 300, 50); //1st floor
|
||||||
spawn.spawnStairs(3000 + 2000 - 50, 0, 4, 250, 350, true); //stairs ground
|
spawn.spawnStairs(3000 + 2000 - 50, 0, 4, 250, 350, true); //stairs ground
|
||||||
@@ -3928,7 +3948,7 @@ const level = {
|
|||||||
};
|
};
|
||||||
level.customTopLayer = () => {
|
level.customTopLayer = () => {
|
||||||
ctx.fillStyle = "rgba(64,64,64,0.97)";
|
ctx.fillStyle = "rgba(64,64,64,0.97)";
|
||||||
ctx.fillRect(1175, -400, 275, 175);
|
ctx.fillRect(2800, -400, 275, 175);
|
||||||
|
|
||||||
hazard.draw();
|
hazard.draw();
|
||||||
doorBedroom.draw();
|
doorBedroom.draw();
|
||||||
|
|||||||
@@ -1053,9 +1053,14 @@ const mobs = {
|
|||||||
} else if (tech.nailsDeathMob) {
|
} else if (tech.nailsDeathMob) {
|
||||||
b.targetedNail(this.position, tech.nailsDeathMob, 39 + 6 * Math.random())
|
b.targetedNail(this.position, tech.nailsDeathMob, 39 + 6 * Math.random())
|
||||||
}
|
}
|
||||||
if (Math.random() < tech.isBotSpawner) {
|
if (tech.isBotSpawnerReset) {
|
||||||
|
for (let i = 0, len = bullet.length; i < len; i++) {
|
||||||
|
if (bullet[i].botType && !bullet[i].isKeep) bullet[i].endCycle = simulation.cycle + 660 //10 seconds and 1 extra second for fun
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Math.random() < tech.botSpawner) {
|
||||||
b.randomBot(this.position, false)
|
b.randomBot(this.position, false)
|
||||||
bullet[bullet.length - 1].endCycle = simulation.cycle + 1000 + Math.floor(400 * Math.random())
|
bullet[bullet.length - 1].endCycle = simulation.cycle + 660 //10 seconds and 1 extra second for fun
|
||||||
this.leaveBody = false; // no body since it turned into the bot
|
this.leaveBody = false; // no body since it turned into the bot
|
||||||
}
|
}
|
||||||
} else if (tech.isShieldAmmo && this.shield && !this.isBonusShield) {
|
} else if (tech.isShieldAmmo && this.shield && !this.isBonusShield) {
|
||||||
|
|||||||
23
js/player.js
23
js/player.js
@@ -1600,16 +1600,23 @@ const m = {
|
|||||||
name: "nano-scale manufacturing",
|
name: "nano-scale manufacturing",
|
||||||
description: "use <strong class='color-f'>energy</strong> to <strong>block</strong> mobs<br>excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br><strong>double</strong> your default <strong class='color-f'>energy</strong> regeneration",
|
description: "use <strong class='color-f'>energy</strong> to <strong>block</strong> mobs<br>excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br><strong>double</strong> your default <strong class='color-f'>energy</strong> regeneration",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
|
// m.fieldMeterColor = "#0c5"
|
||||||
|
// m.eyeFillColor = m.fieldMeterColor
|
||||||
m.hold = function() {
|
m.hold = function() {
|
||||||
if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 200 && (m.cycle % 2)) {
|
if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 200 && (m.cycle % 2)) {
|
||||||
if (tech.isSporeField) {
|
if (tech.isSporeField) {
|
||||||
// const len = Math.floor(5 + 4 * Math.random())
|
for (let i = 0; i < 30; i++) {
|
||||||
const len = Math.ceil(m.energy * 10)
|
m.energy -= 0.11
|
||||||
m.energy = 0;
|
if (m.energy > 0) {
|
||||||
for (let i = 0; i < len; i++) b.spore(m.pos)
|
b.spore(m.pos)
|
||||||
|
} else {
|
||||||
|
m.energy = 0.01
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (tech.isMissileField) {
|
} else if (tech.isMissileField) {
|
||||||
m.energy -= 0.5;
|
m.energy -= 0.4;
|
||||||
b.missile({ x: m.pos.x, y: m.pos.y - 40 }, -Math.PI / 2, 0, 1)
|
b.missile({ x: m.pos.x, y: m.pos.y - 40 }, -Math.PI / 2 + 0.5 * (Math.random() - 0.5), 0, 1)
|
||||||
} else if (tech.isIceField) {
|
} else if (tech.isIceField) {
|
||||||
m.energy -= 0.057;
|
m.energy -= 0.057;
|
||||||
b.iceIX(1)
|
b.iceIX(1)
|
||||||
@@ -1907,7 +1914,7 @@ const m = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency"
|
name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency"
|
||||||
description: "<strong class='color-cloaked'>cloak</strong> after not using your gun or field<br>while <strong class='color-cloaked'>cloaked</strong> mobs can't see you<br>increase <strong class='color-d'>damage</strong> by <strong>133%</strong>",
|
description: "<strong class='color-cloaked'>cloak</strong> after not using your gun or field<br>while <strong class='color-cloaked'>cloaked</strong> mobs can't see you<br>increase <strong class='color-d'>damage</strong> by <strong>121%</strong>",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
m.fieldFire = true;
|
m.fieldFire = true;
|
||||||
m.fieldMeterColor = "#333";
|
m.fieldMeterColor = "#333";
|
||||||
@@ -1915,7 +1922,7 @@ const m = {
|
|||||||
// m.eyeFillColor = '#333'
|
// m.eyeFillColor = '#333'
|
||||||
m.fieldPhase = 0;
|
m.fieldPhase = 0;
|
||||||
m.isCloak = false
|
m.isCloak = false
|
||||||
m.fieldDamage = 2.33 // 1 + 111/100
|
m.fieldDamage = 2.21 // 1 + 111/100
|
||||||
m.fieldDrawRadius = 0
|
m.fieldDrawRadius = 0
|
||||||
const drawRadius = 1000
|
const drawRadius = 1000
|
||||||
|
|
||||||
|
|||||||
@@ -793,7 +793,7 @@ const simulation = {
|
|||||||
if (tech.isFlipFlopOn) {
|
if (tech.isFlipFlopOn) {
|
||||||
m.energy += 0.22;
|
m.energy += 0.22;
|
||||||
} else {
|
} else {
|
||||||
m.energy -= 0.031;
|
m.energy -= 0.041;
|
||||||
if (m.energy < 0) m.energy = 0
|
if (m.energy < 0) m.energy = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1580,6 +1580,8 @@ const spawn = {
|
|||||||
const sub = Vector.sub(this.homePosition, this.position)
|
const sub = Vector.sub(this.homePosition, this.position)
|
||||||
const dist = Vector.magnitude(sub)
|
const dist = Vector.magnitude(sub)
|
||||||
if (dist > 250) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002)
|
if (dist > 250) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002)
|
||||||
|
} else {
|
||||||
|
this.isFiring = false
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@@ -1700,6 +1702,8 @@ const spawn = {
|
|||||||
const sub = Vector.sub(this.homePosition, this.position)
|
const sub = Vector.sub(this.homePosition, this.position)
|
||||||
const dist = Vector.magnitude(sub)
|
const dist = Vector.magnitude(sub)
|
||||||
if (dist > 350) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002)
|
if (dist > 350) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002)
|
||||||
|
} else {
|
||||||
|
this.isFiring = false
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
204
js/tech.js
204
js/tech.js
@@ -124,31 +124,31 @@
|
|||||||
damageFromTech() {
|
damageFromTech() {
|
||||||
let dmg = m.fieldDamage
|
let dmg = m.fieldDamage
|
||||||
if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ...
|
if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ...
|
||||||
if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555
|
if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.45
|
||||||
if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599
|
if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599
|
||||||
if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.75
|
if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.4 : 0.85
|
||||||
if (tech.isTechDamage) dmg *= 2
|
if (tech.isTechDamage) dmg *= 1.9
|
||||||
if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance())
|
if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance())
|
||||||
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
|
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
|
||||||
if (tech.isMaxEnergyTech) dmg *= 1.4
|
if (tech.isMaxEnergyTech) dmg *= 1.4
|
||||||
if (tech.isEnergyNoAmmo) dmg *= 1.5
|
if (tech.isEnergyNoAmmo) dmg *= 1.5
|
||||||
if (tech.isDamageForGuns) dmg *= 1 + 0.17 * b.inventory.length
|
if (tech.isDamageForGuns) dmg *= 1 + 0.14 * b.inventory.length
|
||||||
if (tech.isLowHealthDmg) dmg *= 1 + 0.6 * Math.max(0, 1 - m.health)
|
if (tech.isLowHealthDmg) dmg *= 1 + 0.5 * Math.max(0, 1 - m.health)
|
||||||
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
|
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
|
||||||
if (tech.isEnergyLoss) dmg *= 1.5;
|
if (tech.isEnergyLoss) dmg *= 1.45;
|
||||||
if (tech.isAcidDmg && m.health > 1) dmg *= 1.4;
|
if (tech.isAcidDmg && m.health > 1) dmg *= 1.35;
|
||||||
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
|
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
|
||||||
if (tech.isEnergyDamage) dmg *= 1 + m.energy / 9;
|
if (tech.isEnergyDamage) dmg *= 1 + m.energy / 9;
|
||||||
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038
|
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038
|
||||||
if (tech.isRerollDamage) dmg *= 1 + 0.039 * powerUps.research.count
|
if (tech.isRerollDamage) dmg *= 1 + 0.039 * powerUps.research.count
|
||||||
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25
|
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.22
|
||||||
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2
|
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 1.9
|
||||||
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.43, player.speed * 0.015)
|
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.43, player.speed * 0.015)
|
||||||
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
|
if (tech.isBotDamage) dmg *= 1 + 0.05 * b.totalBots()
|
||||||
return dmg * tech.slowFire * tech.aimDamage
|
return dmg * tech.slowFire * tech.aimDamage
|
||||||
},
|
},
|
||||||
duplicationChance() {
|
duplicationChance() {
|
||||||
return (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + m.duplicateChance
|
return (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.043 + tech.duplicateChance + m.duplicateChance
|
||||||
},
|
},
|
||||||
maxDuplicationEvent() {
|
maxDuplicationEvent() {
|
||||||
if (tech.is100Duplicate && tech.duplicationChance() > 0.99) {
|
if (tech.is100Duplicate && tech.duplicationChance() > 0.99) {
|
||||||
@@ -163,7 +163,7 @@
|
|||||||
},
|
},
|
||||||
tech: [{
|
tech: [{
|
||||||
name: "integrated armament",
|
name: "integrated armament",
|
||||||
description: `increase <strong class='color-d'>damage</strong> by <strong>25%</strong><br>your inventory can only hold 1 <strong class='color-g'>gun</strong>`,
|
description: `increase <strong class='color-d'>damage</strong> by <strong>22%</strong><br>your inventory can only hold 1 <strong class='color-g'>gun</strong>`,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -213,7 +213,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "arsenal",
|
name: "arsenal",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>17%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>14%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -473,7 +473,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "dead reckoning",
|
name: "dead reckoning",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>33%</strong> when at <strong>rest</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>30%</strong> when at <strong>rest</strong>",
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 4,
|
frequency: 4,
|
||||||
@@ -483,7 +483,7 @@
|
|||||||
},
|
},
|
||||||
requires: "inertial frame",
|
requires: "inertial frame",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
tech.restDamage += 0.33
|
tech.restDamage += 0.3
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.restDamage = 1;
|
tech.restDamage = 1;
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isBotSpawner
|
return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner
|
||||||
},
|
},
|
||||||
requires: "an explosive damage source, no other mob death tech",
|
requires: "an explosive damage source, no other mob death tech",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
@@ -850,7 +850,7 @@
|
|||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.isBotSpawner
|
return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner
|
||||||
},
|
},
|
||||||
requires: "no other mob death tech",
|
requires: "no other mob death tech",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
@@ -867,7 +867,7 @@
|
|||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.isBotSpawner
|
return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.botSpawner
|
||||||
},
|
},
|
||||||
requires: "no other mob death tech",
|
requires: "no other mob death tech",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.isBotSpawner
|
return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner
|
||||||
},
|
},
|
||||||
requires: "any mob death tech",
|
requires: "any mob death tech",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
@@ -921,7 +921,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "anticorrelation",
|
name: "anticorrelation",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>100%</strong><br>after not using your <strong class='color-g'>gun</strong> or <strong class='color-f'>field</strong> for <strong>2</strong> seconds",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>90%</strong><br>after not using your <strong class='color-g'>gun</strong> or <strong class='color-f'>field</strong> for <strong>2</strong> seconds",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -938,20 +938,38 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "scrap bots",
|
name: "scrap bots",
|
||||||
description: "<strong>20%</strong> chance to build a <strong class='color-bot'>bot</strong> after killing a mob<br>the <strong class='color-bot'>bot</strong> lasts for about <strong>20</strong> seconds",
|
description: "<strong>33%</strong> chance after killing a mob to build<br>a scrap <strong class='color-bot'>bot</strong> that operates for <strong>10</strong> seconds",
|
||||||
maxCount: 3,
|
maxCount: 3,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
isBotTech: true,
|
isBotTech: true,
|
||||||
allowed() {
|
allowed() {
|
||||||
return b.totalBots() > 0 && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isExplodeMob
|
return !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isExplodeMob //b.totalBots() > 0 &&
|
||||||
},
|
},
|
||||||
requires: "a bot and no other mob death tech",
|
requires: "no other mob death tech",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isBotSpawner += 0.20;
|
tech.botSpawner += 0.33;
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.isBotSpawner = 0;
|
tech.botSpawner = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "scrap refit",
|
||||||
|
description: "killing a mob resets your functional scrap <strong class='color-bot'>bots</strong><br>to <strong>10</strong> seconds of operation",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 1,
|
||||||
|
isBotTech: true,
|
||||||
|
allowed() {
|
||||||
|
return tech.botSpawner
|
||||||
|
},
|
||||||
|
requires: "scrap bots",
|
||||||
|
effect() {
|
||||||
|
tech.isBotSpawnerReset = true;
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
tech.isBotSpawnerReset = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1211,7 +1229,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "dynamo-bot upgrade",
|
name: "dynamo-bot upgrade",
|
||||||
description: "<strong>convert</strong> your bots to <strong>dynamo-bots</strong><br>dynamo-bots <strong>regen</strong> <strong>24</strong> <strong class='color-f'>energy</strong> per second",
|
description: "<strong>convert</strong> your bots to <strong>dynamo-bots</strong><br>increase regen to <strong>22</strong> <strong class='color-f'>energy</strong> per second",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -1302,7 +1320,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "network effect",
|
name: "network effect",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for each of your permanent <strong class='color-bot'>bots</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>5%</strong><br>for each of your permanent <strong class='color-bot'>bots</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -1554,7 +1572,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "NAND gate",
|
name: "NAND gate",
|
||||||
description: "if in the <strong class='color-flop'>ON</strong> state<br>do <strong>55.5%</strong> more <strong class='color-d'>damage</strong>",
|
description: "if in the <strong class='color-flop'>ON</strong> state<br>do <strong>45%</strong> more <strong class='color-d'>damage</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 4,
|
frequency: 4,
|
||||||
@@ -1572,7 +1590,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "transistor",
|
name: "transistor",
|
||||||
description: "if <strong class='color-flop'>ON</strong> regen <strong>22</strong> <strong class='color-f'>energy</strong> per second<br>if <strong class='color-flop'>OFF</strong> drain <strong>3.1</strong> <strong class='color-f'>energy</strong> per second",
|
description: "if <strong class='color-flop'>ON</strong> regen <strong>22</strong> <strong class='color-f'>energy</strong> per second<br>if <strong class='color-flop'>OFF</strong> drain <strong>4.1</strong> <strong class='color-f'>energy</strong> per second",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 4,
|
frequency: 4,
|
||||||
@@ -1910,7 +1928,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "exothermic process",
|
name: "exothermic process",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>50%</strong><br>if a mob <strong>dies</strong> drain <strong class='color-f'>energy</strong> by <strong>25%</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>45%</strong><br>if a mob <strong>dies</strong> drain <strong class='color-f'>energy</strong> by <strong>25%</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -1933,9 +1951,9 @@
|
|||||||
frequency: 4,
|
frequency: 4,
|
||||||
frequencyDefault: 4,
|
frequencyDefault: 4,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.isEnergyLoss && m.maxEnergy < 1.1 && !tech.isSporeField && !tech.isRewindAvoidDeath
|
return tech.isEnergyLoss && !tech.isRewindAvoidDeath
|
||||||
},
|
},
|
||||||
requires: "exothermic process, not max energy increase, CPT, or spore nano-scale",
|
requires: "exothermic process, CPT",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isMaxEnergyTech = true;
|
tech.isMaxEnergyTech = true;
|
||||||
m.setMaxEnergy()
|
m.setMaxEnergy()
|
||||||
@@ -1970,12 +1988,10 @@
|
|||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
allowed() {
|
allowed() {
|
||||||
return m.maxEnergy > 0.99
|
return true
|
||||||
},
|
},
|
||||||
requires: "max energy >= 1",
|
requires: "",
|
||||||
effect() {
|
effect() {
|
||||||
// m.maxEnergy += 0.5
|
|
||||||
// m.energy += 0.5
|
|
||||||
tech.bonusEnergy += 0.5
|
tech.bonusEnergy += 0.5
|
||||||
m.setMaxEnergy()
|
m.setMaxEnergy()
|
||||||
},
|
},
|
||||||
@@ -2057,7 +2073,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "dormancy",
|
name: "dormancy",
|
||||||
description: "if a mob has <strong>died</strong> in the last <strong>5 seconds</strong><br><span style = 'font-size:93%;'>increase <strong class='color-d'>damage</strong> by <strong>50%</strong> else decrease it by <strong>25%</strong></span>",
|
description: "if a mob has <strong>died</strong> in the last <strong>5 seconds</strong><br><span style = 'font-size:93%;'>increase <strong class='color-d'>damage</strong> by <strong>40%</strong> else decrease it by <strong>15%</strong></span>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -2092,7 +2108,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "negative feedback",
|
name: "negative feedback",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for every <strong>10</strong> <strong class='color-h'>health</strong> below <strong>100</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>5%</strong><br>for every <strong>10</strong> <strong class='color-h'>health</strong> below <strong>100</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -2109,7 +2125,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "antiscience",
|
name: "antiscience",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>100%</strong><br>lose <strong>11</strong> <strong class='color-h'>health</strong> when you pick up a <strong class='color-m'>tech</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>90%</strong><br>lose <strong>11</strong> <strong class='color-h'>health</strong> when you pick up a <strong class='color-m'>tech</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -2144,7 +2160,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "fluoroantimonic acid",
|
name: "fluoroantimonic acid",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>40%</strong><br>when your <strong class='color-h'>health</strong> is above <strong>100</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>35%</strong><br>when your <strong class='color-h'>health</strong> is above <strong>100</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -2615,7 +2631,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "futures exchange",
|
name: "futures exchange",
|
||||||
description: "clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>adds <strong>4.5%</strong> power up <strong class='color-dup'>duplication</strong> chance",
|
description: "clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>adds <strong>4.3%</strong> power up <strong class='color-dup'>duplication</strong> chance",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
@@ -3889,7 +3905,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "drone repair",
|
name: "drone repair",
|
||||||
description: "broken <strong>drones</strong> <strong>repair</strong> if the drone <strong class='color-g'>gun</strong> is active<br><strong>repairing</strong> has a <strong>33%</strong> chance to use an <strong class='color-g'>ammo</strong>",
|
description: "broken <strong>drones</strong> <strong>repair</strong> if the drone <strong class='color-g'>gun</strong> is active<br><strong>repairing</strong> has a <strong>33%</strong> chance to use <strong>1</strong> <strong class='color-g'>ammo</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -4399,7 +4415,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "eddy current brake",
|
name: "eddy current brake",
|
||||||
description: "your stored <strong class='color-f'>energy</strong> projects a field that<br>limits the <strong>top speed</strong> of mobs",
|
description: "project a field that limits the <strong>top speed</strong> of mobs<br>field <strong>radius</strong> scales with stored <strong class='color-f'>energy</strong>",
|
||||||
isFieldTech: true,
|
isFieldTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -4553,7 +4569,7 @@
|
|||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
|
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
|
||||||
},
|
},
|
||||||
requires: "nano-scale manufacturing",
|
requires: "nano-scale manufacturing",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -4848,7 +4864,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "discrete optimization",
|
name: "discrete optimization",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>66%</strong><br><strong>50%</strong> increased <strong><em>delay</em></strong> after firing",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>50%</strong><br><strong>50%</strong> increased <strong><em>delay</em></strong> after firing",
|
||||||
isFieldTech: true,
|
isFieldTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -4858,7 +4874,7 @@
|
|||||||
},
|
},
|
||||||
requires: "metamaterial cloaking",
|
requires: "metamaterial cloaking",
|
||||||
effect() {
|
effect() {
|
||||||
tech.aimDamage = 1.66
|
tech.aimDamage = 1.5
|
||||||
b.setFireCD();
|
b.setFireCD();
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
@@ -4946,7 +4962,7 @@
|
|||||||
//**************************************************
|
//**************************************************
|
||||||
{
|
{
|
||||||
name: "ship",
|
name: "ship",
|
||||||
description: "<strong>experiment:</strong> fly around with no legs<br>aim with the keyboard",
|
description: "<strong style='color: #f55;'>experiment:</strong> fly around with no legs<br>aim with the keyboard",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 0,
|
frequency: 0,
|
||||||
@@ -4964,7 +4980,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "quantum leap",
|
name: "quantum leap",
|
||||||
description: "<strong>experiment:</strong> every 20 seconds<br>become an alternate version of yourself",
|
description: "<strong style='color: #f55;'>experiment:</strong> every 20 seconds<br>become an alternate version of yourself",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 0,
|
frequency: 0,
|
||||||
@@ -4979,13 +4995,13 @@
|
|||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
m.switchWorlds()
|
m.switchWorlds()
|
||||||
simulation.trails()
|
simulation.trails()
|
||||||
}, 20000); //every 20 sections
|
}, 20000); //every 20 seconds
|
||||||
},
|
},
|
||||||
remove() {}
|
remove() {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "shields",
|
name: "shields",
|
||||||
description: "<strong>experiment:</strong> every 5 seconds<br>all mobs gain a shield",
|
description: "<strong style='color: #f55;'>experiment:</strong> every 5 seconds<br>all mobs gain a shield",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 0,
|
frequency: 0,
|
||||||
@@ -5001,13 +5017,13 @@
|
|||||||
for (let i = 0; i < mob.length; i++) {
|
for (let i = 0; i < mob.length; i++) {
|
||||||
if (!mob[i].isShielded && !mob[i].shield && mob[i].dropPowerUp) spawn.shield(mob[i], mob[i].position.x, mob[i].position.y, 1, true);
|
if (!mob[i].isShielded && !mob[i].shield && mob[i].dropPowerUp) spawn.shield(mob[i], mob[i].position.x, mob[i].position.y, 1, true);
|
||||||
}
|
}
|
||||||
}, 5000); //every 5 sections
|
}, 5000); //every 5 seconds
|
||||||
},
|
},
|
||||||
remove() {}
|
remove() {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "aim",
|
name: "Fourier analysis",
|
||||||
description: "<strong>experiment:</strong> your aiming is random",
|
description: "<strong style='color: #f55;'>experiment:</strong> your aiming is random",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 0,
|
frequency: 0,
|
||||||
@@ -5030,6 +5046,31 @@
|
|||||||
},
|
},
|
||||||
remove() {}
|
remove() {}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "panopticon",
|
||||||
|
description: "<strong style='color: #f55;'>experiment:</strong> mobs can see you all the time",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 0,
|
||||||
|
isNonRefundable: true,
|
||||||
|
isBadRandomOption: true,
|
||||||
|
isExperimentalMode: true,
|
||||||
|
allowed() {
|
||||||
|
return build.isExperimentSelection
|
||||||
|
},
|
||||||
|
requires: "",
|
||||||
|
effect() {
|
||||||
|
setInterval(() => {
|
||||||
|
for (let i = 0; i < mob.length; i++) {
|
||||||
|
if (!mob[i].shield && mob[i].dropPowerUp) {
|
||||||
|
mob[i].locatePlayer()
|
||||||
|
mob[i].seePlayer.yes = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 1000); //every 1 seconds
|
||||||
|
},
|
||||||
|
remove() {}
|
||||||
|
},
|
||||||
//**************************************************
|
//**************************************************
|
||||||
//************************************************** JUNK
|
//************************************************** JUNK
|
||||||
//************************************************** tech
|
//************************************************** tech
|
||||||
@@ -5052,6 +5093,55 @@
|
|||||||
// },
|
// },
|
||||||
// remove() {}
|
// remove() {}
|
||||||
// },
|
// },
|
||||||
|
{
|
||||||
|
name: "panopticon",
|
||||||
|
description: "<strong>experiment:</strong> mobs can see you all the time",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 0,
|
||||||
|
isExperimentHide: true,
|
||||||
|
isNonRefundable: true,
|
||||||
|
isJunk: true,
|
||||||
|
allowed() {
|
||||||
|
return build.isExperimentSelection
|
||||||
|
},
|
||||||
|
requires: "",
|
||||||
|
effect() {
|
||||||
|
setInterval(() => {
|
||||||
|
for (let i = 0; i < mob.length; i++) {
|
||||||
|
if (!mob[i].shield && mob[i].dropPowerUp) {
|
||||||
|
mob[i].locatePlayer()
|
||||||
|
mob[i].seePlayer.yes = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 1000); //every 1 seconds
|
||||||
|
},
|
||||||
|
remove() {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "inverted mouse",
|
||||||
|
description: "your mouse is scrambled<br>it's fine, just rotate it 90 degrees",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 0,
|
||||||
|
isExperimentHide: true,
|
||||||
|
isNonRefundable: true,
|
||||||
|
isJunk: true,
|
||||||
|
allowed() {
|
||||||
|
return !m.isShipMode
|
||||||
|
},
|
||||||
|
requires: "not ship",
|
||||||
|
effect() {
|
||||||
|
document.body.addEventListener("mousemove", (e) => {
|
||||||
|
const ratio = window.innerWidth / window.innerHeight
|
||||||
|
simulation.mouse.x = e.clientY * ratio
|
||||||
|
simulation.mouse.y = e.clientX / ratio;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
// m.look = m.lookDefault
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "Fourier analysis",
|
name: "Fourier analysis",
|
||||||
description: "your aiming is now controlled by this equation:<br>2sin(0.0133t) + sin(0.013t) + 0.5sin(0.031t)+ 0.33sin(0.03t)",
|
description: "your aiming is now controlled by this equation:<br>2sin(0.0133t) + sin(0.013t) + 0.5sin(0.031t)+ 0.33sin(0.03t)",
|
||||||
@@ -5068,6 +5158,7 @@
|
|||||||
m.look = () => {
|
m.look = () => {
|
||||||
m.angle = 2 * Math.sin(m.cycle * 0.0133) + Math.sin(m.cycle * 0.013) + 0.5 * Math.sin(m.cycle * 0.031) + 0.33 * Math.sin(m.cycle * 0.03)
|
m.angle = 2 * Math.sin(m.cycle * 0.0133) + Math.sin(m.cycle * 0.013) + 0.5 * Math.sin(m.cycle * 0.031) + 0.33 * Math.sin(m.cycle * 0.03)
|
||||||
const scale = 0.8;
|
const scale = 0.8;
|
||||||
|
simulation.mouse.y
|
||||||
m.transSmoothX = canvas.width2 - m.pos.x - (simulation.mouse.x - canvas.width2) * scale;
|
m.transSmoothX = canvas.width2 - m.pos.x - (simulation.mouse.x - canvas.width2) * scale;
|
||||||
m.transSmoothY = canvas.height2 - m.pos.y - (simulation.mouse.y - canvas.height2) * scale;
|
m.transSmoothY = canvas.height2 - m.pos.y - (simulation.mouse.y - canvas.height2) * scale;
|
||||||
m.transX += (m.transSmoothX - m.transX) * 0.07;
|
m.transX += (m.transSmoothX - m.transX) * 0.07;
|
||||||
@@ -5193,7 +5284,7 @@
|
|||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
m.switchWorlds()
|
m.switchWorlds()
|
||||||
simulation.trails()
|
simulation.trails()
|
||||||
}, 20000); //every 30 sections
|
}, 20000); //every 30 seconds
|
||||||
},
|
},
|
||||||
remove() {}
|
remove() {}
|
||||||
},
|
},
|
||||||
@@ -5213,7 +5304,7 @@
|
|||||||
effect() {
|
effect() {
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
alert(`The best combo is ${tech.tech[Math.floor(Math.random() * tech.tech.length)].name} with ${tech.tech[Math.floor(Math.random() * tech.tech.length)].name}!`);
|
alert(`The best combo is ${tech.tech[Math.floor(Math.random() * tech.tech.length)].name} with ${tech.tech[Math.floor(Math.random() * tech.tech.length)].name}!`);
|
||||||
}, 30000); //every 30 sections
|
}, 30000); //every 30 seconds
|
||||||
},
|
},
|
||||||
remove() {}
|
remove() {}
|
||||||
},
|
},
|
||||||
@@ -6119,7 +6210,8 @@
|
|||||||
renormalization: null,
|
renormalization: null,
|
||||||
fragments: null,
|
fragments: null,
|
||||||
isEnergyDamage: null,
|
isEnergyDamage: null,
|
||||||
isBotSpawner: null,
|
botSpawner: null,
|
||||||
|
isBotSpawnerReset: null,
|
||||||
waveHelix: null,
|
waveHelix: null,
|
||||||
isSporeFollow: null,
|
isSporeFollow: null,
|
||||||
isNailRadiation: null,
|
isNailRadiation: null,
|
||||||
|
|||||||
26
todo.txt
26
todo.txt
@@ -1,9 +1,13 @@
|
|||||||
******************************************************** NEXT PATCH ********************************************************
|
******************************************************** NEXT PATCH ********************************************************
|
||||||
|
|
||||||
tech: automatic - always fire, but get 2.5x ammo
|
experiment and junk: panopticon - mobs can see you all the time
|
||||||
requires inertial frame
|
|
||||||
|
|
||||||
tech: drone repair - while drones are your active gun, drones respawn with a 50% chance to consume ammo
|
scrap bots now have a 33% chance to spawn for 10 seconds after killing a mob
|
||||||
|
(was 20% chance for 20 seconds)
|
||||||
|
tech: scrap refit - killing a mob resets your functional scrap bots back to 10 seconds of operation
|
||||||
|
|
||||||
|
several damage tech have reduced damage by about 10%
|
||||||
|
spores do 20% more damage, but last 1 second shorter
|
||||||
|
|
||||||
******************************************************** BUGS ********************************************************
|
******************************************************** BUGS ********************************************************
|
||||||
|
|
||||||
@@ -33,17 +37,19 @@ fix door.isOpen actually meaning isClosed?
|
|||||||
|
|
||||||
(repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping
|
(repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping
|
||||||
|
|
||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** TODO ********************************************************
|
||||||
|
|
||||||
|
quantum foam: hold fire to charge up foam, release fire to let go an amount relative to hold long you held fire
|
||||||
|
foam gun fires a bullet that tracks how long mouse is down
|
||||||
|
when mouse is up it streams out a hose of foam based on how long foam was down
|
||||||
|
bullet is small and hidden
|
||||||
|
|
||||||
|
make some bullets move super fast, but do collisions checks in .do()
|
||||||
|
check for hitting mobs or map with fractional velocity
|
||||||
|
if velocity is above 40ish
|
||||||
|
|
||||||
flipflop, but toggles after a kill
|
flipflop, but toggles after a kill
|
||||||
|
|
||||||
tech shotgun - crouching makes your spread very small
|
|
||||||
remove spread reduction on nail shot
|
|
||||||
doesn't apply to slug
|
|
||||||
|
|
||||||
add water drops to sewers
|
|
||||||
|
|
||||||
new level: procedural generation
|
new level: procedural generation
|
||||||
several small rooms are linked by portals
|
several small rooms are linked by portals
|
||||||
the portals have a randomized pattern
|
the portals have a randomized pattern
|
||||||
|
|||||||
Reference in New Issue
Block a user