diff --git a/js/bullet.js b/js/bullet.js index a890479..a7facb4 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -3040,17 +3040,14 @@ const b = { lockedOn: null, delay: 50, cd: simulation.cycle + 10, - dmg: 0, + dmg: radius * (tech.isMutualism ? 2.5 : 1), setDamage() { //dmg is set to zero after doing damage once, and set back to normal after jumping this.dmg = radius * (tech.isMutualism ? 2.5 : 1) //damage done in addition to the damage from momentum //spores do 7 dmg, worms do 18 }, beforeDmg(who) { - // this.endCycle = 0 Matter.Body.setVelocity(this, Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), 10 + 10 * Math.random())); //push away from target - this.endCycle -= 180 this.cd = simulation.cycle + this.delay; - // this.collisionFilter.mask = cat.map if (tech.isSporeFreeze) mobs.statusSlow(who, 90) if (tech.isSpawnBulletsOnDeath && who.alive && who.isDropPowerUp) { setTimeout(() => { @@ -3075,29 +3072,8 @@ const b = { }, gravity: 0.002 + 0.002 * tech.isSporeFollow, do() { - // if (true && this.lockedOn && this.cd < simulation.cycle) { //blink towards mobs - // //needs it's own cooldown variables - // // this.cd = simulation.cycle + this.delay; - - // const sub = Vector.sub(this.lockedOn.position, this.position); - // const distMag = Vector.magnitude(sub); - // if (distMag < 500) { - // const unit = Vector.normalise(sub) - // Matter.Body.setVelocity(this, Vector.mult(unit, Math.max(20, this.speed * 1.5))); - // ctx.beginPath(); - // ctx.moveTo(this.position.x, this.position.y); - // Matter.Body.translate(this, Vector.mult(unit, Math.min(350, distMag - this.lockedOn.radius + 10))); - // ctx.lineTo(this.position.x, this.position.y); - // ctx.lineWidth = radius * 2; - // ctx.strokeStyle = "rgba(0,0,0,0.5)"; - // ctx.stroke(); - // } - // } - this.force.y += this.gravity * this.mass if (this.cd < simulation.cycle && (Matter.Query.collides(this, map).length || Matter.Query.collides(this, body).length)) { //if on the ground and not on jump cooldown // - // this.collisionFilter.mask = cat.map | cat.mob | cat.mobBullet | cat.mobShield - this.cd = simulation.cycle + this.delay; this.lockedOn = null; //find a target let closeDist = Infinity; @@ -3160,7 +3136,6 @@ const b = { drone(where = { x: m.pos.x + 30 * Math.cos(m.angle) + 20 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 20 * (Math.random() - 0.5) }, speed = 1) { const me = bullet.length; const THRUST = 0.0015 - // const FRICTION = tech.isFastDrones ? 0.008 : 0.0005 const dir = m.angle + 0.4 * (Math.random() - 0.5); const RADIUS = (4.5 + 3 * Math.random()) bullet[me] = Bodies.polygon(where.x, where.y, 8, RADIUS, { @@ -3170,7 +3145,6 @@ const b = { frictionAir: 0, restitution: 1, density: 0.0005, // 0.001 is normal density - //total 0.24 + 0.3 average dmg: 0.34 + 0.12 * tech.isDroneTeleport + 0.15 * tech.isDroneFastLook, //damage done in addition to the damage from momentum lookFrequency: (tech.isDroneFastLook ? 20 : 70) + Math.floor(17 * Math.random()), endCycle: simulation.cycle + Math.floor((950 + 400 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 5 * RADIUS + Math.max(0, 150 - bullet.length), @@ -3749,7 +3723,7 @@ const b = { inertia: Infinity, frictionAir: 0.003, dmg: 0, //damage on impact - damage: tech.foamDamage * (tech.isFastFoam ? 2.5 : 1) * (tech.isBulletTeleport ? 1.47 : 1), //damage done over time + damage: tech.foamDamage * (tech.isFastFoam ? 2.8 : 1) * (tech.isBulletTeleport ? 1.53 : 1), //damage done over time scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1), classType: "bullet", collisionFilter: { @@ -3816,9 +3790,9 @@ const b = { Matter.Body.setPosition(this, Vector.add(Vector.add(rotate, this.target.velocity), this.target.position)) } if (this.target.isBoss) { - if (this.target.speed > 8) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.98)) + if (this.target.speed > 7.5) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.98)) } else { - if (this.target.speed > 4) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.95)) + if (this.target.speed > 3.5) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.95)) } Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9); @@ -5606,10 +5580,18 @@ const b = { }, dmg) } } + } else if (tech.isSporeFlea) { + const where = { x: m.pos.x + 35 * Math.cos(m.angle), y: m.pos.y + 35 * Math.sin(m.angle) } + const number = 4 * (tech.isShotgunReversed ? 1.6 : 1) + for (let i = 0; i < number; i++) { + const angle = m.angle + 0.2 * (Math.random() - 0.5) + const speed = (input.down ? 33 : 20) * (1 + 0.1 * Math.random()) + b.flea(where, { x: speed * Math.cos(angle), y: speed * Math.sin(angle) }) + } } else if (tech.isSporeWorm) { const where = { x: m.pos.x + 35 * Math.cos(m.angle), y: m.pos.y + 35 * Math.sin(m.angle) } const spread = (input.down ? 0.02 : 0.07) - const number = 3 * (tech.isShotgunReversed ? 1.6 : 1) + Math.random() + const number = 4 * (tech.isShotgunReversed ? 1.6 : 1) let angle = m.angle - (number - 1) * spread * 0.5 for (let i = 0; i < number; i++) { b.worm(where) @@ -6349,7 +6331,7 @@ const b = { bullet[me].maxRadius = 30; bullet[me].restitution = 0.3; bullet[me].minDmgSpeed = 0; - bullet[me].totalSpores = 8 + 2 * tech.isSporeFreeze + 3 * tech.isSporeZooid + bullet[me].totalSpores = 8 + 2 * tech.isSporeFreeze + 4 * tech.isSporeColony bullet[me].stuck = function() {}; bullet[me].beforeDmg = function() {}; bullet[me].do = function() { @@ -6481,7 +6463,7 @@ const b = { ] for (len = this.totalSpores; count < len; count++) { - if (tech.isSporeZooid && Math.random() < 0.5) { + if (tech.isSporeColony && Math.random() < 0.5) { things[Math.floor(Math.random() * things.length)]() } else if (tech.isSporeFlea) { things[2]() diff --git a/js/index.js b/js/index.js index 381303b..a509545 100644 --- a/js/index.js +++ b/js/index.js @@ -358,7 +358,27 @@ ${simulation.isCheating ? "

lore disabled": ""} document.getElementById("field-" + m.fieldMode).classList.remove("build-field-selected"); m.setField(index) who.classList.add("build-field-selected"); + } else if (m.fieldMode === 4) { + const i = 4 //update experiment text + simulation.molecularMode++ + if (simulation.molecularMode > i - 1) simulation.molecularMode = 0 + m.fieldUpgrades[i].description = m.fieldUpgrades[i].setDescription() + document.getElementById(`field-${i}`).innerHTML = `
  ${build.nameLink(m.fieldUpgrades[i].name)}
${m.fieldUpgrades[i].description}` } + + // if (m.fieldMode === 4 && simulation.molecularMode < 3) { + // simulation.molecularMode++ + // m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription() + // } else { + // m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field + + // if (m.fieldMode === 4) { + // simulation.molecularMode = 0 + // m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription() + // } + // } + + } else if (type === "tech") { if (tech.tech[index].count < tech.tech[index].maxCount) { // if (!tech.tech[index].isLore && !tech.tech[index].isNonRefundable && !who.classList.contains("build-tech-selected")) who.classList.add("build-tech-selected"); @@ -920,7 +940,16 @@ window.addEventListener("keydown", function(event) { if (tech.isPauseSwitchField || simulation.testing) { document.getElementById("pause-field").addEventListener("click", () => { const energy = m.energy - m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field + if (m.fieldMode === 4 && simulation.molecularMode < 3) { + simulation.molecularMode++ + m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription() + } else { + m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field + if (m.fieldMode === 4) { + simulation.molecularMode = 0 + m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription() + } + } m.energy = energy document.getElementById("pause-field").innerHTML = `
  ${m.fieldUpgrades[m.fieldMode].name}
${m.fieldUpgrades[m.fieldMode].description}` }); @@ -1125,18 +1154,18 @@ document.body.addEventListener("mousemove", (e) => { document.body.addEventListener("mouseup", (e) => { // input.fire = false; // console.log(e) - if (e.which === 3) { - input.field = false; - } else { + if (e.button === 0) { input.fire = false; + } else if (e.button === 2) { + input.field = false; } }); document.body.addEventListener("mousedown", (e) => { - if (e.which === 3) { - input.field = true; - } else { + if (e.button === 0) { input.fire = true; + } else if (e.button === 2) { + input.field = true; } }); diff --git a/js/level.js b/js/level.js index 686627b..0decdab 100644 --- a/js/level.js +++ b/js/level.js @@ -24,9 +24,9 @@ const level = { // powerUps.research.changeRerolls(100) // tech.tech[297].frequency = 100 // b.guns[0].ammo = 10000 - // m.setField("molecular assembler") //molecular assembler time dilation - // b.giveGuns("spores") - // tech.giveTech("K-selection") + // m.setField("perfect diamagnetism") //molecular assembler time dilation perfect diamagnetism + // b.giveGuns("shotgun") //0 nail gun 1 shotgun 2 super balls 3 matter wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser + // tech.giveTech("siphonaptera") // tech.giveTech("fleas") // tech.giveTech("colony") // tech.giveTech("mycelium manufacturing") @@ -36,7 +36,8 @@ const level = { // for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "tech"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "research"); // spawn.starter(1900, -500, 200) - // for (let i = 0; i < 10; ++i) spawn.hopBullet(1900, -500) + // spawn.powerUpBossBaby(1900, -500) + // for (let i = 0; i < 10; ++i) spawn.grower(1900, -500) // level.testing(); //not in rotation, used for testing // for (let i = 0; i < 7; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research"); // for (let i = 0; i < 4; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech"); diff --git a/js/mob.js b/js/mob.js index 1217e20..1c349a1 100644 --- a/js/mob.js +++ b/js/mob.js @@ -172,7 +172,6 @@ const mobs = { ctx.lineTo(who.vertices[j].x, who.vertices[j].y); } ctx.lineTo(who.vertices[0].x, who.vertices[0].y); - ctx.stroke(); ctx.fill(); }, endEffect() { diff --git a/js/player.js b/js/player.js index 11074e9..c6183f1 100644 --- a/js/player.js +++ b/js/player.js @@ -2020,8 +2020,11 @@ const m = { }, { name: "molecular assembler", - description: `excess energy used to build ${simulation.molecularMode === 0 ? "spores" : simulation.molecularMode === 1 ? "missiles" : simulation.molecularMode === 2 ? "ice IX" : "drones"}
use energy to deflect mobs
generate 12 energy per second`, + description: `excess energy used to build ${simulation.molecularMode === 0 ? "spores" : simulation.molecularMode === 1 ? "missiles" : simulation.molecularMode === 2 ? "ice IX" : "drones"}
use energy to deflect mobs
generate 12 energy per second`, // simulation.molecularMode: Math.floor(4 * Math.random()), //0 spores, 1 missile, 2 ice IX, 3 drones + setDescription() { + return `excess energy used to build ${simulation.molecularMode === 0 ? "spores" : simulation.molecularMode === 1 ? "missiles" : simulation.molecularMode === 2 ? "ice IX" : "drones"}
use energy to deflect mobs
generate 12 energy per second` + }, effect: () => { m.fieldMeterColor = "#ff0" m.eyeFillColor = m.fieldMeterColor diff --git a/js/simulation.js b/js/simulation.js index abf14a2..e55f06f 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -191,7 +191,7 @@ const simulation = { accelScale: null, //set in levels.setDifficulty CDScale: null, //set in levels.setDifficulty isNoPowerUps: false, - molecularMode: Math.floor(4 * Math.random()), //0 spores, 1 missile, 2 ice IX, 3 drones + molecularMode: Math.floor(4 * Math.random()), //0 spores, 1 missile, 2 ice IX, 3 drones //randomize molecular assembler field type // dropFPS(cap = 40, time = 15) { // simulation.fpsCap = cap // simulation.fpsInterval = 1000 / simulation.fpsCap; @@ -577,7 +577,6 @@ const simulation = { }, firstRun: true, splashReturn() { - document.getElementById("previous-seed").innerHTML = `previous seed: ${Math.initialSeed}
` document.getElementById("seed").value = Math.initialSeed = Math.seed //randomize initial seed @@ -1425,15 +1424,16 @@ const simulation = { const dx = Math.max(25, round(simulation.mouseInGame.x) - x) const dy = Math.max(25, round(simulation.mouseInGame.y) - y) - if (e.which === 2) { + if (e.button === 2) { if (level.isProcedural) { simulation.outputMapString(`spawn.randomMob(x+${x}, y+${y}, 0);`); } else { simulation.outputMapString(`spawn.randomMob(${x}, ${y}, 0);`); } - + } else if (e.button === 4) { + simulation.outputMapString(`${Math.floor(simulation.constructMouseDownPosition.x)}, ${Math.floor(simulation.constructMouseDownPosition.y)}`); } else if (simulation.mouseInGame.x > simulation.constructMouseDownPosition.x && simulation.mouseInGame.y > simulation.constructMouseDownPosition.y) { //make sure that the width and height are positive - if (e.which === 1) { //add map + if (e.button === 1) { //add map if (level.isProcedural) { simulation.outputMapString(`spawn.mapRect(x+${x}, y+${y}, ${dx}, ${dy});`); } else { @@ -1449,7 +1449,7 @@ const simulation = { Composite.add(engine.world, map[len]); //add to world simulation.draw.setPaths() //update map graphics - } else if (e.which === 3) { //add body + } else if (e.button === 3) { //add body if (level.isProcedural) { simulation.outputMapString(`spawn.bodyRect(x+${x}, y+${y}, ${dx}, ${dy});`); } else { diff --git a/js/tech.js b/js/tech.js index a9c8fc3..28c4031 100644 --- a/js/tech.js +++ b/js/tech.js @@ -221,7 +221,7 @@ const tech = { } }, hasExplosiveDamageCheck() { - return tech.haveGunCheck("missiles") || simulation.molecularMode === 1 || tech.missileBotCount > 0 || tech.isBoomBotUpgrade || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) + return tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount > 0 || tech.isBoomBotUpgrade || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) }, damageFromTech() { let dmg = 1 //m.fieldDamage @@ -884,7 +884,6 @@ const tech = { name: "anti-shear topology", link: `anti-shear topology`, description: "+30% projectile duration", //
drone spore worm flea missile foam wave neutron ice", - isGunTech: true, maxCount: 3, count: 0, frequency: 1, @@ -3087,26 +3086,11 @@ const tech = { }, remove() { tech.isDeterminism = false; - // if (this.count > 0) { - // for (let i = 0; i < 5; i++) { - // const numberRemoved = tech.removeTech() - // console.log(numberRemoved) - // if (numberRemoved === 0) { //if the player didn't remove a power up then remove 1 tech for the map - // for (let j = powerUp.length - 1; j > -1; j--) { - // if (powerUp[j].name === "tech") { - // Matter.Composite.remove(engine.world, powerUp[j]); - // powerUp.splice(j, 1); - // break; - // } - // } - // } - // } - // } } }, { name: "superdeterminism", - description: `spawn 5 tech
you have no cancel and ${powerUps.orb.research(1)}, no longer spawn`, + description: `spawn 5 tech
you have no cancel and ${powerUps.orb.research(1)} no longer spawn`, maxCount: 1, count: 0, frequency: 4, @@ -3124,10 +3108,6 @@ const tech = { }, remove() { tech.isSuperDeterminism = false; - // tech.isSuperDeterminism = false; - // if (this.count) { - // for (let i = 0; i < 5; i++) tech.removeTech() - // } } }, { @@ -3156,22 +3136,6 @@ const tech = { } } }, - - - // for (let i = 0, len = tech.tech.length; i < len; i++) { - // if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 3 - // } - // }, - // remove() { - // // powerUps.research.changeRerolls(-6) - // // if (this.count > 1) { - // // for (let i = 0, len = tech.tech.length; i < len; i++) { - // // if (tech.tech[i].isFieldTech) tech.tech[i].frequency /= 3 - // // } - // // } - - - { name: "paradigm shift", description: `clicking tech while paused ejects them
16% chance to fail`, @@ -3211,10 +3175,7 @@ const tech = { }, { name: "technical debt", // overengineering - // description: `increase damage by 300% minus 10% for tech you have learned(${4 - 0.1 * tech.totalCount})`, - // description: `increase damage by 300%, but reduce damage
by 10% for tech you have learned`, descriptionFunction() { - // return `increase damage by 300% minus 15%
for each tech you have learned (${Math.floor(100*(4 - 0.14 * tech.totalCount))-100}%)` return `+300% damage –15% damage
for each tech you have learned (${Math.floor(100*(Math.max(41 / (tech.totalCount + 21), 4 - 0.15 * tech.totalCount) ))-100}%)` }, maxCount: 1, @@ -3777,7 +3738,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return ((tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.nailRecoil) || (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isFoamShot && !tech.isSporeWorm)) && !tech.isRivets && !tech.isIncendiary && !tech.isIceCrystals && !tech.isIceShot + return ((tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.nailRecoil) || (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea)) && !tech.isRivets && !tech.isIncendiary && !tech.isIceCrystals && !tech.isIceShot }, requires: "nail gun, shotgun, not ice crystal, rivets, rotary cannon, or pneumatic, incendiary, nail-shot, rivets, foam-shot, worm-shot, ice-shot", effect() { @@ -3816,7 +3777,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return ((tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate) || (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isFoamShot && !tech.isSporeWorm)) && !tech.isNeedles && !tech.isIceCrystals && !tech.isIceShot + return ((tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate) || (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea)) && !tech.isNeedles && !tech.isIceCrystals && !tech.isIceShot }, requires: "nail gun, shotgun, not ice crystal, needles, or pneumatic actuator", effect() { @@ -4140,7 +4101,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isSporeWorm && !tech.isNeedles + return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles }, requires: "shotgun, not incendiary, rivets, foam-shot, worm-shot, ice-shot, needles", effect() { @@ -4160,7 +4121,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isSporeWorm && !tech.isNeedles + return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles }, requires: "shotgun, not incendiary, nail-shot, rivet, worm-shot, ice-shot, needle", effect() { @@ -4180,7 +4141,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isNeedles + return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles }, requires: "shotgun, not incendiary, nail-shot, rivet, foam-shot, worm-shot", effect() { @@ -4199,7 +4160,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.isIceCrystals || tech.isSporeFreeze || simulation.molecularMode === 2 || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 + return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 }, requires: "a freeze effect", effect() { @@ -4218,7 +4179,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.isIceCrystals || tech.isSporeFreeze || simulation.molecularMode === 2 || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 + return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 }, requires: "a freeze effect", effect() { @@ -4237,7 +4198,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return (tech.isIceCrystals || tech.isSporeFreeze || simulation.molecularMode === 2 || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob + return (tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob }, requires: "a localized freeze effect, no other mob death tech", effect() { @@ -4256,7 +4217,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return simulation.molecularMode === 2 || tech.relayIce || tech.isNeedleIce || tech.blockingIce || tech.iceIXOnDeath || tech.isIceShot + return (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || tech.blockingIce || tech.iceIXOnDeath || tech.isIceShot }, requires: "ice IX", effect() { @@ -4275,7 +4236,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.isIceCrystals || tech.isSporeFreeze || simulation.molecularMode === 2 || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 || tech.iceIXOnDeath || tech.isIceShot + return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 || tech.iceIXOnDeath || tech.isIceShot }, requires: "a localized freeze effect", effect() { @@ -4294,7 +4255,7 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIceShot && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isNeedles) || (tech.haveGunCheck("super balls") && !tech.isFoamBall) || (tech.isRivets && !tech.isNailCrit) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport) + return (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIceShot && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles) || (tech.haveGunCheck("super balls") && !tech.isFoamBall) || (tech.isRivets && !tech.isNailCrit) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport) }, requires: "shotgun, super balls, rivets, drones, not irradiated drones, burst drones, polyurethane", effect() { @@ -4577,7 +4538,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return (tech.haveGunCheck("missiles") && tech.missileFireCD === 45) || simulation.molecularMode === 1 || tech.missileBotCount + return (tech.haveGunCheck("missiles") && tech.missileFireCD === 45) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount }, requires: "missiles", effect() { @@ -4596,9 +4557,9 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return (tech.haveGunCheck("missiles") || simulation.molecularMode === 1) && tech.isMissileBig + return (tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1)) && tech.isMissileBig }, - requires: "missiles, cruse missile", + requires: "missiles, cruise missile", effect() { tech.isMissileBiggest = true }, @@ -4683,7 +4644,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.explosiveRadius === 1 && !tech.isSmallExplosion && !tech.isBlockExplode && !tech.fragments && (tech.haveGunCheck("missiles") || tech.missileBotCount || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || simulation.molecularMode === 1 || tech.isBoomBotUpgrade || tech.isTokamak) + return tech.explosiveRadius === 1 && !tech.isSmallExplosion && !tech.isBlockExplode && !tech.fragments && (tech.haveGunCheck("missiles") || tech.missileBotCount || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.isBoomBotUpgrade || tech.isTokamak) }, requires: "an explosive damage source, not ammonium nitrate, nitroglycerin, chain reaction, fragmentation", effect: () => { @@ -4702,7 +4663,7 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return !tech.isExplodeRadio && ((tech.haveGunCheck("harpoon") && !tech.isFoamBall) || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || simulation.molecularMode === 1 || tech.missileBotCount || tech.isRivets || tech.blockDamage > 0.075) + return !tech.isExplodeRadio && ((tech.haveGunCheck("harpoon") && !tech.isFoamBall) || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount || tech.isRivets || tech.blockDamage > 0.075) }, requires: "grenades, missiles, rivets, harpoon, or mass driver, not iridium-192, not polyurethane foam", effect() { @@ -4798,7 +4759,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 3) && (tech.haveGunCheck("missiles") || simulation.molecularMode === 1 || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)) + return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 3) && (tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)) }, requires: "an explosive damage source, not electric reactive armor", effect: () => { @@ -4841,7 +4802,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("missiles") || tech.missileBotCount || tech.haveGunCheck("grenades") || simulation.molecularMode === 1 + return tech.haveGunCheck("missiles") || tech.missileBotCount || tech.haveGunCheck("grenades") }, requires: "missiles, grenades", effect() { @@ -5154,7 +5115,7 @@ const tech = { }, { name: "colony", - description: "+38% sporangium discharge
38% chance to discharge something different", + description: "+50% sporangium discharge
40% chance to discharge something different", link: `colony`, isGunTech: true, maxCount: 1, @@ -5166,10 +5127,10 @@ const tech = { }, requires: "spores", effect() { - tech.isSporeZooid = true + tech.isSporeColony = true }, remove() { - tech.isSporeZooid = false + tech.isSporeColony = false } }, { @@ -5182,7 +5143,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0 || tech.isSporeWorm || tech.isSporeFlea + return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea }, requires: "spores", effect() { @@ -5202,7 +5163,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0 || tech.isSporeWorm || tech.isSporeFlea + return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea }, requires: "spores", effect() { @@ -5222,7 +5183,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0) && !tech.isEnergyHealth || tech.isSporeWorm || tech.isSporeFlea + return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0)) && !tech.isEnergyHealth || tech.isSporeWorm || tech.isSporeFlea }, requires: "spores, not mass-energy", effect() { @@ -5234,14 +5195,14 @@ const tech = { }, { name: "siphonaptera", - description: "sporangium hatch fleas", //
spore tech applies to fleas + description: "shotgun and sporangium hatch fleas", //
spore tech applies to fleas isGunTech: true, maxCount: 1, count: 0, frequency: 3, frequencyDefault: 3, allowed() { - return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0) && !tech.isSporeWorm + return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeWorm }, requires: "spores, not worms", effect() { @@ -5261,7 +5222,7 @@ const tech = { frequency: 3, frequencyDefault: 3, allowed() { - return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0 || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeFlea + return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeFlea }, requires: "spores, not fleas", effect() { @@ -5582,7 +5543,7 @@ const tech = { }, { name: "uncertainty principle", - description: "foam and wave positions are erratic
+47% foam and wave damage", + description: "foam and wave positions are erratic
+53% foam and wave damage", isGunTech: true, maxCount: 1, count: 0, @@ -5620,7 +5581,7 @@ const tech = { }, { name: "aerogel", - description: "–50% foam duration and foam bubbles float
+150% foam damage", + description: "–50% foam duration and foam bubbles float
+180% foam damage", isGunTech: true, maxCount: 1, count: 0, @@ -5641,7 +5602,7 @@ const tech = { }, { name: "surface tension", - description: "+41% foam damage", + description: "+43% foam damage", isGunTech: true, maxCount: 9, count: 0, @@ -5652,7 +5613,7 @@ const tech = { }, requires: "foam", effect() { - tech.foamDamage += 0.011 * 0.41 + tech.foamDamage += 0.011 * 0.43 }, remove() { tech.foamDamage = 0.011; @@ -6048,7 +6009,7 @@ const tech = { }, { name: "laser diode", - description: "+33% laser energy efficiency", + description: "+40% laser energy efficiency", isGunTech: true, maxCount: 1, count: 0, @@ -6059,7 +6020,7 @@ const tech = { }, requires: "laser, not free-electron", effect() { - tech.isLaserDiode = 0.66; //100%-37% + tech.isLaserDiode = 0.6; //100%-40% tech.laserColor = "rgb(0, 11, 255)" tech.laserColorAlpha = "rgba(0, 11, 255,0.5)" }, @@ -6071,7 +6032,7 @@ const tech = { }, { name: "free-electron laser", - description: "+200% laser damage
–250% laser energy efficiency", + description: "+225% laser damage
–250% laser energy efficiency", isGunTech: true, maxCount: 1, count: 0, @@ -6083,7 +6044,7 @@ const tech = { requires: "laser, not pulse, diodes", effect() { tech.laserFieldDrain = 0.0063 //base is 0.002 - tech.laserDamage = 0.48; //base is 0.16 + tech.laserDamage = 0.52; //base is 0.16, 0.16 * (1 + 2.25) tech.laserColor = "#83f" tech.laserColorAlpha = "rgba(136, 51, 255,0.5)" }, @@ -7348,7 +7309,7 @@ const tech = { frequency: 3, frequencyDefault: 3, allowed() { - return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "wormhole") && (build.isExperimentSelection || powerUps.research.count > 3) + return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "wormhole") && (build.isExperimentSelection || powerUps.research.count > 6) }, requires: "wormhole, time dilation, negative mass, pilot wave", effect() { @@ -10388,5 +10349,5 @@ const tech = { isMicroTransactions: null, isLaserLens: null, laserCrit: null, - isSporeZooid: null, + isSporeColony: null, } \ No newline at end of file diff --git a/todo.txt b/todo.txt index 184bd2c..497df36 100644 --- a/todo.txt +++ b/todo.txt @@ -1,24 +1,31 @@ ******************************************************** NEXT PATCH ************************************************** -molecular fabricator defaults to random type on game load - spores, missile, ice IX, drones - -renamed fleas -> siphonaptera +siphonaptera makes shotgun fire fleas +colony 37% -> 50% more stuff in sporangium +foam bullets have a +7% slow effect + about +7% damage for some foam tech +laser diode 33% -> 40% less energy cost +free-electron laser 200% -> 225% damage +extra clicks in experiment and unified field theory pause now switches molecular fab types +bug fixes + mob stun graphics is more consistent and less like mob invincibility *********************************************************** TODO ***************************************************** +tech ______ effect that last until you get hit + field or bots can check your health every cycle and see if it lower + if it's high update the health check value + effect: + +damage until getting hit for cloaking field + fleas add very short (2 cycle) delay after each landing -> hop zero velocity while on short delay? try it? flea tech: add a delay to flea jumping also +dmg -improve mob invincible graphic - opacity oscillates from 100% to 0%? - make different from stun - make plasma ball power up and block pick up still work when you have no no energy make a unique CD var for plasma ball? @@ -37,7 +44,7 @@ testChamber2 for cube button that activates a laser beam that hits a target and opens a door in order to enter the door you need to place the cube on the button to activate the laser - cube has to fly through a portal in oder to get to the button + cube has to fly through a portal in order to get to the button you can't use your body story: you pick up the cube early on and have to get it to a button @@ -55,16 +62,6 @@ testChamber2 mitosis: after needle,bullets or rivets hit a surface split off into two smaller less damaging versions that have their velocity reset -firerate -tech: florescence -Hitting a mob makes it emit lasers from its vertices - all laser but pulse? - should trigger a global cd so it can't occur more then once per cycle - -tech spawn bots that last until you get hit - bots can check you health every cycle and see if it lower - it it's high update the health check value - JUNK? - after killing a mob go invulnerable for 1 second critical hit with laser, harpoon, nails, needle, rivet