applied science
tech: applied science - gives a random gun tech and a research for each gun in your inventory JUNK tech - motion sickness - disable camera smoothing JUNK tech - palantír - see far away foam-bot, nail-bot, missile-bot: are now affected by fire delay tech this gives some options for late game bot scaling timelike now allows some energy regen while immune to harm in double time Tokamak now overrides the trajectory throw graphics with its own
This commit is contained in:
@@ -3443,6 +3443,7 @@ const b = {
|
|||||||
minDmgSpeed: 2,
|
minDmgSpeed: 2,
|
||||||
// lookFrequency: 56 + Math.floor(17 * Math.random()) - isUpgraded * 20,
|
// lookFrequency: 56 + Math.floor(17 * Math.random()) - isUpgraded * 20,
|
||||||
lastLookCycle: simulation.cycle + 60 * Math.random(),
|
lastLookCycle: simulation.cycle + 60 * Math.random(),
|
||||||
|
delay: Math.floor((tech.isNailBotUpgrade ? 21 : 110) * b.fireCDscale),
|
||||||
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
||||||
range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(),
|
range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(),
|
||||||
endCycle: Infinity,
|
endCycle: Infinity,
|
||||||
@@ -3460,7 +3461,7 @@ 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 ? 21 : 110)
|
this.lastLookCycle = simulation.cycle + this.delay
|
||||||
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 (
|
if (
|
||||||
@@ -3503,7 +3504,7 @@ const b = {
|
|||||||
minDmgSpeed: 2,
|
minDmgSpeed: 2,
|
||||||
lookFrequency: 27 + Math.ceil(6 * Math.random()),
|
lookFrequency: 27 + Math.ceil(6 * Math.random()),
|
||||||
cd: 0,
|
cd: 0,
|
||||||
delay: 70,
|
delay: Math.floor(65 * b.fireCDscale),
|
||||||
range: 70 + 3 * b.totalBots(),
|
range: 70 + 3 * b.totalBots(),
|
||||||
endCycle: Infinity,
|
endCycle: Infinity,
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
@@ -3579,7 +3580,7 @@ const b = {
|
|||||||
minDmgSpeed: 2,
|
minDmgSpeed: 2,
|
||||||
lookFrequency: 60 + Math.floor(17 * Math.random()) - 40 * tech.isFoamBotUpgrade,
|
lookFrequency: 60 + Math.floor(17 * Math.random()) - 40 * tech.isFoamBotUpgrade,
|
||||||
cd: 0,
|
cd: 0,
|
||||||
delay: 100,
|
delay: Math.floor(105 * b.fireCDscale),
|
||||||
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
||||||
range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(),
|
range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(),
|
||||||
endCycle: Infinity,
|
endCycle: Infinity,
|
||||||
|
|||||||
25
js/level.js
25
js/level.js
@@ -16,10 +16,10 @@ const level = {
|
|||||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||||
// simulation.isHorizontalFlipped = true
|
// simulation.isHorizontalFlipped = true
|
||||||
// m.setField("metamaterial cloaking")
|
// m.setField("metamaterial cloaking")
|
||||||
// b.giveGuns("mine")
|
// b.giveGuns("laser")
|
||||||
// tech.giveTech("spherical harmonics")
|
// tech.giveTech("tokamak")
|
||||||
// tech.giveTech("relative permittivity")
|
// tech.giveTech("relative permittivity")
|
||||||
// tech.giveTech("causality bombs")
|
// tech.giveTech("palantír")
|
||||||
// for (let i = 0; i < 2; i++) tech.giveTech("refractory metal")
|
// for (let i = 0; i < 2; i++) tech.giveTech("refractory metal")
|
||||||
// tech.giveTech("antiscience")
|
// tech.giveTech("antiscience")
|
||||||
// for (let i = 0; i < 1; i++) tech.giveTech("reticulum")
|
// for (let i = 0; i < 1; i++) tech.giveTech("reticulum")
|
||||||
@@ -2311,8 +2311,23 @@ const level = {
|
|||||||
spawn.mapRect(4850, -275, 50, 175);
|
spawn.mapRect(4850, -275, 50, 175);
|
||||||
// level.difficultyIncrease(40) //30 is near max on hard //60 is near max on why
|
// level.difficultyIncrease(40) //30 is near max on hard //60 is near max on why
|
||||||
// spawn.starter(1900, -500, 200) //big boy
|
// spawn.starter(1900, -500, 200) //big boy
|
||||||
spawn.historyBoss(1700, -500)
|
|
||||||
spawn.shooterBoss(3200, -500)
|
// spawn.spiderBoss(1700, -500)
|
||||||
|
// spawn.launcherBoss(3200, -500)
|
||||||
|
spawn.laserTargetingBoss(1700, -500)
|
||||||
|
spawn.powerUpBoss(3200, -500)
|
||||||
|
// spawn.snakeBoss(1700, -500)
|
||||||
|
// spawn.streamBoss(3200, -500)
|
||||||
|
// spawn.pulsarBoss(1700, -500)
|
||||||
|
// spawn.spawnerBossCulture(3200, -500)
|
||||||
|
// spawn.grenadierBoss(1700, -500)
|
||||||
|
// spawn.growBossCulture(3200, -500)
|
||||||
|
// spawn.blinkBoss(1700, -500)
|
||||||
|
// spawn.snakeSpitBoss(3200, -500)
|
||||||
|
// spawn.laserBombingBoss(1700, -500)
|
||||||
|
// spawn.launcherBoss(3200, -500)
|
||||||
|
// spawn.blockBoss(1700, -500)
|
||||||
|
// spawn.slashBoss(3200, -500)
|
||||||
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
|
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
|
||||||
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
|
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
|
||||||
// spawn.slashBoss(1900, -500)
|
// spawn.slashBoss(1900, -500)
|
||||||
|
|||||||
119
js/player.js
119
js/player.js
@@ -299,7 +299,17 @@ const m = {
|
|||||||
},
|
},
|
||||||
alive: false,
|
alive: false,
|
||||||
switchWorlds() {
|
switchWorlds() {
|
||||||
const totalGuns = b.inventory.length //- tech.isRewindGun //count guns, but not CPT gun
|
const totalGuns = b.inventory.length
|
||||||
|
//track ammo/ ammoPack count
|
||||||
|
let ammoCount = 0
|
||||||
|
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
||||||
|
if (b.guns[b.inventory[i]].ammo !== Infinity) {
|
||||||
|
ammoCount += b.guns[b.inventory[i]].ammo / b.guns[b.inventory[i]].ammoPack
|
||||||
|
} else {
|
||||||
|
ammoCount += 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
simulation.isTextLogOpen = false; //prevent console spam
|
simulation.isTextLogOpen = false; //prevent console spam
|
||||||
//remove all tech and count current tech total
|
//remove all tech and count current tech total
|
||||||
let totalTech = 0;
|
let totalTech = 0;
|
||||||
@@ -345,15 +355,7 @@ const m = {
|
|||||||
//randomize field
|
//randomize field
|
||||||
m.setField(Math.ceil(Math.random() * (m.fieldUpgrades.length - 1)))
|
m.setField(Math.ceil(Math.random() * (m.fieldUpgrades.length - 1)))
|
||||||
|
|
||||||
//track ammo/ ammoPack count
|
|
||||||
let ammoCount = 0
|
|
||||||
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
|
||||||
if (b.guns[b.inventory[i]].ammo !== Infinity) {
|
|
||||||
ammoCount += b.guns[b.inventory[i]].ammo / b.guns[b.inventory[i]].ammoPack
|
|
||||||
} else {
|
|
||||||
ammoCount += 5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//removes guns and ammo
|
//removes guns and ammo
|
||||||
b.inventory = [];
|
b.inventory = [];
|
||||||
b.activeGun = null;
|
b.activeGun = null;
|
||||||
@@ -367,7 +369,7 @@ const m = {
|
|||||||
|
|
||||||
//randomize ammo based on ammo/ammoPack count
|
//randomize ammo based on ammo/ammoPack count
|
||||||
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
||||||
if (b.guns[b.inventory[i]].ammo !== Infinity) b.guns[b.inventory[i]].ammo = Math.max(0, Math.floor(ammoCount / b.inventory.length * b.guns[b.inventory[i]].ammoPack * (1.05 + 0.5 * (Math.random() - 0.5))))
|
if (b.guns[b.inventory[i]].ammo !== Infinity) b.guns[b.inventory[i]].ammo = Math.max(0, Math.floor(ammoCount / b.inventory.length * b.guns[b.inventory[i]].ammoPack * (1.05 + 0.3 * (Math.random() - 0.5))))
|
||||||
}
|
}
|
||||||
|
|
||||||
//randomize tech
|
//randomize tech
|
||||||
@@ -1136,40 +1138,66 @@ const m = {
|
|||||||
if (m.fireCDcycle < m.cycle) m.fireCDcycle = m.cycle
|
if (m.fireCDcycle < m.cycle) m.fireCDcycle = m.cycle
|
||||||
m.throwCharge += 0.5 * (tech.throwChargeRate / b.fireCDscale + 2 * tech.isAddBlockMass) / m.holdingTarget.mass
|
m.throwCharge += 0.5 * (tech.throwChargeRate / b.fireCDscale + 2 * tech.isAddBlockMass) / m.holdingTarget.mass
|
||||||
if (m.throwCharge < 6) m.energy -= 0.001 / tech.throwChargeRate / b.fireCDscale; // m.throwCharge caps at 5
|
if (m.throwCharge < 6) m.energy -= 0.001 / tech.throwChargeRate / b.fireCDscale; // m.throwCharge caps at 5
|
||||||
//draw charge
|
|
||||||
const x = m.pos.x + 15 * Math.cos(m.angle);
|
//trajectory path prediction
|
||||||
const y = m.pos.y + 15 * Math.sin(m.angle);
|
if (tech.isTokamak) {
|
||||||
const len = m.holdingTarget.vertices.length - 1;
|
//draw charge
|
||||||
const edge = m.throwCharge * m.throwCharge * m.throwCharge;
|
if (m.throwCharge > 4) {
|
||||||
const grd = ctx.createRadialGradient(x, y, edge, x, y, edge + 5);
|
|
||||||
grd.addColorStop(0, "rgba(255,50,150,0.3)");
|
const x = m.pos.x + 15 * Math.cos(m.angle);
|
||||||
grd.addColorStop(1, "transparent");
|
const y = m.pos.y + 15 * Math.sin(m.angle);
|
||||||
ctx.fillStyle = grd;
|
const len = m.holdingTarget.vertices.length - 1;
|
||||||
ctx.beginPath();
|
ctx.fillStyle = "rgba(200,0,255,0.3)";
|
||||||
ctx.moveTo(x, y);
|
ctx.beginPath();
|
||||||
ctx.lineTo(m.holdingTarget.vertices[len].x, m.holdingTarget.vertices[len].y);
|
ctx.moveTo(x, y);
|
||||||
ctx.lineTo(m.holdingTarget.vertices[0].x, m.holdingTarget.vertices[0].y);
|
ctx.lineTo(m.holdingTarget.vertices[len].x, m.holdingTarget.vertices[len].y);
|
||||||
ctx.fill();
|
ctx.lineTo(m.holdingTarget.vertices[0].x, m.holdingTarget.vertices[0].y);
|
||||||
for (let i = 0; i < len; i++) {
|
ctx.fill();
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(x, y);
|
||||||
|
ctx.lineTo(m.holdingTarget.vertices[i].x, m.holdingTarget.vertices[i].y);
|
||||||
|
ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y);
|
||||||
|
ctx.fill();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//draw charge
|
||||||
|
const x = m.pos.x + 15 * Math.cos(m.angle);
|
||||||
|
const y = m.pos.y + 15 * Math.sin(m.angle);
|
||||||
|
const len = m.holdingTarget.vertices.length - 1;
|
||||||
|
const edge = m.throwCharge * m.throwCharge * m.throwCharge;
|
||||||
|
const grd = ctx.createRadialGradient(x, y, edge, x, y, edge + 5);
|
||||||
|
grd.addColorStop(0, "rgba(255,50,150,0.3)");
|
||||||
|
grd.addColorStop(1, "transparent");
|
||||||
|
ctx.fillStyle = grd;
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
ctx.moveTo(x, y);
|
ctx.moveTo(x, y);
|
||||||
ctx.lineTo(m.holdingTarget.vertices[i].x, m.holdingTarget.vertices[i].y);
|
ctx.lineTo(m.holdingTarget.vertices[len].x, m.holdingTarget.vertices[len].y);
|
||||||
ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y);
|
ctx.lineTo(m.holdingTarget.vertices[0].x, m.holdingTarget.vertices[0].y);
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(x, y);
|
||||||
|
ctx.lineTo(m.holdingTarget.vertices[i].x, m.holdingTarget.vertices[i].y);
|
||||||
|
ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y);
|
||||||
|
ctx.fill();
|
||||||
|
}
|
||||||
|
//trajectory prediction
|
||||||
|
const cycles = 30
|
||||||
|
const charge = Math.min(m.throwCharge / 5, 1)
|
||||||
|
const speed = 80 * charge * Math.min(0.85, 0.8 / Math.pow(m.holdingTarget.mass, 0.25));
|
||||||
|
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky
|
||||||
|
ctx.beginPath()
|
||||||
|
for (let i = 1, len = 10; i < len + 1; i++) {
|
||||||
|
const time = cycles * i / len
|
||||||
|
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time)
|
||||||
|
}
|
||||||
|
ctx.strokeStyle = "rgba(68, 68, 68, 0.15)" //color.map
|
||||||
|
ctx.lineWidth = 2
|
||||||
|
ctx.stroke()
|
||||||
}
|
}
|
||||||
//trajectory path prediction
|
|
||||||
const cycles = 30
|
|
||||||
const charge = Math.min(m.throwCharge / 5, 1)
|
|
||||||
const speed = 80 * charge * Math.min(0.85, 0.8 / Math.pow(m.holdingTarget.mass, 0.25));
|
|
||||||
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky
|
|
||||||
ctx.beginPath()
|
|
||||||
for (let i = 1, len = 10; i < len + 1; i++) {
|
|
||||||
const time = cycles * i / len
|
|
||||||
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time)
|
|
||||||
}
|
|
||||||
ctx.strokeStyle = "rgba(68, 68, 68, 0.15)" //color.map
|
|
||||||
ctx.lineWidth = 2
|
|
||||||
ctx.stroke()
|
|
||||||
} else {
|
} else {
|
||||||
m.drop()
|
m.drop()
|
||||||
}
|
}
|
||||||
@@ -1178,7 +1206,7 @@ const m = {
|
|||||||
m.fieldCDcycle = m.cycle + 15;
|
m.fieldCDcycle = m.cycle + 15;
|
||||||
m.isHolding = false;
|
m.isHolding = false;
|
||||||
|
|
||||||
if (tech.isTokamak && m.throwCharge > 3) { //remove the block body and pulse in the direction you are facing
|
if (tech.isTokamak && m.throwCharge > 4) { //remove the block body and pulse in the direction you are facing
|
||||||
//m.throwCharge > 5 seems to be when the field full colors in a block you are holding
|
//m.throwCharge > 5 seems to be when the field full colors in a block you are holding
|
||||||
m.throwCycle = m.cycle + 180 //used to detect if a block was thrown in the last 3 seconds
|
m.throwCycle = m.cycle + 180 //used to detect if a block was thrown in the last 3 seconds
|
||||||
if (m.immuneCycle < m.cycle) m.energy += 0.25 * Math.sqrt(m.holdingTarget.mass) * Math.min(5, m.throwCharge)
|
if (m.immuneCycle < m.cycle) m.energy += 0.25 * Math.sqrt(m.holdingTarget.mass) * Math.min(5, m.throwCharge)
|
||||||
@@ -2339,7 +2367,7 @@ const m = {
|
|||||||
m.grabPowerUp();
|
m.grabPowerUp();
|
||||||
m.lookForPickUp();
|
m.lookForPickUp();
|
||||||
|
|
||||||
m.drain += 0.0000025
|
m.drain += 0.0000025 //also increases inside tech.isTimeSkip
|
||||||
if (m.energy > m.drain) {
|
if (m.energy > m.drain) {
|
||||||
m.energy -= m.drain;
|
m.energy -= m.drain;
|
||||||
if (m.energy < m.drain) {
|
if (m.energy < m.drain) {
|
||||||
@@ -2370,7 +2398,10 @@ const m = {
|
|||||||
|
|
||||||
simulation.cycle--; //pause all functions that depend on game cycle increasing
|
simulation.cycle--; //pause all functions that depend on game cycle increasing
|
||||||
if (tech.isTimeSkip) {
|
if (tech.isTimeSkip) {
|
||||||
if (m.immuneCycle < m.cycle + 10) m.immuneCycle = m.cycle + 10;
|
m.immuneCycle = 0;
|
||||||
|
m.drain += 0.0000025
|
||||||
|
m.regenEnergy(); //immunity disables normal regen, so turn off immunity for just this function
|
||||||
|
m.immuneCycle = m.cycle + 10;
|
||||||
simulation.isTimeSkipping = true;
|
simulation.isTimeSkipping = true;
|
||||||
m.cycle++;
|
m.cycle++;
|
||||||
simulation.gravity();
|
simulation.gravity();
|
||||||
|
|||||||
@@ -922,7 +922,7 @@ const spawn = {
|
|||||||
Matter.Body.setDensity(me, 0.00035) // normal density is 0.001 // this reduces life by half and decreases knockback
|
Matter.Body.setDensity(me, 0.00035) // normal density is 0.001 // this reduces life by half and decreases knockback
|
||||||
const k = 642 //k=r^2/m
|
const k = 642 //k=r^2/m
|
||||||
me.split = function() {
|
me.split = function() {
|
||||||
Matter.Body.scale(this, 0.4, 0.4);
|
Matter.Body.scale(this, 0.45, 0.45);
|
||||||
this.radius = Math.sqrt(this.mass * k / Math.PI)
|
this.radius = Math.sqrt(this.mass * k / Math.PI)
|
||||||
spawn.cellBoss(this.position.x, this.position.y, this.radius, this.cellID);
|
spawn.cellBoss(this.position.x, this.position.y, this.radius, this.cellID);
|
||||||
mob[mob.length - 1].health = this.health
|
mob[mob.length - 1].health = this.health
|
||||||
@@ -932,9 +932,9 @@ const spawn = {
|
|||||||
this.split();
|
this.split();
|
||||||
};
|
};
|
||||||
me.onDamage = function(dmg) {
|
me.onDamage = function(dmg) {
|
||||||
if (Math.random() < 0.33 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split();
|
if (Math.random() < 0.34 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split();
|
||||||
}
|
}
|
||||||
me.damageReduction = 0.18 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1); //me.damageReductionGoal
|
me.damageReduction = 0.17 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1); //me.damageReductionGoal
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
// // this.armor();
|
// // this.armor();
|
||||||
if (!m.isBodiesAsleep) {
|
if (!m.isBodiesAsleep) {
|
||||||
|
|||||||
172
js/tech.js
172
js/tech.js
@@ -450,6 +450,38 @@
|
|||||||
},
|
},
|
||||||
remove() {}
|
remove() {}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "applied science",
|
||||||
|
description: `spawn ${powerUps.orb.research(1)} and get a random <strong class='color-m'>tech</strong><br>for each <strong class='color-g'>gun</strong> in your inventory`,
|
||||||
|
maxCount: 9,
|
||||||
|
count: 0,
|
||||||
|
isNonRefundable: true,
|
||||||
|
frequency: 2,
|
||||||
|
frequencyDefault: 2,
|
||||||
|
allowed() {
|
||||||
|
return b.inventory.length > 1
|
||||||
|
},
|
||||||
|
requires: "NOT EXPERIMENT MODE, at least 2 guns",
|
||||||
|
effect() {
|
||||||
|
for (let i = 0; i < b.inventory.length; i++) {
|
||||||
|
//spawn a research for each gun
|
||||||
|
powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false);
|
||||||
|
//find a gun tech for this gun
|
||||||
|
const gunTechPool = []
|
||||||
|
for (let j = 0; j < tech.tech.length; j++) {
|
||||||
|
if (tech.tech[j].isGunTech && tech.tech[j].allowed && !tech.tech[j].isJunk && !tech.tech[j].isBadRandomOption && tech.tech[j].count < tech.tech[j].maxCount) {
|
||||||
|
const regex = tech.tech[j].requires.search(b.guns[b.inventory[i]].name) //get string index of gun name
|
||||||
|
const not = tech.tech[j].requires.search(' not ') //get string index of ' not '
|
||||||
|
//look for the gun name in the requirements, but the gun name needs to show up before the word ' not '
|
||||||
|
if (regex !== -1 && (not === -1 || not > regex)) gunTechPool.push(j)
|
||||||
|
// console.log(gunName, regex, not, tech.tech[j].name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (gunTechPool.length) tech.giveTech(gunTechPool[Math.floor(Math.random() * gunTechPool.length)]) // choose from the gun pool
|
||||||
|
}
|
||||||
|
},
|
||||||
|
remove() {}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "logistics",
|
name: "logistics",
|
||||||
description: `${powerUps.orb.ammo()} give <strong>80%</strong> more <strong class='color-ammo'>ammo</strong>, but<br>it's only added to your current <strong class='color-g'>gun</strong>`,
|
description: `${powerUps.orb.ammo()} give <strong>80%</strong> more <strong class='color-ammo'>ammo</strong>, but<br>it's only added to your current <strong class='color-g'>gun</strong>`,
|
||||||
@@ -3737,7 +3769,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isNeedles || tech.isNeedleShot
|
return tech.isNeedles || tech.isNeedleShot
|
||||||
},
|
},
|
||||||
requires: "needle gun, needle-shot",
|
requires: "nail gun, needle gun, needle-shot",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isNeedleIce = true
|
tech.isNeedleIce = true
|
||||||
},
|
},
|
||||||
@@ -3756,7 +3788,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("harpoon") || (tech.isNeedles || tech.isNeedleShot)
|
return tech.haveGunCheck("harpoon") || (tech.isNeedles || tech.isNeedleShot)
|
||||||
},
|
},
|
||||||
requires: "needle gun, needle-shot, harpoon",
|
requires: "nail gun, needle gun, needle-shot, harpoon",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isNeedleShieldPierce = true
|
tech.isNeedleShieldPierce = true
|
||||||
},
|
},
|
||||||
@@ -3847,7 +3879,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isRivets
|
return tech.isRivets
|
||||||
},
|
},
|
||||||
requires: "rivet gun",
|
requires: "nail gun, rivet gun",
|
||||||
effect() {
|
effect() {
|
||||||
tech.rivetSize += 0.2
|
tech.rivetSize += 0.2
|
||||||
},
|
},
|
||||||
@@ -3959,7 +3991,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (tech.isNailShot || tech.isNeedleShot || tech.nailBotCount > 1 || tech.haveGunCheck("nail gun"))
|
return (tech.isNailShot || tech.isNeedleShot || tech.nailBotCount > 1 || tech.haveGunCheck("nail gun"))
|
||||||
},
|
},
|
||||||
requires: "nails",
|
requires: "nail gun, nails",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isNailCrit = true
|
tech.isNailCrit = true
|
||||||
},
|
},
|
||||||
@@ -3979,7 +4011,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce) + tech.isNeedleShot + tech.isNailShot) * 2 > 1
|
return tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce) + tech.isNeedleShot + tech.isNailShot) * 2 > 1
|
||||||
},
|
},
|
||||||
requires: "nails, rivets, not ceramic needles",
|
requires: "nail gun, nails, rivets, not ceramic needles",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isNailRadiation = true;
|
tech.isNailRadiation = true;
|
||||||
},
|
},
|
||||||
@@ -4098,7 +4130,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (tech.haveGunCheck("shotgun") || tech.haveGunCheck("railgun")) && !tech.isShotgunRecoil
|
return (tech.haveGunCheck("shotgun") || tech.haveGunCheck("railgun")) && !tech.isShotgunRecoil
|
||||||
},
|
},
|
||||||
requires: "shotgun or railgun, not Newton's 3rd law",
|
requires: "shotgun, railgun, not Newton's 3rd law",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isShotgunReversed = true;
|
tech.isShotgunReversed = true;
|
||||||
},
|
},
|
||||||
@@ -4386,8 +4418,8 @@
|
|||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 4,
|
frequency: 2,
|
||||||
frequencyDefault: 4,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("matter wave") && !tech.isPhaseVelocity && !tech.isBulletTeleport
|
return tech.haveGunCheck("matter wave") && !tech.isPhaseVelocity && !tech.isBulletTeleport
|
||||||
},
|
},
|
||||||
@@ -4426,12 +4458,12 @@
|
|||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 4,
|
frequency: 2,
|
||||||
frequencyDefault: 4,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.isLongitudinal
|
return tech.isLongitudinal
|
||||||
},
|
},
|
||||||
requires: "phonon",
|
requires: "matter wave, phonon",
|
||||||
effect() {
|
effect() {
|
||||||
tech.is360Longitudinal = true;
|
tech.is360Longitudinal = true;
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
@@ -4477,14 +4509,14 @@
|
|||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 3,
|
frequency: 2,
|
||||||
frequencyDefault: 3,
|
frequencyDefault: 2,
|
||||||
isBot: true,
|
isBot: true,
|
||||||
isBotTech: true,
|
isBotTech: true,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("missiles", false)
|
return tech.haveGunCheck("missiles", false)
|
||||||
},
|
},
|
||||||
requires: "missile gun",
|
requires: "missiles",
|
||||||
effect() {
|
effect() {
|
||||||
tech.missileBotCount++;
|
tech.missileBotCount++;
|
||||||
b.missileBot();
|
b.missileBot();
|
||||||
@@ -4566,12 +4598,12 @@
|
|||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 2,
|
||||||
frequencyDefault: 1,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.isVacuumBomb && !tech.isExplodeRadio
|
return tech.isVacuumBomb && !tech.isExplodeRadio
|
||||||
},
|
},
|
||||||
requires: "vacuum bomb, not iridium-192",
|
requires: "grenades, vacuum bomb, not iridium-192",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isBlockExplode = true; //chain reaction
|
tech.isBlockExplode = true; //chain reaction
|
||||||
},
|
},
|
||||||
@@ -4611,7 +4643,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isNeutronBomb
|
return tech.isNeutronBomb
|
||||||
},
|
},
|
||||||
requires: "neutron bomb",
|
requires: "grenades, neutron bomb",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isNeutronSlow = true
|
tech.isNeutronSlow = true
|
||||||
},
|
},
|
||||||
@@ -4736,7 +4768,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField
|
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField
|
||||||
},
|
},
|
||||||
requires: "spores",
|
requires: "spore gun, spores",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isFastSpores = true
|
tech.isFastSpores = true
|
||||||
},
|
},
|
||||||
@@ -4756,7 +4788,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormShot
|
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormShot
|
||||||
},
|
},
|
||||||
requires: "spores or worms",
|
requires: "spore gun, spores or worms",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isSporeFreeze = true
|
tech.isSporeFreeze = true
|
||||||
},
|
},
|
||||||
@@ -4775,7 +4807,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormShot
|
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormShot
|
||||||
},
|
},
|
||||||
requires: "spores or worms",
|
requires: "spore gun, spores or worms",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isSporeFollow = true
|
tech.isSporeFollow = true
|
||||||
},
|
},
|
||||||
@@ -4794,7 +4826,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField) && !tech.isEnergyHealth || tech.isWormShot
|
return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField) && !tech.isEnergyHealth || tech.isWormShot
|
||||||
},
|
},
|
||||||
requires: "spores, worms, not mass-energy",
|
requires: "spore gun, spores, worms, not mass-energy",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isMutualism = true
|
tech.isMutualism = true
|
||||||
},
|
},
|
||||||
@@ -4813,7 +4845,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormholeSpores
|
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormholeSpores
|
||||||
},
|
},
|
||||||
requires: "spores",
|
requires: "spore gun, spores",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isSporeWorm = true
|
tech.isSporeWorm = true
|
||||||
},
|
},
|
||||||
@@ -4832,7 +4864,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isSporeWorm || tech.isWormShot
|
return tech.isSporeWorm || tech.isWormShot
|
||||||
},
|
},
|
||||||
requires: "worms",
|
requires: "spore gun, worms",
|
||||||
effect() {
|
effect() {
|
||||||
tech.wormSurviveDmg = true
|
tech.wormSurviveDmg = true
|
||||||
},
|
},
|
||||||
@@ -4851,7 +4883,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("drones", false) || tech.isForeverDrones
|
return tech.haveGunCheck("drones", false) || tech.isForeverDrones
|
||||||
},
|
},
|
||||||
requires: "drone gun or fault tolerance",
|
requires: "drones, fault tolerance",
|
||||||
effect() {
|
effect() {
|
||||||
const num = 8
|
const num = 8
|
||||||
tech.isForeverDrones += num
|
tech.isForeverDrones += num
|
||||||
@@ -4937,7 +4969,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("drones")
|
return tech.haveGunCheck("drones")
|
||||||
},
|
},
|
||||||
requires: "drone gun",
|
requires: "drones",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isDroneRespawn = true
|
tech.isDroneRespawn = true
|
||||||
},
|
},
|
||||||
@@ -4956,7 +4988,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) && !tech.isDroneRadioactive && !tech.isIncendiary
|
return (tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) && !tech.isDroneRadioactive && !tech.isIncendiary
|
||||||
},
|
},
|
||||||
requires: "drone gun, molecular assembler, not irradiated drones, incendiary",
|
requires: "drones, molecular assembler, not irradiated drones, incendiary",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isDroneTeleport = true
|
tech.isDroneTeleport = true
|
||||||
},
|
},
|
||||||
@@ -4975,7 +5007,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isDroneTeleport
|
return tech.isDroneTeleport
|
||||||
},
|
},
|
||||||
requires: "brushless motor",
|
requires: "drones, brushless motor",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isDroneFastLook = true
|
tech.isDroneFastLook = true
|
||||||
},
|
},
|
||||||
@@ -5030,7 +5062,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isDroneRadioactive
|
return tech.isDroneRadioactive
|
||||||
},
|
},
|
||||||
requires: "irradiated drones",
|
requires: "drones irradiated drones",
|
||||||
effect() {
|
effect() {
|
||||||
tech.droneRadioDamage = 2
|
tech.droneRadioDamage = 2
|
||||||
},
|
},
|
||||||
@@ -5050,7 +5082,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isDroneRadioactive
|
return tech.isDroneRadioactive
|
||||||
},
|
},
|
||||||
requires: "irradiated drones",
|
requires: "drones, irradiated drones",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isFastDrones = true
|
tech.isFastDrones = true
|
||||||
},
|
},
|
||||||
@@ -5147,7 +5179,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("foam")
|
return tech.haveGunCheck("foam")
|
||||||
},
|
},
|
||||||
requires: "foam gun",
|
requires: "foam",
|
||||||
effect() {
|
effect() {
|
||||||
tech.foamFutureFire++
|
tech.foamFutureFire++
|
||||||
},
|
},
|
||||||
@@ -5166,7 +5198,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("foam")
|
return tech.haveGunCheck("foam")
|
||||||
},
|
},
|
||||||
requires: "foam gun",
|
requires: "foam",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isAmmoFoamSize = true
|
tech.isAmmoFoamSize = true
|
||||||
},
|
},
|
||||||
@@ -5185,7 +5217,7 @@
|
|||||||
isBot: true,
|
isBot: true,
|
||||||
isBotTech: true,
|
isBotTech: true,
|
||||||
isNonRefundable: true,
|
isNonRefundable: true,
|
||||||
requires: "NOT EXPERIMENT MODE, foam gun, no other bot upgrades",
|
requires: "foam gun, not bot upgrades NOT EXPERIMENT MODE,",
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("foam", false) && !b.hasBotUpgrade()
|
return tech.haveGunCheck("foam", false) && !b.hasBotUpgrade()
|
||||||
},
|
},
|
||||||
@@ -5533,7 +5565,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isWideLaser
|
return tech.isWideLaser
|
||||||
},
|
},
|
||||||
requires: "diffuse beam",
|
requires: "laser gun, diffuse beam",
|
||||||
effect() {
|
effect() {
|
||||||
tech.wideLaser += 2
|
tech.wideLaser += 2
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
@@ -5618,7 +5650,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isPulseLaser && !tech.beamSplitter
|
return tech.isPulseLaser && !tech.beamSplitter
|
||||||
},
|
},
|
||||||
requires: "pulse, not diffraction grating",
|
requires: "laser gun, pulse, not diffraction grating",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isPulseAim = true;
|
tech.isPulseAim = true;
|
||||||
},
|
},
|
||||||
@@ -6315,7 +6347,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "timelike",
|
name: "timelike",
|
||||||
description: "<strong>time dilation</strong> doubles your relative time <strong>rate</strong><br>and makes you <strong>immune</strong> to <strong class='color-harm'>harm</strong>",
|
description: "<strong>time dilation</strong> doubles your relative time <strong>rate</strong><br>and makes you immune to <strong class='color-harm'>harm</strong>",
|
||||||
isFieldTech: true,
|
isFieldTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -6327,11 +6359,9 @@
|
|||||||
requires: "time dilation, not retrocausality",
|
requires: "time dilation, not retrocausality",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isTimeSkip = true;
|
tech.isTimeSkip = true;
|
||||||
b.setFireCD();
|
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.isTimeSkip = false;
|
tech.isTimeSkip = false;
|
||||||
b.setFireCD();
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -6980,6 +7010,72 @@
|
|||||||
// },
|
// },
|
||||||
// remove() {}
|
// remove() {}
|
||||||
// },
|
// },
|
||||||
|
{
|
||||||
|
name: "palantír",
|
||||||
|
description: `see far away lands`,
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 0,
|
||||||
|
isNonRefundable: true,
|
||||||
|
isExperimentHide: true,
|
||||||
|
isJunk: true,
|
||||||
|
allowed() {
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
requires: "",
|
||||||
|
effect() {
|
||||||
|
m.look = () => {
|
||||||
|
//always on mouse look
|
||||||
|
m.angle = Math.atan2(
|
||||||
|
simulation.mouseInGame.y - m.pos.y,
|
||||||
|
simulation.mouseInGame.x - m.pos.x
|
||||||
|
);
|
||||||
|
//smoothed mouse look translations
|
||||||
|
const scale = 2;
|
||||||
|
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.transX += (m.transSmoothX - m.transX) * m.lookSmoothing;
|
||||||
|
m.transY += (m.transSmoothY - m.transY) * m.lookSmoothing;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
if (this.count) m.look = m.lookDefault
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "motion sickness",
|
||||||
|
description: `disable camera smoothing`,
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 0,
|
||||||
|
isNonRefundable: true,
|
||||||
|
isExperimentHide: true,
|
||||||
|
isJunk: true,
|
||||||
|
allowed() {
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
requires: "",
|
||||||
|
effect() {
|
||||||
|
m.look = () => {
|
||||||
|
//always on mouse look
|
||||||
|
m.angle = Math.atan2(
|
||||||
|
simulation.mouseInGame.y - m.pos.y,
|
||||||
|
simulation.mouseInGame.x - m.pos.x
|
||||||
|
);
|
||||||
|
//smoothed mouse look translations
|
||||||
|
const scale = 1.2;
|
||||||
|
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.transX = canvas.width2 - m.pos.x - (simulation.mouse.x - canvas.width2) * scale;
|
||||||
|
m.transY = canvas.height2 - m.pos.y - (simulation.mouse.y - canvas.height2) * scale;
|
||||||
|
// m.transX += (m.transSmoothX - m.transX) * m.lookSmoothing;
|
||||||
|
// m.transY += (m.transSmoothY - m.transY) * m.lookSmoothing;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
if (this.count) m.look = m.lookDefault
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "planetesimals",
|
name: "planetesimals",
|
||||||
description: `play <strong>planetesimals</strong><br><em>(an annoying asteroids game with Newtonian physics)</em><br>clearing a <strong>level</strong> in <strong>planetesimals</strong> spawns a <strong class='color-m'>tech</strong> in <strong>n-gon</strong><br>but, if you <strong style="color:red;">die</strong> in <strong>planetesimals</strong> you <strong style="color:red;">die</strong> in <strong>n-gon</strong>`,
|
description: `play <strong>planetesimals</strong><br><em>(an annoying asteroids game with Newtonian physics)</em><br>clearing a <strong>level</strong> in <strong>planetesimals</strong> spawns a <strong class='color-m'>tech</strong> in <strong>n-gon</strong><br>but, if you <strong style="color:red;">die</strong> in <strong>planetesimals</strong> you <strong style="color:red;">die</strong> in <strong>n-gon</strong>`,
|
||||||
|
|||||||
21
todo.txt
21
todo.txt
@@ -1,23 +1,18 @@
|
|||||||
******************************************************** NEXT PATCH **************************************************
|
******************************************************** NEXT PATCH **************************************************
|
||||||
|
|
||||||
block throwing and mines when crouched now have trajectory prediction, like grenades
|
tech: applied science - gives a random gun tech and a research for each gun in your inventory
|
||||||
|
|
||||||
all bot upgrades are about 20% better
|
JUNK tech - motion sickness - disable camera smoothing
|
||||||
Ψ(t) collapse gives 16->21 research
|
JUNK tech - palantír - see far away
|
||||||
spores and drones have up to 20% shorter life span when the number of active bullets is high
|
|
||||||
|
|
||||||
1st ionization energy gives 7 -> 8 max energy per heal
|
foam-bot, nail-bot, missile-bot: are now affected by fire delay tech
|
||||||
permittivity renamed weak interaction
|
this gives some options for late game bot scaling
|
||||||
weak interaction gives 4 -> 5 max energy per unused power up
|
|
||||||
transceiver renamed electroweak interaction
|
timelike now allows some energy regen while immune to harm in double time
|
||||||
fixed about 70 different requirement text situations
|
Tokamak now overrides the trajectory throw graphics with its own
|
||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** TODO ********************************************************
|
||||||
|
|
||||||
need a mine tech that mines there be fewer mines
|
|
||||||
disables booby trap
|
|
||||||
makes mines do more damage
|
|
||||||
|
|
||||||
tech: after bullets hit a mob, the mob takes 1% more damage
|
tech: after bullets hit a mob, the mob takes 1% more damage
|
||||||
this.damageReduction *= 1.01
|
this.damageReduction *= 1.01
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user