classic n-gon links

nailgun mod
This commit is contained in:
landgreen
2020-08-27 05:25:02 -07:00
parent 21b8c6fc2b
commit d3514ee4f1
10 changed files with 144 additions and 177 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -111,6 +111,17 @@
<label for="body-damage" title="allow damage from the ground and large fast moving blocks">collision damage from blocks:</label> <label for="body-damage" title="allow damage from the ground and large fast moving blocks">collision damage from blocks:</label>
<input type="checkbox" id="body-damage" name="body-damage" checked style="width:17px; height:17px;"> --> <input type="checkbox" id="body-damage" name="body-damage" checked style="width:17px; height:17px;"> -->
<br> <br>
<label for="classic-select" title="play older versions of n-gon">classic n-gon:</label>
<select name="classic-select" id="fps-select" onChange="window.location.href=this.value">
<option value="https://codepen.io/lilgreenland/full/ozXNWZ" selected>9-6-2016</option>
<option value="https://codepen.io/lilgreenland/full/wzARJY">10-2-2016</option>
<option value="classic/7-1-2017/">7-1-2017</option>
<option value="classic/1-4-2018/">1-4-2018</option>
<option value="classic/7-11-2019/">7-11-2019</option>
<option value="classic/9-8-2019/">9-8-2019</option>
<option value="classic/3-13-2020/">3-13-2020</option>
</select>
<br>
<label for="fps-select" title="use this to slow the game down">limit frames per second:</label> <label for="fps-select" title="use this to slow the game down">limit frames per second:</label>
<select name="fps-select" id="fps-select"> <select name="fps-select" id="fps-select">
<option value="max" selected>no cap</option> <option value="max" selected>no cap</option>

View File

@@ -25,7 +25,6 @@ const b = {
if (mech.health > 2 * mod.isAmmoFromHealth * mech.maxHealth) { if (mech.health > 2 * mod.isAmmoFromHealth * mech.maxHealth) {
mech.damage(mod.isAmmoFromHealth * mech.maxHealth / mech.harmReduction()); mech.damage(mod.isAmmoFromHealth * mech.maxHealth / mech.harmReduction());
powerUps.spawn(mech.pos.x, mech.pos.y, "ammo"); powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
} else { } else {
game.replaceTextLog = true; game.replaceTextLog = true;
game.makeTextLog("not enough health for catabolism to produce ammo", 120); game.makeTextLog("not enough health for catabolism to produce ammo", 120);
@@ -1545,60 +1544,46 @@ const b = {
nextFireCycle: 0, //use to remember how longs its been since last fire, used to reset count nextFireCycle: 0, //use to remember how longs its been since last fire, used to reset count
startingHoldCycle: 0, startingHoldCycle: 0,
fire() { fire() {
const me = bullet.length;
const dir = mech.angle + (Math.random() - 0.5) * ((mech.crouch) ? 0.01 : 0.1);
bullet[me] = Bodies.rectangle(mech.pos.x + 23 * Math.cos(mech.angle), mech.pos.y + 23 * Math.sin(mech.angle), 20 * mod.bulletSize * mod.highCaliber, 6 * mod.bulletSize, b.fireAttributes(dir));
//fire delay decreases as you hold fire, down to 3 from 15 //fire delay decreases as you hold fire, down to 3 from 15
if (this.nextFireCycle + 1 < mech.cycle) this.startingHoldCycle = mech.cycle //reset if not constantly firing const pos = {
const CD = Math.max(11 - 0.06 * (mech.cycle - this.startingHoldCycle), 2) * mod.highCaliber //CD scales with cycles fire is held down x: mech.pos.x + 23 * Math.cos(mech.angle),
this.nextFireCycle = mech.cycle + CD * b.fireCD //predict next fire cycle if the fire button is held down y: mech.pos.y + 23 * Math.sin(mech.angle)
b.fireProps(CD, mech.crouch ? 38 : 34, dir, me); //cd , speed
// b.fireProps(mech.crouch ? 7 : 4, mech.crouch ? 40 : 34, dir, me); //cd , speed
bullet[me].endCycle = game.cycle + 70;
bullet[me].dmg = 0.25;
bullet[me].frictionAir = mech.crouch ? 0.001 : 0.003;
if (mod.isIceCrystals) {
bullet[me].onDmg = function (who) {
mobs.statusSlow(who, 30)
};
mech.energy -= mech.fieldRegen + 0.0075
if (mech.energy < 0.02) {
mech.fireCDcycle = mech.cycle + 60; // cool down
}
} }
bullet[me].do = function () { if (mod.nailGun) {
this.force.y += this.mass * 0.0003; mech.fireCDcycle = mech.cycle + Math.floor(2.1 * b.fireCD); // cool down
const speed = 33 + 10 * Math.random()
const angle = mech.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (mech.crouch ? 0.22 : 0.65)
const velocity = {
x: speed * Math.cos(angle),
y: speed * Math.sin(angle)
}
b.nail(pos, velocity, 1) //position, velocity, damage
} else {
if (this.nextFireCycle + 1 < mech.cycle) this.startingHoldCycle = mech.cycle //reset if not constantly firing
const CD = Math.max(11 - 0.06 * (mech.cycle - this.startingHoldCycle), 2) //CD scales with cycles fire is held down
this.nextFireCycle = mech.cycle + CD * b.fireCD //predict next fire cycle if the fire button is held down
const me = bullet.length;
const dir = mech.angle + (Math.random() - 0.5) * ((mech.crouch) ? 0.01 : 0.1);
bullet[me] = Bodies.rectangle(pos.x, pos.y, 20 * mod.bulletSize, 6 * mod.bulletSize, b.fireAttributes(dir));
b.fireProps(CD, mech.crouch ? 38 : 34, dir, me); //cd , speed
// //place in bullet do bullet[me].endCycle = game.cycle + 70;
// //slow player bullet[me].dmg = 0.25;
// const range = 1000 bullet[me].frictionAir = mech.crouch ? 0.001 : 0.003;
// if (Vector.magnitude(Vector.sub(player.position, this.position)) < range) { if (mod.isIceCrystals) {
// Matter.Body.setVelocity(player, { bullet[me].onDmg = function (who) {
// x: player.velocity.x * 0.95, mobs.statusSlow(who, 30)
// y: player.velocity.y * 0.95 };
// }); mech.energy -= mech.fieldRegen + 0.0075
// } if (mech.energy < 0.02) {
// //aoe damage to mobs mech.fireCDcycle = mech.cycle + 60; // cool down
// for (let i = 0, len = mob.length; i < len; i++) { }
// if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < range) { }
// let dmg = b.dmgScale * 0.023 bullet[me].do = function () {
// if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.5 //reduce damage if a wall is in the way this.force.y += this.mass * 0.0003;
// if (mob[i].shield) dmg *= 5 //x5 to make up for the /5 that shields normally take };
// mob[i].damage(dmg); }
// mob[i].locatePlayer();
// }
// }
// //draw it
// ctx.beginPath();
// ctx.arc(this.position.x, this.position.y, range, 0, 2 * Math.PI);
// ctx.fillStyle = `rgba(255,0,0,0.2)`;
// ctx.fill();
};
} }
}, },
{ {

View File

@@ -360,17 +360,17 @@ const game = {
//in testing mode //in testing mode
if (game.testing) { if (game.testing) {
if (keys[192]) { // ` if (keys[192]) { // `
powerUps.spawn(game.mouseInGame.x, game.mouseInGame.y, "reroll"); powerUps.directSpawn(game.mouseInGame.x, game.mouseInGame.y, "reroll");
} else if (keys[49]) { // give power ups with 1 } else if (keys[49]) { // give power ups with 1
powerUps.spawn(game.mouseInGame.x, game.mouseInGame.y, "heal"); powerUps.directSpawn(game.mouseInGame.x, game.mouseInGame.y, "heal");
} else if (keys[50]) { // 2 } else if (keys[50]) { // 2
powerUps.spawn(game.mouseInGame.x, game.mouseInGame.y, "ammo"); powerUps.directSpawn(game.mouseInGame.x, game.mouseInGame.y, "ammo");
} else if (keys[51]) { // 3 } else if (keys[51]) { // 3
powerUps.spawn(game.mouseInGame.x, game.mouseInGame.y, "gun"); powerUps.directSpawn(game.mouseInGame.x, game.mouseInGame.y, "gun");
} else if (keys[52]) { // 4 } else if (keys[52]) { // 4
powerUps.spawn(game.mouseInGame.x, game.mouseInGame.y, "field"); powerUps.directSpawn(game.mouseInGame.x, game.mouseInGame.y, "field");
} else if (keys[53]) { // 5 } else if (keys[53]) { // 5
powerUps.spawn(game.mouseInGame.x, game.mouseInGame.y, "mod"); powerUps.directSpawn(game.mouseInGame.x, game.mouseInGame.y, "mod");
} else if (keys[54]) { // 6 spawn mob } else if (keys[54]) { // 6 spawn mob
const pick = spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)]; const pick = spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)];
spawn.allowShields = false; spawn.allowShields = false;
@@ -399,6 +399,16 @@ const game = {
x: 0, x: 0,
y: 0 y: 0
}); });
// move bots to follow player
for (let i = 0; i < bullet.length; i++) {
if (bullet[i].botType) {
Matter.Body.setPosition(bullet[i], player.position);
Matter.Body.setVelocity(bullet[i], {
x: 0,
y: 0
});
}
}
// game.noCameraScroll() // game.noCameraScroll()
} else if (keys[85]) { // next level with U } else if (keys[85]) { // next level with U
level.nextLevel(); level.nextLevel();

View File

@@ -16,9 +16,9 @@ const level = {
// game.zoomScale = 1000; // game.zoomScale = 1000;
// game.setZoom(); // game.setZoom();
// mech.isStealth = true; // mech.isStealth = true;
// b.giveGuns("rail gun") // b.giveGuns("minigun")
// mech.setField("standing wave harmonics") // mech.setField("standing wave harmonics")
// mod.giveMod("frame-dragging"); // mod.giveMod("nail gun");
level.intro(); //starting level level.intro(); //starting level
// level.testing(); //not in rotation // level.testing(); //not in rotation
@@ -59,7 +59,6 @@ const level = {
const len = Math.floor((mech.maxHealth - mech.health) / 0.5) const len = Math.floor((mech.maxHealth - mech.health) / 0.5)
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false); powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false);
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false);
} }
} }
if (mod.isGunCycle) { if (mod.isGunCycle) {
@@ -138,7 +137,7 @@ const level = {
// spawn.laserTargetingBoss(1600, -400) // spawn.laserTargetingBoss(1600, -400)
// spawn.spawner(1600, -500) // spawn.spawner(1600, -500)
// spawn.sniper(1700, -120, 50) // spawn.sniper(1700, -120, 50)
spawn.springer(1400, -120) spawn.starter(1400, -120, 100)
// spawn.sniper(1800, -120) // spawn.sniper(1800, -120)
// spawn.sniper(2200, -120) // spawn.sniper(2200, -120)
// spawn.cellBossCulture(1600, -500) // spawn.cellBossCulture(1600, -500)
@@ -3214,8 +3213,8 @@ const level = {
level.levelsCleared++; level.levelsCleared++;
level.onLevel++; //cycles map to next level level.onLevel++; //cycles map to next level
if (level.onLevel > level.levels.length - 1) level.onLevel = 0; if (level.onLevel > level.levels.length - 1) level.onLevel = 0;
level.difficultyIncrease(game.difficultyMode) //increase difficulty based on modes level.difficultyIncrease(game.difficultyMode) //increase difficulty based on modes
if (level.levelsCleared > level.levels.length) level.difficultyIncrease(game.difficultyMode)
if (game.isEasyMode && level.levelsCleared % 2) level.difficultyDecrease(1); if (game.isEasyMode && level.levelsCleared % 2) level.difficultyDecrease(1);
game.clearNow = true; //triggers in game.clearMap to remove all physics bodies and setup for new map game.clearNow = true; //triggers in game.clearMap to remove all physics bodies and setup for new map
}, },

View File

@@ -1020,14 +1020,13 @@ const mobs = {
if (mod.nailsDeathMob) b.targetedNail(this.position, mod.nailsDeathMob) if (mod.nailsDeathMob) b.targetedNail(this.position, mod.nailsDeathMob)
} else if (mod.isShieldAmmo && this.shield) { } else if (mod.isShieldAmmo && this.shield) {
let type = "ammo" let type = "ammo"
if (Math.random() < 0.4 || mod.bayesian) { if (Math.random() < 0.4) {
type = "heal" type = "heal"
} else if (Math.random() < 0.3 && !mod.isSuperDeterminism) { } else if (Math.random() < 0.3 && !mod.isSuperDeterminism) {
type = "reroll" type = "reroll"
} }
for (let i = 0, len = Math.ceil(2.8 * Math.random()); i < len; i++) { for (let i = 0, len = Math.ceil(2.8 * Math.random()); i < len; i++) {
powerUps.spawn(this.position.x, this.position.y, type); powerUps.spawn(this.position.x, this.position.y, type);
if (Math.random() < mod.bayesian) powerUps.spawn(this.position.x, this.position.y, type);
} }
} }
}, },

