new mod anthropic, small map changes

This commit is contained in:
landgreen
2020-02-21 06:02:52 -08:00
parent b9422c8c74
commit 60bbd64c80
6 changed files with 133 additions and 68 deletions

View File

@@ -47,6 +47,9 @@ const b = {
isModEnergyRecovery: null, isModEnergyRecovery: null,
isModHealthRecovery: null, isModHealthRecovery: null,
isModEnergyLoss: null, isModEnergyLoss: null,
isModFoamShieldHit: null,
isModDeathAvoid: null,
isModDeathAvoidOnCD: null,
modOnHealthChange() { //used with acid mod modOnHealthChange() { //used with acid mod
if (b.isModAcidDmg && mech.health > 0.8) { if (b.isModAcidDmg && mech.health > 0.8) {
game.playerDmgColor = "rgba(0,80,80,0.9)" game.playerDmgColor = "rgba(0,80,80,0.9)"
@@ -357,22 +360,6 @@ const b = {
mech.fieldRange = 175; mech.fieldRange = 175;
} }
}, },
{
name: "entanglement",
description: "only when your <strong>first gun</strong> is equipped<br>reduce <strong>harm</strong> by <strong>10%</strong> for each gun you have",
maxCount: 1,
count: 0,
allowed() {
return true
},
requires: "",
effect() {
b.isModEntanglement = true
},
remove() {
b.isModEntanglement = false;
}
},
{ {
name: "waste energy recovery", name: "waste energy recovery",
description: "regen <strong>7%</strong> of max <strong class='color-f'>energy</strong> every second<br>active for <strong>5 seconds</strong> after a mob <strong>dies</strong>", description: "regen <strong>7%</strong> of max <strong class='color-f'>energy</strong> every second<br>active for <strong>5 seconds</strong> after a mob <strong>dies</strong>",
@@ -457,6 +444,22 @@ const b = {
b.isModStomp = false; b.isModStomp = false;
} }
}, },
{
name: "entanglement",
description: "only when your <strong>first gun</strong> is equipped<br>reduce <strong>harm</strong> by <strong>10%</strong> for each gun you have",
maxCount: 1,
count: 0,
allowed() {
return true
},
requires: "",
effect() {
b.isModEntanglement = true
},
remove() {
b.isModEntanglement = false;
}
},
{ {
name: "Pauli exclusion", name: "Pauli exclusion",
description: `unable to <strong>collide</strong> with enemies for <strong>+2</strong> seconds<br>activates after being <strong>harmed</strong> from a collision`, description: `unable to <strong>collide</strong> with enemies for <strong>+2</strong> seconds<br>activates after being <strong>harmed</strong> from a collision`,
@@ -490,6 +493,40 @@ const b = {
b.isModAnnihilation = false; b.isModAnnihilation = false;
} }
}, },
{
name: "quantum immortality",
description: "after <strong>dying</strong>, continue in an <strong>alternate reality</strong><br><em>guns, ammo, field, and mods are randomized</em>",
maxCount: 1,
count: 0,
allowed() {
return true
},
requires: "",
effect() {
b.isModImmortal = true;
},
remove() {
b.isModImmortal = false;
}
},
{
name: "weak anthropic principle",
description: "<strong>avoid harm</strong> that should be <strong>fatal</strong><br>can occur once every <strong>3</strong> seconds",
maxCount: 1,
count: 0,
allowed() {
return b.isModImmortal
},
requires: "quantum immortality",
effect() {
b.isModDeathAvoid = true;
b.isModDeathAvoidOnCD = false;
},
remove() {
b.isModDeathAvoid = false;
b.isModDeathAvoidOnCD = false;
}
},
{ {
name: "piezoelectricity", name: "piezoelectricity",
description: "<strong>colliding</strong> with enemies charges your <strong class='color-f'>energy</strong>", description: "<strong>colliding</strong> with enemies charges your <strong class='color-f'>energy</strong>",
@@ -576,7 +613,7 @@ const b = {
}, },
{ {
name: "recursive healing", name: "recursive healing",
description: "<strong class='color-h'>healing</strong> power ups trigger one extra time.", description: "<strong class='color-h'>healing</strong> power ups trigger one extra time",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
allowed() { allowed() {
@@ -607,22 +644,6 @@ const b = {
b.isModMassEnergy = false; b.isModMassEnergy = false;
} }
}, },
{
name: "quantum immortality",
description: "after <strong>dying</strong>, continue in an <strong>alternate reality</strong><br><em>guns, ammo, field, and mods are randomized</em>",
maxCount: 1,
count: 0,
allowed() {
return true
},
requires: "",
effect() {
b.isModImmortal = true;
},
remove() {
b.isModImmortal = false;
}
},
{ {
name: "Bayesian inference", name: "Bayesian inference",
description: "<strong>20%</strong> chance for double <strong>power ups</strong> to drop<br>one fewer <strong>choice</strong> when selecting <strong>power ups</strong>", description: "<strong>20%</strong> chance for double <strong>power ups</strong> to drop<br>one fewer <strong>choice</strong> when selecting <strong>power ups</strong>",
@@ -805,6 +826,22 @@ const b = {
} }
} }
}, },
{
name: "foam stabilization",
description: "<strong>foam</strong> can stick to shields",
maxCount: 1,
count: 0,
allowed() {
return b.haveGunCheck("foam")
},
requires: "foam",
effect() {
b.isModFoamShieldHit = true;
},
remove() {
b.isModFoamShieldHit = false;
}
},
// { // {
// name: "super mines", // name: "super mines",
// description: "mines fire super balls when triggered", // description: "mines fire super balls when triggered",
@@ -1705,11 +1742,11 @@ const b = {
num: 5, num: 5,
isStarterGun: true, isStarterGun: true,
fire() { fire() {
mech.fireCDcycle = mech.cycle + Math.floor((mech.crouch ? 30 : 20) * b.modFireRate); // cool down mech.fireCDcycle = mech.cycle + Math.floor((mech.crouch ? 25 : 20) * b.modFireRate); // cool down
b.muzzleFlash(20); b.muzzleFlash(20);
// mobs.alert(450); // mobs.alert(450);
const SPEED = mech.crouch ? 40 : 30 const SPEED = mech.crouch ? 40 : 30
const SPREAD = mech.crouch ? 0.04 : 0.15 const SPREAD = mech.crouch ? 0.08 : 0.15
let dir = mech.angle - SPREAD * (b.modSuperBallNumber - 1) / 2; let dir = mech.angle - SPREAD * (b.modSuperBallNumber - 1) / 2;
for (let i = 0; i < b.modSuperBallNumber; i++) { for (let i = 0; i < b.modSuperBallNumber; i++) {
const me = bullet.length; const me = bullet.length;
@@ -2215,7 +2252,7 @@ const b = {
target: null, target: null,
targetVertex: null, targetVertex: null,
onDmg(who) { onDmg(who) {
if (!this.target && who.alive && who.dropPowerUp && !who.isShielded) { if (!this.target && who.alive && (who.dropPowerUp || b.isModFoamShieldHit) && (!who.isShielded || b.isModFoamShieldHit)) {
this.target = who; this.target = who;
this.collisionFilter.category = cat.body; this.collisionFilter.category = cat.body;
this.collisionFilter.mask = null; this.collisionFilter.mask = null;
@@ -2260,7 +2297,12 @@ const b = {
Matter.Body.setPosition(this, this.target.vertices[this.targetVertex]) Matter.Body.setPosition(this, this.target.vertices[this.targetVertex])
Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.9)) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.9))
Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9) Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9)
this.target.damage(b.dmgScale * 0.005); if (this.target.isShielded) {
this.target.damage(b.dmgScale * 0.001);
} else {
this.target.damage(b.dmgScale * 0.005);
}
} else if (this.target !== null) { //look for a new target } else if (this.target !== null) { //look for a new target
this.target = null this.target = null
this.collisionFilter.category = cat.bullet; this.collisionFilter.category = cat.bullet;

View File

@@ -640,7 +640,7 @@ const game = {
mech.death(); mech.death();
} }
if (!(mech.cycle % 60)) { //once a second checks if (!(mech.cycle % 60)) { //once a second
if (mech.lastKillCycle + 300 > mech.cycle) { //effects active for 5 seconds after killing a mob if (mech.lastKillCycle + 300 > mech.cycle) { //effects active for 5 seconds after killing a mob
if (b.isModEnergyRecovery) { if (b.isModEnergyRecovery) {
@@ -653,6 +653,9 @@ const game = {
if (b.isModEnergyLoss) { if (b.isModEnergyLoss) {
mech.fieldMeter = 0.05; mech.fieldMeter = 0.05;
} }
} else { //haven't killed a mob in the last 5 seconds
} }
if (!(game.cycle % 420)) { //once every 7 seconds if (!(game.cycle % 420)) { //once every 7 seconds

View File

@@ -13,12 +13,12 @@ const level = {
levelsCleared: 0, levelsCleared: 0,
start() { start() {
if (level.levelsCleared === 0) { if (level.levelsCleared === 0) {
// level.difficultyIncrease(4) // level.difficultyIncrease(14)
// b.giveGuns("laser") // b.giveGuns("foam")
// mech.setField("negative mass field") // mech.setField("negative mass field")
// for (let i = 0; i < 9; i++) { // for (let i = 0; i < 9; i++) {
// b.giveMod("waste energy recovery"); // b.giveMod("foam stabilization");
// b.giveMod("thermal runaway"); // b.giveMod("anthropic principle");
// b.giveMod("acute stress response"); // b.giveMod("acute stress response");
// } // }
@@ -143,8 +143,8 @@ const level = {
// powerUps.spawn(450, -400, "mod", false, 6); // powerUps.spawn(450, -400, "mod", false, 6);
// powerUps.spawn(450, -400, "mod", false); // powerUps.spawn(450, -400, "mod", false);
// spawn.bodyRect(-45, -100, 40, 50); // spawn.bodyRect(-45, -100, 40, 50);
// spawn.bomberBoss(800, -450); spawn.bomberBoss(800, -450);
spawn.cellBoss(400, -750); // spawn.cellBoss(400, -750);
// spawn.randomLevelBoss(400, -750) // spawn.randomLevelBoss(400, -750)
@@ -362,7 +362,9 @@ const level = {
powerUps.spawn(1900, -150, "heal", false); //starting gun powerUps.spawn(1900, -150, "heal", false); //starting gun
powerUps.spawn(2050, -150, "heal", false); //starting gun powerUps.spawn(2050, -150, "heal", false); //starting gun
// powerUps.spawn(2050, -150, "field", false); //starting gun // powerUps.spawn(2050, -150, "field", false); //starting gun
powerUps.spawn(2300, -150, "gun", false); //starting gun powerUps.spawnStartingPowerUps(2300, -150);
// powerUps.spawn(2300, -150, "gun", false); //starting gun
// if (game.isEasyMode) { // if (game.isEasyMode) {
// // powerUps.spawn(2050, -150, "mod", false); //starting gun // // powerUps.spawn(2050, -150, "mod", false); //starting gun
// // powerUps.spawn(2050, -150, "mod", false); //starting gun // // powerUps.spawn(2050, -150, "mod", false); //starting gun
@@ -785,6 +787,9 @@ const level = {
level.enter.x = mech.spawnPos.x - 50; level.enter.x = mech.spawnPos.x - 50;
level.enter.y = mech.spawnPos.y + 20; level.enter.y = mech.spawnPos.y + 20;
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
spawn.mapRect(level.exit.x, level.exit.y + 15, 100, 20);
// spawn.mapRect(3950, -3260, 100, 30);
level.addZone(level.exit.x, level.exit.y, 100, 30, "nextLevel"); level.addZone(level.exit.x, level.exit.y, 100, 30, "nextLevel");
powerUps.spawnStartingPowerUps(1075, -550); powerUps.spawnStartingPowerUps(1075, -550);
spawn.debris(-250, 50, 1650, 2); //16 debris per level spawn.debris(-250, 50, 1650, 2); //16 debris per level
@@ -914,7 +919,6 @@ const level = {
spawn.mapRect(3700, -3700, 50, 500); spawn.mapRect(3700, -3700, 50, 500);
spawn.mapRect(4250, -3700, 50, 300); spawn.mapRect(4250, -3700, 50, 300);
spawn.mapRect(3700, -3250, 1100, 100); spawn.mapRect(3700, -3250, 1100, 100);
spawn.mapRect(3950, -3260, 100, 30);
spawn.randomSmallMob(-225, 25); spawn.randomSmallMob(-225, 25);
spawn.randomSmallMob(1000, -1100); spawn.randomSmallMob(1000, -1100);

View File

@@ -317,7 +317,7 @@ const mech = {
game.clearNow = true; //triggers a map reset game.clearNow = true; //triggers a map reset
//count mods //count mods
let totalMods = -2; //lose 2 mods for balance reasons let totalMods = 0;
for (let i = 0; i < b.mods.length; i++) { for (let i = 0; i < b.mods.length; i++) {
totalMods += b.mods[i].count totalMods += b.mods[i].count
} }
@@ -352,13 +352,14 @@ const mech = {
} }
function randomizeHealth() { function randomizeHealth() {
mech.health = 0.5 + Math.random() mech.health = 0.55 + Math.random()
if (mech.health > 1) mech.health = 1; if (mech.health > 1) mech.health = 1;
mech.displayHealth(); mech.displayHealth();
} }
function randomizeGuns() { function randomizeGuns() {
const length = Math.round(b.inventory.length * (1 + 0.4 * (Math.random() - 0.5))) // const length = Math.round(b.inventory.length * (1 + 0.4 * (Math.random() - 0.5)))
const length = b.inventory.length
//removes guns and ammo //removes guns and ammo
b.inventory = []; b.inventory = [];
b.activeGun = null; b.activeGun = null;
@@ -367,16 +368,12 @@ const mech = {
b.guns[i].have = false; b.guns[i].have = false;
if (b.guns[i].ammo !== Infinity) b.guns[i].ammo = 0; if (b.guns[i].ammo !== Infinity) b.guns[i].ammo = 0;
} }
//give random guns //give random guns
for (let i = 0; i < length; i++) { for (let i = 0; i < length; i++) b.giveGuns()
b.giveGuns()
}
//randomize ammo //randomize ammo
for (let i = 0, len = b.inventory.length; i < len; i++) { for (let i = 0, len = b.inventory.length; i < len; i++) {
if (b.guns[b.inventory[i]].ammo !== Infinity) { if (b.guns[b.inventory[i]].ammo !== Infinity) {
b.guns[b.inventory[i]].ammo = Math.max(0, Math.floor(6 * b.guns[b.inventory[i]].ammo * (Math.random() - 0.3))) b.guns[b.inventory[i]].ammo = Math.max(0, Math.floor(6 * b.guns[b.inventory[i]].ammo * (Math.random() - 0.1)))
} }
} }
game.makeGunHUD(); //update gun HUD game.makeGunHUD(); //update gun HUD
@@ -466,9 +463,31 @@ const mech = {
} }
mech.health -= dmg; mech.health -= dmg;
if (mech.health < 0) { if (mech.health < 0) {
mech.health = 0; console.log(b.isModDeathAvoid, b.isModDeathAvoidOnCD)
mech.death(); if (b.isModDeathAvoid && !b.isModDeathAvoidOnCD) { //&& Math.random() < 0.5
return; b.isModDeathAvoidOnCD = true;
mech.health += dmg //undo the damage
mech.collisionImmune = mech.cycle + 30 //disable this.collisionImmune bonus seconds
game.wipe = function () { //set wipe to have trails
ctx.fillStyle = "rgba(255,255,255,0.02)";
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
setTimeout(function () {
game.wipe = function () { //set wipe to normal
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
// game.replaceTextLog = true;
// game.makeTextLog("death avoided", 360);
b.isModDeathAvoidOnCD = false;
}, 3000);
return;
} else {
mech.health = 0;
mech.death();
return;
}
} }
b.modOnHealthChange(); b.modOnHealthChange();
mech.displayHealth(); mech.displayHealth();

View File

@@ -289,10 +289,12 @@ const powerUps = {
} }
}, },
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
if (b.modCount < 1) { if (b.inventory.length === 0) {
powerUps.spawn(x, y, "gun", false);
} else if (b.modCount === 0) {
powerUps.spawn(x, y, "mod", false); //starting gun powerUps.spawn(x, y, "mod", false); //starting gun
} else if (b.inventory.length < 2) { } else if (b.inventory.length < 2) {
powerUps.spawn(x, y, "gun", false); //starting gun powerUps.spawn(x, y, "gun", false);
} else { } else {
powerUps.spawnRandomPowerUp(x, y); powerUps.spawnRandomPowerUp(x, y);
powerUps.spawnRandomPowerUp(x, y); powerUps.spawnRandomPowerUp(x, y);

View File

@@ -1,5 +1,8 @@
************** TODO - n-gon ************** ************** TODO - n-gon **************
mod - Collision avoidance system
10% chance to dodge a collision
mod - mines - fire something instead of needles on activation mod - mines - fire something instead of needles on activation
foam?, flak?, vacuum bomb, super balls foam?, flak?, vacuum bomb, super balls
make a different mod for each type of bullet mine can fire make a different mod for each type of bullet mine can fire
@@ -45,14 +48,6 @@ css transition for pause menu
field that pushes everything back, and can destroy smaller blocks field that pushes everything back, and can destroy smaller blocks
converts blocks into ammo power ups converts blocks into ammo power ups
mod: make player invisible when...
use the flag from phase field
when health is low?
field: a larger radius that attracted enemies
still deflected them near the robot
convert the health of mobs into energy when they are being attracted
mod: chance to not die from fatal damage mod: chance to not die from fatal damage
also push mobs and bodies away? also push mobs and bodies away?
also heal? also heal?