diff --git a/.DS_Store b/.DS_Store index f0113c0..34a581f 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index 183f54b..369394b 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -304,6 +304,9 @@ const b = { } } }, + explosionRange() { + return tech.explosiveRadius * (tech.isExplosionHarm ? 1.8 : 1) * (tech.isSmallExplosion ? 0.8 : 1) * (tech.isExplodeRadio ? 1.25 : 1) + }, explosion(where, radius) { // typically explode is used for some bullets with .onEnd radius *= tech.explosiveRadius let dist, sub, knock; @@ -664,7 +667,7 @@ const b = { } bullet[me].do = function() { const suckCycles = 40 - if (simulation.cycle > this.endCycle - suckCycles || Matter.Query.collides(this, map).length || Matter.Query.collides(this, body).length) { //suck + if (!m.isBodiesAsleep && simulation.cycle > this.endCycle - suckCycles || Matter.Query.collides(this, map).length || Matter.Query.collides(this, body).length) { //suck const that = this function suck(who, radius = that.explodeRad * 3.2) { @@ -726,7 +729,7 @@ const b = { this.force.y += this.mass * 0.0025; //extra gravity for harder arcs const suckCycles = 40 - if (simulation.cycle > this.endCycle - suckCycles) { //suck + if (!m.isBodiesAsleep && simulation.cycle > this.endCycle - suckCycles) { //suck const that = this function suck(who, radius = that.explodeRad * 3.2) { @@ -2597,17 +2600,19 @@ const b = { frictionStatic: 0, frictionAir: 0.008 * (1 + 0.3 * Math.random()), restitution: 0.5 * (1 + 0.5 * Math.random()), - dmg: 0, // 0.14 //damage done in addition to the damage from momentum - minDmgSpeed: 2, - lookFrequency: 40 + Math.floor(7 * Math.random()) - 10 * tech.isLaserBotUpgrade, - drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4, acceleration: 0.0015 * (1 + 0.3 * Math.random()), - range: 700 * (1 + 0.1 * Math.random()) + 500 * tech.isLaserBotUpgrade, playerRange: 150 + Math.floor(30 * Math.random()), offPlayer: { x: 0, y: 0, }, + dmg: 0, //damage done in addition to the damage from momentum + minDmgSpeed: 2, + lookFrequency: 40 + Math.floor(7 * Math.random()) - 10 * tech.isLaserBotUpgrade, + range: (700 + 400 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()), + drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4, + drain: 0.7 - 0.52 * tech.isLaserBotUpgrade, + laserDamage: 0.38 + 0.29 * tech.isLaserBotUpgrade, endCycle: Infinity, classType: "bullet", collisionFilter: { @@ -2655,8 +2660,8 @@ const b = { } //hit target with laser if (this.lockedOn && this.lockedOn.alive && m.energy > this.drainThreshold) { - m.energy -= tech.laserFieldDrain * tech.isLaserDiode * 0.7 - b.laser(this.vertices[0], this.lockedOn.position, b.dmgScale * (0.38 * tech.laserDamage + this.isUpgraded * 0.25), tech.laserReflections, false, 0.4) //tech.laserDamage = 0.16 + m.energy -= tech.laserFieldDrain * tech.isLaserDiode * this.drain + b.laser(this.vertices[0], this.lockedOn.position, b.dmgScale * this.laserDamage * tech.laserDamage, tech.laserReflections, false, 0.4) //tech.laserDamage = 0.16 // laser(where = { // x: m.pos.x + 20 * Math.cos(m.angle), // y: m.pos.y + 20 * Math.sin(m.angle) @@ -2712,13 +2717,17 @@ const b = { }, onEnd() {}, do() { - if (this.explode) { - b.explosion(this.position, this.explode); //makes bullet do explosive damage at end - this.explode = 0; - } - const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, m.pos)) + const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, player.position)) if (distanceToPlayer > 100) { //if far away move towards player - this.force = Vector.mult(Vector.normalise(Vector.sub(m.pos, this.position)), this.mass * this.acceleration) + if (this.explode) { + if (tech.isImmuneExplosion && m.energy > 1.43) { + b.explosion(this.position, this.explode); + } else { + b.explosion(this.position, Math.max(0, Math.min(this.explode, (distanceToPlayer - 70) / b.explosionRange()))); + } + this.explode = 0; + } + this.force = Vector.mult(Vector.normalise(Vector.sub(player.position, this.position)), this.mass * this.acceleration) } else if (distanceToPlayer < 250) { //close to player Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity //find targets @@ -3220,7 +3229,7 @@ const b = { }, { name: "shotgun", - description: "fire a burst of short range bullets", + description: "fire a wide burst of short range bullets", ammo: 0, ammoPack: 5.5, defaultAmmoPack: 5.5, diff --git a/js/engine.js b/js/engine.js index 9be8869..c209c14 100644 --- a/js/engine.js +++ b/js/engine.js @@ -109,7 +109,7 @@ function collisionChecks(event) { return } m.damage(dmg); - if (tech.isPiezo) m.energy += 4; + if (tech.isPiezo) m.energy += 20.48; if (tech.isBayesian) powerUps.ejectTech() if (mob[k].onHit) mob[k].onHit(k); m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to collision damage for 30 cycles diff --git a/js/level.js b/js/level.js index dd19012..fbcc566 100644 --- a/js/level.js +++ b/js/level.js @@ -12,10 +12,10 @@ 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(20) + // level.difficultyIncrease(40) // simulation.zoomScale = 1000; // simulation.setZoom(); - // m.setField("plasma torch") + // m.setField("nano-scale manufacturing") // b.giveGuns("nail gun") // tech.isExplodeRadio = true // for (let i = 0; i < 1; i++) tech.giveTech("dynamo-bot") @@ -770,7 +770,7 @@ const level = { mapB.portalPair = mapA return [portalA, portalB, mapA, mapB] }, - hazard(x, y, width, height, damage = 0.0008, color = "hsla(160, 100%, 35%,0.75)", isOptical = false) { + hazard(x, y, width, height, damage = 0.003, color = "hsla(160, 100%, 35%,0.75)", isOptical = false) { return { min: { x: x, @@ -786,21 +786,24 @@ const level = { isOn: true, query() { if (this.isOn && this.height > 0 && Matter.Query.region([player], this).length && !(m.isCloak && isOptical)) { - if (damage < 0.02) { - m.damage(damage) - } else if (m.immuneCycle < m.cycle) { - m.immuneCycle = m.cycle + tech.collisionImmuneCycles; - m.damage(damage) - simulation.drawList.push({ //add dmg to draw queue - x: player.position.x, - y: player.position.y, - radius: damage * 1500, - color: simulation.mobDmgColor, - time: 20 - }); + const drain = 0.003 + m.fieldRegen + if (m.energy > drain) { + m.energy -= drain + } else { + if (damage < 0.02) { + m.damage(damage) + } else if (m.immuneCycle < m.cycle) { + m.immuneCycle = m.cycle + tech.collisionImmuneCycles; + m.damage(damage) + simulation.drawList.push({ //add dmg to draw queue + x: player.position.x, + y: player.position.y, + radius: damage * 1500, + color: simulation.mobDmgColor, + time: 20 + }); + } } - const drain = 0.005 - if (m.energy > drain) m.energy -= drain //float if (!isOptical) { @@ -910,7 +913,7 @@ const level = { //start a conversation based on the number of conversations seen if (!simulation.isCheating && localSettings.loreCount < lore.conversation.length) lore.conversation[localSettings.loreCount]() - const hazardSlime = level.hazard(-1800, 150, 3600, 650, 0.01, "hsla(160, 100%, 35%,0.75)") + const hazardSlime = level.hazard(-1800, 150, 3600, 650, 0.004, "hsla(160, 100%, 35%,0.75)") const circle = { x: 0, y: -500, @@ -957,7 +960,7 @@ const level = { ctx.beginPath(); const step = Math.PI / 20 const horizontalStep = 85 - if (simulation.isCheating) phase += 0.003 //(m.pos.x - circle.x) * 0.0005 //0.05 * Math.sin(simulation.cycle * 0.030) + if (simulation.isCheating) phase += 0.01 //(m.pos.x - circle.x) * 0.0005 //0.05 * Math.sin(simulation.cycle * 0.030) // const sway = 5 * Math.cos(simulation.cycle * 0.007) sway.x = sway.x * 0.995 + 0.005 * (m.pos.x - circle.x) * 0.05 //+ 0.04 * Math.cos(simulation.cycle * 0.01) sway.y = 2.5 * Math.sin(simulation.cycle * 0.015) @@ -1099,8 +1102,8 @@ const level = { // spawn.streamBoss(1600, -500) // spawn.cellBossCulture(1600, -500) // spawn.cellBossCulture(1600, -500) - // simulation.difficulty = 66 - // spawn.orbitalBoss(1600, -500) + // simulation.difficulty = 30 + spawn.orbitalBoss(1600, -500) // spawn.beamer(1200, -500) // spawn.shield(mob[mob.length - 1], 1800, -120, 1); diff --git a/js/player.js b/js/player.js index c0ede58..92556bb 100644 --- a/js/player.js +++ b/js/player.js @@ -304,7 +304,6 @@ const m = { }, alive: false, switchWorlds() { - //count tech const totalGuns = b.inventory.length - tech.isRewindGun //count guns, but not CPT gun simulation.isTextLogOpen = false; //prevent console spam //remove all tech and count current tech total @@ -312,8 +311,9 @@ const m = { for (let i = 0, len = tech.tech.length; i < len; i++) { if ( !tech.tech[i].isNonRefundable && + !tech.tech[i].isLore && tech.tech[i].name !== "many-worlds" && - tech.tech[i].name !== "perturbation theory" + tech.tech[i].name !== "decoherence" ) { totalTech += tech.tech[i].count tech.tech[i].remove(); @@ -321,10 +321,10 @@ const m = { tech.tech[i].count = 0 } } - lore.techCount = 0; + // lore.techCount = 0; + // tech.removeLoreTechFromPool(); + // tech.addLoreTechToPool(); tech.removeJunkTechFromPool(); - tech.removeLoreTechFromPool(); - tech.addLoreTechToPool(); tech.armorFromPowerUps = 0; tech.totalCount = 0; const randomBotCount = b.totalBots() @@ -334,7 +334,7 @@ const m = { bullet = []; //randomize health - m.health = 0.7 + Math.random() + m.health = m.health * (1 + 0.5 * (Math.random() - 0.5)) if (m.health > 1) m.health = 1; m.displayHealth(); @@ -344,7 +344,11 @@ const m = { //track ammo/ ammoPack count let ammoCount = 0 for (let i = 0, len = b.inventory.length; i < len; i++) { - if (b.guns[b.inventory[i]].ammo !== Infinity) ammoCount += b.guns[b.inventory[i]].ammo / b.guns[b.inventory[i]].ammoPack + if (b.guns[b.inventory[i]].ammo !== Infinity) { + ammoCount += b.guns[b.inventory[i]].ammo / b.guns[b.inventory[i]].ammoPack + } else { + ammoCount += 5 + } } //removes guns and ammo b.inventory = []; @@ -369,6 +373,7 @@ const m = { for (let i = 0, len = tech.tech.length; i < len; i++) { if (tech.tech[i].count < tech.tech[i].maxCount && !tech.tech[i].isBadRandomOption && + !tech.tech[i].isLore && tech.tech[i].allowed() && (!tech.tech[i].isJunk || Math.random() < 0.25)) options.push(i); // !tech.tech[i].isNonRefundable && @@ -489,13 +494,13 @@ const m = { let dmg = 1 dmg *= m.fieldHarmReduction if (tech.isImmortal) dmg *= 0.84 - if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.33 : 1.33 + if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.25 : 1.25 if (tech.healthDrain) dmg *= 1 + 2.667 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage if (tech.isBlockHarm && m.isHolding) dmg *= 0.2 if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.0185, 0.55) if (tech.isSlowFPS) dmg *= 0.8 - if (tech.isPiezo) dmg *= 0.85 + // if (tech.isPiezo) dmg *= 0.85 if (tech.isHarmReduce && m.fieldUpgrades[m.fieldMode].name === "negative mass field" && m.isFieldActive) dmg *= 0.5 if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots() if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; @@ -631,6 +636,7 @@ const m = { m.energy -= dmg; if (m.energy < 0 || isNaN(m.energy)) { //taking deadly damage if (tech.isDeathAvoid && powerUps.research.count && !tech.isDeathAvoidedThisLevel) { + tech.isDeathAvoidedThisLevel = true powerUps.research.changeRerolls(-1) simulation.makeTextLog(`m.research--
${powerUps.research.count}`) @@ -1505,7 +1511,7 @@ const m = { description: "use energy to block mobs
excess energy used to build drones
double your default energy regeneration", effect: () => { m.hold = function() { - if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 200) { + if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 200 && (m.cycle % 2)) { if (tech.isSporeField) { // const len = Math.floor(5 + 4 * Math.random()) const len = Math.ceil(m.energy * 10) @@ -2664,7 +2670,7 @@ const m = { player.position.x > level.exit.x && player.position.x < level.exit.x + 100 && player.position.y > level.exit.y - 150 && - player.position.y < level.exit.y - 40 + player.position.y < level.exit.y + 40 ) { level.nextLevel() } @@ -2773,6 +2779,7 @@ const m = { ctx.restore(); } + //fix collisions collisionChecks = (event) => { const pairs = event.pairs; @@ -2803,7 +2810,7 @@ const m = { return } m.damage(dmg); - if (tech.isPiezo) m.energy += 4; + if (tech.isPiezo) m.energy += 20.48; if (tech.isBayesian) powerUps.ejectTech() if (mob[k].onHit) mob[k].onHit(k); m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to collision damage for 30 cycles diff --git a/js/spawn.js b/js/spawn.js index b6ba4b9..0d53a54 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -82,8 +82,8 @@ const spawn = { } } }, - - randomLevelBoss(x, y, options = ["orbitalBoss", "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "snakeBoss", "streamBoss"]) { + //, "historyBoss", "shooterBoss", "cellBossCulture", "bomberBoss", "spiderBoss", "launcherBoss", "laserTargetingBoss", "powerUpBoss", "snakeBoss", "streamBoss" + randomLevelBoss(x, y, options = ["orbitalBoss"]) { // other bosses: suckerBoss, laserBoss, tetherBoss, //these need a particular level to work so they are not included in the random pool spawn[options[Math.floor(Math.random() * options.length)]](x, y) }, @@ -2688,11 +2688,11 @@ const spawn = { mobs.spawn(who.position.x, who.position.y, 8, 12, "rgb(255,0,150)"); let me = mob[mob.length - 1]; me.stroke = "transparent"; - // Matter.Body.setDensity(me, 0.00004); //normal is 0.001 + Matter.Body.setDensity(me, 0.1); //normal is 0.001 me.leaveBody = false; me.dropPowerUp = false; me.showHealthBar = false; - me.isShielded = true + // me.isShielded = true me.collisionFilter.category = cat.mobBullet; me.collisionFilter.mask = cat.bullet; //cat.player | cat.map | cat.body me.do = function() { @@ -2709,14 +2709,15 @@ const spawn = { } Matter.Body.setPosition(this, Vector.add(who.position, Vector.mult(orbit, radius))) //bullets move with player //damage player - if (Matter.Query.collides(this, [player]).length > 0 && !m.isCloak) { + if (Matter.Query.collides(this, [player]).length > 0 && !(m.isCloak && tech.isIntangible)) { m.damage(0.035 * simulation.dmgScale); this.death(); } }; }, orbitalBoss(x, y, radius = 88) { - const nodes = Math.floor(3 + 1 * Math.sqrt(simulation.difficulty)) + const nodeBalance = Math.random() + const nodes = Math.min(15, Math.floor(1 + 5 * nodeBalance + 0.75 * Math.sqrt(simulation.difficulty))) mobs.spawn(x, y, nodes, radius, "rgb(255,0,150)"); let me = mob[mob.length - 1]; me.isBoss = true; @@ -2724,23 +2725,24 @@ const spawn = { me.stroke = "transparent"; //used for drawGhost me.seeAtDistance2 = 2000000; - me.accelMag = Math.floor(10 * (Math.random() + 4.5)) * 0.00001 * simulation.accelScale; - me.frictionAir = 0.005; - me.accelMag = 0.00016 * simulation.accelScale; me.memory = Infinity; + me.frictionAir = 0.01; + me.accelMag = 0.00004 * simulation.accelScale; me.collisionFilter.mask = cat.player | cat.bullet spawn.shield(me, x, y, 1); - let speed = (0.006 + 0.002 * Math.sqrt(simulation.difficulty)) * ((Math.random() < 0.5) ? 1 : -1) - let range = radius + 125 + 250 * Math.random() + nodes * 5 + const rangeInnerVsOuter = Math.random() + let speed = (0.003 + 0.0015 * Math.sqrt(simulation.difficulty)) * ((Math.random() < 0.5) ? 1 : -1) + let range = radius + 150 + 200 * rangeInnerVsOuter + nodes * 5 for (let i = 0; i < nodes; i++) spawn.orbital(me, range, i / nodes * 2 * Math.PI, speed) const orbitalIndexes = [] //find indexes for all the current nodes for (let i = 0; i < nodes; i++) orbitalIndexes.push(mob.length - 1 - i) // add orbitals for each orbital - range = 70 + Math.max(0, 140 * Math.random() - nodes * 3) - speed = speed * (1.5 + 2 * Math.random()) + range = Math.max(60, 150 - nodes * 3 - rangeInnerVsOuter * 80) + speed = speed * (1.25 + 2 * Math.random()) + const subNodes = Math.max(2, Math.floor(6 - 5 * nodeBalance + 0.5 * Math.sqrt(simulation.difficulty))) for (let j = 0; j < nodes; j++) { - for (let i = 0, len = nodes - 1; i < len; i++) spawn.orbital(mob[orbitalIndexes[j]], range, i / len * 2 * Math.PI, speed) + for (let i = 0, len = subNodes; i < len; i++) spawn.orbital(mob[orbitalIndexes[j]], range, i / len * 2 * Math.PI, speed) } me.onDeath = function() { powerUps.spawnBossPowerUp(this.position.x, this.position.y) diff --git a/js/tech.js b/js/tech.js index 50b2896..322c82b 100644 --- a/js/tech.js +++ b/js/tech.js @@ -109,6 +109,7 @@ }, damageFromTech() { let dmg = m.fieldDamage + if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.37 if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.5 if (tech.isTechDamage) dmg *= 2 if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance()) @@ -891,7 +892,7 @@ }, { name: "laser-bot upgrade", - description: "convert all your bots to laser-bots
400% increased laser-bot laser damage", + description: "convert all your bots to laser-bots
75% improved damage, efficiency, and range", // 400% increased laser-bot laser damage", maxCount: 1, count: 0, allowed() { @@ -1334,16 +1335,16 @@ }, { name: "piezoelectricity", - description: "colliding with mobs gives you 400 energy
reduce harm by 15%", + description: "colliding with mobs gives you 2048 energy", //
reduce harm by 15% maxCount: 1, count: 0, allowed() { - return !tech.isEnergyHealth + return !tech.isEnergyHealth && m.harmReduction() < 1 }, - requires: "not mass-energy equivalence", + requires: "not mass-energy equivalence, some harm reduction", effect() { tech.isPiezo = true; - m.energy += 4; + m.energy += 20.48; }, remove() { tech.isPiezo = false; @@ -1603,7 +1604,7 @@ }, { name: "torpor", - description: "if a mob has died in the last 5 seconds
reduce harm by 66% else increase it by 50%", + description: "if a mob has died in the last 5 seconds
reduce harm by 75% else increase it by 25%", maxCount: 1, count: 0, allowed() { @@ -1808,6 +1809,22 @@ tech.isDeathAvoid = false; } }, + { + name: "strong anthropic principle", + description: "after anthropic principle prevents your death
increase damage by 137.03599% on that level", + maxCount: 1, + count: 0, + allowed() { + return tech.isDeathAvoid + }, + requires: "anthropic principle", + effect() { + tech.isAnthropicDamage = true + }, + remove() { + tech.isAnthropicDamage = false + } + }, { name: "quantum immortality", description: "after dying, continue in an alternate reality
reduce harm by 16%", //spawn 4 research @@ -1843,7 +1860,7 @@ }, { name: "decoherence", - description: "enter an alternate reality after you research
spawn 9 research immediately", + description: "enter an alternate reality after you research
spawn 9 research", maxCount: 1, count: 0, allowed() { @@ -1885,7 +1902,7 @@ requires: "not determinism, at least 3 research", effect() { tech.isBanish = true - for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x, m.pos.y, "research", false); + for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "research", false); }, remove() { tech.isBanish = false @@ -1970,7 +1987,7 @@ tech.setupAllTech(); // remove all tech tech.addLoreTechToPool(); for (let i = 0; i < count; i++) { // spawn new tech power ups - powerUps.spawn(m.pos.x, m.pos.y, "tech"); + powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); } //have state is checked in m.death() }, @@ -2293,7 +2310,7 @@ effect: () => { tech.isDeterminism = true; //if you change the six also change it in Born rule - for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x, m.pos.y, "tech"); + for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); }, remove() { tech.isDeterminism = false; @@ -2312,9 +2329,8 @@ requires: "determinism, not unified field theory", effect: () => { tech.isSuperDeterminism = true; - for (let i = 0; i < 7; i++) { //if you change the six also change it in Born rule - powerUps.spawn(m.pos.x, m.pos.y, "tech"); - } + //if you change the six also change it in Born rule + for (let i = 0; i < 7; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); }, remove() { tech.isSuperDeterminism = false; @@ -2331,9 +2347,9 @@ maxCount: 1, count: 0, allowed() { - return (b.totalBots() > 5 || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection || + return (b.totalBots() > 3 || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection || }, - requires: "bots > 5, plasma torch, nano-scale, pilot wave, not mass-energy equivalence, CPT", + requires: "bots > 3, plasma torch, nano-scale, pilot wave, not mass-energy equivalence, CPT", effect() { tech.isRewindGun = true b.guns.push(b.gunRewind) @@ -4212,7 +4228,7 @@ }, requires: "", effect() { - for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x, m.pos.y, "heal"); + for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal"); this.count-- }, remove() {} @@ -4230,7 +4246,7 @@ }, requires: "not exciton lattice", effect() { - for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo"); + for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo"); this.count-- }, remove() {} @@ -4248,7 +4264,7 @@ }, requires: "not superdeterminism", effect() { - for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "research"); + for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "research"); this.count-- }, remove() {} @@ -4510,27 +4526,27 @@ }, remove() {} }, - { - name: "lubrication", - description: "reduce block density and friction for this level", - maxCount: 9, - count: 0, - numberInPool: 0, - isNonRefundable: true, - isExperimentHide: true, - isJunk: true, - allowed() { - return true - }, - requires: "", - effect() { - for (let i = 0; i < body.length; i++) { - Matter.Body.setDensity(body[i], 0.0001) // 0.001 is normal - body[i].friction = 0.01 - } - }, - remove() {} - }, + // { + // name: "lubrication", + // description: "reduce block density and friction for this level", + // maxCount: 9, + // count: 0, + // numberInPool: 0, + // isNonRefundable: true, + // isExperimentHide: true, + // isJunk: true, + // allowed() { + // return true + // }, + // requires: "", + // effect() { + // for (let i = 0; i < body.length; i++) { + // Matter.Body.setDensity(body[i], 0.0001) // 0.001 is normal + // body[i].friction = 0.01 + // } + // }, + // remove() {} + // }, { name: "pitch", description: "oscillate the pitch of your world", @@ -5356,5 +5372,6 @@ isDamageAfterKill: null, isHarmReduceAfterKill: null, isSwitchReality: null, - isResearchReality: null + isResearchReality: null, + isAnthropicDamage: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index c3a93e5..e9ef8f7 100644 --- a/todo.txt +++ b/todo.txt @@ -1,11 +1,14 @@ ******************************************************** NEXT PATCH ******************************************************** -tech: decoherence - switch realities after you research, spawn 9 research power ups +mob orbitals can now be destroyed, but it takes a very large amount of damage + +laser-bot upgrade: gives 75% damage, range, and energy efficiency (was 400% damage, but they ran out of energy too fast) +boom-bots are now smart about not hurting the player with explosions while doing the most damage + +tech: strong anthropic principle - after anthropic principle prevents your death do 137.03599 extra damage for the rest of the level ******************************************************** BUGS ******************************************************** -ship mode can old exit a level in the top part of the exit - use the floor of portal sensor on the player? to unstuck player (only once on my computer) once every 7 second check isn't running code @@ -32,6 +35,15 @@ use the floor of portal sensor on the player? to unstuck player ******************************************************** TODO ******************************************************** +tech: after using anthropic principle do 200% more damage for the rest of the level + + +use ship tech to make a mob mode + differences from ship to mob + graphics + take no damage from mob collision + It would be cool if you could exit mob mode + decrease healing effects by 50% decrease level scaling healing reduction net effect: healing at difficulty 40 (level 10 hard) should be 25% higher then current levels @@ -44,7 +56,6 @@ bosses should have 2x health, but only do about 50 health damage boss flag cut damage done to boss by 20x <---- make bosses not have extra density - tech: spawn a bot after taking collision damage tech: standing wave freezes the mobs it hits @@ -63,11 +74,6 @@ map: laboratory a button that spawns a heal. -final boss: hide boss after spawning mobs - reduce health by 1/3? - -tech: after using anthropic principle do 100% more damage for the rest of the level - mechanic: immune to next collision track number of possible collisions, if number is > 0 immune and -- graphical indication? (recolor health bar while immune)