View File

@@ -1011,7 +1011,7 @@ const mod = {
}, },
{ {
name: "Bayesian inference", name: "Bayesian inference",
description: "<strong>33%</strong> chance to <strong>duplicate</strong> spawned <strong>power ups</strong><br><strong class='color-g'>ammo</strong> will no longer <strong>spawn</strong> from mobs", description: "<strong>33%</strong> chance to <strong>duplicate</strong> spawned <strong>power ups</strong><br><strong class='color-g'>ammo</strong> will no longer <strong>spawn</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1019,10 +1019,10 @@ const mod = {
}, },
requires: "", requires: "",
effect: () => { effect: () => {
mod.bayesian = 0.33; mod.isBayesian = true
}, },
remove() { remove() {
mod.bayesian = 0; mod.isBayesian = false
} }
}, },
{ {
@@ -1081,7 +1081,6 @@ const mod = {
mod.isGunCycle = true; mod.isGunCycle = true;
for (let i = 0; i < 5; i++) { for (let i = 0; i < 5; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "gun"); powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
} }
}, },
remove() { remove() {
@@ -1200,7 +1199,6 @@ const mod = {
mod.isDeterminism = true; mod.isDeterminism = true;
for (let i = 0; i < 5; i++) { //if you change the six also change it in Born rule for (let i = 0; i < 5; i++) { //if you change the six also change it in Born rule
powerUps.spawn(mech.pos.x, mech.pos.y, "mod"); powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
} }
}, },
remove() { remove() {
@@ -1221,7 +1219,6 @@ const mod = {
mod.isSuperDeterminism = true; mod.isSuperDeterminism = true;
for (let i = 0; i < 4; i++) { //if you change the six also change it in Born rule for (let i = 0; i < 4; i++) { //if you change the six also change it in Born rule
powerUps.spawn(mech.pos.x, mech.pos.y, "mod"); powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
} }
}, },
remove() { remove() {
@@ -1333,7 +1330,6 @@ const mod = {
for (let i = 0; i < 2; i++) { for (let i = 0; i < 2; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "gun"); powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
} }
}, },
remove() {} remove() {}
@@ -1380,7 +1376,7 @@ const mod = {
count: 0, count: 0,
maxCount: 9, maxCount: 9,
allowed() { allowed() {
return mod.haveGunCheck("minigun") || mod.haveGunCheck("shotgun") || mod.haveGunCheck("super balls") return (mod.haveGunCheck("minigun") && !mod.nailGun) || mod.haveGunCheck("shotgun") || mod.haveGunCheck("super balls")
}, },
requires: "minigun, shotgun, super balls", requires: "minigun, shotgun, super balls",
effect() { effect() {
@@ -1391,28 +1387,28 @@ const mod = {
} }
}, },
{ {
name: "high caliber", name: "nail gun",
description: "<strong>100%</strong> increased <strong>minigun</strong> bullet size<br><strong>100%</strong> increased <strong>delay</strong> after firing", description: "the <strong>minigun</strong> is modified to fire <strong>nails</strong><br>with a short <strong>fire delay</strong> and a low <strong>precision</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return mod.haveGunCheck("minigun") return mod.haveGunCheck("minigun") && !mod.isIceCrystals
}, },
requires: "minigun", requires: "minigun",
effect() { effect() {
mod.highCaliber = 2 mod.nailGun = true
}, },
remove() { remove() {
mod.highCaliber = 1 mod.nailGun = false
} }
}, },
{ {
name: "ice crystal nucleation", name: "ice crystal nucleation",
description: "your <strong>minigun</strong> uses <strong class='color-f'>energy</strong> to condense<br>unlimited <strong class='color-s'>freezing</strong> <strong>bullets</strong> from water vapor", description: "the <strong>minigun</strong> uses <strong class='color-f'>energy</strong> to condense<br>unlimited <strong class='color-s'>freezing</strong> <strong>bullets</strong> from water vapor",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return mod.haveGunCheck("minigun") return mod.haveGunCheck("minigun") && !mod.nailGun
}, },
requires: "minigun", requires: "minigun",
effect() { effect() {
@@ -1847,7 +1843,7 @@ const mod = {
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return mod.nailBotCount + mod.grenadeFragments + mod.nailsDeathMob / 2 + (mod.haveGunCheck("mine") + mod.isRailNails + mod.isNailShot) * 2 > 1 return mod.nailBotCount + mod.grenadeFragments + mod.nailsDeathMob / 2 + (mod.haveGunCheck("mine") + mod.isRailNails + mod.isNailShot + mod.nailGun) * 2 > 1
}, },
requires: "nails", requires: "nails",
effect() { effect() {
@@ -2456,7 +2452,6 @@ const mod = {
effect() { effect() {
for (let i = 0; i < 6; i++) { for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "heal"); powerUps.spawn(mech.pos.x, mech.pos.y, "heal");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "heal");
} }
this.count-- this.count--
}, },
@@ -2476,7 +2471,6 @@ const mod = {
effect() { effect() {
for (let i = 0; i < 6; i++) { for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "ammo"); powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
} }
this.count-- this.count--
}, },
@@ -2497,7 +2491,6 @@ const mod = {
effect() { effect() {
for (let i = 0; i < 5; i++) { for (let i = 0; i < 5; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll"); powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
} }
this.count-- this.count--
}, },
@@ -2516,7 +2509,6 @@ const mod = {
requires: "not superdeterminism", requires: "not superdeterminism",
effect() { effect() {
powerUps.spawn(mech.pos.x, mech.pos.y, "gun"); powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
this.count-- this.count--
}, },
remove() {} remove() {}
@@ -2534,7 +2526,6 @@ const mod = {
requires: "not superdeterminism", requires: "not superdeterminism",
effect() { effect() {
powerUps.spawn(mech.pos.x, mech.pos.y, "field"); powerUps.spawn(mech.pos.x, mech.pos.y, "field");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "field");
this.count-- this.count--
}, },
remove() {} remove() {}
@@ -2558,7 +2549,6 @@ const mod = {
largerHeals: null, largerHeals: null,
squirrelFx: null, squirrelFx: null,
isCrit: null, isCrit: null,
bayesian: null,
isLowHealthDmg: null, isLowHealthDmg: null,
isFarAwayDmg: null, isFarAwayDmg: null,
isEntanglement: null, isEntanglement: null,
@@ -2659,5 +2649,7 @@ const mod = {
isDamageForGuns: null, isDamageForGuns: null,
isGunCycle: null, isGunCycle: null,
isFastFoam: null, isFastFoam: null,
isSporeGrowth: null isSporeGrowth: null,
isBayesian: null,
nailGun: null
} }

View File

@@ -428,7 +428,8 @@ const mech = {
}, },
displayHealth() { displayHealth() {
id = document.getElementById("health"); id = document.getElementById("health");
id.style.width = Math.floor(300 * mech.health) + "px"; // health display follows a x^1.5 rule to make it seem like the player has lower health, this makes the player feel more excitement
id.style.width = Math.floor(300 * Math.pow(mech.health, 1.5)) + "px";
//css animation blink if health is low //css animation blink if health is low
if (mech.health < 0.3) { if (mech.health < 0.3) {
id.classList.add("low-health"); id.classList.add("low-health");
@@ -500,12 +501,12 @@ const mech = {
mech.health -= dmg; mech.health -= dmg;
if (mech.health < 0 || isNaN(mech.health)) { if (mech.health < 0 || isNaN(mech.health)) {
if (mod.isDeathAvoid && powerUps.reroll.rerolls > 0) { //&& Math.random() < 0.5 if (mod.isDeathAvoid && powerUps.reroll.rerolls > 0) { //&& Math.random() < 0.5
mech.health = 0.05
powerUps.reroll.changeRerolls(-1) powerUps.reroll.changeRerolls(-1)
for (let i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false); powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false);
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "heal", false);
} }
// if (mech.health < 0.05) mech.health = 0.05
mech.immuneCycle = mech.cycle + 120 //disable this.immuneCycle bonus seconds mech.immuneCycle = mech.cycle + 120 //disable this.immuneCycle bonus seconds
game.makeTextLog(`<span style='font-size:115%;'> <strong>death</strong> avoided<br><strong>1/${powerUps.reroll.rerolls}</strong> <strong class='color-r'>rerolls</strong> consumed</span>`, 420) game.makeTextLog(`<span style='font-size:115%;'> <strong>death</strong> avoided<br><strong>1/${powerUps.reroll.rerolls}</strong> <strong class='color-r'>rerolls</strong> consumed</span>`, 420)
// game.makeTextLog("<span style='font-size:115%;'> <strong>death</strong> avoided<br><strong>1</strong> <strong class='color-r'>reroll</strong> consumed</span>", 420) // game.makeTextLog("<span style='font-size:115%;'> <strong>death</strong> avoided<br><strong>1</strong> <strong class='color-r'>reroll</strong> consumed</span>", 420)

View File

@@ -24,7 +24,6 @@ const powerUps = {
endDraft() { endDraft() {
if (mod.manyWorlds && powerUps.reroll.rerolls < 1) { if (mod.manyWorlds && powerUps.reroll.rerolls < 1) {
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll"); powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
} }
document.body.style.cursor = "none"; document.body.style.cursor = "none";
document.getElementById("choose-grid").style.display = "none" document.getElementById("choose-grid").style.display = "none"
@@ -64,18 +63,16 @@ const powerUps = {
if (Math.random() < 0.37) { if (Math.random() < 0.37) {
mech.fieldCDcycle = mech.cycle + 30; mech.fieldCDcycle = mech.cycle + 30;
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll"); powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
} }
} }
} }
} }
} }
if (mod.isDeathAvoid && document.getElementById("mod-anthropic")) { if (mod.isDeathAvoid && document.getElementById("mod-anthropic")) {
document.getElementById("mod-anthropic").innerHTML = `(${powerUps.reroll.rerolls})` document.getElementById("mod-anthropic").innerHTML = `-${powerUps.reroll.rerolls}`
} }
if (mod.renormalization && Math.random() < 0.37 && amount < 0) { if (mod.renormalization && Math.random() < 0.37 && amount < 0) {
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll"); powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
} }
if (mod.isRerollHaste) { if (mod.isRerollHaste) {
if (powerUps.reroll.rerolls === 0) { if (powerUps.reroll.rerolls === 0) {
@@ -426,52 +423,39 @@ const powerUps = {
spawnRandomPowerUp(x, y) { //mostly used after mob dies, doesn't always return a power up spawnRandomPowerUp(x, y) { //mostly used after mob dies, doesn't always return a power up
if ((Math.random() * Math.random() - 0.3 > Math.sqrt(mech.health) && !mod.isEnergyHealth) || Math.random() < 0.035) { //spawn heal chance is higher at low health if ((Math.random() * Math.random() - 0.3 > Math.sqrt(mech.health) && !mod.isEnergyHealth) || Math.random() < 0.035) { //spawn heal chance is higher at low health
powerUps.spawn(x, y, "heal"); powerUps.spawn(x, y, "heal");
if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "heal");
return; return;
} }
if (Math.random() < 0.15 && b.inventory.length > 0 && !mod.bayesian) { if (Math.random() < 0.15 && b.inventory.length > 0) {
powerUps.spawn(x, y, "ammo"); powerUps.spawn(x, y, "ammo");
if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "ammo");
return; return;
} }
if (Math.random() < 0.0015 * (3 - b.inventory.length)) { //a new gun has a low chance for each not acquired gun up to 3 if (Math.random() < 0.0015 * (3 - b.inventory.length)) { //a new gun has a low chance for each not acquired gun up to 3
powerUps.spawn(x, y, "gun"); powerUps.spawn(x, y, "gun");
if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "gun");
return; return;
} }
if (Math.random() < 0.0027 * (26 - mod.totalCount)) { //a new mod has a low chance for each not acquired mod up to 15 if (Math.random() < 0.0027 * (26 - mod.totalCount)) { //a new mod has a low chance for each not acquired mod up to 15
powerUps.spawn(x, y, "mod"); powerUps.spawn(x, y, "mod");
if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "mod");
return; return;
} }
if (Math.random() < 0.006) { if (Math.random() < 0.006) {
powerUps.spawn(x, y, "field"); powerUps.spawn(x, y, "field");
if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "field");
return; return;
} }
// if (Math.random() < 0.01) { // if (Math.random() < 0.01) {
// powerUps.spawn(x, y, "reroll"); // powerUps.spawn(x, y, "reroll");
// if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "reroll");
// return; // return;
// } // }
}, },
randomPowerUpCounter: 0, randomPowerUpCounter: 0,
spawnBossPowerUp(x, y) { //boss spawns field and gun mod upgrades spawnBossPowerUp(x, y) { //boss spawns field and gun mod upgrades
if (game.difficultyMode < 2) { //easy and normal mode powerUps.randomPowerUpCounter++;
powerUps.randomPowerUpCounter += 0.65; if (game.difficultyMode === 4 && Math.random() < 0.5) { //why mode gets a free power up chance
} else if (game.difficultyMode === 2) { //hard mode powerUps.randomPowerUpCounter *= 0.5
powerUps.randomPowerUpCounter += 1; spawnPowerUps()
} else { //why mode
powerUps.randomPowerUpCounter += 1.33;
if (Math.random() < 0.5) { //why mode gets a free power up chance
powerUps.randomPowerUpCounter *= 0.5
spawnPowerUps()
}
} }
const chance = Math.max(level.levelsCleared, 10) * 0.1 //1 until level 10, then 1.1, 1.2, 1.3, ... const chanceToFail = Math.max(level.levelsCleared, 10) * 0.1 //1 until level 10, then 1.1, 1.2, 1.3, ...
if (Math.random() * chanceToFail < powerUps.randomPowerUpCounter) {
if (Math.random() * chance < powerUps.randomPowerUpCounter) {
powerUps.randomPowerUpCounter = 0; powerUps.randomPowerUpCounter = 0;
spawnPowerUps() spawnPowerUps()
} else { } else {
@@ -482,11 +466,7 @@ const powerUps = {
if (mech.health < 0.65 && !mod.isEnergyHealth) { if (mech.health < 0.65 && !mod.isEnergyHealth) {
powerUps.spawn(x, y, "heal"); powerUps.spawn(x, y, "heal");
powerUps.spawn(x, y, "heal"); powerUps.spawn(x, y, "heal");
if (Math.random() < mod.bayesian) { } else {
powerUps.spawn(x, y, "heal");
powerUps.spawn(x, y, "heal");
}
} else if (!mod.bayesian) {
powerUps.spawn(x, y, "ammo"); powerUps.spawn(x, y, "ammo");
powerUps.spawn(x, y, "ammo"); powerUps.spawn(x, y, "ammo");
} }
@@ -495,21 +475,17 @@ const powerUps = {
function spawnPowerUps() { function spawnPowerUps() {
if (mech.fieldMode === 0) { if (mech.fieldMode === 0) {
powerUps.spawn(x, y, "field") powerUps.spawn(x, y, "field")
if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "field")
} else if (Math.random() < 0.95) { } else if (Math.random() < 0.95) {
powerUps.spawn(x, y, "mod") powerUps.spawn(x, y, "mod")
if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "mod")
} else { } else {
powerUps.spawn(x, y, "gun") powerUps.spawn(x, y, "gun")
if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "gun")
} }
} }
}, },
chooseRandomPowerUp(x, y) { //100% chance to drop a random power up //used in spawn.debris chooseRandomPowerUp(x, y) { //100% chance to drop a random power up //used in spawn.debris
if (Math.random() < 0.5) { if (Math.random() < 0.5) {
powerUps.spawn(x, y, "heal", false); powerUps.spawn(x, y, "heal", false);
if (Math.random() < mod.bayesian) powerUps.spawn(x, y, "heal", false); } else {
} else if (!mod.bayesian) {
powerUps.spawn(x, y, "ammo", false); powerUps.spawn(x, y, "ammo", false);
} }
}, },
@@ -517,7 +493,6 @@ const powerUps = {
if (mob.length && Math.random() < 0.8) { // 80% chance if (mob.length && Math.random() < 0.8) { // 80% chance
const index = Math.floor(Math.random() * mob.length) const index = Math.floor(Math.random() * mob.length)
powerUps.spawn(mob[index].position.x, mob[index].position.y, "reroll"); powerUps.spawn(mob[index].position.x, mob[index].position.y, "reroll");
if (Math.random() < mod.bayesian) powerUps.spawn(mob[index].position.x, mob[index].position.y, "reroll");
} }
}, },
spawnStartingPowerUps(x, y) { //used for map specific power ups, mostly to give player a starting gun spawnStartingPowerUps(x, y) { //used for map specific power ups, mostly to give player a starting gun
@@ -547,36 +522,43 @@ const powerUps = {
powerUps.spawnRandomPowerUp(x, y); powerUps.spawnRandomPowerUp(x, y);
} }
}, },
spawn(x, y, target, moving = true, mode = null) { directSpawn(x, y, target, moving = true, mode = null) {
if (!(mod.isSuperDeterminism && (target === 'gun' || target === 'field' || target === 'reroll'))) { let index = powerUp.length;
let index = powerUp.length; target = powerUps[target];
target = powerUps[target]; size = target.size();
size = target.size(); powerUp[index] = Matter.Bodies.polygon(x, y, 0, size, {
powerUp[index] = Matter.Bodies.polygon(x, y, 0, size, { density: 0.001,
density: 0.001, frictionAir: 0.01,
frictionAir: 0.01, restitution: 0.8,
restitution: 0.8, inertia: Infinity, //prevents rotation
inertia: Infinity, //prevents rotation collisionFilter: {
collisionFilter: { group: 0,
group: 0, category: cat.powerUp,
category: cat.powerUp, mask: cat.map | cat.powerUp
mask: cat.map | cat.powerUp },
}, color: target.color,
color: target.color, effect: target.effect,
effect: target.effect, name: target.name,
name: target.name, size: size
size: size });
if (mode) {
powerUp[index].mode = mode
}
if (moving) {
Matter.Body.setVelocity(powerUp[index], {
x: (Math.random() - 0.5) * 15,
y: Math.random() * -9 - 3
}); });
if (mode) { }
powerUp[index].mode = mode World.add(engine.world, powerUp[index]); //add to world
} },
if (moving) { spawn(x, y, target, moving = true, mode = null) {
Matter.Body.setVelocity(powerUp[index], { if (
x: (Math.random() - 0.5) * 15, !(mod.isSuperDeterminism && (target === 'gun' || target === 'field' || target === 'reroll')) &&
y: Math.random() * -9 - 3 !(mod.isBayesian && target === 'ammo')
}); ) {
} powerUps.directSpawn(x, y, target, moving, mode)
World.add(engine.world, powerUp[index]); //add to world if (mod.isBayesian && Math.random() < 0.33) powerUps.directSpawn(x, y, target, moving, mode)
} }
}, },
}; };

View File

@@ -1,22 +1,17 @@
mod: mycelial fragmentation - sporangium release spores as they grow
mod: renormalization 37% chance to spawn reroll when you use a reroll for any reason. 2x difficulty increases after clearing every level once
mod - minigun fires nails, nails are inaccurate, but fire rapidly
difficulty balancing added an option to play older versions of n-gon in settings
much more damage done by mobs
more effective heals
more damage done by player
more mod spawns
spring attack mobs take smaller steps
this should stop them from "coming in like a wrecking ball"
mob alert range is reduced for large mobs
this controls how mobs that see you tell other mobs about your location
************** TODO - n-gon ************** ************** TODO - n-gon **************
make bayesian inference a part of power up spawn code more directly player goes intangible while immune after getting hit?
getting stuck above a mob can immobilize player
add a minimum knock from player mob collisions?
perfect diamagnetism be able to grab and launch mobs
Gun: Launch yourself at high speed to the enemy, gaining temporary invincibility while in the air and for 3 seconds after landing. Upon impact, trigger a large explosion.
removing supersaturation sets total health to 1 removing supersaturation sets total health to 1
this cancels the health benefits from crystallized armor this cancels the health benefits from crystallized armor
@@ -24,11 +19,7 @@ removing supersaturation sets total health to 1
fix door.isOpen actually meaning isClosed fix door.isOpen actually meaning isClosed
getting stuck above a mob can immobilize player mod - laser fires 3 beams
add a minimum knock from player mob collisions?
player goes intangible while immune after getting hit?
the laser fire 3 beams
after you die custom should be populated with your last build after you die custom should be populated with your last build
@@ -37,15 +28,12 @@ considering removing the perfect diamagnetism field from the game
use canvas pixel array effects for full screen graphics use canvas pixel array effects for full screen graphics
add some pixels after player gets hit? add some pixels after player gets hit?
difficulty ramp late game?
give missiles a suck and delay explosion, like vacuum bomb give missiles a suck and delay explosion, like vacuum bomb
bot that does AOE damage while it rotates around player bot that does AOE damage while it rotates around player
no physics / collisions no physics / collisions
cap 3 ? cap 3 ?
Mod: "Instant Acceleration": Minigun instantly starts firing at max fire rate, skipping the accelerated fire rate stage.
level Boss: fractal Sierpiński triangle level Boss: fractal Sierpiński triangle
https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle