diff --git a/js/index.js b/js/index.js index 1023617..52c9f9e 100644 --- a/js/index.js +++ b/js/index.js @@ -255,17 +255,17 @@ const build = { text += `
damage: ${((tech.damageFromTech())).toPrecision(3)}     difficulty: ${((m.dmgScale)).toPrecision(3)}
defense: ${(1-m.harmReduction()).toPrecision(3)}     difficulty: ${(1/simulation.dmgScale).toPrecision(3)} -
fire rate: ${((1-b.fireCDscale)*100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}% -
duplication: ${(tech.duplicationChance()*100).toFixed(0)}% -
coupling: ${(m.coupling).toFixed(2)} -${m.coupling> 0 ? '
'+m.couplingDescription(true): ""} +${b.fireCDscale < 1 ? `
fire rate: ${((1-b.fireCDscale)*100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}%`: ""} +${tech.duplicationChance() ? `
duplication: ${(tech.duplicationChance()*100).toFixed(0)}%`: ""} +${m.coupling ? `
coupling: ${(m.coupling).toFixed(2)}   `+m.couplingDescription(true)+"": ""} ${botText}

health: (${(m.health*100).toFixed(0)} / ${(m.maxHealth*100).toFixed(0)})
energy: (${(m.energy*100).toFixed(0)} / ${(m.maxEnergy*100).toFixed(0)}) +(${(m.fieldRegen*6000).toFixed(0)}/s)
gun: ${b.activeGun === null || b.activeGun === undefined ? "undefined":b.guns[b.activeGun].name}   ammo: ${b.activeGun === null || b.activeGun === undefined ? "0":b.guns[b.activeGun].ammo}
tech: ${tech.totalCount}   research: ${powerUps.research.count} -
JUNK: ${(junkCount / totalCount * 100).toFixed(1)}% +${junkCount ? `
JUNK: ${(junkCount / totalCount * 100).toFixed(1)}% `: ""} +

seed: ${Math.initialSeed}
level: ${level.levels[level.onLevel]} (${level.difficultyText()})   ${m.cycle} cycles diff --git a/js/level.js b/js/level.js index 5d0fd10..02a5c03 100644 --- a/js/level.js +++ b/js/level.js @@ -23,12 +23,11 @@ const level = { // powerUps.research.changeRerolls(100000) // m.immuneCycle = Infinity //you can't take damage // tech.tech[297].frequency = 100 - // m.setField("time dilation") //molecular assembler time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass + // m.setField("standing wave") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass // b.giveGuns("laser") //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 // b.guns[0].ammo = 1000000 - // tech.giveTech("time crystals"); - // tech.giveTech("retrocausality") - // for (let i = 0; i < 5; ++i) tech.giveTech("coupling") + // tech.giveTech("expansion") + // for (let i = 0; i < 1; ++i) tech.giveTech("field coupling") // for (let i = 0; i < 1; ++i) tech.giveTech("free-electron laser") // m.damage(0.1); // for (let i = 0; i < 1; i++) tech.giveTech("dynamic equilibrium") @@ -37,7 +36,7 @@ const level = { // spawn.starter(1900, -500, 200) // spawn.beetleBoss(1900, -400) - // spawn.pulsarBoss(1900, -400) + // spawn.shooter(1900, -500) // for (let i = 0; i < 15; ++i) spawn.starter(1900 + 300 * Math.random(), -500 + 300 * Math.random()) // level.testing(); // for (let i = 0; i < 7; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research"); @@ -145,7 +144,7 @@ const level = { simulation.accelScale = 1 //mob acceleration increases each level simulation.CDScale = 1 //mob CD time decreases each level simulation.dmgScale = Math.max(0.1, 0.34 * simulation.difficulty) //damage done by mobs scales with total levels - simulation.healScale = 1 / (1 + simulation.difficulty * 0.052) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale; + simulation.healScale = 1 / (1 + simulation.difficulty * 0.05) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale; }, difficultyIncrease(num = 1) { for (let i = 0; i < num; i++) { @@ -155,7 +154,7 @@ const level = { if (simulation.CDScale > 0.15) simulation.CDScale *= 0.965 //mob CD time decreases each level } simulation.dmgScale = Math.max(0.1, 0.34 * simulation.difficulty) //damage done by mobs scales with total levels - simulation.healScale = 1 / (1 + simulation.difficulty * 0.052) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale; + simulation.healScale = 1 / (1 + simulation.difficulty * 0.05) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale; // console.log(`CD = ${simulation.CDScale}`) }, difficultyDecrease(num = 1) { //used in easy mode for simulation.reset() @@ -167,7 +166,7 @@ const level = { } if (simulation.difficulty < 1) simulation.difficulty = 0; simulation.dmgScale = Math.max(0.1, 0.34 * simulation.difficulty) //damage done by mobs scales with total levels - simulation.healScale = 1 / (1 + simulation.difficulty * 0.052) + simulation.healScale = 1 / (1 + simulation.difficulty * 0.05) }, difficultyText() { if (simulation.difficultyMode === 1) { diff --git a/js/player.js b/js/player.js index 50b8f9c..a9d1d8d 100644 --- a/js/player.js +++ b/js/player.js @@ -344,7 +344,7 @@ const m = { !tech.tech[i].isFromAppliedScience && tech.tech[i].name !== "many-worlds" && tech.tech[i].name !== "Ψ(t) collapse" && - tech.tech[i].name !== "non-unitary operator" && + tech.tech[i].name !== "Hilbert space" && tech.tech[i].name !== "-quantum leap-" ) { totalTech += tech.tech[i].count @@ -519,28 +519,28 @@ const m = { let dmg = 1 dmg *= m.fieldHarmReduction // if (!tech.isFlipFlopOn && tech.isFlipFlopHealth) dmg *= 0.5 - if (tech.isLowHealthDefense) dmg *= 1 - Math.max(0, 1 - m.health) * 0.8 if (tech.isZeno) dmg *= 0.15 if (tech.isFieldHarmReduction) dmg *= 0.5 if (tech.isHarmMACHO) dmg *= 0.4 if (tech.isImmortal) dmg *= 0.66 - if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33 + if (tech.isSlowFPS) dmg *= 0.8 + if (tech.energyRegen === 0) dmg *= 0.34 if (tech.healthDrain) dmg *= 1 + 3.33 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage + if (m.fieldMode === 0 || m.fieldMode === 3) dmg *= 0.73 ** m.coupling + if (tech.isLowHealthDefense) dmg *= 1 - Math.max(0, 1 - m.health) * 0.8 + if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33 if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage if (tech.isAddBlockMass && m.isHolding) dmg *= 0.15 if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.0165, 0.66) - if (tech.isSlowFPS) dmg *= 0.8 if (tech.isHarmReduce && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.25 if (tech.isNeutronium && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.1 if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots() if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.3 - if (tech.energyRegen === 0) dmg *= 0.34 if (tech.isTurret && m.crouch) dmg *= 0.34; if (tech.isEntanglement && b.inventory[0] === b.activeGun) { for (let i = 0, len = b.inventory.length; i < len; i++) dmg *= 0.87 // 1 - 0.15 } - if (m.fieldMode === 0 || m.fieldMode === 3) dmg *= 0.73 ** m.coupling return dmg }, rewind(steps) { // m.rewind(Math.floor(Math.min(599, 137 * m.energy))) @@ -987,6 +987,8 @@ const m = { m.calculateFieldThreshold(); //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) m.isBodiesAsleep = true; m.wakeCheck(); + m.setMaxEnergy(); + m.setMaxHealth(); m.couplingChange() m.hole = { isOn: false, @@ -1002,7 +1004,8 @@ const m = { } }, setMaxEnergy() { - m.maxEnergy = (m.fieldMode === 0 || m.fieldMode === 1) * 0.4 * m.coupling + (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus + tech.harmonicEnergy + 2 * tech.isGroundState + 3 * tech.isRelay * tech.isFlipFlopOn * tech.isRelayEnergy + 0.6 * (m.fieldUpgrades[m.fieldMode].name === "standing wave") + // (m.fieldMode === 0 || m.fieldMode === 1) * 0.4 * m.coupling + + m.maxEnergy = (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus + tech.harmonicEnergy + 2 * tech.isGroundState + 3 * tech.isRelay * tech.isFlipFlopOn * tech.isRelayEnergy + 0.6 * (m.fieldUpgrades[m.fieldMode].name === "standing wave") // if (tech.isEnergyHealth) m.maxEnergy *= Math.sqrt(m.harmReduction()) simulation.makeTextLog(`m.maxEnergy = ${(m.maxEnergy.toFixed(2))}`) }, @@ -1368,8 +1371,13 @@ const m = { m.energy -= fieldBlockCost if (m.energy < 0) m.energy = 0; m.fieldCDcycle = m.cycle + m.fieldBlockCD; - if (tech.blockingIce && !who.isInvulnerable) { - for (let i = 0; i < fieldBlockCost * 60 * tech.blockingIce; i++) b.iceIX(3, 2 * Math.PI * Math.random(), m.pos) + if (!who.isInvulnerable && (m.coupling && m.fieldMode < 3) && bullet.length < 250) { //for standing wave mostly + for (let i = 0; i < m.coupling; i++) { + const sub = Vector.mult(Vector.normalise(Vector.sub(who.position, m.pos)), (m.fieldRange * m.harmonicRadius) * (0.4 + 0.3 * Math.random())) //m.harmonicRadius should be 1 unless you are standing wave expansion + const rad = Vector.rotate(sub, 1 * (Math.random() - 0.5)) + const angle = Math.atan2(sub.y, sub.x) + b.iceIX(6 + 6 * Math.random(), angle + 3 * (Math.random() - 0.5), Vector.add(m.pos, rad)) + } } const unit = Vector.normalise(Vector.sub(player.position, who.position)) if (tech.blockDmg) { @@ -1543,54 +1551,22 @@ const m = { } }, hold() {}, - // couplingDescription() { - // switch (m.fieldMode) { - // case 0: //field emitter - // return `gain the effects of all other fields` - // case 1: //standing wave - // return `+40 max energy per coupling` - // case 2: //perfect diamagnetism - // return `invulnerable +3 seconds post collision per coupling` - // case 3: //negative mass - // return `+27% defense per coupling` - // case 4: //assembler - // return `generate 6 energy per second per coupling` - // case 5: //plasma - // return `+50 max health per coupling` - // case 6: //time dilation - // return `+25% longer stopped time per coupling` //movement, jumping, and - // case 7: //cloaking - // return `+33% ambush damage per coupling` - // case 8: //pilot wave - // return `+40% block collision damage per coupling` - // case 9: //wormhole - // return `+4% duplication per coupling` - // } - // }, couplingDescription(isScaled = false) { const couple = isScaled ? m.coupling : 1 switch (m.fieldMode) { case 0: //field emitter - return `gain the effects of all applicable fields` - // return `+${40*couple} max energy - //
invulnerable +${3*couple} seconds post collision - //
+${27*couple}% defense - //
generate ${6*couple} energy per second - //
+${50*couple} max health - //
+${20*couple}% longer stopped time - //
+${33*couple}% ambush damage - //
+${40*couple}% block collision damage - //
+${4*couple}% duplication` + return `gain the effects of all fields` case 1: //standing wave - return `+${40*couple} max energy` + return `deflecting condenses +${Math.ceil(couple)} ice IX` case 2: //perfect diamagnetism - return `invulnerable +${3*couple} seconds post collision` + return `deflecting condenses +${Math.ceil(couple)} ice IX` + // return `invulnerable +${2*couple} seconds post collision` case 3: //negative mass return `+${27*couple}% defense` case 4: //assembler return `generate ${6*couple} energy per second` case 5: //plasma - return `+${50*couple} max health` + return `+${15*couple} damage` case 6: //time dilation return `+${25*couple}% longer stopped time` //movement, jumping, and case 7: //cloaking @@ -1598,16 +1574,17 @@ const m = { case 8: //pilot wave return `+${40*couple}% block collision damage` case 9: //wormhole - return `+${4*couple}% duplication` + return `after eating blocks +${20*couple} energy` } }, couplingChange() { - m.setMaxEnergy(); - m.setMaxHealth(); + // m.setMaxEnergy(); + // m.setMaxHealth(); m.setFieldRegen() mobs.setMobSpawnHealth(); + if ((m.fieldMode === 0 || m.fieldMode === 9) && !build.isExperimentSelection && !simulation.isTextLogOpen) simulation.circleFlare(0.4); powerUps.setDupChance(); - m.collisionImmuneCycles = 30 + m.coupling * 180 + // m.collisionImmuneCycles = 30 + m.coupling * 120 //2 seconds // switch (m.fieldMode) { // case 0: //field emitter // // m.fieldFireRate = 0.8 ** (m.coupling) @@ -1654,9 +1631,9 @@ const m = { }, fieldUpgrades: [{ name: "field emitter", - //
energy regen disabled if immune to harm - description: "use energy to deflect mobs
100 max energy
generate 6 energy per second", - // description: "use energy to deflect mobs,
grab power ups, and throw blocks
generate 6 energy/s, when not immune to harm", + description: `use energy to deflect mobs +
100 max energy +
generate 6 energy per second`, effect: () => { m.hold = function() { if (m.isHolding) { @@ -1683,7 +1660,9 @@ const m = { { name: "standing wave", //deflecting protects you in every direction - description: "3 oscillating shields are permanently active
+60 max energy
generate 6 energy per second", //drains energy //deflecting has 50% less recoil + description: `3 oscillating shields are permanently active +
+60 max energy +
generate 6 energy per second`, drainCD: 0, effect: () => { m.fieldBlockCD = 0; @@ -1811,10 +1790,11 @@ const m = { mob[i].locatePlayer(); const unit = Vector.normalise(Vector.sub(m.fieldPosition, mob[i].position)) m.fieldCDcycle = m.cycle + m.fieldBlockCD + (mob[i].isShielded ? 15 : 0); - if (tech.blockingIce) { - for (let i = 0; i < 2 * tech.blockingIce; i++) { - const angle = m.fieldAngle + 1.55 * (Math.random() - 0.5) - b.iceIX(10, angle, Vector.add(m.fieldPosition, { x: m.fieldRange * Math.cos(angle), y: m.fieldRange * Math.sin(angle) })) + if (bullet.length < 250) { + for (let i = 0; i < m.coupling; i++) { + const angle = m.fieldAngle + 4 * m.fieldArc * (Math.random() - 0.5) + const radius = m.fieldRange * (0.6 + 0.3 * Math.random()) + b.iceIX(6 + 6 * Math.random(), angle, Vector.add(m.fieldPosition, { x: radius * Math.cos(angle), y: radius * Math.sin(angle) })) } } if (tech.blockDmg) { //electricity @@ -3478,7 +3458,7 @@ const m = { Matter.Composite.remove(engine.world, body[i]); body.splice(i, 1); m.fieldRange *= 0.8 - if (tech.isWormholeEnergy) m.energy += 0.5 + if ((m.fieldMode === 0 || m.fieldMode === 9) && m.immuneCycle < m.cycle) m.energy += 0.2 * m.coupling if (tech.isWormholeWorms) { //pandimensional spermia b.worm(Vector.add(m.hole.pos2, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random()))) Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), -10)); @@ -3501,7 +3481,9 @@ const m = { body.splice(i, 1); m.fieldRange *= 0.8 // if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2 - if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.5 + // if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.5 + if ((m.fieldMode === 0 || m.fieldMode === 9) && m.immuneCycle < m.cycle) m.energy += 0.2 * m.coupling + if (m.fieldMode === 0 || m.fieldMode === 9) m.energy += 0.2 * m.coupling if (tech.isWormholeWorms) { //pandimensional spermia b.worm(Vector.add(m.hole.pos1, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random()))) Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), 5)); diff --git a/js/powerup.js b/js/powerup.js index 20cea23..418192d 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -595,7 +595,7 @@ const powerUps = { } } if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) { - tech.junkResearchNumber = Math.floor(5 * Math.random()) + tech.junkResearchNumber = Math.ceil(3 * Math.random()) text += `
` for (let i = 0; i < tech.junkResearchNumber; i++) text += `
` text += `
  pseudoscience
` @@ -734,7 +734,7 @@ const powerUps = { } } if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) { - tech.junkResearchNumber = Math.floor(5 * Math.random()) + tech.junkResearchNumber = Math.ceil(3 * Math.random()) text += `
` for (let i = 0; i < tech.junkResearchNumber; i++) text += `
` text += `
  pseudoscience
` @@ -987,7 +987,7 @@ const powerUps = { } //add in research button or pseudoscience button if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) { - tech.junkResearchNumber = Math.floor(5 * Math.random()) + tech.junkResearchNumber = Math.ceil(3 * Math.random()) text += `
` for (let i = 0; i < tech.junkResearchNumber; i++) text += `
` text += `
  pseudoscience
` diff --git a/js/spawn.js b/js/spawn.js index cbdf322..081a24d 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -2009,7 +2009,7 @@ const spawn = { this.checkStatus(); if (this.seePlayer.recall) { //throw large seekers - if (!(simulation.cycle % 240)) { + if (!(simulation.cycle % 90)) { spawn.seeker(this.position.x, this.position.y, 15 * (0.7 + 0.5 * Math.random()), 7); //give the bullet a rotational velocity as if they were attached to a vertex const who = mob[mob.length - 1] Matter.Body.setDensity(who, 0.00001); //normal is 0.001 @@ -2559,7 +2559,6 @@ const spawn = { }; me.warpIntensity = 0 me.awake = function() { - // this.armor(); this.checkStatus(); //health bar needs to be here because the position is being set const h = this.radius * 0.3; @@ -2627,14 +2626,6 @@ const spawn = { ctx.stroke(); } - // ctx.beginPath(); - // ctx.arc(this.position.x, this.position.y, this.laserRange * 0.9, 0, 2 * Math.PI); - // ctx.strokeStyle = "rgba(150,0,255,0.5)"; - // ctx.lineWidth = 1; - // ctx.stroke(); - // ctx.setLineDash([]); - // ctx.fillStyle = "rgba(150,0,255,0.03)"; - // ctx.fill(); if (!this.isStunned && !this.isSlowed) { if (this.followDelay > this.delayLimit) this.followDelay -= 0.15; let history = m.history[(m.cycle - Math.floor(this.followDelay)) % 600] @@ -4261,8 +4252,8 @@ const spawn = { this.death(); //hit player if (Vector.magnitude(Vector.sub(this.position, player.position)) < this.explodeRange && m.immuneCycle < m.cycle) { - m.damage(0.015 * simulation.dmgScale * (tech.isRadioactiveResistance ? 0.25 : 1)); - m.energy -= 0.15 * (tech.isRadioactiveResistance ? 0.25 : 1) + m.damage(0.02 * simulation.dmgScale * (tech.isRadioactiveResistance ? 0.25 : 1)); + m.energy -= 0.2 * (tech.isRadioactiveResistance ? 0.25 : 1) if (m.energy < 0) m.energy = 0 } // mob[i].isInvulnerable = false //make mineBoss not invulnerable ? @@ -5046,11 +5037,52 @@ const spawn = { // this.armor(); this.seePlayerByLookingAt(); this.checkStatus(); - this.fire(); - //gently return to starting location - // const sub = Vector.sub(this.homePosition, this.position) - // const dist = Vector.magnitude(sub) - // if (dist > 50) this.force = Vector.mult(Vector.normalise(sub), this.mass * 0.0002) + // this.fire(); + const setNoseShape = () => { + const mag = this.radius + this.radius * this.noseLength; + this.vertices[1].x = this.position.x + Math.cos(this.angle) * mag; + this.vertices[1].y = this.position.y + Math.sin(this.angle) * mag; + }; + //throw a mob/bullet at player + if (this.seePlayer.recall) { + //set direction to turn to fire + if (!(simulation.cycle % this.seePlayerFreq)) { + this.fireDir = Vector.normalise(Vector.sub(this.seePlayer.position, this.position)); + this.fireDir.y -= Math.abs(this.seePlayer.position.x - this.position.x) / 2500; //gives the bullet an arc //was / 1600 + } + //rotate towards fireAngle + const angle = this.angle + Math.PI / 2; + const dot = Vector.dot({ + x: Math.cos(angle), + y: Math.sin(angle) + }, this.fireDir) + // c = Math.cos(angle) * this.fireDir.x + Math.sin(angle) * this.fireDir.y; + const threshold = 0.1; + if (dot > threshold) { + this.torque += 0.000004 * this.inertia; + } else if (dot < -threshold) { + this.torque -= 0.000004 * this.inertia; + } else if (this.noseLength > 1.5 && dot > -0.2 && dot < 0.2) { + //fire + for (let i = 0, len = 2 + 0.07 * simulation.difficulty; i < len; i++) { + spawn.bullet(this.vertices[1].x, this.vertices[1].y, 7 + Math.ceil(this.radius / 25)); + const v = 15; + Matter.Body.setVelocity(mob[mob.length - 1], { + x: this.velocity.x + this.fireDir.x * v + 7 * Math.random(), + y: this.velocity.y + this.fireDir.y * v + 7 * Math.random() + }); + } + this.noseLength = 0; + // recoil + this.force.x -= 0.005 * this.fireDir.x * this.mass; + this.force.y -= 0.005 * this.fireDir.y * this.mass; + } + if (this.noseLength < 1.5) this.noseLength += this.fireFreq; + setNoseShape(); + } else if (this.noseLength > 0.1) { + this.noseLength -= this.fireFreq / 2; + setNoseShape(); + } }; }, bullet(x, y, radius = 9, sides = 0) { @@ -5059,11 +5091,11 @@ const spawn = { let me = mob[mob.length - 1]; me.stroke = "transparent"; me.onHit = function() { - this.explode(this.mass * 20); + this.explode(this.mass * 15); }; Matter.Body.setDensity(me, 0.00004); //normal is 0.001 - me.timeLeft = 200; - // me.g = 0.001; //required if using this.gravity + me.timeLeft = 220; + me.g = 0.001; //required if using this.gravity me.frictionAir = 0; me.restitution = 0.8; me.leaveBody = false; @@ -5074,7 +5106,7 @@ const spawn = { me.collisionFilter.category = cat.mobBullet; me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet; me.do = function() { - // this.gravity(); + this.gravity(); this.timeLimit(); }; }, @@ -6026,7 +6058,7 @@ const spawn = { for (let i = 0; i < nodes; ++i) { angle -= 0.1 spawn.snakeBody(x + tailRadius * Math.cos(angle), y + tailRadius * Math.sin(angle), i === 0 ? 25 : 20); - if (i < 3) mob[mob.length - 1].snakeHeadID = me.id + if (i < 4) mob[mob.length - 1].snakeHeadID = me.id mob[mob.length - 1].previousTailID = previousTailID previousTailID = mob[mob.length - 1].id } @@ -6125,7 +6157,7 @@ const spawn = { spawn.snakeBody(x + tailRadius * Math.cos(angle), y + tailRadius * Math.sin(angle), i === 0 ? 25 : 20); const who = mob[mob.length - 1] who.fill = `hsl(${160+40*Math.random()}, 100%, ${5 + 25*Math.random()*Math.random()}%)` - if (i < 3) who.snakeHeadID = me.id + if (i < 4) who.snakeHeadID = me.id if (i === 0) me.snakeBody1 = who //track this segment, so the difference in position between this segment and the head can be used to angle the wings who.previousTailID = previousTailID previousTailID = who.id diff --git a/js/tech.js b/js/tech.js index 5ec8375..e860cb8 100644 --- a/js/tech.js +++ b/js/tech.js @@ -1,6 +1,7 @@ const tech = { totalCount: null, setupAllTech() { + tech.damage = 1 for (let i = 0, len = tech.tech.length; i < len; i++) { tech.tech[i].count = 0 tech.tech[i].isLost = false @@ -90,7 +91,6 @@ const tech = { if (tech.tech[i].count < tech.tech[i].maxCount && tech.tech[i].allowed() && !tech.tech[i].isJunk) countNonJunk += tech.tech[i].frequency } const num = percent * countNonJunk //scale number added - console.log(num) for (let i = 0; i < num; i++) tech.tech[options[Math.floor(Math.random() * options.length)]].frequency++ //add random array options to tech pool simulation.makeTextLog(`tech.tech.push(${num.toFixed(0)} JUNK)`) return num @@ -206,17 +206,12 @@ const tech = { hasExplosiveDamageCheck() { 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) }, + damage: 1, //used for tech changes to player damage that don't have complex conditions damageFromTech() { - let dmg = 1 //m.fieldDamage - if (m.coupling && (m.fieldMode === 0 || m.fieldMode === 7)) dmg *= 1 + 0.15 * m.coupling + let dmg = tech.damage //m.fieldDamage + if (m.coupling && (m.fieldMode === 0 || m.fieldMode === 5)) dmg *= 1 + 0.15 * m.coupling + if (m.isSneakAttack && m.sneakAttackCycle + Math.min(120, 0.5 * (m.cycle - m.enterCloakCycle)) > m.cycle) dmg *= 4.33 * (1 + 0.33 * m.coupling) if (tech.deathSkipTime) dmg *= 1 + 0.6 * tech.deathSkipTime - if (tech.isNoDraftPause) dmg *= 1.34 - if (tech.isCloakingDamage) dmg *= 1.35 - if (tech.isTechDamage) dmg *= 1.9 - if (tech.isMaxEnergyTech) dmg *= 1.5 - if (tech.isEnergyNoAmmo) dmg *= 1.88 - if (tech.isEnergyLoss) dmg *= 1.55 - if (tech.OccamDamage) dmg *= tech.OccamDamage if (tech.isTechDebt) dmg *= Math.max(41 / (tech.totalCount + 21), 4 - 0.15 * tech.totalCount) if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599 @@ -234,14 +229,13 @@ const tech = { if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2 if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165) if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 1.6 - if (m.isSneakAttack && m.sneakAttackCycle + Math.min(120, 0.5 * (m.cycle - m.enterCloakCycle)) > m.cycle) dmg *= 4.33 * (1 + 0.33 * m.coupling) if (tech.isAxion && tech.isHarmMACHO) dmg *= 2 - m.harmReduction() if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3; if (tech.lastHitDamage && m.lastHit) dmg *= 1 + tech.lastHitDamage * m.lastHit * (2 - m.harmReduction()) // if (!simulation.paused) m.lastHit = 0 - return dmg * tech.slowFire * tech.aimDamage + return dmg }, duplicationChance() { - return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + 0.05 * tech.isExtraGunField + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication * (1 - 0.016 * (simulation.difficultyMode ** 2)) + (m.fieldMode === 0 || m.fieldMode === 9) * 0.04 * m.coupling) + return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + 0.05 * tech.isExtraGunField + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication * (1 - 0.016 * (simulation.difficultyMode ** 2))) // + (m.fieldMode === 0 || m.fieldMode === 9) * 0.03 * m.coupling) }, isScaleMobsWithDuplication: false, maxDuplicationEvent() { @@ -592,10 +586,13 @@ const tech = { return !tech.isAmmoFromHealth }, requires: "not catabolism", + damage: 1.88, effect() { + tech.damage *= this.damage tech.isEnergyNoAmmo = true; }, remove() { + if (this.count) tech.damage /= this.damage tech.isEnergyNoAmmo = false; } }, @@ -815,11 +812,14 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { return true }, + damage: 1.2, effect() { + tech.damage *= this.damage tech.slowFire = 1.2 b.setFireCD(); }, remove() { + if (this.count) tech.damage /= this.damage tech.slowFire = 1; b.setFireCD(); } @@ -941,6 +941,22 @@ const tech = { tech.sporesOnDeath = 0; } }, + { + name: "bubble fusion", + description: `after destroying a mob's natural shield
spawn 1-2 ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { return true }, + requires: "", + effect() { + tech.isShieldAmmo = true; + }, + remove() { + tech.isShieldAmmo = false; + } + }, { name: "reaction inhibitor", description: "-13% maximum mob health", //health @@ -2321,11 +2337,14 @@ const tech = { return !tech.isRewindAvoidDeath }, requires: "not CPT", + damage: 1.5, effect() { + tech.damage *= this.damage tech.isMaxEnergyTech = true; m.setMaxEnergy() }, remove() { + if (this.count) tech.damage /= this.damage tech.isMaxEnergyTech = false; m.setMaxEnergy() } @@ -2339,10 +2358,13 @@ const tech = { frequencyDefault: 1, allowed() { return true }, requires: "", + damage: 1.55, effect() { + tech.damage *= this.damage tech.isEnergyLoss = true; }, remove() { + if (this.count) tech.damage /= this.damage tech.isEnergyLoss = false; } }, @@ -2607,10 +2629,13 @@ const tech = { frequencyDefault: 1, allowed() { return true }, requires: "", + damage: 1.9, effect() { + tech.damage *= this.damage tech.isTechDamage = true; }, remove() { + if (this.count) tech.damage /= this.damage tech.isTechDamage = false; } }, @@ -2750,6 +2775,37 @@ const tech = { tech.healthDrain = 0; } }, + { + name: "ergodicity", + description: `+91% damage
${powerUps.orb.heal()} have no effect`, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !tech.isEnergyHealth && !tech.healthDrain + }, + requires: "not mass-energy, enthalpy", + damage: 1.91, + effect() { + tech.damage *= this.damage + tech.isNoHeals = true; + powerUps.heal.color = "#abb" + for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live + if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color + } + }, + remove() { + if (this.count) { + tech.damage /= this.damage + powerUps.heal.color = "#0eb" + for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live + if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color + } + } + tech.isNoHeals = false; + } + }, { name: "maintenance", description: `double the frequency of finding healing tech
spawn ${powerUps.orb.heal(13)}`, @@ -2854,8 +2910,7 @@ const tech = { }, { name: "Hilbert space", - // link: `non-unitary operator`, - description: "reduce combat difficulty by 2 levels
after a collision enter an alternate reality", + description: "+91% damage
after a collision enter an alternate reality", maxCount: 1, count: 0, frequency: 1, @@ -2864,15 +2919,14 @@ const tech = { return !tech.isResearchReality && !tech.isSwitchReality }, requires: "not Ψ(t) collapse, many-worlds", + damage: 1.91, effect() { + tech.damage *= this.damage tech.isCollisionRealitySwitch = true; - level.difficultyDecrease(simulation.difficultyMode * 2) }, remove() { + if (this.count) tech.damage /= this.damage tech.isCollisionRealitySwitch = false; - if (this.count > 0) { - level.difficultyIncrease(simulation.difficultyMode * 2) - } } }, { @@ -3022,7 +3076,7 @@ const tech = { }, { name: "pseudoscience", - description: "when selecting a power up, research 3 times
for free, but add 0-3% JUNK to the tech pool", + description: "when selecting a power up, research 3 times
for free, but add 1-3% JUNK to the tech pool", maxCount: 1, count: 0, frequency: 1, @@ -3165,68 +3219,6 @@ const tech = { tech.isSuperDeterminism = false; } }, - { - name: "unified field theory", - description: `clicking the field box when paused cycles your field
triple the frequency of finding fieldtech
`, - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return !tech.isSuperDeterminism && !tech.isNoDraftPause - }, - requires: "not superdeterminism, eternalism", - effect() { - tech.isPauseSwitchField = true; - for (let i = 0, len = tech.tech.length; i < len; i++) { - if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 3 - } - }, - remove() { - tech.isPauseSwitchField = false; - 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`, - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return !tech.isSuperDeterminism && !tech.isNoDraftPause - }, - requires: "not superdeterminism, eternalism", - effect() { - tech.isPauseEjectTech = true; - }, - remove() { - tech.isPauseEjectTech = false; - } - }, - { - name: "eternalism", - description: "+34% damage
time can't be paused (time can be dilated)", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return !tech.isPauseSwitchField && !tech.isPauseEjectTech && !tech.isWormHolePause - }, - requires: "not unified field theory, paradigm shift, invariant", - effect() { - tech.isNoDraftPause = true - }, - remove() { - tech.isNoDraftPause = false - } - }, { name: "technical debt", // overengineering descriptionFunction() { @@ -3265,7 +3257,7 @@ const tech = { }, { name: "meta-analysis", - description: `if you choose a JUNK tech you instead get a
random normal tech and ${powerUps.orb.research(2)}`, + description: `if you choose a JUNK tech you instead get a
random normal tech and spawn ${powerUps.orb.research(2)}`, maxCount: 1, count: 0, frequency: 1, @@ -3281,81 +3273,95 @@ const tech = { }, { name: "dark patterns", - description: "reduce combat difficulty by 1 level
+31% JUNK to tech pool", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return level.onLevel < 8 && level.onLevel > 0 - }, - requires: "on levels 1 through 7", - effect() { - level.difficultyDecrease(simulation.difficultyMode) - // simulation.difficulty-= - simulation.makeTextLog(`level.difficultyDecrease(simulation.difficultyMode)`) - this.refundAmount += tech.addJunkTechToPool(0.31) - // for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i]) - }, - refundAmount: 0, - remove() { - if (this.count > 0) { - if (this.refundAmount > 0) tech.removeJunkTechFromPool(this.refundAmount) - level.difficultyIncrease(simulation.difficultyMode) - } - } - }, - { - name: "ergodicity", - description: `reduce combat difficulty by 2 levels
${powerUps.orb.heal()} have no effect`, - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return level.onLevel > 1 && !tech.isEnergyHealth && !tech.healthDrain - }, - requires: "past level 1, not mass-energy, enthalpy", - effect() { - tech.isNoHeals = true; - level.difficultyDecrease(simulation.difficultyMode * 2) - simulation.makeTextLog(`level.difficultyDecrease(simulation.difficultyMode * 2)`) - powerUps.heal.color = "#abb" - for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live - if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color - } - }, - remove() { - if (tech.isNoHeals) { - powerUps.heal.color = "#0eb" - for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live - if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color - } - } - tech.isNoHeals = false; - if (this.count > 0) level.difficultyIncrease(simulation.difficultyMode * 2) - } - }, - { - name: "bubble fusion", - description: `after destroying a mob's natural shield
spawn 1-2 ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`, + description: "+38% damage
+53% JUNK to tech pool", maxCount: 1, count: 0, frequency: 1, frequencyDefault: 1, allowed() { return true }, requires: "", + damage: 1.38, effect() { - tech.isShieldAmmo = true; + tech.damage *= this.damage + this.refundAmount += tech.addJunkTechToPool(0.53) + }, + refundAmount: 0, + remove() { + if (this.count > 0) { + tech.damage /= this.damage + if (this.refundAmount > 0) tech.removeJunkTechFromPool(this.refundAmount) + } + } + }, + { + name: "eternalism", + description: "+34% damage
time can't be paused (time can be dilated)", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !tech.isPauseSwitchField && !tech.isPauseEjectTech && !tech.isWormHolePause + }, + requires: "not unified field theory, paradigm shift, invariant", + damage: 1.34, + effect() { + tech.damage *= this.damage + tech.isNoDraftPause = true }, remove() { - tech.isShieldAmmo = false; + if (this.count) tech.damage /= this.damage + tech.isNoDraftPause = false + } + }, + { + name: "paradigm shift", + description: `clicking tech while paused ejects them
16% chance to fail`, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !tech.isSuperDeterminism && !tech.isNoDraftPause + }, + requires: "not superdeterminism, eternalism", + effect() { + tech.isPauseEjectTech = true; + }, + remove() { + tech.isPauseEjectTech = false; + } + }, + { + name: "unified field theory", + description: `clicking the field box when paused cycles your field
triple the frequency of finding fieldtech
`, + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return !tech.isSuperDeterminism && !tech.isNoDraftPause + }, + requires: "not superdeterminism, eternalism", + effect() { + tech.isPauseSwitchField = true; + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 3 + } + }, + remove() { + tech.isPauseSwitchField = false; + 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: "field coupling", descriptionFunction() { - return `+1 field coupling (${m.fieldUpgrades[m.fieldMode].name})
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}` + return `+1 coupling (${m.fieldUpgrades[m.fieldMode].name})
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}` }, maxCount: 9, count: 0, @@ -3375,7 +3381,7 @@ const tech = { } }, { - name: "crystallography", + name: "quintessence", descriptionFunction() { return `use all your ${powerUps.orb.research(1)} to get +${powerUps.research.count*this.couplingToResearch} coupling
${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per coupling"}` }, @@ -3670,11 +3676,8 @@ const tech = { }, { name: "Occam's razor", - // descriptionFunction() { - // return `randomly remove ${this.removePercent * 100}% of your tech
for each removed gain ${this.damagePerRemoved * 100}% damage` - // }, descriptionFunction() { - return `randomly remove half your tech
for each removed +${this.damagePerRemoved * 100 }% damage (~${(this.count === 0) ? this.damagePerRemoved * 50 * tech.totalCount : tech.OccamDamage*100}%)` + return `randomly remove half your tech
for each removed +${this.damagePerRemoved * 100 }% damage (~${(this.count === 0) ? this.damagePerRemoved * 50 * tech.totalCount : this.damage*100}%)` }, maxCount: 1, count: 0, @@ -3688,6 +3691,7 @@ const tech = { requires: "more than 6 tech", // removePercent: 0.5, damagePerRemoved: 0.5, + damage: null, effect() { let pool = [] for (let i = 0, len = tech.tech.length; i < len; i++) { // spawn new tech power ups @@ -3696,11 +3700,11 @@ const tech = { pool = shuffle(pool); //shuffles order of maps let removeCount = 0 for (let i = 0, len = pool.length * this.damagePerRemoved; i < len; i++) removeCount += tech.removeTech(pool[i]) - tech.OccamDamage = 1 + this.damagePerRemoved * removeCount - // tech.OccamDamage = Math.pow(1.25, removeCount) + this.damage = 1 + this.damagePerRemoved * removeCount + tech.damage *= this.damage }, remove() { - tech.OccamDamage = 0; + if (this.count) tech.damage /= this.damage } }, { @@ -4336,7 +4340,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && 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 || (m.coupling && m.fieldMode < 3) }, requires: "a freeze effect", effect() { @@ -4355,7 +4359,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && 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 || (m.coupling && m.fieldMode < 3) }, requires: "a freeze effect", effect() { @@ -4374,7 +4378,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - 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 + return (tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3)) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob }, requires: "a localized freeze effect, no other mob death tech", effect() { @@ -4393,7 +4397,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && 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 || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot }, requires: "ice IX", effect() { @@ -4412,7 +4416,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - 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 + return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot }, requires: "a localized freeze effect", effect() { @@ -5012,7 +5016,7 @@ const tech = { }, { name: "vacuum bomb", - description: "grenades fire slower, explode bigger
and, suck everything towards them", + description: "grenades fire slower, explode bigger,
and suck everything towards them", isGunTech: true, maxCount: 1, count: 0, @@ -6572,9 +6576,9 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "standing wave" && (tech.blockDmg || tech.blockingIce) + return m.fieldUpgrades[m.fieldMode].name === "standing wave" }, - requires: "standing wave, bremsstrahlung, triple point", + requires: "standing wave", effect() { tech.isStandingWaveExpand = true m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.3) * Math.pow(0.6, (tech.harmonics - 2)) @@ -6623,28 +6627,28 @@ const tech = { tech.isBlockRadiation = false; } }, - { - name: "triple point", - description: "deflecting condenses ice IX crystals", - isFieldTech: true, - maxCount: 9, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" - }, - requires: "standing wave, perfect diamagnetism", - effect() { - tech.blockingIce++ - }, - remove() { - tech.blockingIce = 0; - } - }, + // { + // name: "triple point", + // description: "deflecting condenses ice IX crystals", + // isFieldTech: true, + // maxCount: 9, + // count: 0, + // frequency: 2, + // frequencyDefault: 2, + // allowed() { + // return m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" + // }, + // requires: "standing wave, perfect diamagnetism", + // effect() { + // tech.blockingIce++ + // }, + // remove() { + // tech.blockingIce = 0; + // } + // }, { name: "flux pinning", - description: "after deflecting a mob
it is stunned for upto 4 seconds", + description: "after deflecting a mob
it is stunned for up to 4 seconds", isFieldTech: true, maxCount: 9, count: 0, @@ -7501,7 +7505,9 @@ const tech = { return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && (build.isExperimentSelection || powerUps.research.count > 1) }, requires: "cloaking, pilot wave, or plasma torch", + damage: 1.35, effect() { + tech.damage *= this.damage tech.isCloakingDamage = true for (let i = 0; i < 2; i++) { if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) @@ -7509,7 +7515,10 @@ const tech = { }, remove() { tech.isCloakingDamage = false - if (this.count > 0) powerUps.research.changeRerolls(2) + if (this.count > 0) { + tech.damage /= this.damage + powerUps.research.changeRerolls(2) + } } }, { @@ -7524,11 +7533,14 @@ const tech = { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" }, requires: "cloaking, molecular assembler, plasma torch, pilot wave", + damage: 1.35, effect() { + tech.damage *= this.damage tech.aimDamage = 1.35 b.setFireCD(); }, remove() { + if (this.count) tech.damage /= this.damage tech.aimDamage = 1 b.setFireCD(); } @@ -7580,25 +7592,25 @@ const tech = { if (this.count > 0) powerUps.research.changeRerolls(6) } }, - { - name: "Penrose process", - description: "after a block falls into a wormhole
+50 energy", - isFieldTech: true, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return m.fieldUpgrades[m.fieldMode].name === "wormhole" - }, - requires: "wormhole", - effect() { - tech.isWormholeEnergy = true - }, - remove() { - tech.isWormholeEnergy = false - } - }, + // { + // name: "Penrose process", + // description: "after a block falls into a wormhole
+50 energy", + // isFieldTech: true, + // maxCount: 1, + // count: 0, + // frequency: 2, + // frequencyDefault: 2, + // allowed() { + // return m.fieldUpgrades[m.fieldMode].name === "wormhole" + // }, + // requires: "wormhole", + // effect() { + // tech.isWormholeEnergy = true + // }, + // remove() { + // tech.isWormholeEnergy = false + // } + // }, { name: "transdimensional worms", link: `transdimensional worms`, @@ -10419,7 +10431,7 @@ const tech = { iceEnergy: null, isPerfectBrake: null, explosiveRadius: null, - isWormholeEnergy: null, + // isWormholeEnergy: null, isWormholeDamage: null, isNailCrit: null, isFlechetteExplode: null, @@ -10497,7 +10509,7 @@ const tech = { isDroneRespawn: null, deathSpawns: null, isMobBlockFling: null, - blockingIce: null, + // blockingIce: null, isPhaseVelocity: null, waveBeamSpeed: null, wavePacketAmplitude: null, @@ -10565,7 +10577,7 @@ const tech = { isFreeWormHole: null, isRewindField: null, isCrouchRegen: null, - OccamDamage: null, + // OccamDamage: null, isAxion: null, isWormholeMapIgnore: null, isLessDamageReduction: null, diff --git a/todo.txt b/todo.txt index d4e352f..18904cb 100644 --- a/todo.txt +++ b/todo.txt @@ -1,27 +1,33 @@ ******************************************************** NEXT PATCH ************************************************** -tech: crystallography - convert all your research into 0.25 coupling per research -tech: residual dipolar coupling - cancelling field gun or tech gives +0.5 coupling -tech: fine-structure constant - +6 coupling, eject this tech if you take damage -coupling for cloaking field now gives +33% ambush damage - tech: ambush removed -coupling for time dilation now gives +25% longer time dilation effect - about +2 seconds -coupling tech isn't well balanced yet, so give me feedback +coupling + crystallography renamed quintessence + wormhole -> energy after eating blocks + penrose process is removed + perfect diamagnatism and standing wave -> ice IX after blocking + tech triple point removed + plasma torch -> +damage -non-unitary operator renamed to Hilbert space +killing one of the first 3->4 snake body mobs makes snake bosses vulnerable +shooterBoss shoots 3-6 smaller bullets bug fixes *********************************************************** TODO ***************************************************** +coupling + negative coupling? + coupling tech - names: strongly coupled, Vibronic coupling, Residual dipolar coupling, NMR coupling - tech: convert all research into "coupling" + names: strongly coupled, Vibronic coupling, Residual dipolar coupling, NMR coupling, quintessence tech: +x% field coupling, your field changes randomly every y seconds tech: coupling starts at 200%, but decays when the field is in use, coupling recharges when the field is not in use some fields aren't used much (that's ok?) +triple point iceIX needs to spawn in the radius of the field and an arc in the same quadrant as the mob + +tech give laser mines more lasers (3->4? 5?) + buffing your deflecting for 1 second after pressing the field button sounds cool 2 second cooldown on the effect to prevent spamming it buff: giving energy or doing damage makes sense @@ -44,6 +50,9 @@ greatly increase walking speed for time dilation field make jumping normal +junk tech: charged shot +immediately fire all of your ammo + after taking damage explode while invulnerable scale explosion radius with damage @@ -903,6 +912,7 @@ possible names for tech NP-complete lenticular lens: is an array of lenses, designed so that when viewed from slightly different angles, different parts of the image underneath are shown. p-zombie + p-hacking JUNK tech plot script: