mob body slice

no cloning theorem - 42% duplication, but lose 1% dup if you kill a mob
  requires cloaking or time dilation field
tech: symbiosis - if you kill a mob lose 2% max health, but gain 2 tech at the end of every level.
  requires cloaking or time dilation field

JUNK tech: all-stars - make mobs look like stars
JUNK tech: mouth - make mobs look like they have a mouth

the nonCollideBosses have been made 10% harder to kill
  these are the types of bosses that spawn from apomixis on 100% duplication

7+ sided mobs may slice in two when they die
This commit is contained in:
landgreen
2021-09-26 06:18:52 -07:00
parent 7c2c142b4c
commit 4df06fcfc6
8 changed files with 323 additions and 151 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -19,8 +19,8 @@ const level = {
// b.giveGuns("harpoon") // b.giveGuns("harpoon")
// tech.giveTech("toggling harpoon") // tech.giveTech("toggling harpoon")
// tech.giveTech("filament") // tech.giveTech("filament")
// tech.giveTech("isotropic radiator") // tech.giveTech("mouth")
// tech.giveTech("necrophage") // tech.giveTech("all-stars")
// for (let i = 0; i < 3; i++) tech.giveTech("super sized") // for (let i = 0; i < 3; i++) tech.giveTech("super sized")
// for (let i = 0; i < 9; i++) tech.giveTech("MIRV") // for (let i = 0; i < 9; i++) tech.giveTech("MIRV")
@@ -108,8 +108,9 @@ const level = {
m.eyeFillColor = m.fieldMeterColor m.eyeFillColor = m.fieldMeterColor
simulation.makeTextLog(`tech.isFlipFlopOn <span class='color-symbol'>=</span> true`); simulation.makeTextLog(`tech.isFlipFlopOn <span class='color-symbol'>=</span> true`);
} }
if (tech.removeMaxHealthOnKill > 0.01) { if (tech.isSpawnExitTech) {
for (let i = 0; i < 2; i++) powerUps.spawn(level.exit.x + 10 * (Math.random() - 0.5), level.exit.y - 100 + 10 * (Math.random() - 0.5), "tech", false) // for (let i = 0; i < 2; i++) powerUps.spawn(level.exit.x + 10 * (Math.random() - 0.5), level.exit.y - 100 + 10 * (Math.random() - 0.5), "tech", false) //exit
for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 90 * (Math.random() - 0.5), player.position.y + 90 * (Math.random() - 0.5), "tech", false); //start
} }
}, },
custom() {}, custom() {},
@@ -2291,14 +2292,13 @@ const level = {
spawn.mapRect(5300, -275, 50, 175); spawn.mapRect(5300, -275, 50, 175);
spawn.mapRect(5050, -100, 50, 150); spawn.mapRect(5050, -100, 50, 150);
spawn.mapRect(4850, -275, 50, 175); spawn.mapRect(4850, -275, 50, 175);
level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
spawn.starter(1900, -500, 200) //big boy spawn.starter(1900, -500, 200) //big boy
// spawn.blockGroup(1900, -500) // spawn.blockGroup(1900, -500)
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40); // for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
// spawn.laserBombingBoss(1900, -500) // spawn.laserBombingBoss(1900, -500)
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500) // for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
// spawn.snakeSuckBoss(1900, -500)
// spawn.grenadier(1900, -500) // spawn.grenadier(1900, -500)
// spawn.sneaker(1900, -500, 200) // spawn.sneaker(1900, -500, 200)
// spawn.shield(mob[mob.length - 1], 1900, -500, 1); // spawn.shield(mob[mob.length - 1], 1900, -500, 1);
@@ -2316,7 +2316,7 @@ const level = {
// spawn.nodeGroup(1200, -500, "grenadier") // spawn.nodeGroup(1200, -500, "grenadier")
// spawn.nodeGroup(1800, -500, "grenadier") // spawn.nodeGroup(1800, -500, "grenadier")
// spawn.nodeGroup(1200, 0, "grenadier") // spawn.nodeGroup(1200, 0, "grenadier")
// spawn.snakeBoss(1200, -500) spawn.snakeBoss(1200, -500)
// spawn.suckerBoss(2900, -500) // spawn.suckerBoss(2900, -500)
// spawn.randomMob(1600, -500) // spawn.randomMob(1600, -500)
}, },
@@ -4365,15 +4365,15 @@ const level = {
Composite.add(engine.world, cons[cons.length - 1]); Composite.add(engine.world, cons[cons.length - 1]);
spawn.bodyRect(-2700, 1150, 100, 160, 1, spawn.propsSlide); //weight spawn.bodyRect(-2700, 1150, 100, 160, 1, spawn.propsSlide); //weight
spawn.bodyRect(-2550, 1150, 200, 100, 1, spawn.propsSlide); //weight spawn.bodyRect(-2550, 1200, 150, 150, 1, spawn.propsSlide); //weight
spawn.bodyRect(-2775, 1300, 400, 100, 1, spawn.propsHoist); //hoist spawn.bodyRect(-2763, 1300, 350, 100, 1, spawn.propsHoist); //hoist
cons[cons.length] = Constraint.create({ cons[cons.length] = Constraint.create({
pointA: { pointA: {
x: -2575, x: -2575,
y: 150 y: 150
}, },
bodyB: body[body.length - 1], bodyB: body[body.length - 1],
stiffness: 0.0005, stiffness: 0.0004,
length: 566 length: 566
}); });
Composite.add(engine.world, cons[cons.length - 1]); Composite.add(engine.world, cons[cons.length - 1]);

View File

@@ -362,7 +362,7 @@ const mobs = {
seePlayerByDistOrLOS() { seePlayerByDistOrLOS() {
if (!(simulation.cycle % this.seePlayerFreq)) { if (!(simulation.cycle % this.seePlayerFreq)) {
if ( if (
(this.distanceToPlayer2() < this.seeAtDistance2 || (Matter.Query.ray(map, this.position, this.playerPosRandomY()).length === 0 && Matter.Query.ray(body, this.position, this.playerPosRandomY()).length === 0)) && (this.distanceToPlayer2() < this.seeAtDistance2 || (Matter.Query.ray(map, this.position, this.playerPosRandomY()).length === 0)) && //&& Matter.Query.ray(body, this.position, this.playerPosRandomY()).length === 0
!m.isCloak !m.isCloak
) { ) {
this.foundPlayer(); this.foundPlayer();
@@ -1151,6 +1151,10 @@ const mobs = {
m.setMaxHealth(); m.setMaxHealth();
} }
} }
if (tech.cloakDuplication) {
tech.cloakDuplication -= 0.01
powerUps.setDupChance(); //needed after adjusting duplication chance
}
} else if (tech.isShieldAmmo && this.shield && !this.isExtraShield) { } else if (tech.isShieldAmmo && this.shield && !this.isExtraShield) {
let type = tech.isEnergyNoAmmo ? "heal" : "ammo" let type = tech.isEnergyNoAmmo ? "heal" : "ammo"
if (Math.random() < 0.4) { if (Math.random() < 0.4) {
@@ -1242,29 +1246,67 @@ const mobs = {
replace(i) { replace(i) {
//if there are too many bodies don't turn into blocks to help performance //if there are too many bodies don't turn into blocks to help performance
if (this.leaveBody && body.length < 40 && this.mass < 200 && this.radius > 18) { if (this.leaveBody && body.length < 40 && this.mass < 200 && this.radius > 18) {
const len = body.length; let v = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //might help with vertex collision issue, not sure
const v = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //might help with vertex collision issue, not sure if (v.length > 5 && body.length < 35 && Math.random() < 0.5) {
body[len] = Matter.Bodies.fromVertices(this.position.x, this.position.y, v); const cutPoint = 3 + Math.floor((v.length - 6) * Math.random()) //Math.floor(v.length / 2)
Matter.Body.setVelocity(body[len], Vector.mult(this.velocity, 0.5)); const v2 = v.slice(0, cutPoint + 1)
Matter.Body.setAngularVelocity(body[len], this.angularVelocity); v = v.slice(cutPoint - 1)
body[len].collisionFilter.category = cat.body; const len = body.length;
body[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet; body[len] = Matter.Bodies.fromVertices(this.position.x, this.position.y, v2);
// if (body[len].mass > 10 || 45 + 10 * Math.random() < body.length) { Matter.Body.setVelocity(body[len], Vector.mult(this.velocity, 0.5));
// body[len].collisionFilter.mask = cat.player | cat.bullet | cat.mob | cat.mobBullet; Matter.Body.setAngularVelocity(body[len], this.angularVelocity);
// } body[len].collisionFilter.category = cat.body;
body[len].classType = "body"; body[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet;
Composite.add(engine.world, body[len]); //add to world body[len].classType = "body";
Composite.add(engine.world, body[len]); //add to world
//large mobs shrink so they don't block paths const len2 = body.length;
if (body[len].mass > 9) { body[len2] = Matter.Bodies.fromVertices(this.position.x, this.position.y, v);
const shrink = function(that, massLimit) { Matter.Body.setVelocity(body[len2], Vector.mult(this.velocity, 0.5));
if (that.mass > massLimit) { Matter.Body.setAngularVelocity(body[len2], this.angularVelocity);
const scale = 0.95; body[len2].collisionFilter.category = cat.body;
Matter.Body.scale(that, scale, scale); body[len2].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet;
setTimeout(shrink, 20, that, massLimit); // if (body[len].mass > 10 || 45 + 10 * Math.random() < body.length) {
} // body[len].collisionFilter.mask = cat.player | cat.bullet | cat.mob | cat.mobBullet;
}; // }
shrink(body[len], 7 + 4 * Math.random()) body[len2].classType = "body";
Composite.add(engine.world, body[len2]); //add to world
//large mobs shrink so they don't block paths
if (body[len].mass + body[len2].mass > 16) {
const massLimit = 8 + 6 * Math.random()
const shrink = function(that1, that2) {
if (that1.mass + that2.mass > massLimit) {
const scale = 0.95;
Matter.Body.scale(that1, scale, scale);
Matter.Body.scale(that2, scale, scale);
setTimeout(shrink, 20, that1, that2);
}
};
shrink(body[len], body[len2])
}
} else {
const len = body.length;
body[len] = Matter.Bodies.fromVertices(this.position.x, this.position.y, v);
Matter.Body.setVelocity(body[len], Vector.mult(this.velocity, 0.5));
Matter.Body.setAngularVelocity(body[len], this.angularVelocity);
body[len].collisionFilter.category = cat.body;
body[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet;
body[len].classType = "body";
Composite.add(engine.world, body[len]); //add to world
//large mobs shrink so they don't block paths
if (body[len].mass > 9) {
const massLimit = 7 + 4 * Math.random()
const shrink = function(that) {
if (that.mass > massLimit) {
const scale = 0.95;
Matter.Body.scale(that, scale, scale);
setTimeout(shrink, 20, that);
}
};
shrink(body[len])
}
} }
Matter.Composite.remove(engine.world, this); Matter.Composite.remove(engine.world, this);
mob.splice(i, 1); mob.splice(i, 1);

View File

@@ -948,7 +948,7 @@ const m = {
m.fieldHarmReduction = 1; m.fieldHarmReduction = 1;
m.isSneakAttack = false m.isSneakAttack = false
m.duplicateChance = 0 m.duplicateChance = 0
powerUps.setDo(); powerUps.setDupChance();
m.grabPowerUpRange2 = 156000; m.grabPowerUpRange2 = 156000;
m.blockingRecoil = 4; m.blockingRecoil = 4;
m.fieldRange = 155; m.fieldRange = 155;
@@ -2219,9 +2219,9 @@ const m = {
for (let i = 0; i < inPlayer.length; i++) { for (let i = 0; i < inPlayer.length; i++) {
if (m.energy > 0) { if (m.energy > 0) {
if (inPlayer[i].shield) { //shields drain player energy if (inPlayer[i].shield) { //shields drain player energy
m.energy -= 0.014; m.energy -= 0.016;
} else { } else {
m.energy -= 0.004; m.energy -= 0.006;
} }
} }
} }
@@ -2590,7 +2590,7 @@ const m = {
description: "use <strong class='color-f'>energy</strong> to <strong>tunnel</strong> through a <strong class='color-worm'>wormhole</strong><br><strong class='color-worm'>wormholes</strong> attract <strong class='color-block'>blocks</strong> and power ups<br><strong>7%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>", //<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 class='color-worm'>wormholes</strong> attract <strong class='color-block'>blocks</strong> and power ups<br><strong>7%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>", //<br>bullets may also traverse <strong class='color-worm'>wormholes</strong>
effect: function() { effect: function() {
m.duplicateChance = 0.07 m.duplicateChance = 0.07
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
m.hold = function() { m.hold = function() {
// m.hole = { //this is reset with each new field, but I'm leaving it here for reference // m.hole = { //this is reset with each new field, but I'm leaving it here for reference

View File

@@ -89,7 +89,7 @@ const powerUps = {
totalPowerUps: 0, //used for tech that count power ups at the end of a level totalPowerUps: 0, //used for tech that count power ups at the end of a level
lastTechIndex: null, lastTechIndex: null,
do() {}, do() {},
setDo() { setDupChance() {
if (tech.duplicationChance() > 0 || tech.isAnthropicTech) { if (tech.duplicationChance() > 0 || tech.isAnthropicTech) {
if (tech.isPowerUpsVanish) { if (tech.isPowerUpsVanish) {
powerUps.do = powerUps.doDuplicatesVanish powerUps.do = powerUps.doDuplicatesVanish
@@ -319,16 +319,20 @@ const powerUps = {
} }
} }
if (tech.isRerollBots) { if (tech.isRerollBots) {
let delay = 0
for (const cost = 2 + Math.floor(0.2 * b.totalBots()); powerUps.research.count > cost - 1; powerUps.research.count -= cost) { for (const cost = 2 + Math.floor(0.2 * b.totalBots()); powerUps.research.count > cost - 1; powerUps.research.count -= cost) {
b.randomBot() delay += 500
if (tech.renormalization) { setTimeout(() => {
for (let i = 0; i < cost; i++) { b.randomBot()
if (Math.random() < 0.4) { if (tech.renormalization) {
m.fieldCDcycle = m.cycle + 20; for (let i = 0; i < cost; i++) {
powerUps.spawn(m.pos.x, m.pos.y, "research"); if (Math.random() < 0.4) {
m.fieldCDcycle = m.cycle + 20;
powerUps.spawn(m.pos.x + 100 * (Math.random() - 0.5), m.pos.y + 100 * (Math.random() - 0.5), "research");
}
} }
} }
} }, delay);
} }
for (let i = 0, len = tech.tech.length; i < len; i++) { for (let i = 0, len = tech.tech.length; i < len; i++) {
if (tech.tech[i].name === "bot fabrication") tech.tech[i].description = `if you collect ${powerUps.orb.research(2 + Math.floor(0.2 * b.totalBots()))}use them to build a<br>random <strong class='color-bot'>bot</strong> <em>(+1 cost every 5 bots)</em>` if (tech.tech[i].name === "bot fabrication") tech.tech[i].description = `if you collect ${powerUps.orb.research(2 + Math.floor(0.2 * b.totalBots()))}use them to build a<br>random <strong class='color-bot'>bot</strong> <em>(+1 cost every 5 bots)</em>`
@@ -472,21 +476,39 @@ const powerUps = {
} }
} }
} else { //give ammo to all guns in inventory } else { //give ammo to all guns in inventory
let textLog = ""
for (let i = 0, len = b.inventory.length; i < len; i++) { for (let i = 0, len = b.inventory.length; i < len; i++) {
const target = b.guns[b.inventory[i]] const target = b.guns[b.inventory[i]]
if (target.ammo !== Infinity) { if (target.ammo !== Infinity) {
if (tech.ammoCap) { if (tech.ammoCap) {
const ammoAdded = Math.ceil(target.ammoPack * 0.45 * tech.ammoCap) //0.45 is average const ammoAdded = Math.ceil(target.ammoPack * 0.45 * tech.ammoCap) //0.45 is average
target.ammo = ammoAdded target.ammo = ammoAdded
simulation.makeTextLog(`${target.name}.<span class='color-g'>ammo</span> <span class='color-symbol'>=</span> ${ammoAdded}`) textLog += `${target.name}.<span class='color-g'>ammo</span> <span class='color-symbol'>=</span> ${ammoAdded}<br>`
} else { } else {
const ammoAdded = Math.ceil((0.45 * Math.random() + 0.45 * Math.random()) * target.ammoPack) //Math.ceil(Math.random() * target.ammoPack) const ammoAdded = Math.ceil((0.45 * Math.random() + 0.45 * Math.random()) * target.ammoPack) //Math.ceil(Math.random() * target.ammoPack)
target.ammo += ammoAdded target.ammo += ammoAdded
simulation.makeTextLog(`${target.name}.<span class='color-g'>ammo</span> <span class='color-symbol'>+=</span> ${ammoAdded}`) textLog += `${target.name}.<span class='color-g'>ammo</span> <span class='color-symbol'>+=</span> ${ammoAdded}<br>`
} }
} }
} }
simulation.makeTextLog(textLog)
} }
// } else { //give ammo to all guns in inventory
// for (let i = 0, len = b.inventory.length; i < len; i++) {
// const target = b.guns[b.inventory[i]]
// if (target.ammo !== Infinity) {
// if (tech.ammoCap) {
// const ammoAdded = Math.ceil(target.ammoPack * 0.45 * tech.ammoCap) //0.45 is average
// target.ammo = ammoAdded
// simulation.makeTextLog(`${target.name}.<span class='color-g'>ammo</span> <span class='color-symbol'>=</span> ${ammoAdded}`)
// } else {
// const ammoAdded = Math.ceil((0.45 * Math.random() + 0.45 * Math.random()) * target.ammoPack) //Math.ceil(Math.random() * target.ammoPack)
// target.ammo += ammoAdded
// simulation.makeTextLog(`${target.name}.<span class='color-g'>ammo</span> <span class='color-symbol'>+=</span> ${ammoAdded}`)
// }
// }
// }
// }
simulation.updateGunHUD(); simulation.updateGunHUD();
} }
}, },

View File

@@ -917,7 +917,7 @@ const spawn = {
me.onDamage = function(dmg) { me.onDamage = function(dmg) {
if (Math.random() < 0.33 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split(); if (Math.random() < 0.33 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split();
} }
me.damageReduction = 0.2 //me.damageReductionGoal me.damageReduction = 0.18 //me.damageReductionGoal
me.do = function() { me.do = function() {
// // this.armor(); // // this.armor();
if (!m.isBodiesAsleep) { if (!m.isBodiesAsleep) {
@@ -990,7 +990,7 @@ const spawn = {
me.onHit = function() { //run this function on hitting player me.onHit = function() { //run this function on hitting player
this.explode(); this.explode();
}; };
me.damageReduction = 0.25 me.damageReduction = 0.22
me.doAwake = function() { me.doAwake = function() {
if (!m.isBodiesAsleep) { if (!m.isBodiesAsleep) {
// this.armor(); // this.armor();
@@ -1107,7 +1107,7 @@ const spawn = {
if (!count % 2) powerUps.spawnRandomPowerUp(this.position.x, this.position.y) // higher then normal chance to drop heals and ammo if (!count % 2) powerUps.spawnRandomPowerUp(this.position.x, this.position.y) // higher then normal chance to drop heals and ammo
} }
} }
me.damageReduction = 0.25 me.damageReduction = 0.22
me.do = function() { me.do = function() {
// this.armor(); // this.armor();
this.alwaysSeePlayer(); this.alwaysSeePlayer();
@@ -3070,7 +3070,7 @@ const spawn = {
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.isBoss = true; me.isBoss = true;
Matter.Body.setDensity(me, 0.002 + 0.0001 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.0025 + 0.00013 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.stroke = "transparent"; //used for drawGhost me.stroke = "transparent"; //used for drawGhost
me.seeAtDistance2 = 1500000; me.seeAtDistance2 = 1500000;
@@ -3084,12 +3084,9 @@ const spawn = {
me.friction = 0; me.friction = 0;
me.frictionAir = 0.01; me.frictionAir = 0.01;
me.memory = Infinity; me.memory = Infinity;
// me.memory = 300;
// Matter.Body.setDensity(me, 0.0015); //extra dense //normal is 0.001
me.collisionFilter.mask = cat.player | cat.bullet //| cat.body me.collisionFilter.mask = cat.player | cat.bullet //| cat.body
spawn.shield(me, x, y, 1); spawn.shield(me, x, y, 1);
const len = Math.floor(Math.min(15, 3 + Math.sqrt(simulation.difficulty))) // simulation.difficulty = 40 on hard mode level 10 const len = Math.floor(Math.min(15, 3 + Math.sqrt(simulation.difficulty))) // simulation.difficulty = 40 on hard mode level 10
const speed = (0.007 + 0.003 * Math.random() + 0.004 * Math.sqrt(simulation.difficulty)) const speed = (0.007 + 0.003 * Math.random() + 0.004 * Math.sqrt(simulation.difficulty))
let radiusOrbitals = radius + 125 + 350 * Math.random() let radiusOrbitals = radius + 125 + 350 * Math.random()
@@ -3100,7 +3097,7 @@ const spawn = {
me.onDeath = function() { me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y) powerUps.spawnBossPowerUp(this.position.x, this.position.y)
}; };
me.damageReduction = 0.25 me.damageReduction = 0.2
me.do = function() { me.do = function() {
// this.armor(); // this.armor();
this.seePlayerCheckByDistance(); this.seePlayerCheckByDistance();

View File

@@ -194,26 +194,16 @@
return dmg * tech.slowFire * tech.aimDamage return dmg * tech.slowFire * tech.aimDamage
}, },
duplicationChance() { duplicationChance() {
return (tech.isPowerUpsVanish ? 0.13 : 0) + (tech.isStimulatedEmission ? 0.17 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + m.duplicateChance + tech.wormDuplicate + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) return (tech.isPowerUpsVanish ? 0.13 : 0) + (tech.isStimulatedEmission ? 0.17 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + m.duplicateChance + tech.wormDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0)
}, },
maxDuplicationEvent() { maxDuplicationEvent() {
if (tech.is100Duplicate && tech.duplicationChance() > 0.99) { if (tech.is100Duplicate && tech.duplicationChance() > 0.99) {
tech.is100Duplicate = false tech.is100Duplicate = false
const range = 500
const range = 550
for (let i = 0, len = 8; i < len; i++) { for (let i = 0, len = 8; i < len; i++) {
const angle = 2 * Math.PI * i / len const angle = 2 * Math.PI * i / len
spawn.randomLevelBoss(m.pos.x + range * Math.cos(angle), m.pos.y + range * Math.sin(angle), spawn.nonCollideBossList); spawn.randomLevelBoss(m.pos.x + range * Math.cos(angle), m.pos.y + range * Math.sin(angle), spawn.nonCollideBossList);
} }
// spawn.randomLevelBoss(m.pos.x + range, m.pos.y, spawn.nonCollideBossList);
// spawn.randomLevelBoss(m.pos.x, m.pos.y + range, spawn.nonCollideBossList);
// spawn.randomLevelBoss(m.pos.x - range, m.pos.y, spawn.nonCollideBossList);
// spawn.randomLevelBoss(m.pos.x, m.pos.y - range, spawn.nonCollideBossList);
// spawn.randomLevelBoss(m.pos.x + range, m.pos.y + range, spawn.nonCollideBossList);
// spawn.randomLevelBoss(m.pos.x + range, m.pos.y - range, spawn.nonCollideBossList);
// spawn.randomLevelBoss(m.pos.x - range, m.pos.y + range, spawn.nonCollideBossList);
// spawn.randomLevelBoss(m.pos.x - range, m.pos.y - range, spawn.nonCollideBossList);
} }
}, },
setTechFrequency(name, frequency) { setTechFrequency(name, frequency) {
@@ -480,7 +470,7 @@
allowed() { allowed() {
return !tech.isEnergyNoAmmo && !tech.isEnergyHealth return !tech.isEnergyNoAmmo && !tech.isEnergyHealth
}, },
requires: "exciton-lattice, not mass-energy", requires: "not exciton-lattice, mass-energy",
effect: () => { effect: () => {
tech.isAmmoFromHealth = true; tech.isAmmoFromHealth = true;
}, },
@@ -748,7 +738,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb || tech.isIceField || tech.isIceShot || tech.relayIce || tech.blockingIce > 1 return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb || tech.isIceField || tech.isIceShot || tech.relayIce || tech.blockingIce > 1 || tech.isWormShot || tech.foamBotCount > 1
}, },
requires: "drones, spores, missiles, foam, wave beam, neutron bomb, ice IX", requires: "drones, spores, missiles, foam, wave beam, neutron bomb, ice IX",
effect() { effect() {
@@ -1634,7 +1624,7 @@
allowed() { allowed() {
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isTokamak return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isTokamak
}, },
requires: "mass driver, not pilot wave not tokamak", requires: "mass driver, not pilot wave, tokamak",
effect() { effect() {
tech.isAddBlockMass = true tech.isAddBlockMass = true
}, },
@@ -2620,7 +2610,7 @@
allowed() { allowed() {
return m.maxHealth > 1; return m.maxHealth > 1;
}, },
requires: "health above 100", requires: "max health above 100",
effect() { effect() {
tech.isAcidDmg = true; tech.isAcidDmg = true;
}, },
@@ -2768,11 +2758,11 @@
requires: "anthropic principle, below 66% duplication chance", requires: "anthropic principle, below 66% duplication chance",
effect() { effect() {
tech.isAnthropicTech = true tech.isAnthropicTech = true
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
}, },
remove() { remove() {
tech.isAnthropicTech = false tech.isAnthropicTech = false
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
} }
}, },
{ {
@@ -2821,7 +2811,7 @@
allowed() { allowed() {
return !tech.isResearchReality && !tech.isSwitchReality return !tech.isResearchReality && !tech.isSwitchReality
}, },
requires: "Ψ(t) collapse, many-worlds", requires: "not Ψ(t) collapse, many-worlds",
effect() { effect() {
tech.isCollisionRealitySwitch = true; tech.isCollisionRealitySwitch = true;
level.difficultyDecrease(simulation.difficultyMode * 2) level.difficultyDecrease(simulation.difficultyMode * 2)
@@ -2862,7 +2852,7 @@
allowed() { allowed() {
return !tech.isSwitchReality && !tech.isCollisionRealitySwitch && !tech.isJunkResearch return !tech.isSwitchReality && !tech.isCollisionRealitySwitch && !tech.isJunkResearch
}, },
requires: "many-worlds, non-unitary, not pseudoscience", requires: "not many-worlds, non-unitary, pseudoscience",
effect() { effect() {
tech.isResearchReality = true; tech.isResearchReality = true;
for (let i = 0; i < 16; i++) powerUps.spawn(m.pos.x + Math.random() * 60, m.pos.y + Math.random() * 60, "research", false); for (let i = 0; i < 16; i++) powerUps.spawn(m.pos.x + Math.random() * 60, m.pos.y + Math.random() * 60, "research", false);
@@ -3088,12 +3078,12 @@
requires: "below 100% duplication chance", requires: "below 100% duplication chance",
effect() { effect() {
tech.duplicateChance += 0.1 tech.duplicateChance += 0.1
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
tech.addJunkTechToPool(30) tech.addJunkTechToPool(30)
}, },
remove() { remove() {
tech.duplicateChance = 0 tech.duplicateChance = 0
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
if (this.count > 1) tech.removeJunkTechFromPool(30) if (this.count > 1) tech.removeJunkTechFromPool(30)
} }
}, },
@@ -3110,11 +3100,11 @@
requires: "below 100% duplication chance", requires: "below 100% duplication chance",
effect: () => { effect: () => {
tech.isStimulatedEmission = true tech.isStimulatedEmission = true
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
}, },
remove() { remove() {
tech.isStimulatedEmission = false tech.isStimulatedEmission = false
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
} }
}, },
{ {
@@ -3130,11 +3120,11 @@
requires: "below 100% duplication chance", requires: "below 100% duplication chance",
effect: () => { effect: () => {
tech.isPowerUpsVanish = true tech.isPowerUpsVanish = true
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
}, },
remove() { remove() {
tech.isPowerUpsVanish = false tech.isPowerUpsVanish = false
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
} }
}, },
{ {
@@ -3150,11 +3140,11 @@
requires: "below 100% duplication chance, not determinism", requires: "below 100% duplication chance, not determinism",
effect() { effect() {
tech.isCancelDuplication = true //search for tech.cancelCount to balance tech.isCancelDuplication = true //search for tech.cancelCount to balance
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
}, },
remove() { remove() {
tech.isCancelDuplication = false tech.isCancelDuplication = false
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
} }
}, },
{ {
@@ -3324,7 +3314,7 @@
allowed() { allowed() {
return !tech.isSuperDeterminism && tech.duplicationChance() > 0 && powerUps.research.count > 1 return !tech.isSuperDeterminism && tech.duplicationChance() > 0 && powerUps.research.count > 1
}, },
requires: "at least 2 research, not super determinism", requires: "some duplication, not super determinism",
effect: () => { effect: () => {
powerUps.research.changeRerolls(-2) powerUps.research.changeRerolls(-2)
simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-r'>research</span> <span class='color-symbol'>-=</span> 2<br>${powerUps.research.count}`) simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-r'>research</span> <span class='color-symbol'>-=</span> 2<br>${powerUps.research.count}`)
@@ -3992,7 +3982,7 @@
allowed() { allowed() {
return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isIceShot && !tech.isFoamShot && !tech.isWormShot && !tech.isNeedleShot return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isIceShot && !tech.isFoamShot && !tech.isWormShot && !tech.isNeedleShot
}, },
requires: "shotgun, not nail-shot, foam-shot, worm-shot, ice-shot", requires: "shotgun, not nail-shot, foam-shot, worm-shot, ice-shot, needle-shot",
effect() { effect() {
tech.isSlugShot = true; tech.isSlugShot = true;
}, },
@@ -4011,7 +4001,7 @@
allowed() { allowed() {
return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isSlugShot && !tech.isIceShot && !tech.isFoamShot && !tech.isWormShot && !tech.isNeedleShot return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isSlugShot && !tech.isIceShot && !tech.isFoamShot && !tech.isWormShot && !tech.isNeedleShot
}, },
requires: "shotgun, not incendiary, slug, foam-shot, worm-shot, ice-shot", requires: "shotgun, not incendiary, slug, foam-shot, worm-shot, ice-shot, needle-shot",
effect() { effect() {
tech.isNailShot = true; tech.isNailShot = true;
}, },
@@ -4049,7 +4039,7 @@
allowed() { allowed() {
return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isSlugShot && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedleShot return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isSlugShot && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedleShot
}, },
requires: "shotgun, not incendiary, nail-shot, slug, foam-shot, ice-shot", requires: "shotgun, not incendiary, nail-shot, slug, foam-shot, ice-shot, needle-shot",
effect() { effect() {
tech.isWormShot = true; tech.isWormShot = true;
}, },
@@ -4068,7 +4058,7 @@
allowed() { allowed() {
return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isSlugShot && !tech.isIceShot && !tech.isWormShot && !tech.isNeedleShot return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isSlugShot && !tech.isIceShot && !tech.isWormShot && !tech.isNeedleShot
}, },
requires: "shotgun, not incendiary, nail-shot, slug, worm-shot, ice-shot", requires: "shotgun, not incendiary, nail-shot, slug, worm-shot, ice-shot, needle-shot",
effect() { effect() {
tech.isFoamShot = true; tech.isFoamShot = true;
}, },
@@ -4133,7 +4123,7 @@
allowed() { allowed() {
return tech.haveGunCheck("super balls") && tech.missileCount === 1 && !tech.superBallDelay return tech.haveGunCheck("super balls") && tech.missileCount === 1 && !tech.superBallDelay
}, },
requires: "super balls, but not super duper or supertemporal", requires: "super balls, but not MIRV or supertemporal",
effect() { effect() {
tech.oneSuperBall = true; tech.oneSuperBall = true;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
@@ -4352,7 +4342,7 @@
allowed() { allowed() {
return tech.haveGunCheck("missiles") return tech.haveGunCheck("missiles")
}, },
requires: "missiles", requires: "missile gun",
effect() { effect() {
tech.missileBotCount++; tech.missileBotCount++;
b.missileBot(); b.missileBot();
@@ -4498,7 +4488,7 @@
allowed() { allowed() {
return tech.haveGunCheck("mine") return tech.haveGunCheck("mine")
}, },
requires: "mines, not mine reclamation", requires: "mines",
effect() { effect() {
tech.isMineDrop = true; tech.isMineDrop = true;
if (tech.isMineDrop) b.mine(m.pos, { x: 0, y: 0 }, 0) if (tech.isMineDrop) b.mine(m.pos, { x: 0, y: 0 }, 0)
@@ -4577,7 +4567,7 @@
allowed() { allowed() {
return tech.haveGunCheck("spores") return tech.haveGunCheck("spores")
}, },
requires: "spores", requires: "spore gun",
effect() { effect() {
tech.isSporeGrowth = true tech.isSporeGrowth = true
}, },
@@ -5007,7 +4997,7 @@
allowed() { allowed() {
return tech.haveGunCheck("harpoon") return tech.haveGunCheck("harpoon")
}, },
requires: "harpoon, not spear", requires: "harpoon",
effect() { effect() {
tech.isFilament = true; tech.isFilament = true;
}, },
@@ -5227,7 +5217,7 @@
allowed() { allowed() {
return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.laserBotCount > 1) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.laserBotCount > 1) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser
}, },
requires: "laser, not wide beam, diffuse beam, pulse, or slow light", requires: "laser, not diffuse beam, pulse, or slow light",
effect() { effect() {
tech.laserReflections += 2; tech.laserReflections += 2;
}, },
@@ -6050,6 +6040,51 @@
m.fieldRegen = tech.energyRegen; m.fieldRegen = tech.energyRegen;
} }
}, },
{
name: "no-cloning theorem",
description: `<strong>42%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>if you <strong>kill</strong> a <strong>mob</strong> lose <strong>1%</strong> <strong class='color-dup'>duplication</strong> chance`,
isFieldTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking") && tech.duplicationChance() < 1
},
requires: "metamaterial cloaking, below 100% duplication chance",
effect() {
tech.cloakDuplication = 0.42
powerUps.setDupChance(); //needed after adjusting duplication chance
},
remove() {
tech.cloakDuplication = 0
powerUps.setDupChance(); //needed after adjusting duplication chance
}
},
{
name: "symbiosis",
description: "if you <strong>kill</strong> a <strong>mob</strong> lose <strong>2%</strong> max <strong class='color-h'>health</strong><br>at the <strong>start</strong> of each level spawn <strong>2</strong> <strong class='color-m'>tech</strong>",
isFieldTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking") && !tech.removeMaxHealthOnKill
},
requires: "metamaterial cloaking, not -symbiosis-",
effect() {
tech.removeMaxHealthOnKill = 0.02
tech.isSpawnExitTech = true
// for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 90 * (Math.random() - 0.5), player.position.y + 90 * (Math.random() - 0.5), "tech", false); //start
// for (let i = 0; i < 2; i++) powerUps.spawn(level.exit.x + 10 * (Math.random() - 0.5), level.exit.y - 100 + 10 * (Math.random() - 0.5), "tech", false) //exit
},
remove() {
tech.removeMaxHealthOnKill = 0
tech.isSpawnExitTech = false
}
},
{ {
name: "boson composite", name: "boson composite",
description: "<strong>intangible</strong> to <strong class='color-block'>blocks</strong> and mobs while <strong class='color-cloaked'>cloaked</strong><br>passing through <strong>mobs</strong> drains your <strong class='color-f'>energy</strong>", description: "<strong>intangible</strong> to <strong class='color-block'>blocks</strong> and mobs while <strong class='color-cloaked'>cloaked</strong><br>passing through <strong>mobs</strong> drains your <strong class='color-f'>energy</strong>",
@@ -6091,26 +6126,6 @@
tech.isCloakStun = false; tech.isCloakStun = false;
} }
}, },
{
name: "pacifist",
description: "if you <strong>kill</strong> a <strong>mob</strong> lose <strong>2%</strong> max <strong class='color-h'>health</strong><br>spawn <strong>2</strong> <strong class='color-m'>tech</strong> at the <strong>end</strong> of every level",
isFieldTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" && !tech.removeMaxHealthOnKill
},
requires: "metamaterial cloaking, not -pacifist-",
effect() {
tech.removeMaxHealthOnKill = 0.02
for (let i = 0; i < 2; i++) powerUps.spawn(level.exit.x + 10 * (Math.random() - 0.5), level.exit.y - 100 + 10 * (Math.random() - 0.5), "tech", false)
},
remove() {
tech.removeMaxHealthOnKill = 0
}
},
{ {
name: "ambush", name: "ambush",
description: "metamaterial cloaking field <strong class='color-d'>damage</strong> effect<br>is increased from <span style = 'text-decoration: line-through;'>300%</span> to <strong>600%</strong>", description: "metamaterial cloaking field <strong class='color-d'>damage</strong> effect<br>is increased from <span style = 'text-decoration: line-through;'>300%</span> to <strong>600%</strong>",
@@ -6245,17 +6260,17 @@
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole" && (build.isExperimentSelection || powerUps.research.count > 3) && tech.duplicationChance() < 1 return m.fieldUpgrades[m.fieldMode].name === "wormhole" && (build.isExperimentSelection || powerUps.research.count > 3) && tech.duplicationChance() < 1
}, },
requires: "wormhole,below 100% duplication chance", requires: "wormhole, below 100% duplication chance",
effect() { effect() {
tech.wormDuplicate = 0.14 tech.wormDuplicate = 0.14
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
for (let i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) {
if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
} }
}, },
remove() { remove() {
tech.wormDuplicate = 0 tech.wormDuplicate = 0
powerUps.setDo(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
if (this.count > 0) powerUps.research.changeRerolls(4) if (this.count > 0) powerUps.research.changeRerolls(4)
} }
}, },
@@ -6493,8 +6508,8 @@
} }
}, },
{ {
name: "-pacifist-", name: "-symbiosis-",
description: "<strong style='color: #f55;'>experiment:</strong> if you <strong>kill</strong> a <strong>mob</strong><br>lose <strong>1%</strong> max <strong class='color-h'>health</strong>", description: "<strong style='color: #f55;'>experiment:</strong> if you <strong>kill</strong> a <strong>mob</strong><br>lose <strong>0.2%</strong> max <strong class='color-h'>health</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -6505,7 +6520,7 @@
}, },
requires: "", requires: "",
effect() { effect() {
tech.removeMaxHealthOnKill = 0.01 tech.removeMaxHealthOnKill = 0.002
}, },
remove() { remove() {
tech.removeMaxHealthOnKill = 0 tech.removeMaxHealthOnKill = 0
@@ -6552,6 +6567,117 @@
if (this.count) player.restitution = 0 if (this.count) player.restitution = 0
} }
}, },
{
name: "mouth",
description: "mobs have a non functional mouth",
maxCount: 1,
count: 0,
frequency: 0,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
mobs.draw = () => {
ctx.lineWidth = 2;
let i = mob.length;
while (i--) {
ctx.beginPath();
const vertices = mob[i].vertices;
ctx.moveTo(vertices[0].x, vertices[0].y);
for (let j = 1, len = vertices.length; j < len; ++j) ctx.lineTo(vertices[j].x, vertices[j].y);
ctx.quadraticCurveTo(mob[i].position.x, mob[i].position.y, vertices[0].x, vertices[0].y);
ctx.fillStyle = mob[i].fill;
ctx.strokeStyle = mob[i].stroke;
ctx.fill();
ctx.stroke();
}
}
},
remove() {
mobs.draw = () => {
ctx.lineWidth = 2;
let i = mob.length;
while (i--) {
ctx.beginPath();
const vertices = mob[i].vertices;
ctx.moveTo(vertices[0].x, vertices[0].y);
for (let j = 1, len = vertices.length; j < len; ++j) ctx.lineTo(vertices[j].x, vertices[j].y);
ctx.lineTo(vertices[0].x, vertices[0].y);
ctx.fillStyle = mob[i].fill;
ctx.strokeStyle = mob[i].stroke;
ctx.fill();
ctx.stroke();
}
}
}
},
{
name: "all-stars",
description: "make all mobs look like stars",
maxCount: 1,
count: 0,
frequency: 0,
isExperimentHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
mobs.draw = () => {
ctx.lineWidth = 2;
let i = mob.length;
while (i--) {
ctx.beginPath();
const vertices = mob[i].vertices;
ctx.moveTo(vertices[0].x, vertices[0].y);
for (let j = 1, len = vertices.length; j < len; ++j) {
ctx.quadraticCurveTo(mob[i].position.x, mob[i].position.y, vertices[j].x, vertices[j].y);
}
ctx.quadraticCurveTo(mob[i].position.x, mob[i].position.y, vertices[0].x, vertices[0].y);
ctx.fillStyle = mob[i].fill;
ctx.strokeStyle = mob[i].stroke;
ctx.fill();
ctx.stroke();
}
}
},
remove() {
mobs.draw = () => {
ctx.lineWidth = 2;
let i = mob.length;
while (i--) {
ctx.beginPath();
const vertices = mob[i].vertices;
ctx.moveTo(vertices[0].x, vertices[0].y);
for (let j = 1, len = vertices.length; j < len; ++j) ctx.lineTo(vertices[j].x, vertices[j].y);
ctx.lineTo(vertices[0].x, vertices[0].y);
ctx.fillStyle = mob[i].fill;
ctx.strokeStyle = mob[i].stroke;
ctx.fill();
ctx.stroke();
}
}
}
},
// draw() {
// ctx.lineWidth = 2;
// let i = mob.length;
// while (i--) {
// ctx.beginPath();
// const vertices = mob[i].vertices;
// ctx.moveTo(vertices[0].x, vertices[0].y);
// for (let j = 1, len = vertices.length; j < len; ++j) ctx.lineTo(vertices[j].x, vertices[j].y);
// ctx.lineTo(vertices[0].x, vertices[0].y);
// ctx.fillStyle = mob[i].fill;
// ctx.strokeStyle = mob[i].stroke;
// ctx.fill();
// ctx.stroke();
// }
// },
{ {
name: "true colors", name: "true colors",
description: `set all power ups to their real world colors`, description: `set all power ups to their real world colors`,
@@ -8223,5 +8349,7 @@
ammoCap: null, ammoCap: null,
isHarpoonPowerUp: null, isHarpoonPowerUp: null,
harpoonDensity: null, harpoonDensity: null,
removeMaxHealthOnKill: null removeMaxHealthOnKill: null,
isSpawnExitTech: null,
cloakDuplication: null
} }

View File

@@ -1,12 +1,20 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
tech: pacifist - if you kill a mob lose 2% max health, but gain 2 tech at the end of every level no cloning theorem - 42% duplication, but lose 1% dup if you kill a mob
junk tech: bounce - you bounce, it's kinda annoying requires cloaking or time dilation field
tech: symbiosis - if you kill a mob lose 2% max health, but gain 2 tech at the end of every level.
requires cloaking or time dilation field
JUNK tech: all-stars - make mobs look like stars
JUNK tech: mouth - make mobs look like they have a mouth
the nonCollideBosses have been made 10% harder to kill
these are the types of bosses that spawn from apomixis on 100% duplication
7+ sided mobs may slice in two when they die
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
experiment: like lose 1% max health every time you kill a mob?
JUNK tech: planetesimals game inside n-gon JUNK tech: planetesimals game inside n-gon
https://codepen.io/lilgreenland/pen/jrMvaB?editors=0010 https://codepen.io/lilgreenland/pen/jrMvaB?editors=0010
@@ -46,8 +54,6 @@ harpoon tech
tracking so good harpoon can hit a target, circle around and hit it again tracking so good harpoon can hit a target, circle around and hit it again
doesn't seem to be good physics doesn't seem to be good physics
tech - explode after getting hit, but while you are immune to harm
"Interstellar Disturbance": Cosmic String applies to mobs who cross the wormhole's path, even after initial wormholing, but at reduced damage and stun time. "Interstellar Disturbance": Cosmic String applies to mobs who cross the wormhole's path, even after initial wormholing, but at reduced damage and stun time.
on mouse down wormhole shows a possible wormhole on mouse down wormhole shows a possible wormhole
@@ -67,28 +73,9 @@ make another boss with a tail
stabbers maybe stabbers maybe
suckers maybe suckers maybe
tech remove all JUNK tech make experiment and understand vibe more obvious
but you can't research
maybe spend research
tech missiles - move faster and more accurately, turn sharper
also some other bonus:
damage? or size which is basically damage
experiment and understand vibe more obvious
mostly in early game or first time players mostly in early game or first time players
falling particle rain
what causes it?
after taking damage
mines
grenades
mines and grenades
once a second you just eject rain upwards
after collecting a power up
basically spores with no guidance
lag if too many particles?
look into 360 wave beam lag look into 360 wave beam lag
aoe effect pushes mobs away, then rapidly pulls them in aoe effect pushes mobs away, then rapidly pulls them in
@@ -108,10 +95,6 @@ make non moving bosses not move after getting hit
buff rail gun buff rail gun
block shattering
get code from planetesimals
https://codepen.io/lilgreenland/pen/jrMvaB?editors=0010
scrolling console history in pause menu? scrolling console history in pause menu?
pause should at least show the last in game console message pause should at least show the last in game console message