coupling tech
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 non-unitary operator renamed to Hilbert space bug fixes
This commit is contained in:
@@ -281,11 +281,6 @@ const b = {
|
||||
fireCDscale: 1,
|
||||
setFireCD() {
|
||||
b.fireCDscale = tech.fireRate * tech.slowFire * tech.researchHaste * tech.aimDamage
|
||||
if (m.fieldMode === 0) {
|
||||
b.fireCDscale *= 0.8 ** (m.coupling)
|
||||
} else if (m.fieldMode === 6) {
|
||||
b.fireCDscale *= 0.75 * 0.8 ** (m.coupling)
|
||||
}
|
||||
if (tech.isFastTime) b.fireCDscale *= 0.5
|
||||
if (tech.isFireRateForGuns) b.fireCDscale *= Math.pow(0.82, b.inventory.length)
|
||||
if (tech.isFireMoveLock) b.fireCDscale *= 0.55
|
||||
|
||||
11
js/index.js
11
js/index.js
@@ -229,14 +229,13 @@ const build = {
|
||||
|
||||
//used for junk estimation
|
||||
let junkCount = 0
|
||||
let totalCount = 0
|
||||
let totalCount = 1 //start at one to avoid NaN issues
|
||||
for (let i = 0; i < tech.tech.length; i++) {
|
||||
if (tech.tech[i].count < tech.tech[i].maxCount && tech.tech[i].allowed() && !tech.tech[i].isBanished) {
|
||||
totalCount += tech.tech[i].frequency
|
||||
if (tech.tech[i].isJunk) junkCount += tech.tech[i].frequency
|
||||
}
|
||||
}
|
||||
// ${m.coupling> 0 ? '<br>'+m.couplingDescription(): ""}
|
||||
//left side
|
||||
let botText = ""
|
||||
if (tech.nailBotCount) botText += `<br>nail-bots: ${tech.nailBotCount}`
|
||||
@@ -259,7 +258,7 @@ const build = {
|
||||
<br><strong><em>fire rate</em></strong>: ${((1-b.fireCDscale)*100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}%
|
||||
<br><strong class='color-dup'>duplication</strong>: ${(tech.duplicationChance()*100).toFixed(0)}%
|
||||
<br><strong class='color-coupling'>coupling</strong>: ${(m.coupling).toFixed(2)}
|
||||
|
||||
${m.coupling> 0 ? '<br>'+m.couplingDescription(true): ""}
|
||||
${botText}
|
||||
<br>
|
||||
<br><strong class='color-h'>health</strong>: (${(m.health*100).toFixed(0)} / ${(m.maxHealth*100).toFixed(0)})
|
||||
@@ -962,18 +961,18 @@ window.addEventListener("keydown", function(event) {
|
||||
|
||||
if (tech.isPauseSwitchField || simulation.testing) {
|
||||
document.getElementById("pause-field").addEventListener("click", () => {
|
||||
const energy = m.energy
|
||||
const energy = m.energy //save current energy
|
||||
if (m.fieldMode === 4 && simulation.molecularMode < 3) {
|
||||
simulation.molecularMode++
|
||||
m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription()
|
||||
} else {
|
||||
m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field
|
||||
m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 0 : m.fieldMode + 1) //cycle to next field
|
||||
if (m.fieldMode === 4) {
|
||||
simulation.molecularMode = 0
|
||||
m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription()
|
||||
}
|
||||
}
|
||||
m.energy = energy
|
||||
m.energy = energy //return to current energy
|
||||
document.getElementById("pause-field").innerHTML = `<div class="grid-title"><div class="circle-grid field"></div> ${m.fieldUpgrades[m.fieldMode].name}</div> ${m.fieldUpgrades[m.fieldMode].description}`
|
||||
});
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ const level = {
|
||||
start() {
|
||||
if (level.levelsCleared === 0) { //this code only runs on the first level
|
||||
// simulation.enableConstructMode() //used to build maps in testing mode
|
||||
// level.difficultyIncrease(1 * 4) //30 is near max on hard //60 is near max on why
|
||||
// level.difficultyIncrease(3 * 4) //30 is near max on hard //60 is near max on why
|
||||
// simulation.isHorizontalFlipped = true
|
||||
// m.maxHealth = m.health = 100
|
||||
// tech.isRerollDamage = true
|
||||
@@ -26,10 +26,9 @@ const level = {
|
||||
// m.setField("time dilation") //molecular assembler 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("coupling");
|
||||
// tech.giveTech("time crystals");
|
||||
// tech.giveTech("retrocausality")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("slow light")
|
||||
// for (let i = 0; i < 5; ++i) tech.giveTech("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")
|
||||
@@ -38,7 +37,7 @@ const level = {
|
||||
|
||||
// spawn.starter(1900, -500, 200)
|
||||
// spawn.beetleBoss(1900, -400)
|
||||
// spawn.timeBoss(1900, -400)
|
||||
// spawn.pulsarBoss(1900, -400)
|
||||
// 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");
|
||||
|
||||
@@ -605,7 +605,6 @@ const mobs = {
|
||||
const hitPlayer = Matter.Query.ray([player], this.position, Vector.add(this.position, Vector.mult(perp, radius * 2.05)), minorRadius)
|
||||
if (hitPlayer.length && m.immuneCycle < m.cycle) {
|
||||
m.damage(dmg * simulation.dmgScale);
|
||||
// m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage
|
||||
}
|
||||
},
|
||||
searchSpring() {
|
||||
|
||||
74
js/player.js
74
js/player.js
@@ -540,7 +540,7 @@ const m = {
|
||||
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.75 ** m.coupling
|
||||
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)))
|
||||
@@ -658,6 +658,11 @@ const m = {
|
||||
},
|
||||
collisionImmuneCycles: 30,
|
||||
damage(dmg) {
|
||||
if (tech.isCouplingNoHit) {
|
||||
for (let i = 0, len = tech.tech.length; i < len; i++) {
|
||||
if (tech.tech[i].name === "fine-structure constant") powerUps.ejectTech(i, true)
|
||||
}
|
||||
}
|
||||
if (tech.isRewindAvoidDeath && m.energy > 0.6 && dmg > 0.01) {
|
||||
const steps = Math.floor(Math.min(299, 150 * m.energy))
|
||||
simulation.makeTextLog(`<span class='color-var'>m</span>.rewind(${steps})`)
|
||||
@@ -1538,28 +1543,62 @@ const m = {
|
||||
}
|
||||
},
|
||||
hold() {},
|
||||
couplingDescription() {
|
||||
// couplingDescription() {
|
||||
// switch (m.fieldMode) {
|
||||
// case 0: //field emitter
|
||||
// return `gain the effects of <strong>all</strong> other <strong class='color-f'>fields</strong>`
|
||||
// case 1: //standing wave
|
||||
// return `<strong>+40</strong> max <strong class='color-f'>energy</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
// case 2: //perfect diamagnetism
|
||||
// return `<span style = 'font-size:89%;'><strong>invulnerable</strong> <strong>+3</strong> seconds post collision per <strong class='color-coupling'>coupling</strong></span>`
|
||||
// case 3: //negative mass
|
||||
// return `<strong>+27%</strong> <strong class='color-defense'>defense</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
// case 4: //assembler
|
||||
// return `generate <strong>6</strong> <strong class='color-f'>energy</strong> per second per <strong class='color-coupling'>coupling</strong>`
|
||||
// case 5: //plasma
|
||||
// return `<strong>+50</strong> max <strong class='color-h'>health</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
// case 6: //time dilation
|
||||
// return `<strong>+25%</strong> longer <strong style='letter-spacing: 2px;'>stopped time</strong> per <strong class='color-coupling'>coupling</strong>` //<strong>movement</strong>, <strong>jumping</strong>, and
|
||||
// case 7: //cloaking
|
||||
// return `<strong>+33%</strong> ambush <strong class='color-d'>damage</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
// case 8: //pilot wave
|
||||
// return `<strong>+40%</strong> <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
// case 9: //wormhole
|
||||
// return `<strong>+4%</strong> <strong class='color-dup'>duplication</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
// }
|
||||
// },
|
||||
couplingDescription(isScaled = false) {
|
||||
const couple = isScaled ? m.coupling : 1
|
||||
switch (m.fieldMode) {
|
||||
case 0: //field emitter
|
||||
return `gain the effects of <strong>all</strong> other <strong class='color-f'>fields</strong>`
|
||||
return `gain the effects of <strong>all</strong> applicable <strong class='color-f'>fields</strong>`
|
||||
// return `<strong>+${40*couple}</strong> max <strong class='color-f'>energy</strong>
|
||||
// <br><span style = 'font-size:89%;'><strong>invulnerable</strong> <strong>+${3*couple}</strong> seconds post collision</span>
|
||||
// <br><strong>+${27*couple}%</strong> <strong class='color-defense'>defense</strong>
|
||||
// <br>generate <strong>${6*couple}</strong> <strong class='color-f'>energy</strong> per second
|
||||
// <br><strong>+${50*couple}</strong> max <strong class='color-h'>health</strong>
|
||||
// <br><strong>+${20*couple}%</strong> longer <strong style='letter-spacing: 2px;'>stopped time</strong>
|
||||
// <br><strong>+${33*couple}%</strong> ambush <strong class='color-d'>damage</strong>
|
||||
// <br><strong>+${40*couple}%</strong> <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong>
|
||||
// <br><strong>+${4*couple}%</strong> <strong class='color-dup'>duplication</strong>`
|
||||
case 1: //standing wave
|
||||
return `<strong>+40</strong> max <strong class='color-f'>energy</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
return `<strong>+${40*couple}</strong> max <strong class='color-f'>energy</strong>`
|
||||
case 2: //perfect diamagnetism
|
||||
return `<span style = 'font-size:89%;'><strong>invulnerable</strong> <strong>+3</strong> seconds post collision per <strong class='color-coupling'>coupling</strong></span>`
|
||||
return `<span style = 'font-size:89%;'><strong>invulnerable</strong> <strong>+${3*couple}</strong> seconds post collision</span>`
|
||||
case 3: //negative mass
|
||||
return `<strong>+20%</strong> <strong class='color-defense'>defense</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
return `<strong>+${27*couple}%</strong> <strong class='color-defense'>defense</strong>`
|
||||
case 4: //assembler
|
||||
return `generate <strong>6</strong> <strong class='color-f'>energy</strong> per second per <strong class='color-coupling'>coupling</strong>`
|
||||
return `generate <strong>${6*couple}</strong> <strong class='color-f'>energy</strong> per second`
|
||||
case 5: //plasma
|
||||
return `<strong>+50</strong> max <strong class='color-h'>health</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
return `<strong>+${50*couple}</strong> max <strong class='color-h'>health</strong>`
|
||||
case 6: //time dilation
|
||||
return `<strong>+20%</strong> <strong><em>fire rate</em></strong> per <strong class='color-coupling'>coupling</strong>` //<strong>movement</strong>, <strong>jumping</strong>, and
|
||||
return `<strong>+${25*couple}%</strong> longer <strong style='letter-spacing: 2px;'>stopped time</strong>` //<strong>movement</strong>, <strong>jumping</strong>, and
|
||||
case 7: //cloaking
|
||||
return `<strong>+15%</strong> <strong class='color-d'>damage</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
return `<strong>+${33*couple}%</strong> ambush <strong class='color-d'>damage</strong>`
|
||||
case 8: //pilot wave
|
||||
return `<strong>+40%</strong> <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
return `<strong>+${40*couple}%</strong> <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong>`
|
||||
case 9: //wormhole
|
||||
return `<strong>+5%</strong> <strong class='color-dup'>duplication</strong> per <strong class='color-coupling'>coupling</strong>`
|
||||
return `<strong>+${4*couple}%</strong> <strong class='color-dup'>duplication</strong>`
|
||||
}
|
||||
},
|
||||
couplingChange() {
|
||||
@@ -1568,7 +1607,6 @@ const m = {
|
||||
m.setFieldRegen()
|
||||
mobs.setMobSpawnHealth();
|
||||
powerUps.setDupChance();
|
||||
b.setFireCD();
|
||||
m.collisionImmuneCycles = 30 + m.coupling * 180
|
||||
// switch (m.fieldMode) {
|
||||
// case 0: //field emitter
|
||||
@@ -2680,17 +2718,13 @@ const m = {
|
||||
sleep(mob);
|
||||
sleep(body);
|
||||
sleep(bullet);
|
||||
|
||||
simulation.cycle--; //pause all functions that depend on game cycle increasing
|
||||
}
|
||||
|
||||
if (tech.isRewindField) {
|
||||
this.rewindCount = 0
|
||||
m.grabPowerUpRange2 = 300000
|
||||
m.hold = function() {
|
||||
|
||||
m.grabPowerUp();
|
||||
|
||||
// //grab power ups
|
||||
// for (let i = 0, len = powerUp.length; i < len; ++i) {
|
||||
// if (
|
||||
@@ -2705,15 +2739,13 @@ const m = {
|
||||
// break; //because the array order is messed up after splice
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
if (m.isHolding) {
|
||||
m.drawHold(m.holdingTarget);
|
||||
m.holding();
|
||||
m.throwBlock();
|
||||
m.wakeCheck();
|
||||
} else if (input.field && m.fieldCDcycle < m.cycle) { //not hold but field button is pressed
|
||||
const drain = 0.002
|
||||
const drain = 0.002 / (1 + 0.25 * m.coupling)
|
||||
if (m.energy > drain) m.energy -= drain
|
||||
|
||||
m.grabPowerUp();
|
||||
@@ -2790,7 +2822,7 @@ const m = {
|
||||
m.holding();
|
||||
m.throwBlock();
|
||||
} else if (input.field && m.fieldCDcycle < m.cycle) {
|
||||
const drain = 0.0026
|
||||
const drain = 0.0026 / (1 + 0.25 * m.coupling)
|
||||
if (m.energy > drain) m.energy -= drain
|
||||
m.grabPowerUp();
|
||||
m.lookForPickUp(); //this drains energy 0.001
|
||||
|
||||
@@ -325,6 +325,10 @@ const powerUps = {
|
||||
powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), spawnType, false);
|
||||
}
|
||||
}
|
||||
if (tech.isCancelCouple) {
|
||||
m.coupling += 0.5
|
||||
m.couplingChange()
|
||||
}
|
||||
// if (tech.isCancelTech && Math.random() < 0.3) {
|
||||
// powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "tech", false);
|
||||
// simulation.makeTextLog(`<strong>options exchange</strong>: returns 1 <strong class='color-m'>tech</strong>`)
|
||||
|
||||
@@ -816,7 +816,6 @@ const simulation = {
|
||||
m.alive = true;
|
||||
m.onGround = false
|
||||
m.lastOnGroundCycle = 0
|
||||
m.setMaxHealth()
|
||||
m.health = 0;
|
||||
m.addHealth(0.25)
|
||||
m.drop();
|
||||
@@ -838,8 +837,8 @@ const simulation = {
|
||||
// <br>input.key.field <span class='color-symbol'>=</span> ["<span class='color-text'>${input.key.field}</span>", "<span class='color-text'>right mouse</span>"]
|
||||
// <br><span class='color-var'>m</span>.field.description <span class='color-symbol'>=</span> "<span class='color-text'>${m.fieldUpgrades[m.fieldMode].description}</span>"
|
||||
// `, 800);
|
||||
|
||||
m.setField(0)
|
||||
m.coupling = 0
|
||||
m.setField(0) //this calls m.couplingChange(), which sets max health and max energy
|
||||
// m.energy = 0;
|
||||
//exit testing
|
||||
if (simulation.testing) {
|
||||
|
||||
22
js/spawn.js
22
js/spawn.js
@@ -743,7 +743,7 @@ const spawn = {
|
||||
vertexCollision(where, look, body);
|
||||
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
|
||||
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
|
||||
if (m.immuneCycle < m.cycle + 60 + tech.collisionImmuneCycles) m.immuneCycle = m.cycle + 60 + tech.collisionImmuneCycles; //player is immune to damage extra time
|
||||
if (m.immuneCycle < m.cycle + 60 + m.collisionImmuneCycles) m.immuneCycle = m.cycle + 60 + m.collisionImmuneCycles; //player is immune to damage extra time
|
||||
m.damage(dmg);
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
x: best.x,
|
||||
@@ -1639,7 +1639,7 @@ const spawn = {
|
||||
me.collisionFilter.category = cat.mobBullet;
|
||||
me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet;
|
||||
me.onHit = function() {
|
||||
this.explode(this.mass * 2);
|
||||
this.explode(this.mass);
|
||||
};
|
||||
me.do = function() {
|
||||
this.gravity();
|
||||
@@ -3160,7 +3160,7 @@ const spawn = {
|
||||
// //check damage
|
||||
// const hitPlayer = Matter.Query.ray([player], this.position, wing, radius)
|
||||
// if (hitPlayer.length && m.immuneCycle < m.cycle) {
|
||||
// m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage
|
||||
// m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage
|
||||
// m.damage(0.02 * simulation.dmgScale);
|
||||
// }
|
||||
|
||||
@@ -3411,7 +3411,7 @@ const spawn = {
|
||||
}
|
||||
//damage player if in range
|
||||
if (Vector.magnitude(Vector.sub(player.position, this.fireTarget)) < this.pulseRadius && m.immuneCycle < m.cycle) {
|
||||
m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage
|
||||
m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage
|
||||
m.damage(0.045 * simulation.dmgScale);
|
||||
}
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
@@ -3532,7 +3532,7 @@ const spawn = {
|
||||
}
|
||||
//damage player if in range
|
||||
if (Vector.magnitude(Vector.sub(player.position, this.fireTarget)) < this.pulseRadius && m.immuneCycle < m.cycle) {
|
||||
m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage
|
||||
m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage
|
||||
m.damage(0.03 * simulation.dmgScale);
|
||||
}
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
@@ -3747,7 +3747,7 @@ const spawn = {
|
||||
vertexCollision(where, look, body);
|
||||
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
|
||||
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
|
||||
m.immuneCycle = m.cycle + tech.collisionImmuneCycles + 60; //player is immune to damage for an extra second
|
||||
m.immuneCycle = m.cycle + m.collisionImmuneCycles + 60; //player is immune to damage for an extra second
|
||||
const dmg = 0.14 * simulation.dmgScale;
|
||||
m.damage(dmg);
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
@@ -3999,7 +3999,7 @@ const spawn = {
|
||||
vertexCollision(where, look, map);
|
||||
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
|
||||
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
|
||||
m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for an extra second
|
||||
m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for an extra second
|
||||
m.damage(this.swordDamage);
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
x: best.x,
|
||||
@@ -4625,7 +4625,7 @@ const spawn = {
|
||||
vertexCollision(where, look, map);
|
||||
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
|
||||
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
|
||||
m.immuneCycle = m.cycle + tech.collisionImmuneCycles + 60; //player is immune to damage for an extra second
|
||||
m.immuneCycle = m.cycle + m.collisionImmuneCycles + 60; //player is immune to damage for an extra second
|
||||
m.damage(this.swordDamage);
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
x: best.x,
|
||||
@@ -4749,7 +4749,7 @@ const spawn = {
|
||||
vertexCollision(where, look, map);
|
||||
if (!m.isCloak) vertexCollision(where, look, [playerBody, playerHead]);
|
||||
if (best.who && (best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
|
||||
m.immuneCycle = m.cycle + tech.collisionImmuneCycles + 60; //player is immune to damage for an extra second
|
||||
m.immuneCycle = m.cycle + m.collisionImmuneCycles + 60; //player is immune to damage for an extra second
|
||||
m.damage(this.swordDamage);
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
x: best.x,
|
||||
@@ -5540,7 +5540,7 @@ const spawn = {
|
||||
me.onDeath = function() {
|
||||
//damage player if in range
|
||||
if (Vector.magnitude(Vector.sub(player.position, this.position)) < pulseRadius && m.immuneCycle < m.cycle) {
|
||||
m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage
|
||||
m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage
|
||||
m.damage(0.015 * simulation.dmgScale);
|
||||
}
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
@@ -6358,7 +6358,7 @@ const spawn = {
|
||||
Matter.Body.setPosition(this, Vector.add(Vector.add(who.position, who.velocity), Vector.mult(orbit, radius))) //bullets move with player
|
||||
//damage player
|
||||
if (Matter.Query.collides(this, [player]).length > 0 && !(m.isCloak && tech.isIntangible) && m.immuneCycle < m.cycle) {
|
||||
m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
|
||||
m.immuneCycle = m.cycle + m.collisionImmuneCycles; //player is immune to damage for 30 cycles
|
||||
const dmg = 0.03 * simulation.dmgScale
|
||||
m.damage(dmg);
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
|
||||
195
js/tech.js
195
js/tech.js
@@ -234,14 +234,14 @@ 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 *= tech.sneakAttackDmg
|
||||
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
|
||||
},
|
||||
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.05 * 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.04 * m.coupling)
|
||||
},
|
||||
isScaleMobsWithDuplication: false,
|
||||
maxDuplicationEvent() {
|
||||
@@ -2853,8 +2853,8 @@ const tech = {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "non-unitary operator",
|
||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Unitary_operator' class="link">non-unitary operator</a>`,
|
||||
name: "Hilbert space",
|
||||
// link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Unitary_operator' class="link">non-unitary operator</a>`,
|
||||
description: "reduce combat <strong>difficulty</strong> by <strong>2 levels</strong><br>after a <strong>collision</strong> enter an <strong class='alt'>alternate reality</strong>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
@@ -2886,7 +2886,7 @@ const tech = {
|
||||
allowed() {
|
||||
return !tech.isResearchReality && !tech.isCollisionRealitySwitch
|
||||
},
|
||||
requires: "not Ψ(t) collapse, non-unitary",
|
||||
requires: "not Ψ(t) collapse, Hilbert space",
|
||||
effect() {
|
||||
tech.isSwitchReality = true;
|
||||
},
|
||||
@@ -2905,7 +2905,7 @@ const tech = {
|
||||
allowed() {
|
||||
return !tech.isSwitchReality && !tech.isCollisionRealitySwitch && !tech.isJunkResearch
|
||||
},
|
||||
requires: "not many-worlds, non-unitary, pseudoscience",
|
||||
requires: "not many-worlds, Hilbert space, pseudoscience",
|
||||
bonusResearch: 17,
|
||||
effect() {
|
||||
tech.isResearchReality = true;
|
||||
@@ -3153,9 +3153,9 @@ const tech = {
|
||||
isBadRandomOption: true,
|
||||
isNonRefundable: true,
|
||||
allowed() {
|
||||
return tech.isDeterminism && !tech.isAnsatz
|
||||
return tech.isDeterminism && !tech.isAnsatz && !tech.isJunkResearch && !tech.isBrainstorm
|
||||
},
|
||||
requires: "NOT EXPERIMENT MODE, determinism, not ansatz",
|
||||
requires: "determinism, not ansatz, pseudoscience, brainstorming",
|
||||
effect() {
|
||||
tech.isSuperDeterminism = true;
|
||||
//if you change the number spawned also change it in Born rule
|
||||
@@ -3352,6 +3352,107 @@ const tech = {
|
||||
tech.isShieldAmmo = false;
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "field coupling",
|
||||
descriptionFunction() {
|
||||
return `<strong>+1</strong> <strong class='color-f'>field</strong> <strong class='color-coupling'>coupling</strong> <em>(${m.fieldUpgrades[m.fieldMode].name})</em><br>${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
||||
},
|
||||
maxCount: 9,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return (build.isExperimentSelection || powerUps.research.count > 1)
|
||||
},
|
||||
requires: "",
|
||||
effect() {
|
||||
m.coupling++
|
||||
m.couplingChange()
|
||||
},
|
||||
remove() {
|
||||
m.coupling -= this.count
|
||||
m.couplingChange()
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "crystallography",
|
||||
descriptionFunction() {
|
||||
return `use all your ${powerUps.orb.research(1)} to get <strong>+${powerUps.research.count*this.couplingToResearch}</strong> <strong class='color-coupling'>coupling</strong><br>${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
||||
},
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return powerUps.research.count > 3
|
||||
},
|
||||
requires: "",
|
||||
researchUsed: 0,
|
||||
couplingToResearch: 0.25,
|
||||
effect() {
|
||||
while (powerUps.research.count > 0) {
|
||||
powerUps.research.changeRerolls(-1)
|
||||
this.researchUsed++
|
||||
m.coupling += this.couplingToResearch
|
||||
}
|
||||
m.couplingChange()
|
||||
},
|
||||
remove() {
|
||||
if (this.count) {
|
||||
m.coupling -= this.researchUsed * this.couplingToResearch
|
||||
powerUps.research.changeRerolls(this.researchUsed)
|
||||
this.researchUsed = 0
|
||||
}
|
||||
m.couplingChange()
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "fine-structure constant",
|
||||
descriptionFunction() {
|
||||
return `+${this.value} <strong class='color-coupling'>coupling</strong>, <span style = 'font-size:85%;'><strong>eject</strong> this <strong class='color-m'>tech</strong> after losing <strong class='color-h'>health</strong></span><br>${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
||||
},
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return true
|
||||
},
|
||||
value: 6,
|
||||
requires: "",
|
||||
effect() {
|
||||
tech.isCouplingNoHit = true
|
||||
m.coupling += this.value
|
||||
m.couplingChange()
|
||||
},
|
||||
remove() {
|
||||
if (this.count) {
|
||||
m.coupling -= this.value
|
||||
m.couplingChange()
|
||||
}
|
||||
tech.isCouplingNoHit = false
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "residual dipolar coupling",
|
||||
descriptionFunction() {
|
||||
return `clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> yields <strong>+0.5</strong> <strong class='color-coupling'>coupling</strong><br>${ m.couplingDescription()} ${m.fieldMode === 0 ? "" : "per <strong class='color-coupling'>coupling</strong>"}`
|
||||
},
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return !tech.isSuperDeterminism
|
||||
},
|
||||
requires: "not superdeterminism",
|
||||
effect() {
|
||||
tech.isCancelCouple = true
|
||||
},
|
||||
remove() {
|
||||
tech.isCancelCouple = false
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "options exchange",
|
||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Option_(finance)' class="link">options exchange</a>`,
|
||||
@@ -3391,7 +3492,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "futures exchange",
|
||||
description: "clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>adds <strong>4.5%</strong> power up <strong class='color-dup'>duplication</strong> chance",
|
||||
description: "clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br><strong>+4.5%</strong> power up <strong class='color-dup'>duplication</strong> chance",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
@@ -6413,41 +6514,6 @@ const tech = {
|
||||
//************************************************** field
|
||||
//************************************************** tech
|
||||
//**************************************************
|
||||
{
|
||||
name: "coupling",
|
||||
descriptionFunction() {
|
||||
return `<strong>+1</strong> <strong class='color-f'>field</strong> <strong class='color-coupling'>coupling</strong> <em>(${m.fieldUpgrades[m.fieldMode].name})</em><br>${ m.couplingDescription()}`
|
||||
},
|
||||
// isFieldTech: true,
|
||||
maxCount: 9,
|
||||
count: 0,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return (build.isExperimentSelection || powerUps.research.count > 1)
|
||||
},
|
||||
requires: "",
|
||||
// researchUsed: 0,
|
||||
// couplingToResearch: 0.1,
|
||||
effect() {
|
||||
m.coupling++
|
||||
m.couplingChange()
|
||||
// while (powerUps.research.count > 0) {
|
||||
// powerUps.research.changeRerolls(-1)
|
||||
// this.researchUsed++
|
||||
// m.coupling += this.couplingToResearch
|
||||
// }
|
||||
},
|
||||
remove() {
|
||||
m.coupling -= this.count
|
||||
m.couplingChange()
|
||||
// if (this.count) {
|
||||
// m.coupling -= this.researchUsed * this.couplingToResearch
|
||||
// powerUps.research.changeRerolls(this.researchUsed)
|
||||
// this.researchUsed = 0
|
||||
// }
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "zero point energy",
|
||||
description: `use ${powerUps.orb.research(2)}<br><strong>+100</strong> maximum <strong class='color-f'>energy</strong>`,
|
||||
@@ -7404,25 +7470,25 @@ const tech = {
|
||||
tech.isCloakStun = false;
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "ambush",
|
||||
description: "metamaterial cloaking field <strong class='color-d'>damage</strong> effect<br>is increased from <span style = 'text-decoration: line-through;'>333%</span> to <strong>555%</strong>",
|
||||
isFieldTech: true,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
|
||||
},
|
||||
requires: "metamaterial cloaking",
|
||||
effect() {
|
||||
tech.sneakAttackDmg = 6.55 //555% + 100%
|
||||
},
|
||||
remove() {
|
||||
tech.sneakAttackDmg = 4.33 //333% + 100%
|
||||
}
|
||||
},
|
||||
// {
|
||||
// name: "ambush",
|
||||
// description: "metamaterial cloaking field <strong class='color-d'>damage</strong> effect<br>is increased from <span style = 'text-decoration: line-through;'>333%</span> to <strong>555%</strong>",
|
||||
// isFieldTech: true,
|
||||
// maxCount: 1,
|
||||
// count: 0,
|
||||
// frequency: 2,
|
||||
// frequencyDefault: 2,
|
||||
// allowed() {
|
||||
// return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
|
||||
// },
|
||||
// requires: "metamaterial cloaking",
|
||||
// effect() {
|
||||
// tech.sneakAttackDmg = 6.55 //555% + 100%
|
||||
// },
|
||||
// remove() {
|
||||
// tech.sneakAttackDmg = 4.33 //333% + 100%
|
||||
// }
|
||||
// },
|
||||
{
|
||||
name: "dynamical systems",
|
||||
description: `use ${powerUps.orb.research(2)}<br><strong>+35%</strong> <strong class='color-d'>damage</strong>`,
|
||||
@@ -10546,5 +10612,6 @@ const tech = {
|
||||
isExtraBotOption: null,
|
||||
isLastHitDamage: null,
|
||||
isCloakHealLastHit: null,
|
||||
isRicochet: null
|
||||
isRicochet: null,
|
||||
isCancelCouple: null
|
||||
}
|
||||
Reference in New Issue
Block a user