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)