text rewording
tech: freezer burn - if a mob is frozen while below 33% health, it dies
tech: flash freeze - if a mob is above 66% health it's health is set to 66%
snakeBoss 1st tail mob is larger and farther from boss
parthenogenesis your duplication effects extend to duplicate mobs and bosses
WIMPs do 33% less harm (because they are hard to deal with on reactor)
MACHO 66->60% defense
axion 75%-> 100% of defense added to damage
full tech wording rewrite (I probably made a few typos)
increase damage by 10% -> +10% damage
20% fire delay reduction -> +20% fire rate
taking harm -> losing health
50% harm reduction -> +50% defense
new defense text effect
extra long minus sign - -> –
bug fixes
This commit is contained in:
@@ -425,10 +425,10 @@ const b = {
|
||||
if (dist < radius) {
|
||||
if (simulation.dmgScale) {
|
||||
const harm = tech.isExplosionHarm ? 0.075 : 0.05
|
||||
if (tech.isImmuneExplosion && m.energy > 0.15) {
|
||||
if (tech.isImmuneExplosion && m.energy > 0.12) {
|
||||
// const mitigate = Math.min(1, Math.max(1 - m.energy * 0.5, 0))
|
||||
m.energy -= 0.15
|
||||
m.damage(0.01 * harm); //remove 99% of the damage 1-0.99
|
||||
m.energy -= 0.12
|
||||
// m.damage(0.01 * harm); //remove 99% of the damage 1-0.99
|
||||
// console.log(Math.max(0, Math.min(0.15 - 0.01 * player.speed, 0.15)))
|
||||
knock = Vector.mult(Vector.normalise(sub), -0.6 * player.mass * Math.max(0, Math.min(0.15 - 0.002 * player.speed, 0.15)));
|
||||
player.force.x = knock.x; // not += so crazy forces can't build up with MIRV
|
||||
|
||||
@@ -107,7 +107,7 @@ function collisionChecks(event) {
|
||||
!mob[k].isSlowed && !mob[k].isStunned
|
||||
) {
|
||||
let dmg = Math.min(Math.max(0.025 * Math.sqrt(mob[k].mass), 0.05), 0.3) * simulation.dmgScale; //player damage is capped at 0.3*dmgScale of 1.0
|
||||
if (m.isCloak) dmg *= 0.5
|
||||
if (m.isCloak) dmg *= 0.75
|
||||
mob[k].foundPlayer();
|
||||
if (tech.isRewindAvoidDeath && m.energy > 0.66 && dmg > 0.01) { //CPT reversal runs in m.damage, but it stops the rest of the collision code here too
|
||||
m.damage(dmg);
|
||||
@@ -150,7 +150,7 @@ function collisionChecks(event) {
|
||||
y: mob[k].velocity.y - 8 * Math.sin(angle)
|
||||
});
|
||||
|
||||
if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && !mob[k].isBoss && mob[k].isDropPowerUp && m.energy > 0.34 * m.maxEnergy) {
|
||||
if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && !mob[k].isBoss && mob[k].isDropPowerUp && m.energy > 0.34 * m.maxEnergy && mob[k].damageReduction > 0) {
|
||||
m.energy -= 0.33 * Math.max(m.maxEnergy, m.energy) //0.33 * m.energy
|
||||
if (m.immuneCycle === m.cycle + tech.collisionImmuneCycles) m.immuneCycle = 0; //player doesn't go immune to collision damage
|
||||
mob[k].death();
|
||||
|
||||
16
js/index.js
16
js/index.js
@@ -219,6 +219,9 @@ for (let i = 0, len = tech.tech.length; i < len; i++) {
|
||||
if (!tech.tech[i].link) tech.tech[i].link = `<a target="_blank" href='https://en.wikipedia.org/w/index.php?search=${encodeURIComponent(tech.tech[i].name).replace(/'/g, '%27')}&title=Special:Search' class="link">${tech.tech[i].name}</a>`
|
||||
}
|
||||
|
||||
|
||||
//<br>effective <strong class='color-defense'>defense</strong>: ${(1-simulation.dmgScale*m.harmReduction()).toPrecision(3)}
|
||||
//<br>effective <strong class='color-d'>damage</strong>: ${(tech.damageFromTech() * m.dmgScale).toPrecision(3)}
|
||||
const build = {
|
||||
pauseGrid() {
|
||||
//left side
|
||||
@@ -238,18 +241,18 @@ const build = {
|
||||
<g stroke='none' fill='#333' stroke-width="2" font-size="14px" font-family="Ariel, sans-serif"> <text x="5" y="15">copy build url</text></g>
|
||||
</svg><br>`
|
||||
text += `
|
||||
<br>effective <strong class='color-d'>damage</strong>: ${(tech.damageFromTech() * m.dmgScale).toPrecision(4)}
|
||||
<br>damage: ${((tech.damageFromTech())).toPrecision(4)}, difficulty: ${((m.dmgScale)).toPrecision(4)}
|
||||
<br><strong class='color-d'>damage</strong>: ${((tech.damageFromTech())).toPrecision(3)}
|
||||
<br>difficulty: ${((m.dmgScale)).toPrecision(3)}
|
||||
<br>
|
||||
<br>effective <strong class='color-harm'>harm</strong>: ${(simulation.dmgScale*m.harmReduction()).toPrecision(4)}
|
||||
<br>reduction: ${(m.harmReduction()).toPrecision(4)}, difficulty: ${(simulation.dmgScale).toPrecision(4)}
|
||||
<br>+<strong class='color-defense'>defense</strong>: ${(1-m.harmReduction()).toPrecision(3)}
|
||||
<br>difficulty: ${(simulation.dmgScale).toPrecision(3)}
|
||||
<br>
|
||||
${botText}
|
||||
<br><strong class='color-h'>health</strong>: (${(m.health*100).toFixed(0)} / ${(m.maxHealth*100).toFixed(0)}) <strong class='color-f'>energy</strong>: (${(m.energy*100).toFixed(0)} / ${(m.maxEnergy*100).toFixed(0)})
|
||||
<br><strong class='color-g'>gun</strong>: ${b.activeGun === null || b.activeGun === undefined ? "undefined":b.guns[b.activeGun].name} <strong class='color-g'>ammo</strong>: ${b.activeGun === null || b.activeGun === undefined ? "0":b.guns[b.activeGun].ammo}
|
||||
<br><strong><em>fire delay</em></strong> decrease: ${((1-b.fireCDscale)*100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}%
|
||||
<br><strong class='color-dup'>duplication</strong> chance: ${(tech.duplicationChance()*100).toFixed(0)}%
|
||||
<br><strong class='color-m'>tech</strong>: ${tech.totalCount} <strong class='color-r'>research</strong>: ${powerUps.research.count}
|
||||
<br><br><strong class='color-m'>tech</strong>: ${tech.totalCount} <strong class='color-r'>research</strong>: ${powerUps.research.count}
|
||||
<br>position: (${player.position.x.toFixed(1)}, ${player.position.y.toFixed(1)}) velocity: (${player.velocity.x.toFixed(1)}, ${player.velocity.y.toFixed(1)})
|
||||
<br>mouse: (${simulation.mouseInGame.x.toFixed(1)}, ${simulation.mouseInGame.y.toFixed(1)}) mass: ${player.mass.toFixed(1)}
|
||||
<br>
|
||||
@@ -507,6 +510,7 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
|
||||
}
|
||||
} else {
|
||||
text += `<div id="tech-${i}" class="experiment-grid-module experiment-grid-disabled"><div class="grid-title"> ${tech.tech[i].name}</div> ${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}</div>`
|
||||
// text += `<div id="tech-${i}" class="experiment-grid-module experiment-grid-disabled"><div class="grid-title"> ${tech.tech[i].name}</div> ${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}</div>`
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -963,7 +967,7 @@ window.addEventListener("keydown", function(event) {
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='key-input-pause'>H</td>
|
||||
<td class='key-used'>harm immunity</td>
|
||||
<td class='key-used'>+100% defense</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='key-input-pause'>B</td>
|
||||
|
||||
29
js/level.js
29
js/level.js
@@ -18,9 +18,9 @@ const level = {
|
||||
// simulation.isHorizontalFlipped = true
|
||||
// m.addHealth(Infinity)
|
||||
// m.setField("time dilation")
|
||||
// b.giveGuns("laser")
|
||||
// tech.giveTech("closed timelike curve")
|
||||
// tech.giveTech("translucent")
|
||||
// b.giveGuns("shotgun")
|
||||
// tech.giveTech("ice-shot")
|
||||
// tech.giveTech("MACHO")
|
||||
// tech.giveTech("clock gating")
|
||||
// tech.giveTech("6s half-life")
|
||||
// for (let i = 0; i < 10; i++) tech.giveTech("replication")
|
||||
@@ -37,10 +37,10 @@ const level = {
|
||||
// m.immuneCycle = Infinity //you can't take damage
|
||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||
// simulation.enableConstructMode() //used to build maps in testing mode
|
||||
// level.testing();
|
||||
// level.reservoir();
|
||||
// spawn.cellBossCulture(1900, -500)
|
||||
// spawn.launcherBoss(1900, -500)
|
||||
// level.dripp(); //not in rotation, used for testing
|
||||
// spawn.snakeBoss(1900, -500)
|
||||
// level.testing(); //not in rotation, used for testing
|
||||
|
||||
if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************
|
||||
// powerUps.research.changeRerolls(3000)
|
||||
@@ -609,7 +609,18 @@ const level = {
|
||||
this.frictionAir = friction.up
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//edge limits
|
||||
if (this.position.y < maxHeight) {
|
||||
Matter.Body.setPosition(this, {
|
||||
x: this.holdX,
|
||||
y: maxHeight
|
||||
});
|
||||
} else if (this.position.y > y) {
|
||||
Matter.Body.setPosition(this, {
|
||||
x: this.holdX,
|
||||
y: y
|
||||
});
|
||||
}
|
||||
// hold horizontal position
|
||||
Matter.Body.setPosition(this, {
|
||||
@@ -3436,7 +3447,7 @@ const level = {
|
||||
let waterFallX = 0
|
||||
let waterFallSmoothX = 0
|
||||
let isWaterfallFilling = false
|
||||
const riseRate = 0.25 + Math.min(1, simulation.difficulty * 0.01)
|
||||
const riseRate = 0.30 + Math.min(1, simulation.difficulty * 0.005)
|
||||
const spinnerArray = []
|
||||
|
||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||
@@ -8826,7 +8837,7 @@ const level = {
|
||||
}
|
||||
|
||||
anotherBoss = (x, y) => {
|
||||
if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) {
|
||||
if (tech.isDuplicateBoss && Math.random() < tech.duplicationChance()) {
|
||||
tech.isScaleMobsWithDuplication = true
|
||||
spawn.randomLevelBoss(x, y, ["historyBoss"]);
|
||||
tech.isScaleMobsWithDuplication = false
|
||||
|
||||
10
js/mob.js
10
js/mob.js
@@ -59,7 +59,9 @@ const mobs = {
|
||||
}
|
||||
|
||||
function applySlow(whom) {
|
||||
if (!whom.shield && !whom.isShielded) {
|
||||
if (!whom.shield && !whom.isShielded && who.alive) {
|
||||
if (tech.isIceMaxHealthLoss && who.health > 0.66 && who.damageReduction > 0) who.health = 0.66
|
||||
if (tech.isIceKill && who.health < 0.33 && who.damageReduction > 0) who.death();
|
||||
if (whom.isBoss) cycles = Math.floor(cycles * 0.25)
|
||||
let i = whom.status.length
|
||||
while (i--) {
|
||||
@@ -68,8 +70,8 @@ const mobs = {
|
||||
whom.isSlowed = true;
|
||||
whom.status.push({
|
||||
effect() {
|
||||
if (whom.speed > 2) {
|
||||
const drag = 0.95
|
||||
if (whom.speed > 1) {
|
||||
const drag = 0.94
|
||||
Matter.Body.setVelocity(whom, {
|
||||
x: whom.velocity.x * drag,
|
||||
y: whom.velocity.y * drag
|
||||
@@ -1065,7 +1067,7 @@ const mobs = {
|
||||
if ((!this.isShielded || isBypassShield) && this.alive) {
|
||||
dmg *= tech.damageFromTech()
|
||||
//mobs specific damage changes
|
||||
if (tech.isFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500
|
||||
if (tech.isFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 33% dmg at max range of 3000
|
||||
dmg *= this.damageReduction
|
||||
//energy and heal drain should be calculated after damage boosts
|
||||
if (tech.energySiphon && dmg !== Infinity && this.isDropPowerUp && m.immuneCycle < m.cycle) m.energy += Math.min(this.health, dmg) * tech.energySiphon
|
||||
|
||||
32
js/player.js
32
js/player.js
@@ -514,7 +514,7 @@ const m = {
|
||||
dmg *= m.fieldHarmReduction
|
||||
if (tech.isZeno) dmg *= 0.15
|
||||
if (tech.isFieldHarmReduction) dmg *= 0.5
|
||||
if (tech.isHarmMACHO) dmg *= 0.33
|
||||
if (tech.isHarmMACHO) dmg *= 0.4
|
||||
if (tech.isImmortal) dmg *= 0.66
|
||||
if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33
|
||||
if (tech.healthDrain) dmg *= 1 + 3.33 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage
|
||||
@@ -537,7 +537,7 @@ const m = {
|
||||
rewind(steps) { // m.rewind(Math.floor(Math.min(599, 137 * m.energy)))
|
||||
if (tech.isRewindGrenade) {
|
||||
const immunityDuration = 65
|
||||
const immunityCycle = m.cycle + immunityDuration + 10
|
||||
const immunityCycle = m.cycle + immunityDuration + 10 + tech.isPetalsExplode * 30 + tech.isCircleExplode * 21
|
||||
if (m.immuneCycle < immunityCycle) m.immuneCycle = immunityCycle; //player is immune to damage until after grenades might explode...
|
||||
|
||||
for (let i = 1, len = Math.floor(4 + steps / 40); i < len; i++) {
|
||||
@@ -1523,9 +1523,9 @@ const m = {
|
||||
},
|
||||
fieldUpgrades: [{
|
||||
name: "field emitter",
|
||||
//<br><strong class='color-f'>energy</strong> regen disabled if immune to <strong class='color-harm'>harm</strong>
|
||||
description: "use <strong class='color-f'>energy</strong> to <strong>deflect</strong> mobs<br>store up to <strong>100</strong> <strong class='color-f'>energy</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second",
|
||||
// description: "use <strong class='color-f'>energy</strong> to <strong>deflect</strong> mobs,<br><strong>grab</strong> power ups, and <strong>throw</strong> <strong class='color-block'>blocks</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/s, when not immune to <strong class='color-harm'>harm</strong>",
|
||||
//<br><strong class='color-f'>energy</strong> regen disabled if immune to <strong class='color-defense'>harm</strong>
|
||||
description: "use <strong class='color-f'>energy</strong> to <strong>deflect</strong> mobs<br><strong>100</strong> max <strong class='color-f'>energy</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second",
|
||||
// description: "use <strong class='color-f'>energy</strong> to <strong>deflect</strong> mobs,<br><strong>grab</strong> power ups, and <strong>throw</strong> <strong class='color-block'>blocks</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/s, when not immune to <strong class='color-defense'>harm</strong>",
|
||||
effect: () => {
|
||||
m.hold = function() {
|
||||
if (m.isHolding) {
|
||||
@@ -1551,7 +1551,7 @@ const m = {
|
||||
{
|
||||
name: "standing wave",
|
||||
//<strong>deflecting</strong> protects you in every <strong>direction</strong>
|
||||
description: "<strong>3</strong> oscillating <strong>shields</strong> are permanently active<br>increase your <strong>max</strong> <strong class='color-f'>energy</strong> by <strong>60</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second", //drains <strong class='color-f'>energy</strong> //<strong>deflecting</strong> has <strong>50%</strong> less <strong>recoil</strong>
|
||||
description: "<strong>3</strong> oscillating <strong>shields</strong> are permanently active<br> <strong>+60</strong> max <strong class='color-f'>energy</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second", //drains <strong class='color-f'>energy</strong> //<strong>deflecting</strong> has <strong>50%</strong> less <strong>recoil</strong>
|
||||
drainCD: 0,
|
||||
effect: () => {
|
||||
m.fieldBlockCD = 0;
|
||||
@@ -1652,7 +1652,7 @@ const m = {
|
||||
},
|
||||
{
|
||||
name: "perfect diamagnetism",
|
||||
description: "<strong>deflecting</strong> does not drain <strong class='color-f'>energy</strong><br>maintains <strong>functionality</strong> while <strong>inactive</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second",
|
||||
description: "<strong>deflecting</strong> does not drain <strong class='color-f'>energy</strong><br>maintains <strong>functionality</strong> while <strong>inactive</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second",
|
||||
// <br><strong>attract</strong> power ups from <strong>far away</strong>
|
||||
// description: "<strong>attract</strong> power ups from <strong>far away</strong><br><strong>deflecting</strong> doesn't drain <strong class='color-f'>energy</strong><br>thrown <strong class='color-block'>blocks</strong> have",
|
||||
// description: "gain <strong class='color-f'>energy</strong> when <strong>blocking</strong><br>no <strong>recoil</strong> when <strong>blocking</strong>",
|
||||
@@ -1864,7 +1864,7 @@ const m = {
|
||||
{
|
||||
name: "negative mass",
|
||||
//<br>hold <strong class='color-block'>blocks</strong> as if they have a lower <strong>mass</strong>
|
||||
description: "use <strong class='color-f'>energy</strong> to nullify <strong style='letter-spacing: 7px;'>gravity</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>55%</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second",
|
||||
description: "use <strong class='color-f'>energy</strong> to nullify <strong style='letter-spacing: 7px;'>gravity</strong><br>reduce <strong class='color-defense'>harm</strong> by <strong>55%</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second",
|
||||
fieldDrawRadius: 0,
|
||||
effect: () => {
|
||||
m.fieldFire = true;
|
||||
@@ -2014,7 +2014,7 @@ const m = {
|
||||
},
|
||||
{
|
||||
name: "molecular assembler",
|
||||
description: "excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br>use <strong class='color-f'>energy</strong> to <strong>deflect</strong> mobs<br>generate <strong>12</strong> <strong class='color-f'>energy</strong>/second",
|
||||
description: "excess <strong class='color-f'>energy</strong> used to build <strong>drones</strong><br>use <strong class='color-f'>energy</strong> to <strong>deflect</strong> mobs<br>generate <strong>12</strong> <strong class='color-f'>energy</strong> per second",
|
||||
//<strong>double</strong> your default <strong class='color-f'>energy</strong> regeneration
|
||||
effect: () => {
|
||||
// m.fieldMeterColor = "#0c5"
|
||||
@@ -2150,7 +2150,7 @@ const m = {
|
||||
// },
|
||||
{
|
||||
name: "plasma torch",
|
||||
description: "use <strong class='color-f'>energy</strong> to emit short range <strong class='color-plasma'>plasma</strong><br><strong class='color-d'>damages</strong> and <strong>pushes</strong> mobs away<br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second",
|
||||
description: "use <strong class='color-f'>energy</strong> to emit short range <strong class='color-plasma'>plasma</strong><br><strong class='color-d'>damages</strong> and <strong>pushes</strong> mobs away<br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second",
|
||||
set() {
|
||||
b.isExtruderOn = false
|
||||
if (m.plasmaBall) {
|
||||
@@ -2524,8 +2524,8 @@ const m = {
|
||||
},
|
||||
{
|
||||
name: "time dilation",
|
||||
// description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br>while time is stopped you can <strong>move</strong> and <strong>fire</strong><br>and <strong>collisions</strong> do <strong>50%</strong> less <strong class='color-harm'>harm</strong>",
|
||||
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 2px;'>stop time</strong><br>move, jump, and fire <strong>25%</strong> faster<br>generate <strong>18</strong> <strong class='color-f'>energy</strong>/second",
|
||||
// description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 1px;'>stop time</strong><br>while time is stopped you can <strong>move</strong> and <strong>fire</strong><br>and <strong>collisions</strong> do <strong>50%</strong> less <strong class='color-defense'>harm</strong>",
|
||||
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 2px;'>stop time</strong><br>move, jump, and fire <strong>25%</strong> faster<br>generate <strong>18</strong> <strong class='color-f'>energy</strong> per second",
|
||||
set() {
|
||||
m.fieldFireRate = 0.75
|
||||
b.setFireCD();
|
||||
@@ -2684,8 +2684,8 @@ const m = {
|
||||
},
|
||||
{
|
||||
name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency"
|
||||
//<br><strong>collisions</strong> do <strong>50%</strong> less <strong class='color-harm'>harm</strong> when <strong class='color-cloaked'>cloaked</strong>
|
||||
description: "when not firing activate <strong class='color-cloaked'>cloaking</strong><br><span style = 'font-size:95%;'><strong>+333%</strong> <strong class='color-d'>damage</strong> if no mob has <strong>died</strong> in <strong>4</strong> seconds</span><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second",
|
||||
//<br><strong>collisions</strong> do <strong>50%</strong> less <strong class='color-defense'>harm</strong> when <strong class='color-cloaked'>cloaked</strong>
|
||||
description: "when not firing activate <strong class='color-cloaked'>cloaking</strong><br><span style = 'font-size:95%;'><strong>+333%</strong> <strong class='color-d'>damage</strong> if no mob has <strong>died</strong> in <strong>4</strong> seconds</span><br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second",
|
||||
effect: () => {
|
||||
m.fieldFire = true;
|
||||
m.fieldMeterColor = "#333";
|
||||
@@ -2984,7 +2984,7 @@ const m = {
|
||||
name: "pilot wave",
|
||||
//<br><strong class='color-block'>blocks</strong> can't <strong>collide</strong> with <strong>intangible</strong> mobs
|
||||
//field <strong>radius</strong> decreases out of <strong>line of sight</strong>
|
||||
description: "use <strong class='color-f'>energy</strong> to guide <strong class='color-block'>blocks</strong><br><strong>unlock</strong> <strong class='color-m'>tech</strong> from other <strong class='color-f'>fields</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second",
|
||||
description: "use <strong class='color-f'>energy</strong> to guide <strong class='color-block'>blocks</strong><br><strong>unlock</strong> <strong class='color-m'>tech</strong> from other <strong class='color-f'>fields</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second",
|
||||
effect: () => {
|
||||
m.fieldPhase = 0;
|
||||
m.fieldPosition = {
|
||||
@@ -3180,7 +3180,7 @@ const m = {
|
||||
{
|
||||
name: "wormhole",
|
||||
//<strong class='color-worm'>wormholes</strong> attract <strong class='color-block'>blocks</strong> and power ups<br>
|
||||
description: "use <strong class='color-f'>energy</strong> to <strong>tunnel</strong> through a <strong class='color-worm'>wormhole</strong><br><strong>4%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second", //<br>bullets may also traverse <strong class='color-worm'>wormholes</strong>
|
||||
description: "use <strong class='color-f'>energy</strong> to <strong>tunnel</strong> through a <strong class='color-worm'>wormhole</strong><br><strong>4%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second", //<br>bullets may also traverse <strong class='color-worm'>wormholes</strong>
|
||||
drain: 0,
|
||||
effect: function() {
|
||||
m.duplicateChance = 0.04
|
||||
|
||||
30
js/spawn.js
30
js/spawn.js
@@ -51,7 +51,7 @@ const spawn = {
|
||||
this[pick](x, y);
|
||||
}
|
||||
|
||||
if (tech.isMoreMobs) {
|
||||
if (tech.isMoreMobs || (tech.isDuplicateBoss && Math.random() < tech.duplicationChance())) {
|
||||
const pick = this.pickList[Math.floor(Math.random() * this.pickList.length)];
|
||||
this[pick](x, y);
|
||||
}
|
||||
@@ -66,7 +66,7 @@ const spawn = {
|
||||
this[pick](x + Math.round((Math.random() - 0.5) * 20) + i * size * 2.5, y + Math.round((Math.random() - 0.5) * 20), size);
|
||||
}
|
||||
}
|
||||
if (tech.isMoreMobs) {
|
||||
if (tech.isMoreMobs || (tech.isDuplicateBoss && Math.random() < tech.duplicationChance())) {
|
||||
for (let i = 0; i < num; ++i) {
|
||||
const pick = this.pickList[Math.floor(Math.random() * this.pickList.length)];
|
||||
this[pick](x + Math.round((Math.random() - 0.5) * 20) + i * size * 2.5, y + Math.round((Math.random() - 0.5) * 20), size);
|
||||
@@ -109,7 +109,7 @@ const spawn = {
|
||||
}
|
||||
},
|
||||
secondaryBossChance(x, y) {
|
||||
if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) {
|
||||
if (tech.isDuplicateBoss && Math.random() < tech.duplicationChance()) {
|
||||
tech.isScaleMobsWithDuplication = true
|
||||
spawn.randomLevelBoss(x, y);
|
||||
tech.isScaleMobsWithDuplication = false
|
||||
@@ -215,12 +215,12 @@ const spawn = {
|
||||
|
||||
//aoe damage to player
|
||||
if (m.immuneCycle < m.cycle && Vector.magnitude(Vector.sub(player.position, this.position)) < this.radius) {
|
||||
const DRAIN = tech.isRadioactiveResistance ? 0.07 * 0.25 : 0.07
|
||||
const DRAIN = tech.isRadioactiveResistance ? 0.05 * 0.25 : 0.05
|
||||
if (m.energy > DRAIN) {
|
||||
if (m.immuneCycle < m.cycle) m.energy -= DRAIN
|
||||
} else {
|
||||
m.energy = 0;
|
||||
m.damage((tech.isRadioactiveResistance ? 0.007 * 0.25 : 0.007) * simulation.dmgScale)
|
||||
m.damage((tech.isRadioactiveResistance ? 0.005 * 0.25 : 0.005) * simulation.dmgScale)
|
||||
simulation.drawList.push({ //add dmg to draw queue
|
||||
x: this.position.x,
|
||||
y: this.position.y,
|
||||
@@ -5564,8 +5564,10 @@ const spawn = {
|
||||
|
||||
for (let i = 0; i < nodes; ++i) {
|
||||
angle -= 0.15 + i * 0.008
|
||||
mag -= 5
|
||||
spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), 20);
|
||||
mag -= (i < 2) ? -15 : 5
|
||||
spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), i === 0 ? 25 : 20);
|
||||
// mag -= 5
|
||||
// spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), 20);
|
||||
if (i === 0) mob[mob.length - 1].snakeHeadID = me.id
|
||||
mob[mob.length - 1].previousTailID = previousTailID
|
||||
previousTailID = mob[mob.length - 1].id
|
||||
@@ -5609,11 +5611,11 @@ const spawn = {
|
||||
mobs.spawn(x + mag * Math.cos(angle), y + mag * Math.sin(angle), 8, radius, color1); //"rgb(55,170,170)"
|
||||
let me = mob[mob.length - 1];
|
||||
me.isBoss = true;
|
||||
me.accelMag = 0.0004 + 0.0003 * Math.sqrt(simulation.accelScale)
|
||||
me.accelMag = 0.00045 + 0.0002 * Math.sqrt(simulation.accelScale)
|
||||
me.memory = 250;
|
||||
me.laserRange = 500;
|
||||
Matter.Body.setDensity(me, 0.00165 + 0.00011 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
|
||||
me.startingDamageReduction = 0.25 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
|
||||
me.startingDamageReduction = 0.2 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
|
||||
me.damageReduction = 0
|
||||
me.isInvulnerable = true
|
||||
|
||||
@@ -5642,15 +5644,13 @@ const spawn = {
|
||||
let previousTailID = 0
|
||||
for (let i = 0; i < nodes; ++i) {
|
||||
angle -= 0.15 + i * 0.008
|
||||
mag -= 5
|
||||
spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), 20);
|
||||
mag -= (i < 2) ? -15 : 5
|
||||
spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), i === 0 ? 25 : 20);
|
||||
if (i === 0) mob[mob.length - 1].snakeHeadID = me.id
|
||||
mob[mob.length - 1].previousTailID = previousTailID
|
||||
previousTailID = mob[mob.length - 1].id
|
||||
}
|
||||
|
||||
this.constrain2AdjacentMobs(nodes, Math.random() * 0.06 + 0.01);
|
||||
|
||||
for (let i = mob.length - 1, len = i - nodes; i > len; i--) { //set alternating colors
|
||||
if (i % 2) {
|
||||
mob[i].fill = "#333"
|
||||
@@ -5683,11 +5683,11 @@ const spawn = {
|
||||
mobs.spawn(x, y, 8, radius, "rgba(0,180,180,0.4)");
|
||||
let me = mob[mob.length - 1];
|
||||
me.collisionFilter.mask = cat.bullet | cat.player | cat.mob //| cat.body
|
||||
me.accelMag = 0.0006 * simulation.accelScale;
|
||||
me.accelMag = 0.0007 * simulation.accelScale;
|
||||
me.leaveBody = Math.random() < 0.33 ? true : false;
|
||||
me.showHealthBar = false;
|
||||
me.isDropPowerUp = false;
|
||||
Matter.Body.setDensity(me, 0.003); //normal is 0.001
|
||||
Matter.Body.setDensity(me, 0.005); //normal is 0.001
|
||||
me.frictionAir = 0.015;
|
||||
me.isSnakeTail = true;
|
||||
me.stroke = "transparent"
|
||||
|
||||
786
js/tech.js
786
js/tech.js
File diff suppressed because it is too large
Load Diff
@@ -692,10 +692,10 @@ summary {
|
||||
/* letter-spacing: 2px; */
|
||||
}
|
||||
|
||||
.color-harm {
|
||||
.color-defense {
|
||||
/* color: */
|
||||
/* text-shadow: #FC0 1px 0 10px; */
|
||||
background-color: hsla(51, 100%, 71%, 0.187);
|
||||
background-color: hsla(227, 9%, 71%, 0.279);
|
||||
padding: 2px;
|
||||
border-radius: 4px;
|
||||
letter-spacing: 1px;
|
||||
|
||||
63
todo.txt
63
todo.txt
@@ -1,12 +1,71 @@
|
||||
******************************************************** NEXT PATCH **************************************************
|
||||
|
||||
new community map: dripp!
|
||||
enable the 13 community maps in settings
|
||||
tech: freezer burn - if a mob is frozen while below 33% health, it dies
|
||||
tech: flash freeze - if a mob is above 66% health it's health is set to 66%
|
||||
|
||||
snakeBoss 1st tail mob is larger and farther from boss
|
||||
parthenogenesis your duplication effects extend to duplicate mobs and bosses
|
||||
WIMPs do 33% less harm (because they are hard to deal with on reactor)
|
||||
MACHO 66->60% defense
|
||||
axion 75%-> 100% of defense added to damage
|
||||
|
||||
full tech wording rewrite (I probably made a few typos)
|
||||
increase damage by 10% -> +10% damage
|
||||
20% fire delay reduction -> +20% fire rate
|
||||
taking harm -> losing health
|
||||
50% harm reduction -> +50% defense
|
||||
new defense text effect
|
||||
extra long minus sign - -> –
|
||||
|
||||
bug fixes
|
||||
|
||||
*********************************************************** TODO *****************************************************
|
||||
|
||||
scrap bots can't move?
|
||||
|
||||
if a nail critical hits, fire a nail at the nearest mob
|
||||
similar to mob death targeted nail code
|
||||
nail gun needs a small damage buff
|
||||
|
||||
JUNK tech: Pacifism
|
||||
You cannot attack mobs, mobs cannot attack you
|
||||
over write the mob.damage and player.damage methods
|
||||
|
||||
JUNK tech: incubation: spawn something after 5 minutes
|
||||
4 bots?
|
||||
|
||||
mob mechanic: beacon
|
||||
periodically add locations to an array
|
||||
teleport back to a location in the array
|
||||
at random
|
||||
if velocity not facing player?
|
||||
|
||||
super balls do damage after bouncing?
|
||||
how to check for bounce?
|
||||
maybe just increases damage after hitting a mob
|
||||
|
||||
put a shield on a shield on a shield ...
|
||||
|
||||
dark mode:
|
||||
look at Tinyfolks, 20 minutes till dawn
|
||||
|
||||
super short range foam that acts like flame thrower
|
||||
high fire rate
|
||||
short life spawn
|
||||
start large?
|
||||
extra ammo?
|
||||
or only 1/2 of ammo is used?
|
||||
|
||||
laser tech where bots move around and follow you while firing lasers in the direction you are looking
|
||||
they fire when you fire?
|
||||
they aim at player history aim location, with 1s delay
|
||||
bots position spread out perpendicular to the direction you are looking
|
||||
can they get stuck?
|
||||
maybe absolution position, no collide
|
||||
do they need to be physics objects then?
|
||||
make a special bot type for this
|
||||
beam is similar to diffuse beam
|
||||
|
||||
|
||||
block manufacturing - molecular assembler tech
|
||||
Holding r-click will create a slowly increasing in size block, which will be thrown on release
|
||||
|
||||
Reference in New Issue
Block a user