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:
landgreen
2021-11-11 06:28:28 -08:00
parent 95fcdb10b8
commit 50314c21e9
7 changed files with 244 additions and 106 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -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,

View File

@@ -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)

View File

@@ -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,6 +1138,31 @@ 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
//trajectory path prediction
if (tech.isTokamak) {
//draw charge
if (m.throwCharge > 4) {
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;
ctx.fillStyle = "rgba(200,0,255,0.3)";
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(m.holdingTarget.vertices[len].x, m.holdingTarget.vertices[len].y);
ctx.lineTo(m.holdingTarget.vertices[0].x, m.holdingTarget.vertices[0].y);
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 //draw charge
const x = m.pos.x + 15 * Math.cos(m.angle); const x = m.pos.x + 15 * Math.cos(m.angle);
const y = m.pos.y + 15 * Math.sin(m.angle); const y = m.pos.y + 15 * Math.sin(m.angle);
@@ -1157,7 +1184,7 @@ const m = {
ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y); ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y);
ctx.fill(); ctx.fill();
} }
//trajectory path prediction //trajectory prediction
const cycles = 30 const cycles = 30
const charge = Math.min(m.throwCharge / 5, 1) 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 speed = 80 * charge * Math.min(0.85, 0.8 / Math.pow(m.holdingTarget.mass, 0.25));
@@ -1170,6 +1197,7 @@ const m = {
ctx.strokeStyle = "rgba(68, 68, 68, 0.15)" //color.map ctx.strokeStyle = "rgba(68, 68, 68, 0.15)" //color.map
ctx.lineWidth = 2 ctx.lineWidth = 2
ctx.stroke() 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();

View File

@@ -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) {

View File

@@ -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>`,

View File

@@ -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