surface plasmons

retrocausality drains 30% less energy as time rewinds, but each time you start to rewind you drain 30 energy
  no longer provides immunity for 1 second after exiting rewind
  spawns 20% fewer bots

deflecting changes
  shielded mobs take 50% more energy to deflect
  deflecting shielded mobs now only disables your shield for perfect diamagnetism and not for very long
  you can deflect any mob if you have at least 5% energy, but if deflecting brings you below that your shield is disabled for 1 second
    also you can't passively regen energy while shield is disabled

standing wave rework
  coupling gives iceIX -> max energy
  expansion gives deflection efficiency -> +50 max energy
  spherical harmonics gives 40 -> 50% deflection efficiency
  electronegativity is a fieldTech for standing wave, wormhole, and pilot wave
    also  0.15 -> 0.22% damage per energy
  dynamic equilibrium is no longer unlocked by standing wave

tech: surface plasmons - after deflecting drains all your energy, shoot lasers in every direction

added a generic system to add code that loops for a set time
Example code:
simulation.ephemera.push({
    name: "uniqueName",
    count: 60, //cycles before it self removes
    do() {
        this.count--
        if (this.count < 0) simulation.removeEphemera(this.name)
        //run code here
    },
})

some bug fixes
also new bugs probably
This commit is contained in:
landgreen
2023-04-09 08:29:59 -07:00
parent 07af7a7d5c
commit 2e76b5c181
6 changed files with 2413 additions and 133 deletions

BIN
img/surface plasmons.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -4988,7 +4988,7 @@ const b = {
cd: 0, cd: 0,
fireCount: 0, fireCount: 0,
fireLimit: 5 + 2 * tech.isFoamBotUpgrade, fireLimit: 5 + 2 * tech.isFoamBotUpgrade,
delay: Math.floor((175 + (tech.isFoamBotUpgrade ? 0 : 250)) * b.fireCDscale),// + 30 - 20 * tech.isFoamBotUpgrade,//20 + Math.floor(85 * b.fireCDscale) - 20 * tech.isFoamBotUpgrade, delay: Math.floor((150 + (tech.isFoamBotUpgrade ? 0 : 250)) * b.fireCDscale),// + 30 - 20 * tech.isFoamBotUpgrade,//20 + Math.floor(85 * b.fireCDscale) - 20 * tech.isFoamBotUpgrade,
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(), //how far from the player the bot will move range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(), //how far from the player the bot will move
endCycle: Infinity, endCycle: Infinity,

File diff suppressed because it is too large Load Diff

View File

@@ -1896,9 +1896,7 @@ const m = {
} }
}, },
setMaxEnergy() { setMaxEnergy() {
// (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 + 1.5 * (m.fieldMode === 1) + (m.fieldMode === 0 || m.fieldMode === 1) * 0.5 * m.coupling + 0.4 * tech.isStandingWaveExpand
m.maxEnergy = (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus + tech.harmonicEnergy + 2 * tech.isGroundState + 3 * tech.isRelay * tech.isFlipFlopOn * tech.isRelayEnergy + 1.5 * (m.fieldMode === 1)
// if (tech.isEnergyHealth) m.maxEnergy *= Math.sqrt(m.defense())
simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-f'>maxEnergy</span> <span class='color-symbol'>=</span> ${(m.maxEnergy.toFixed(2))}`) simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-f'>maxEnergy</span> <span class='color-symbol'>=</span> ${(m.maxEnergy.toFixed(2))}`)
}, },
fieldMeterColor: "#0cf", fieldMeterColor: "#0cf",
@@ -2268,21 +2266,22 @@ const m = {
} }
} }
}, },
minEnergyToDeflect: 0.05,
pushMass(who, fieldBlockCost = (0.025 + Math.sqrt(who.mass) * Vector.magnitude(Vector.sub(who.velocity, player.velocity)) * 0.002) * m.fieldShieldingScale) { pushMass(who, fieldBlockCost = (0.025 + Math.sqrt(who.mass) * Vector.magnitude(Vector.sub(who.velocity, player.velocity)) * 0.002) * m.fieldShieldingScale) {
if (m.energy > fieldBlockCost * 0.2) { //shield needs at least some of the cost to block if (m.energy > m.minEnergyToDeflect) { //shield needs at least some of the cost to block
if (who.isShielded) fieldBlockCost *= 1.5; //shielded mobs take more energy to block
m.energy -= fieldBlockCost m.energy -= fieldBlockCost
if (m.energy < 0) { if (m.energy < m.minEnergyToDeflect) {
m.energy = 0; m.energy = 0;
m.fieldCDcycle = m.cycle + Math.max(m.fieldBlockCD, 60); m.fieldCDcycle = m.cycle + Math.max(m.fieldBlockCD, 60);
if (tech.isLaserField) { if (tech.isLaserField) {
simulation.ephemera.push({ simulation.ephemera.push({
name: "laser field", //used to find this array element in simulation.removeEphemera() name: "laser field", //used to find this array element in simulation.removeEphemera()
// tech.laserDrain = 0.0018; count: 15 + Math.floor(m.maxEnergy * 30 * 0.0018 / tech.laserDrain), //how many cycles the ephemera lasts, scales with max energy
count: Math.floor(m.maxEnergy * 30) * 0.0018 / tech.laserDrain, //how many cycles the ephemera lasts, scales with max energy
do() { do() {
this.count-- this.count--
if (this.count < 0) simulation.removeEphemera(this.name) if (this.count < 0) simulation.removeEphemera(this.name)
for (let i = 0, num = 12; i < num; i++) { //draw random lasers for (let i = 0, num = 20; i < num; i++) { //draw random lasers
const angle = 6.28 * i / num + m.cycle * 0.04 const angle = 6.28 * i / num + m.cycle * 0.04
b.laser({ x: m.pos.x + 30 * Math.cos(angle), y: m.pos.y + 30 * Math.sin(angle) }, { x: m.pos.x + 3000 * Math.cos(angle), y: m.pos.y + 3000 * Math.sin(angle) })//dmg = tech.laserDamage, reflections = tech.laserReflections, isThickBeam = false, push = 1 b.laser({ x: m.pos.x + 30 * Math.cos(angle), y: m.pos.y + 30 * Math.sin(angle) }, { x: m.pos.x + 3000 * Math.cos(angle), y: m.pos.y + 3000 * Math.sin(angle) })//dmg = tech.laserDamage, reflections = tech.laserReflections, isThickBeam = false, push = 1
} }
@@ -2292,9 +2291,9 @@ const m = {
} else { } else {
m.fieldCDcycle = m.cycle + m.fieldBlockCD; m.fieldCDcycle = m.cycle + m.fieldBlockCD;
} }
if (!who.isInvulnerable && (m.coupling && m.fieldMode < 3) && bullet.length < 250) { //for standing wave mostly if (!who.isInvulnerable && (m.coupling && m.fieldMode === 0) && bullet.length < 200) { //for field emitter iceIX
for (let i = 0; i < m.coupling; i++) { for (let i = 0; i < m.coupling; i++) {
if (m.coupling - i > Math.random()) { if (m.coupling - i > 1.25 * Math.random()) {
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 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 rad = Vector.rotate(sub, 1 * (Math.random() - 0.5))
const angle = Math.atan2(sub.y, sub.x) const angle = Math.atan2(sub.y, sub.x)
@@ -2361,9 +2360,8 @@ const m = {
) { ) {
mob[i].locatePlayer(); mob[i].locatePlayer();
m.pushMass(mob[i]); m.pushMass(mob[i]);
if (mob[i].isShielded) {
m.fieldCDcycle = m.cycle + 30 if (tech.deflectEnergy && !mob[i].isInvulnerable && !mob[i].isShielded) {
} else if (tech.deflectEnergy && !mob[i].isInvulnerable) {
m.energy += tech.deflectEnergy m.energy += tech.deflectEnergy
} }
} }
@@ -2464,8 +2462,9 @@ const m = {
case 0: //field emitter case 0: //field emitter
return `gain the <strong class='color-coupling'>coupling</strong> effects of <strong>all</strong> <strong class='color-f'>fields</strong>` return `gain the <strong class='color-coupling'>coupling</strong> effects of <strong>all</strong> <strong class='color-f'>fields</strong>`
case 1: //standing wave case 1: //standing wave
return `<span style = 'font-size:95%;'><strong>deflecting</strong> condenses +${couple.toFixed(1)} <strong class='color-s'>ice IX</strong></span>` // return `<span style = 'font-size:95%;'><strong>deflecting</strong> condenses +${couple.toFixed(1)} <strong class='color-s'>ice IX</strong></span>`
// return `+${couple.toFixed(1)} <strong class='color-d'>damage</strong> per max <strong class='color-f'>energy</strong>` // return `<span style = 'font-size:95%;'><strong>deflecting</strong> condenses +${couple.toFixed(1)} <strong class='color-s'>ice IX</strong></span>`
return `+${(couple * 50).toFixed(0)} maximum <strong class='color-f'>energy</strong>`
case 2: //perfect diamagnetism case 2: //perfect diamagnetism
return `<span style = 'font-size:95%;'><strong>deflecting</strong> condenses +${couple.toFixed(1)} <strong class='color-s'>ice IX</strong></span>` return `<span style = 'font-size:95%;'><strong>deflecting</strong> condenses +${couple.toFixed(1)} <strong class='color-s'>ice IX</strong></span>`
// return `<span style = 'font-size:89%;'><strong>invulnerable</strong> <strong>+${2*couple}</strong> seconds post collision</span>` // return `<span style = 'font-size:89%;'><strong>invulnerable</strong> <strong>+${2*couple}</strong> seconds post collision</span>`
@@ -2501,7 +2500,7 @@ const m = {
m.coupling = 0 //can't go negative m.coupling = 0 //can't go negative
} }
// m.setMaxEnergy(); m.setMaxEnergy();
// m.setMaxHealth(); // m.setMaxHealth();
m.setFieldRegen() m.setFieldRegen()
mobs.setMobSpawnHealth(); mobs.setMobSpawnHealth();
@@ -2568,7 +2567,7 @@ const m = {
if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp(); m.grabPowerUp();
m.lookForPickUp(); m.lookForPickUp();
if (m.energy > 0) { if (m.energy > m.minEnergyToDeflect) {
m.drawField(); m.drawField();
m.pushMobsFacing(); m.pushMobsFacing();
} }
@@ -2592,7 +2591,7 @@ const m = {
m.fieldBlockCD = 0; m.fieldBlockCD = 0;
m.blockingRecoil = 2 //4 is normal m.blockingRecoil = 2 //4 is normal
m.fieldRange = 185 m.fieldRange = 185
m.fieldShieldingScale = 1.6 * Math.pow(0.6, (tech.harmonics - 2)) m.fieldShieldingScale = 1.6 * Math.pow(0.5, (tech.harmonics - 2))
// m.fieldHarmReduction = 0.66; //33% reduction // m.fieldHarmReduction = 0.66; //33% reduction
m.harmonic3Phase = () => { //normal standard 3 different 2-d circles m.harmonic3Phase = () => { //normal standard 3 different 2-d circles
@@ -2620,7 +2619,6 @@ const m = {
m.pushMass(mob[i]); m.pushMass(mob[i]);
this.drainCD = m.cycle + 15 this.drainCD = m.cycle + 15
} }
if (mob[i].isShielded || mob[i].shield) m.fieldCDcycle = m.cycle + 10
} }
} }
} }
@@ -2671,7 +2669,7 @@ const m = {
} else { } else {
m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
} }
if (m.energy > 0 && m.fieldCDcycle < m.cycle) { if (m.energy > m.minEnergyToDeflect && m.fieldCDcycle < m.cycle) {
if (tech.isStandingWaveExpand) { if (tech.isStandingWaveExpand) {
if (input.field) { if (input.field) {
// const oldHarmonicRadius = m.harmonicRadius // const oldHarmonicRadius = m.harmonicRadius
@@ -2719,7 +2717,7 @@ const m = {
) { ) {
mob[i].locatePlayer(); mob[i].locatePlayer();
const unit = Vector.normalise(Vector.sub(m.fieldPosition, mob[i].position)) const unit = Vector.normalise(Vector.sub(m.fieldPosition, mob[i].position))
m.fieldCDcycle = m.cycle + m.fieldBlockCD + (mob[i].isShielded ? 18 : 0); m.fieldCDcycle = m.cycle + m.fieldBlockCD + (mob[i].isShielded ? 10 : 0);
if (!mob[i].isInvulnerable && bullet.length < 250) { if (!mob[i].isInvulnerable && bullet.length < 250) {
for (let i = 0; i < m.coupling; i++) { for (let i = 0; i < m.coupling; i++) {
if (m.coupling - i > Math.random()) { if (m.coupling - i > Math.random()) {
@@ -3207,7 +3205,7 @@ const m = {
if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen if (m.energy > m.fieldRegen) m.energy -= m.fieldRegen
m.grabPowerUp(); m.grabPowerUp();
m.lookForPickUp(); m.lookForPickUp();
if (m.energy > 0) { if (m.energy > m.minEnergyToDeflect) {
m.drawField(); m.drawField();
m.pushMobsFacing(); m.pushMobsFacing();
} }

View File

@@ -246,7 +246,7 @@ const tech = {
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots() if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
if (tech.isLowEnergyDamage) dmg *= 1 + 0.7 * Math.max(0, 1 - m.energy) if (tech.isLowEnergyDamage) dmg *= 1 + 0.7 * Math.max(0, 1 - m.energy)
if (tech.energyDamage) dmg *= 1 + m.energy * 0.15 * tech.energyDamage; if (tech.energyDamage) dmg *= 1 + m.energy * 0.22 * tech.energyDamage;
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.007 if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.007
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2 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.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165)
@@ -2553,27 +2553,6 @@ const tech = {
tech.isPiezo = false; tech.isPiezo = false;
} }
}, },
{
name: "electronegativity",
descriptionFunction() {
return `<strong>+0.15%</strong> <strong class='color-d'>damage</strong> per current stored <strong class='color-f'>energy</strong><br><em>(+${(15 * m.energy).toFixed(0)}%)</em>`
},
// description: "<strong>+1%</strong> <strong class='color-d'>damage</strong> per <strong>8</strong> stored <strong class='color-f'>energy</strong>",
maxCount: 9,
count: 0,
frequency: 1,
frequencyDefault: 1,
allowed() {
return true
},
requires: "",
effect() {
tech.energyDamage++
},
remove() {
tech.energyDamage = 0;
}
},
{ {
name: "ground state", name: "ground state",
description: "<strong>+200</strong> maximum <strong class='color-f'>energy</strong><br><strong>40%</strong> passive <strong class='color-f'>energy</strong> generation", description: "<strong>+200</strong> maximum <strong class='color-f'>energy</strong><br><strong>40%</strong> passive <strong class='color-f'>energy</strong> generation",
@@ -4761,7 +4740,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && (m.fieldMode === 3 || m.fieldMode === 0))
}, },
requires: "a freeze effect", requires: "a freeze effect",
effect() { effect() {
@@ -4780,7 +4759,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && (m.fieldMode === 3 || m.fieldMode === 0))
}, },
requires: "a freeze effect", requires: "a freeze effect",
effect() { effect() {
@@ -4799,7 +4778,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3)) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob return (tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && (m.fieldMode === 3 || m.fieldMode === 0))) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
}, },
requires: "a localized freeze effect, no other mob death tech", requires: "a localized freeze effect, no other mob death tech",
effect() { effect() {
@@ -4818,7 +4797,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot return (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && (m.fieldMode === 3 || m.fieldMode === 0)) || tech.iceIXOnDeath || tech.isIceShot
}, },
requires: "ice IX", requires: "ice IX",
effect() { effect() {
@@ -4837,7 +4816,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && (m.fieldMode === 3 || m.fieldMode === 0)) || tech.iceIXOnDeath || tech.isIceShot
}, },
requires: "a localized freeze effect", requires: "a localized freeze effect",
effect() { effect() {
@@ -7208,6 +7187,48 @@ const tech = {
//************************************************** field //************************************************** field
//************************************************** tech //************************************************** tech
//************************************************** //**************************************************
{
name: "spherical harmonics",
description: "<strong>+50%</strong> <strong>standing wave</strong> deflection efficiency", //<strong>standing wave</strong> oscillates in a 3rd dimension<br>
isFieldTech: true,
maxCount: 9,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return m.fieldMode === 1 && !tech.isLaserField
},
requires: "standing wave, not surface plasmons",
effect() {
tech.harmonics++
m.fieldShieldingScale = 1.6 * Math.pow(0.5, (tech.harmonics - 2))
m.harmonicShield = m.harmonicAtomic
},
remove() {
tech.harmonics = 2
m.fieldShieldingScale = 1.6 * Math.pow(0.5, (tech.harmonics - 2))
m.harmonicShield = m.harmonic3Phase
}
},
{
name: "surface plasmons",
description: "if <strong>deflecting</strong> drains all your <strong class='color-f'>energy</strong><br>emit <strong class='color-laser'>laser</strong> beams that scale with max <strong class='color-f'>energy</strong>",
isFieldTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return (m.fieldMode === 4 && tech.deflectEnergy === 0) || (m.fieldMode === 1 && tech.harmonics === 2) || m.fieldMode === 0
},
requires: "molecular assembler, standing wave, field emitter, not electric generator",
effect() {
tech.isLaserField = true
},
remove() {
tech.isLaserField = false
}
},
{ {
name: "zero point energy", name: "zero point energy",
description: `use ${powerUps.orb.research(2)}<br><strong>+100</strong> maximum <strong class='color-f'>energy</strong>`, description: `use ${powerUps.orb.research(2)}<br><strong>+100</strong> maximum <strong class='color-f'>energy</strong>`,
@@ -7233,51 +7254,9 @@ const tech = {
if (this.count > 0) powerUps.research.changeRerolls(2) if (this.count > 0) powerUps.research.changeRerolls(2)
} }
}, },
{
name: "surface plasmons",
description: "if <strong>deflecting</strong> a mob drains all your energy<br>emit <strong class='color-laser'>laser</strong> beams in every direction",
isFieldTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return m.fieldMode === 4 || m.fieldMode === 1 || m.fieldMode === 0
},
requires: "molecular assembler, standing wave, field emitter",
effect() {
tech.isLaserField = true
},
remove() {
tech.isLaserField = false
}
},
{
name: "spherical harmonics",
description: "<strong>+40%</strong> <strong>standing wave</strong> deflection efficiency<br>no longer deactivates on mob <strong>shields</strong>", //<strong>standing wave</strong> oscillates in a 3rd dimension<br>
isFieldTech: true,
maxCount: 9,
count: 0,
frequency: 3,
frequencyDefault: 3,
allowed() {
return m.fieldMode === 1
},
requires: "standing wave",
effect() {
tech.harmonics++
m.fieldShieldingScale = 1.6 * Math.pow(0.6, (tech.harmonics - 2))
m.harmonicShield = m.harmonicAtomic
},
remove() {
tech.harmonics = 2
m.fieldShieldingScale = 1.6 * Math.pow(0.6, (tech.harmonics - 2))
m.harmonicShield = m.harmonic3Phase
}
},
{ {
name: "expansion", name: "expansion",
description: "using <strong>standing wave</strong> field <strong>expands</strong> its <strong>radius</strong>", description: "using <strong>standing wave</strong> field <strong>expands</strong> its <strong>radius</strong><br><strong>+40</strong> maximum <strong class='color-f'>energy</strong>",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -7289,37 +7268,36 @@ const tech = {
requires: "standing wave", requires: "standing wave",
effect() { effect() {
tech.isStandingWaveExpand = true tech.isStandingWaveExpand = true
m.setMaxEnergy()
// m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2)) // m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
}, },
remove() { remove() {
tech.isStandingWaveExpand = false tech.isStandingWaveExpand = false
m.setMaxEnergy()
// m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2)) // m.fieldShieldingScale = (tech.isStandingWaveExpand ? 0.9 : 1.6) * Math.pow(0.6, (tech.harmonics - 2))
m.harmonicRadius = 1 m.harmonicRadius = 1
} }
}, },
{ {
name: "triple point", name: "electronegativity",
descriptionFunction() { descriptionFunction() {
return `<strong>+1.5</strong> second <strong class='color-s'>ice IX</strong> freeze effect<br>spawn ${powerUps.orb.coupling(10)} that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong>` //<br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"} return `<strong>+0.22%</strong> <strong class='color-d'>damage</strong> per current stored <strong class='color-f'>energy</strong><br><em>(up to +${(22 * m.maxEnergy).toFixed(0)}% damage at max energy)</em>`
}, },
// description: "<strong>+1%</strong> <strong class='color-d'>damage</strong> per <strong>8</strong> stored <strong class='color-f'>energy</strong>",
isFieldTech: true, isFieldTech: true,
maxCount: 3, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldMode === 1 || m.fieldMode === 2 return m.fieldMode === 1 || m.fieldMode === 9 || m.fieldMode === 8
}, },
requires: "standing wave, perfect diamagnetism", requires: "standing wave, wormhole, pilot wave",
effect() { effect() {
tech.iceIXFreezeTime += 90 tech.energyDamage++
powerUps.spawnDelay("coupling", 10)
}, },
remove() { remove() {
tech.iceIXFreezeTime = 150 tech.energyDamage = 0;
if (this.count) {
m.couplingChange(-this.count)
}
} }
}, },
{ {
@@ -7379,6 +7357,29 @@ const tech = {
tech.isStunField = 0; tech.isStunField = 0;
} }
}, },
{
name: "triple point",
descriptionFunction() {
return `<strong>+1.5</strong> second <strong class='color-s'>ice IX</strong> freeze effect<br>spawn ${powerUps.orb.coupling(10)} that each give <strong>+0.1</strong> <strong class='color-coupling'>coupling</strong>` //<br>${m.couplingDescription(1)} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}
},
isFieldTech: true,
maxCount: 3,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return m.fieldMode === 2
},
requires: "perfect diamagnetism",
effect() {
tech.iceIXFreezeTime += 90
powerUps.spawnDelay("coupling", 10)
},
remove() {
tech.iceIXFreezeTime = 150
if (this.count) m.couplingChange(-this.count)
}
},
{ {
name: "eddy current brake", name: "eddy current brake",
description: "perfect diamagnetism <strong class='color-s'>slows</strong> nearby mobs<br>effect <strong>radius</strong> scales with stored <strong class='color-f'>energy</strong>", description: "perfect diamagnetism <strong class='color-s'>slows</strong> nearby mobs<br>effect <strong>radius</strong> scales with stored <strong class='color-f'>energy</strong>",
@@ -7472,9 +7473,9 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (m.fieldMode === 8 || m.fieldMode === 3 || m.fieldMode === 1) && !tech.isCloakHealLastHit return (m.fieldMode === 8 || m.fieldMode === 3) && !tech.isCloakHealLastHit
}, },
requires: "negative mass, pilot wave, standing wave, not patch", requires: "negative mass, pilot wave, not patch",
effect() { effect() {
tech.lastHitDamage += 5; tech.lastHitDamage += 5;
}, },
@@ -7796,9 +7797,9 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldMode === 4 return m.fieldMode === 4 && !tech.isLaserField
}, },
requires: "molecular assembler", requires: "molecular assembler, not surface plasmon",
effect() { effect() {
tech.deflectEnergy += 0.5; tech.deflectEnergy += 0.5;
}, },

View File

@@ -1,25 +1,24 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
tech - after deflecting drains all your energy, shoot lasers in every direction
is it too hard to safely lose all energy after deflecting
add in some mob knock back or damage immunity?
make this a tech?
balance damage
download image
sometimes the field goes on CD after deflection but when energy isn't 0
fixed?
look at side effects of setting standing wave, molecular assembler, emitter to not disable at 0 energy, not 0.05 or 0.1
might allow repeated deflection with no CD?
energy regen is disable when deflection is on CD
m.fieldCDcycle < m.cycle
tech expansion no long gives deflection efficiency
retrocausality drains 30% less energy as time rewinds, but each time you start to rewind you drain 30 energy retrocausality drains 30% less energy as time rewinds, but each time you start to rewind you drain 30 energy
no longer provides immunity for 1 second after on ending rewind no longer provides immunity for 1 second after exiting rewind
also spawns 20% fewer bots and grenades spawns 20% fewer bots
bug fixes deflecting changes
shielded mobs take 50% more energy to deflect
deflecting shielded mobs now only disables your shield for perfect diamagnetism and not for very long
you can deflect any mob if you have at least 5% energy, but if deflecting brings you below that your shield is disabled for 1 second
also you can't passively regen energy while shield is disabled
standing wave rework
coupling gives iceIX -> max energy
expansion gives deflection efficiency -> +50 max energy
spherical harmonics gives 40 -> 50% deflection efficiency
electronegativity is a fieldTech for standing wave, wormhole, and pilot wave
also 0.15 -> 0.22% damage per energy
dynamic equilibrium is no longer unlocked by standing wave
tech: surface plasmons - after deflecting drains all your energy, shoot lasers in every direction
added a generic system to add code that loops for a set time added a generic system to add code that loops for a set time
Example code: Example code:
@@ -33,17 +32,19 @@ simulation.ephemera.push({
}, },
}) })
some bug fixes
also new bugs probably
*********************************************************** TODO ***************************************************** *********************************************************** TODO *****************************************************
use ephemera to replace things
JUNK?
request animation stuff
tech: choose next map by name after exiting current map tech: choose next map by name after exiting current map
use modified tech selection code? use modified tech selection code?
this might be too much work without much reward this might be too much work without much reward
JUNK only? JUNK only? or maybe combine with other buff
build a system to add in methods to an array that runs these objects in the game loop
method to run the code
condition to remove from array should be inside the method
Tech: relativity Tech: relativity
Simulation speed scales with movement speed. When still, time moves at 0.4 speed, at full walking speed its 1. (So if youre falling or something and you move faster the simulation will be faster than usual) Simulation speed scales with movement speed. When still, time moves at 0.4 speed, at full walking speed its 1. (So if youre falling or something and you move faster the simulation will be faster than usual)
@@ -1279,3 +1280,5 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
boost, coupling power ups tech - cyan electron orbiting a black nucleus electric field as bas-relief //(by Kazumasa Nagai) boost, coupling power ups tech - cyan electron orbiting a black nucleus electric field as bas-relief //(by Kazumasa Nagai)
radioactive - volumetric atomic nucleus diagram by Paul Catherall radioactive - volumetric atomic nucleus diagram by Paul Catherall