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:
BIN
img/surface plasmons.webp
Normal file
BIN
img/surface plasmons.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
@@ -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,
|
||||||
|
|||||||
2280
js/level.js
2280
js/level.js
File diff suppressed because it is too large
Load Diff
42
js/player.js
42
js/player.js
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
171
js/tech.js
171
js/tech.js
@@ -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;
|
||||||
},
|
},
|
||||||
|
|||||||
51
todo.txt
51
todo.txt
@@ -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 it’s 1. (So if you’re 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 it’s 1. (So if you’re 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user