SLOW OPENING DOORs, END OF THE WORLD literally

exit doors take a bit longer to open
  it's nice to take a few seconds to relax between levels
  please don't submit a bug report about this

plasma torch energy regen 6->10
perfect diamagnetism energy regen 6->5

a few more new images

tech: collider - after a mob dies smash power ups and change the flavor of one of them
  powerUps.randomize(where)
    if there is a tech,field,gun it will split into 4 small power ups
    else if there are at least 4 small power ups they have a 1/4 chance to combine into a tech, field, gun
    else a random small power up will change
This commit is contained in:
landgreen
2023-01-28 17:23:57 -08:00
parent c8bf77db8e
commit eb8f4b05ca
11 changed files with 131 additions and 28 deletions

BIN
img/collider.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -30,12 +30,12 @@ const level = {
// m.setField("perfect diamagnetism") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch // m.setField("perfect diamagnetism") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch
// simulation.molecularMode = 2 // simulation.molecularMode = 2
// m.damage(0.1); // m.damage(0.1);
// b.giveGuns("shotgun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser // b.giveGuns("laser") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
// b.giveGuns("wave") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser // b.giveGuns("wave") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
// b.guns[0].ammo = 10000 // b.guns[0].ammo = 10000
// tech.giveTech("vacuum bomb") // tech.giveTech("vacuum bomb")
// tech.giveTech("time crystals") // for (let i = 0; i < 3; ++i) tech.giveTech("collider")
// tech.giveTech("ice-shot") // tech.giveTech("diffuse beam")
// for (let i = 0; i < 1; ++i) tech.giveTech("super ball") // for (let i = 0; i < 1; ++i) tech.giveTech("super ball")
// tech.isFoamBall = true // tech.isFoamBall = true
// for (let i = 0; i < 3; ++i) tech.giveTech("repeater") // for (let i = 0; i < 3; ++i) tech.giveTech("repeater")
@@ -421,7 +421,8 @@ const level = {
player.position.y < level.exit.y - 0 && player.position.y < level.exit.y - 0 &&
player.velocity.y < 0.15 player.velocity.y < 0.15
) { ) {
level.exitCount += input.down ? 8 : 2 // level.exitCount += input.down ? 8 : 2
level.exitCount++
} else if (level.exitCount > 0) { } else if (level.exitCount > 0) {
level.exitCount -= 2 level.exitCount -= 2
} }
@@ -3289,20 +3290,16 @@ const level = {
spawn.mapRect(-1950, -3300, 8200, 1800); //roof spawn.mapRect(-1950, -3300, 8200, 1800); //roof
spawn.mapRect(-250, -200, 1000, 300); // shelf spawn.mapRect(-250, -200, 1000, 300); // shelf
spawn.mapRect(-250, -1700, 1000, 1250); // shelf roof spawn.mapRect(-250, -1700, 1000, 1250); // shelf roof
// spawn.blockDoor(710, -210);
spawn.mapRect(705, -210, 25, 50); spawn.mapRect(705, -210, 25, 50);
spawn.mapRect(725, -220, 25, 50); spawn.mapRect(725, -220, 25, 50);
spawn.bodyRect(750, -125, 125, 125); spawn.bodyRect(750, -125, 125, 125);
spawn.bodyRect(875, -50, 50, 50); spawn.bodyRect(875, -50, 50, 50);
spawn.mapRect(5400, -1700, 400, 1150); //right wall spawn.mapRect(5400, -1700, 400, 1150); //right wall
spawn.mapRect(5400, -300, 400, 400); //right wall spawn.mapRect(5400, -300, 400, 400); //right wall
spawn.mapRect(5700, -3300, 1800, 5100); //right wall spawn.mapRect(5700, -3300, 1800, 5100); //right wall
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump
spawn.mapRect(5403, -650, 400, 450); //blocking exit spawn.mapRect(5403, -650, 400, 450); //blocking exit
// spawn.secondaryBossChance(4800, -500) //no bonus bosses on final level
if (mobs.mobDeaths < level.levelsCleared && !simulation.isCheating) { //pacifist run if (mobs.mobDeaths < level.levelsCleared && !simulation.isCheating) { //pacifist run
for (let i = 0; i < 250; i++) spawn.starter(1000 + 4000 * Math.random(), -1500 * Math.random()) for (let i = 0; i < 250; i++) spawn.starter(1000 + 4000 * Math.random(), -1500 * Math.random())
} else { } else {
@@ -14703,7 +14700,7 @@ const level = {
spawn.mapRect(133875, -1475, 475, 1775); spawn.mapRect(133875, -1475, 475, 1775);
spawn.mapRect(132025, -1925, 2325, 475); spawn.mapRect(132025, -1925, 2325, 475);
simulation.enableConstructMode() //also remove when done // simulation.enableConstructMode() //also remove when done
coin(50165.9, -1090) coin(50165.9, -1090)
coin(78725.4, -600) coin(78725.4, -600)
coin(103830.0, -1473) coin(103830.0, -1473)

View File

@@ -1187,6 +1187,7 @@ const mobs = {
leaveBody: true, leaveBody: true,
isDropPowerUp: true, isDropPowerUp: true,
death() { death() {
if (tech.collidePowerUps && Math.random() < tech.collidePowerUps && this.isDropPowerUp) powerUps.randomize(this.position) //needs to run before onDeath spawns power ups
this.onDeath(this); //custom death effects this.onDeath(this); //custom death effects
this.removeConsBB(); this.removeConsBB();
this.alive = false; //triggers mob removal in mob[i].replace(i) this.alive = false; //triggers mob removal in mob[i].replace(i)
@@ -1207,9 +1208,6 @@ const mobs = {
} }
requestAnimationFrame(cycle); requestAnimationFrame(cycle);
} }
if (tech.iceIXOnDeath && this.isSlowed) { if (tech.iceIXOnDeath && this.isSlowed) {
for (let i = 0, len = 2 * Math.sqrt(Math.min(this.mass, 25)) * tech.iceIXOnDeath; i < len; i++) b.iceIX(3, Math.random() * 2 * Math.PI, this.position) for (let i = 0, len = 2 * Math.sqrt(Math.min(this.mass, 25)) * tech.iceIXOnDeath; i < len; i++) b.iceIX(3, Math.random() * 2 * Math.PI, this.position)
} }

View File

@@ -558,7 +558,7 @@ const m = {
if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33 if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33
if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage
if (tech.isAddBlockMass && m.isHolding) dmg *= 0.15 if (tech.isAddBlockMass && m.isHolding) dmg *= 0.15
if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.0165, 0.66) if (tech.isSpeedHarm && player.speed > 0.1) dmg *= 1 - Math.min(player.speed * 0.0165, 0.66)
if (tech.isHarmReduce && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.25 if (tech.isHarmReduce && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.25
if (tech.isNeutronium && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.1 if (tech.isNeutronium && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.1
if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots() if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots()
@@ -1076,9 +1076,13 @@ const m = {
}, },
setFieldRegen() { setFieldRegen() {
if (m.fieldMode === 6) { if (m.fieldMode === 6) {
m.fieldRegen = 0.0025 //15 energy per second m.fieldRegen = 0.002333 //14 energy per second
} else if (m.fieldMode === 2) {
m.fieldRegen = 0.000833 //5 energy per second
} else if (m.fieldMode === 4) { } else if (m.fieldMode === 4) {
m.fieldRegen = 0.002 //12 energy per second m.fieldRegen = 0.002 //12 energy per second
} else if (m.fieldMode === 5) {
m.fieldRegen = 0.001667 //10 energy per second
} else { } else {
m.fieldRegen = 0.001 //6 energy per second m.fieldRegen = 0.001 //6 energy per second
} }
@@ -1828,7 +1832,7 @@ const m = {
}, },
{ {
name: "perfect diamagnetism", name: "perfect diamagnetism",
description: "<strong>deflecting</strong> does not drain <strong class='color-f'>energy</strong><br>maintains <strong>functionality</strong> while <strong>inactive</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second", description: "<strong>deflecting</strong> does not drain <strong class='color-f'>energy</strong><br>maintains <strong>functionality</strong> while <strong>inactive</strong><br>generate <strong>5</strong> <strong class='color-f'>energy</strong> per second",
// <br><strong>attract</strong> power ups from <strong>far away</strong> // <br><strong>attract</strong> power ups from <strong>far away</strong>
// description: "<strong>attract</strong> power ups from <strong>far away</strong><br><strong>deflecting</strong> doesn't drain <strong class='color-f'>energy</strong><br>thrown <strong class='color-block'>blocks</strong> have", // description: "<strong>attract</strong> power ups from <strong>far away</strong><br><strong>deflecting</strong> doesn't drain <strong class='color-f'>energy</strong><br>thrown <strong class='color-block'>blocks</strong> have",
// description: "gain <strong class='color-f'>energy</strong> when <strong>blocking</strong><br>no <strong>recoil</strong> when <strong>blocking</strong>", // description: "gain <strong class='color-f'>energy</strong> when <strong>blocking</strong><br>no <strong>recoil</strong> when <strong>blocking</strong>",
@@ -2396,7 +2400,7 @@ const m = {
// }, // },
{ {
name: "plasma torch", name: "plasma torch",
description: "use <strong class='color-f'>energy</strong> to emit short range <strong class='color-plasma'>plasma</strong><br><strong class='color-d'>damages</strong> and <strong>pushes</strong> mobs away<br>generate <strong>6</strong> <strong class='color-f'>energy</strong> per second", description: "use <strong class='color-f'>energy</strong> to emit short range <strong class='color-plasma'>plasma</strong><br><strong class='color-d'>damages</strong> and <strong>pushes</strong> mobs away<br>generate <strong>10</strong> <strong class='color-f'>energy</strong> per second",
set() { set() {
b.isExtruderOn = false b.isExtruderOn = false
// m.fieldCDcycleAlternate = 0 // m.fieldCDcycleAlternate = 0
@@ -2785,7 +2789,7 @@ const m = {
}, },
{ {
name: "time dilation", name: "time dilation",
description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 2px;'>stop time</strong><br><strong>+25%</strong> movement and <strong><em>fire rate</em></strong><br>generate <strong>15</strong> <strong class='color-f'>energy</strong> per second", description: "use <strong class='color-f'>energy</strong> to <strong style='letter-spacing: 2px;'>stop time</strong><br><strong>+25%</strong> movement and <strong><em>fire rate</em></strong><br>generate <strong>14</strong> <strong class='color-f'>energy</strong> per second",
set() { set() {
// m.fieldMeterColor = "#0fc" // m.fieldMeterColor = "#0fc"
// m.fieldMeterColor = "#ff0" // m.fieldMeterColor = "#ff0"

View File

@@ -1385,6 +1385,58 @@ const powerUps = {
// } // }
// return 0 // return 0
// }, // },
randomize(where) { //makes a random power up convert into a random different power up
//put 10 power ups close together
const len = Math.min(10, powerUp.length)
for (let i = 0; i < len; i++) { //collide the first 10 power ups
const unit = Vector.rotate({ x: 1, y: 0 }, 6.28 * Math.random())
Matter.Body.setPosition(powerUp[i], Vector.add(where, Vector.mult(unit, 20 + 25 * Math.random())));
Matter.Body.setVelocity(powerUp[i], Vector.mult(unit, 20));
}
//count big power ups and small power ups
let options = ["heal", "research", "ammo"]
if (m.coupling) options.push("coupling")
if (tech.isBoostPowerUps) options.push("boost")
let bigIndexes = []
let smallIndexes = []
for (let i = 0; i < powerUp.length; i++) {
if (powerUp[i].name === "tech" || powerUp[i].name === "gun" || powerUp[i].name === "field") {
bigIndexes.push(i)
} else {
smallIndexes.push(i)
}
}
if (bigIndexes.length > 0) {
// console.log("at least 1 big will always spilt")
const index = bigIndexes[Math.floor(Math.random() * bigIndexes.length)]
for (let i = 0; i < 4; i++) powerUps.directSpawn(where.x, where.y, options[Math.floor(Math.random() * options.length)], false)
Matter.Composite.remove(engine.world, powerUp[index]);
powerUp.splice(index, 1);
} else if (smallIndexes.length > 3 && Math.random() < 0.25) {
// console.log("no big, at least 4 small can combine")
for (let j = 0; j < 4; j++) {
for (let i = 0; i < powerUp.length; i++) {
if (powerUp[i].name === "heal" || powerUp[i].name === "research" || powerUp[i].name === "ammo" || powerUp[i].name === "coupling" || powerUp[i].name === "boost") {
Matter.Composite.remove(engine.world, powerUp[i]);
powerUp.splice(i, 1);
break
}
}
}
options = ["tech", "gun", "field"]
powerUps.directSpawn(where.x, where.y, options[Math.floor(Math.random() * options.length)], false)
} else if (smallIndexes.length > 0) {
// console.log("no big, at least 1 small will swap flavors")
const index = Math.floor(Math.random() * powerUp.length)
options = options.filter(e => e !== powerUp[index].name); //don't repeat the current power up type
powerUps.directSpawn(where.x, where.y, options[Math.floor(Math.random() * options.length)], false)
Matter.Composite.remove(engine.world, powerUp[index]);
powerUp.splice(index, 1);
}
},
directSpawn(x, y, target, moving = true, mode = null, size = powerUps[target].size()) { directSpawn(x, y, target, moving = true, mode = null, size = powerUps[target].size()) {
let index = powerUp.length; let index = powerUp.length;
target = powerUps[target]; target = powerUps[target];

View File

@@ -966,7 +966,7 @@ const tech = {
name: "zoospore vector", name: "zoospore vector",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Disease_vector' class="link">zoospore vector</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Disease_vector' class="link">zoospore vector</a>`,
descriptionFunction() { descriptionFunction() {
return `after mobs <strong>die</strong><br>they have a <strong>+10%</strong> chance to grow ${b.guns[6].nameString('s')}` return `after mobs <strong>die</strong> there is a <strong>+10%</strong> chance<br>they grow ${b.guns[6].nameString('s')}`
}, },
// description: "after mobs <strong>die</strong><br>they have a <strong>+10%</strong> chance to grow <strong class='color-p' style='letter-spacing: 2px;'>spores</strong>", // description: "after mobs <strong>die</strong><br>they have a <strong>+10%</strong> chance to grow <strong class='color-p' style='letter-spacing: 2px;'>spores</strong>",
maxCount: 9, maxCount: 9,
@@ -1005,6 +1005,24 @@ const tech = {
tech.deathSkipTime = 0 tech.deathSkipTime = 0
} }
}, },
{
name: "collider",
descriptionFunction() {
return `after mobs <strong>die</strong> there is a <strong>+33%</strong> chance <br>to change a <strong>power up</strong> into a different <strong>flavor</strong>`
},
maxCount: 3,
count: 0,
frequency: 1,
frequencyDefault: 1,
allowed: () => true,
requires: "",
effect() {
tech.collidePowerUps += 0.33333
},
remove() {
tech.collidePowerUps = 0
}
},
{ {
name: "bubble fusion", name: "bubble fusion",
descriptionFunction() { descriptionFunction() {
@@ -3335,9 +3353,9 @@ const tech = {
isNonRefundable: true, isNonRefundable: true,
// isJunk: true, // isJunk: true,
allowed() { allowed() {
return !tech.isDeterminism return !tech.isDeterminism && !tech.isBrainstorm
}, },
requires: "not determinism", requires: "not determinism, brainstorm",
effect() { effect() {
tech.tooManyTechChoices = 1 tech.tooManyTechChoices = 1
// for (let i = 0; i < this.bonusResearch; i++) powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); // for (let i = 0; i < this.bonusResearch; i++) powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false);
@@ -8574,6 +8592,22 @@ const tech = {
}, },
remove() {} remove() {}
}, },
// {
// name: "synchrotron",
// descriptionFunction() {
// return `<strong>power ups</strong> change into a different <strong>flavor</strong> after a boss dies`
// },
// maxCount: 3,
// count: 0,
// frequency: 1,
// frequencyDefault: 1,
// allowed: () => true,
// requires: "",
// effect() {
// },
// remove() {
// }
// },
{ {
name: "return", name: "return",
description: "return to the introduction level<br>reduce combat <strong>difficulty</strong> by <strong>2 levels</strong>", description: "return to the introduction level<br>reduce combat <strong>difficulty</strong> by <strong>2 levels</strong>",
@@ -11387,4 +11421,5 @@ const tech = {
isZombieMobs: null, isZombieMobs: null,
isSuperMine: null, isSuperMine: null,
sentryAmmo: null, sentryAmmo: null,
collidePowerUps: null,
} }

View File

@@ -1,20 +1,38 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
level: lock exit doors take longer to open
there is a way to escape the slime on the right side now it's nice to take a few seconds to relax between levels
please don't submit a bug report about this
new community level! plasma torch energy regen 6->10
stereoMadness by Richard0820 perfect diamagnetism energy regen 6->5
a few more new images
tech: collider - after a mob dies smash power ups and change the flavor of one of them
powerUps.randomize(where)
if there is a tech,field,gun it will split into 4 small power ups
else if there are at least 4 small power ups they have a 1/4 chance to combine into a tech, field, gun
else a random small power up will change
*********************************************************** TODO ***************************************************** *********************************************************** TODO *****************************************************
diagetic UI Elements
ammo number?
doesn't text look choppy when camera moves?
health bar could be rendered similarly to energy bar
what about 2 bezier curves on left and right of player head that looks like 1/3 circleRadiusScale
what about 2 bezier both above player
as the total energy and health increases the curses could asymptotically approach a maximum length as max energy/health goes to infinity
level: lock level: lock
replace vanish elements with doors to fit theme better
can you do a sideways door?
should there be something in the top part of the map? should there be something in the top part of the map?
add alt versions of left and right sides add alt versions of left and right sides
make flipped L/R version (after everything else is done) make flipped L/R version (after everything else is done)
Tech: Drones always follow you mouse, never going to attack enemies or pick up power ups unless they are close to your mouse
tech: add an selection option to all tech, gun, fields to do something tech: add an selection option to all tech, gun, fields to do something
set all mobs to 30% health, and stun all mobs set all mobs to 30% health, and stun all mobs
50% chance to convert all power ups into research 50% chance to convert all power ups into research
@@ -1149,9 +1167,8 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
subtractive sculpture subtractive sculpture
kinetic sculpture kinetic sculpture
quantum stuff -- Hypertorus, Glowing Opal Pearlescent, Physics, Hydro-Dipping Hydrodipped, Vija Celmins, Matt Molloy (photo of golden waves in the sky) quantum stuff -- Hypertorus, Glowing Opal Pearlescent, Physics, Hydro-Dipping Hydrodipped, Vija Celmins, Matt Molloy (photo of golden waves in the sky)
***major themes missing***
***maybe redo*** ***maybe redo***
heuristics laser
supercritical fission supercritical fission
***past style themes*** ***past style themes***
field emitter - isometric, clean white robot spherical gun turret on bird legs, blender 3d, style of artstation and behance, Disney Pixar, cute field emitter - isometric, clean white robot spherical gun turret on bird legs, blender 3d, style of artstation and behance, Disney Pixar, cute