foam wall collisions, Bayesian one choice
This commit is contained in:
@@ -29,7 +29,7 @@ const b = {
|
|||||||
isModFarAwayDmg: null,
|
isModFarAwayDmg: null,
|
||||||
isModEntanglement: null,
|
isModEntanglement: null,
|
||||||
isModMassEnergy: null,
|
isModMassEnergy: null,
|
||||||
isModFourOptions: null,
|
isModExtraChoice: null,
|
||||||
modLaserBotCount: null,
|
modLaserBotCount: null,
|
||||||
modNailBotCount: null,
|
modNailBotCount: null,
|
||||||
modCollisionImmuneCycles: null,
|
modCollisionImmuneCycles: null,
|
||||||
@@ -48,7 +48,7 @@ const b = {
|
|||||||
isModEnergyRecovery: null,
|
isModEnergyRecovery: null,
|
||||||
isModHealthRecovery: null,
|
isModHealthRecovery: null,
|
||||||
isModEnergyLoss: null,
|
isModEnergyLoss: null,
|
||||||
isModFoamShieldHit: null,
|
isModFoamShieldSKip: null,
|
||||||
isModDeathAvoid: null,
|
isModDeathAvoid: null,
|
||||||
isModDeathAvoidOnCD: null,
|
isModDeathAvoidOnCD: null,
|
||||||
modWaveSpeedMap: null,
|
modWaveSpeedMap: null,
|
||||||
@@ -577,11 +577,13 @@ const b = {
|
|||||||
b.modOnHealthChange();
|
b.modOnHealthChange();
|
||||||
mech.displayHealth();
|
mech.displayHealth();
|
||||||
document.getElementById("health-bg").style.display = "none"
|
document.getElementById("health-bg").style.display = "none"
|
||||||
|
document.getElementById("dmg").style.backgroundColor = "#0cf";
|
||||||
b.isModEnergyHealth = true;
|
b.isModEnergyHealth = true;
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
b.isModEnergyHealth = false;
|
b.isModEnergyHealth = false;
|
||||||
document.getElementById("health-bg").style.display = "inline"
|
document.getElementById("health-bg").style.display = "inline"
|
||||||
|
document.getElementById("dmg").style.backgroundColor = "#f67";
|
||||||
mech.health = mech.energy;
|
mech.health = mech.energy;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -596,7 +598,7 @@ const b = {
|
|||||||
requires: "not mass-energy equivalence",
|
requires: "not mass-energy equivalence",
|
||||||
effect() {
|
effect() {
|
||||||
b.isModPiezo = true;
|
b.isModPiezo = true;
|
||||||
mech.energy = mech.fieldEnergyMax;
|
mech.energy = mech.maxEnergy;
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
b.isModPiezo = false;
|
b.isModPiezo = false;
|
||||||
@@ -631,7 +633,7 @@ const b = {
|
|||||||
requires: "",
|
requires: "",
|
||||||
effect() {
|
effect() {
|
||||||
b.modEnergySiphon += 0.15;
|
b.modEnergySiphon += 0.15;
|
||||||
mech.energy = mech.fieldEnergyMax
|
mech.energy = mech.maxEnergy
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
b.modEnergySiphon = 0;
|
b.modEnergySiphon = 0;
|
||||||
@@ -663,11 +665,11 @@ const b = {
|
|||||||
},
|
},
|
||||||
requires: "",
|
requires: "",
|
||||||
effect() {
|
effect() {
|
||||||
mech.fieldEnergyMax += 0.5
|
mech.maxEnergy += 0.5
|
||||||
mech.energy += 0.5
|
mech.energy += 0.5
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
mech.fieldEnergyMax = 1;
|
mech.maxEnergy = 1;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -716,7 +718,7 @@ const b = {
|
|||||||
requires: "",
|
requires: "",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
b.isModMassEnergy = true // used in mech.grabPowerUp
|
b.isModMassEnergy = true // used in mech.grabPowerUp
|
||||||
mech.energy = mech.fieldEnergyMax * 2
|
mech.energy = mech.maxEnergy * 2
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
b.isModMassEnergy = false;
|
b.isModMassEnergy = false;
|
||||||
@@ -724,7 +726,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
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>33%</strong> chance for double <strong>power ups</strong> to drop<br>only <strong>one choice</strong> when selecting <strong>power ups</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -732,7 +734,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
requires: "",
|
requires: "",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
b.isModBayesian = 0.20;
|
b.isModBayesian = 0.33;
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
b.isModBayesian = 0;
|
b.isModBayesian = 0;
|
||||||
@@ -748,10 +750,10 @@ const b = {
|
|||||||
},
|
},
|
||||||
requires: "",
|
requires: "",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
b.isModFourOptions = true;
|
b.isModExtraChoice = true;
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
b.isModFourOptions = false;
|
b.isModExtraChoice = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1288,8 +1290,8 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "quantum foam",
|
name: "quantum tunneling",
|
||||||
description: "<strong>foam</strong> can stick to <strong>shields</strong>",
|
description: "<strong>foam</strong> bypasses <strong>shields</strong> to stick to mobs",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -1297,10 +1299,10 @@ const b = {
|
|||||||
},
|
},
|
||||||
requires: "foam",
|
requires: "foam",
|
||||||
effect() {
|
effect() {
|
||||||
b.isModFoamShieldHit = true;
|
b.isModFoamShieldSKip = true;
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
b.isModFoamShieldHit = false;
|
b.isModFoamShieldSKip = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1374,7 +1376,7 @@ const b = {
|
|||||||
{
|
{
|
||||||
name: "timelike world line",
|
name: "timelike world line",
|
||||||
description: "<strong>time dilation</strong> increases your time <strong>rate</strong> by <strong>2x</strong><br>while <strong class='color-f'>energy</strong> <strong>drain</strong> is decreased by <strong>2x</strong>",
|
description: "<strong>time dilation</strong> increases your time <strong>rate</strong> by <strong>2x</strong><br>while <strong class='color-f'>energy</strong> <strong>drain</strong> is decreased by <strong>2x</strong>",
|
||||||
maxCount: 9,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return mech.fieldUpgrades[mech.fieldMode].name === "time dilation field"
|
return mech.fieldUpgrades[mech.fieldMode].name === "time dilation field"
|
||||||
@@ -2092,7 +2094,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let i = 0; i < 16; i++) {
|
for (let i = 0; i < 14; i++) {
|
||||||
const speed = 53 + 10 * Math.random()
|
const speed = 53 + 10 * Math.random()
|
||||||
if (targets.length > 0) { // aim near a random target in array
|
if (targets.length > 0) { // aim near a random target in array
|
||||||
const index = Math.floor(Math.random() * targets.length)
|
const index = Math.floor(Math.random() * targets.length)
|
||||||
@@ -3092,7 +3094,7 @@ const b = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (b.isModRPG) {
|
if (b.isModRPG) {
|
||||||
b.fireProps(25, mech.crouch ? 60 : -15, dir, me); //cd , speed
|
b.fireProps(35, mech.crouch ? 60 : -15, dir, me); //cd , speed
|
||||||
bullet[me].endCycle = game.cycle + 70;
|
bullet[me].endCycle = game.cycle + 70;
|
||||||
bullet[me].frictionAir = 0.07;
|
bullet[me].frictionAir = 0.07;
|
||||||
const MAG = 0.015
|
const MAG = 0.015
|
||||||
@@ -3350,11 +3352,11 @@ const b = {
|
|||||||
isStarterGun: true,
|
isStarterGun: true,
|
||||||
isEasyToAim: false,
|
isEasyToAim: false,
|
||||||
fire() {
|
fire() {
|
||||||
mech.fireCDcycle = mech.cycle + Math.floor((mech.crouch ? 12 : 5) * b.modFireRate); // cool down
|
mech.fireCDcycle = mech.cycle + Math.floor((mech.crouch ? 13 : 6) * b.modFireRate); // cool down
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
const dir = mech.angle + 0.2 * (Math.random() - 0.5)
|
const dir = mech.angle + 0.2 * (Math.random() - 0.5)
|
||||||
const RADIUS = (8 + 16 * Math.random())
|
const RADIUS = (8 + 16 * Math.random())
|
||||||
bullet[me] = Bodies.polygon(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 25, RADIUS, {
|
bullet[me] = Bodies.polygon(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 20, RADIUS, {
|
||||||
angle: dir,
|
angle: dir,
|
||||||
density: 0.00005, // 0.001 is normal density
|
density: 0.00005, // 0.001 is normal density
|
||||||
inertia: Infinity,
|
inertia: Infinity,
|
||||||
@@ -3365,7 +3367,7 @@ const b = {
|
|||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
mask: cat.map | cat.body | cat.mob | cat.mobShield
|
mask: cat.mob | cat.mobShield //cat.map | cat.body | cat.mob | cat.mobShield
|
||||||
},
|
},
|
||||||
minDmgSpeed: 0,
|
minDmgSpeed: 0,
|
||||||
endCycle: Infinity,
|
endCycle: Infinity,
|
||||||
@@ -3374,7 +3376,7 @@ const b = {
|
|||||||
target: null,
|
target: null,
|
||||||
targetVertex: null,
|
targetVertex: null,
|
||||||
onDmg(who) {
|
onDmg(who) {
|
||||||
if (!this.target && who.alive && (who.dropPowerUp || b.isModFoamShieldHit) && (!who.isShielded || b.isModFoamShieldHit)) {
|
if (!this.target && who.alive && who.dropPowerUp && (!who.isShielded || b.isModFoamShieldSKip)) {
|
||||||
this.target = who;
|
this.target = who;
|
||||||
this.collisionFilter.category = cat.body;
|
this.collisionFilter.category = cat.body;
|
||||||
this.collisionFilter.mask = null;
|
this.collisionFilter.mask = null;
|
||||||
@@ -3399,7 +3401,23 @@ const b = {
|
|||||||
// ctx.fill()
|
// ctx.fill()
|
||||||
|
|
||||||
if (!mech.isBodiesAsleep) { //if time dilation isn't active
|
if (!mech.isBodiesAsleep) { //if time dilation isn't active
|
||||||
this.force.y += this.mass * 0.00006; //gravity
|
|
||||||
|
//check for touching map
|
||||||
|
if (Matter.Query.collides(this, map).length > 0) {
|
||||||
|
const slow = 0.94
|
||||||
|
Matter.Body.setVelocity(this, {
|
||||||
|
x: this.velocity.x * slow,
|
||||||
|
y: this.velocity.y * slow
|
||||||
|
});
|
||||||
|
} else if (Matter.Query.collides(this, body).length > 0) {
|
||||||
|
const slow = 0.97
|
||||||
|
Matter.Body.setVelocity(this, {
|
||||||
|
x: this.velocity.x * slow,
|
||||||
|
y: this.velocity.y * slow
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.force.y += this.mass * 0.00006; //gravity
|
||||||
|
}
|
||||||
|
|
||||||
if (this.count < 17) {
|
if (this.count < 17) {
|
||||||
this.count++
|
this.count++
|
||||||
@@ -3409,7 +3427,7 @@ const b = {
|
|||||||
this.radius *= SCALE;
|
this.radius *= SCALE;
|
||||||
} else {
|
} else {
|
||||||
//shrink
|
//shrink
|
||||||
const SCALE = 1 - 0.0035 / b.isModBulletsLastLonger
|
const SCALE = 1 - 0.0033 / b.isModBulletsLastLonger
|
||||||
Matter.Body.scale(this, SCALE, SCALE);
|
Matter.Body.scale(this, SCALE, SCALE);
|
||||||
this.radius *= SCALE;
|
this.radius *= SCALE;
|
||||||
if (this.radius < 14) this.endCycle = 0;
|
if (this.radius < 14) this.endCycle = 0;
|
||||||
@@ -3419,12 +3437,11 @@ 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)
|
||||||
if (this.target.isShielded) {
|
if (b.isModFoamShieldSKip) {
|
||||||
this.target.damage(b.dmgScale * 0.001);
|
this.target.damage(b.dmgScale * 0.0025, true); //shield damage bypass
|
||||||
} else {
|
} else {
|
||||||
this.target.damage(b.dmgScale * 0.005);
|
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;
|
||||||
@@ -3434,7 +3451,8 @@ const b = {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
World.add(engine.world, bullet[me]); //add bullet to world
|
World.add(engine.world, bullet[me]); //add bullet to world
|
||||||
const SPEED = mech.crouch ? 22 : 12 - RADIUS * 0.25;
|
if (b.isModFoamShieldSKip) bullet[me].collisionFilter.mask = cat.mob // | cat.mobShield
|
||||||
|
const SPEED = (mech.crouch ? 17 : 12) - RADIUS * 0.25;
|
||||||
Matter.Body.setVelocity(bullet[me], {
|
Matter.Body.setVelocity(bullet[me], {
|
||||||
x: SPEED * Math.cos(dir),
|
x: SPEED * Math.cos(dir),
|
||||||
y: SPEED * Math.sin(dir)
|
y: SPEED * Math.sin(dir)
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ function collisionChecks(event) {
|
|||||||
mob[k].foundPlayer();
|
mob[k].foundPlayer();
|
||||||
let dmg = Math.min(Math.max(0.025 * Math.sqrt(mob[k].mass), 0.05), 0.3) * game.dmgScale; //player damage is capped at 0.3*dmgScale of 1.0
|
let dmg = Math.min(Math.max(0.025 * Math.sqrt(mob[k].mass), 0.05), 0.3) * game.dmgScale; //player damage is capped at 0.3*dmgScale of 1.0
|
||||||
if (b.isModPiezo) {
|
if (b.isModPiezo) {
|
||||||
mech.energy = mech.fieldEnergyMax;
|
mech.energy = mech.maxEnergy;
|
||||||
dmg *= 0.85
|
dmg *= 0.85
|
||||||
}
|
}
|
||||||
mech.damage(dmg);
|
mech.damage(dmg);
|
||||||
|
|||||||
@@ -358,7 +358,7 @@ const game = {
|
|||||||
b.giveGuns("all", 1000)
|
b.giveGuns("all", 1000)
|
||||||
} else if (keys[72]) { // heal with H
|
} else if (keys[72]) { // heal with H
|
||||||
mech.addHealth(Infinity)
|
mech.addHealth(Infinity)
|
||||||
mech.energy = mech.fieldEnergyMax;
|
mech.energy = mech.maxEnergy;
|
||||||
} else if (keys[89]) { //add mods with y
|
} else if (keys[89]) { //add mods with y
|
||||||
b.giveMod()
|
b.giveMod()
|
||||||
} else if (keys[82]) { // teleport to mouse with R
|
} else if (keys[82]) { // teleport to mouse with R
|
||||||
@@ -471,7 +471,7 @@ const game = {
|
|||||||
b.setupAllMods(); //sets mods to default values
|
b.setupAllMods(); //sets mods to default values
|
||||||
game.updateModHUD();
|
game.updateModHUD();
|
||||||
mech.maxHealth = 1
|
mech.maxHealth = 1
|
||||||
mech.fieldEnergyMax = 1
|
mech.maxEnergy = 1
|
||||||
game.paused = false;
|
game.paused = false;
|
||||||
engine.timing.timeScale = 1;
|
engine.timing.timeScale = 1;
|
||||||
game.fpsCap = game.fpsCapDefault;
|
game.fpsCap = game.fpsCapDefault;
|
||||||
@@ -724,8 +724,8 @@ const game = {
|
|||||||
|
|
||||||
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) {
|
||||||
mech.energy += mech.fieldEnergyMax * 0.07
|
mech.energy += mech.maxEnergy * 0.07
|
||||||
if (mech.energy > mech.fieldEnergyMax) mech.energy = mech.fieldEnergyMax;
|
if (mech.energy > mech.maxEnergy) mech.energy = mech.maxEnergy;
|
||||||
}
|
}
|
||||||
if (b.isModHealthRecovery) mech.addHealth(0.01)
|
if (b.isModHealthRecovery) mech.addHealth(0.01)
|
||||||
}
|
}
|
||||||
|
|||||||
50
js/level.js
50
js/level.js
@@ -15,10 +15,10 @@ const level = {
|
|||||||
if (build.isURLBuild && level.levelsCleared === 0) build.onLoadPowerUps();
|
if (build.isURLBuild && level.levelsCleared === 0) build.onLoadPowerUps();
|
||||||
if (level.levelsCleared === 0) { //this code only runs on the first level
|
if (level.levelsCleared === 0) { //this code only runs on the first level
|
||||||
// level.difficultyIncrease(9)
|
// level.difficultyIncrease(9)
|
||||||
// b.giveGuns("missiles")
|
b.giveGuns("foam")
|
||||||
// mech.setField("time dilation field")
|
// mech.setField("time dilation field")
|
||||||
// b.giveMod("renormalization");
|
// b.giveMod("renormalization");
|
||||||
// b.giveMod("pocket universe");
|
// b.giveMod("quantum tunneling");
|
||||||
// b.giveGuns("grenades")
|
// b.giveGuns("grenades")
|
||||||
// b.giveMod("rocket-propelled grenade");
|
// b.giveMod("rocket-propelled grenade");
|
||||||
// mech.setField("pilot wave")
|
// mech.setField("pilot wave")
|
||||||
@@ -100,7 +100,7 @@ const level = {
|
|||||||
//******************************************************************************************************************
|
//******************************************************************************************************************
|
||||||
|
|
||||||
testing() {
|
testing() {
|
||||||
level.difficultyIncrease(9);
|
level.difficultyIncrease(19);
|
||||||
spawn.setSpawnList();
|
spawn.setSpawnList();
|
||||||
spawn.setSpawnList();
|
spawn.setSpawnList();
|
||||||
level.defaultZoom = 1500
|
level.defaultZoom = 1500
|
||||||
@@ -153,12 +153,16 @@ const level = {
|
|||||||
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.bomberBoss(2900, -500)
|
// spawn.bomberBoss(2900, -500)
|
||||||
spawn.stabber(1200, -500)
|
spawn.suckerBoss(1200, -500)
|
||||||
// spawn.chaser(1200, -500)
|
// spawn.hopper(1200, -500)
|
||||||
|
// spawn.shield(mob[mob.length - 1], 1200, -500, 1);
|
||||||
|
|
||||||
// spawn.nodeBoss(1200, -500, "spiker")
|
// spawn.nodeBoss(1200, -500, "spiker")
|
||||||
// spawn.hopper(1200, -500)
|
// spawn.hopper(1200, -500)
|
||||||
// spawn.timeSkipBoss(2900, -500)
|
// spawn.timeSkipBoss(2900, -500)
|
||||||
// spawn.randomMob(1600, -500)
|
// spawn.randomMob(1600, -500)
|
||||||
|
spawn.boost()
|
||||||
|
spawn.boost(1500, 0, 1400);
|
||||||
|
|
||||||
},
|
},
|
||||||
bosses() {
|
bosses() {
|
||||||
@@ -254,28 +258,35 @@ const level = {
|
|||||||
level.addZone(level.exit.x, level.exit.y, 100, 30, "nextLevel");
|
level.addZone(level.exit.x, level.exit.y, 100, 30, "nextLevel");
|
||||||
spawn.mapRect(level.exit.x, level.exit.y + 25, 100, 100); //exit bump
|
spawn.mapRect(level.exit.x, level.exit.y + 25, 100, 100); //exit bump
|
||||||
|
|
||||||
document.body.style.backgroundColor = "#eee";
|
document.body.style.backgroundColor = "#ddd";
|
||||||
// game.draw.mapFill = "#444"
|
// game.draw.mapFill = "#444"
|
||||||
// game.draw.bodyFill = "rgba(140,140,140,0.85)"
|
// game.draw.bodyFill = "rgba(140,140,140,0.85)"
|
||||||
// game.draw.bodyStroke = "#222"
|
// game.draw.bodyStroke = "#222"
|
||||||
|
|
||||||
|
level.fill.push({
|
||||||
|
x: 2600,
|
||||||
|
y: -600,
|
||||||
|
width: 400,
|
||||||
|
height: 500,
|
||||||
|
color: "rgba(0,255,255,0.05)"
|
||||||
|
});
|
||||||
level.fillBG.push({
|
level.fillBG.push({
|
||||||
x: 2600,
|
x: 2600,
|
||||||
y: -600,
|
y: -600,
|
||||||
width: 400,
|
width: 400,
|
||||||
height: 500,
|
height: 500,
|
||||||
color: "#dee"
|
color: "#fff"
|
||||||
});
|
});
|
||||||
|
|
||||||
level.fill.push({
|
// level.fill.push({
|
||||||
x: -150,
|
// x: -150,
|
||||||
y: -1000,
|
// y: -1000,
|
||||||
width: 2750,
|
// width: 2750,
|
||||||
height: 1000,
|
// height: 1000,
|
||||||
color: "rgba(0,10,30,0.04)"
|
// color: "rgba(0,10,30,0.04)"
|
||||||
});
|
// });
|
||||||
|
|
||||||
const lineColor = "#ddd"
|
const lineColor = "#ccc"
|
||||||
level.fillBG.push({
|
level.fillBG.push({
|
||||||
x: 1600,
|
x: 1600,
|
||||||
y: -500,
|
y: -500,
|
||||||
@@ -428,8 +439,7 @@ const level = {
|
|||||||
spawn.bodyRect(2000, 50, 60, 60);
|
spawn.bodyRect(2000, 50, 60, 60);
|
||||||
// spawn.bodyRect(1650, 50, 300, 200);
|
// spawn.bodyRect(1650, 50, 300, 200);
|
||||||
spawn.bodyRect(3175, -155, 325, 325);
|
spawn.bodyRect(3175, -155, 325, 325);
|
||||||
spawn.mapRect(1800, 175, 800, 100); //stops above body from moving to right
|
spawn.mapRect(1800, Math.floor(Math.random() * 200), 850, 300); //stops above body from moving to right
|
||||||
|
|
||||||
//exit building
|
//exit building
|
||||||
// spawn.mapRect(-100, -410, 100, 30);
|
// spawn.mapRect(-100, -410, 100, 30);
|
||||||
spawn.mapRect(-300, -800, 500, 50);
|
spawn.mapRect(-300, -800, 500, 50);
|
||||||
@@ -509,7 +519,7 @@ const level = {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//far right structure
|
//far right structure
|
||||||
spawn.mapRect(5200, -775, 100, 920);
|
spawn.mapRect(5200, -725, 100, 870);
|
||||||
spawn.mapRect(5300, -1075, 350, 1220);
|
spawn.mapRect(5300, -1075, 350, 1220);
|
||||||
spawn.boost(5825, 235, 1400);
|
spawn.boost(5825, 235, 1400);
|
||||||
level.fill.push({
|
level.fill.push({
|
||||||
@@ -528,8 +538,8 @@ const level = {
|
|||||||
height: 1500,
|
height: 1500,
|
||||||
color: "rgba(0,20,40,0.13)"
|
color: "rgba(0,20,40,0.13)"
|
||||||
});
|
});
|
||||||
spawn.mapRect(4000, -400, 325, 50);
|
spawn.mapRect(3950, -350, 375, 50);
|
||||||
spawn.mapRect(4725, -400, 325, 50);
|
spawn.mapRect(4725, -350, 375, 50);
|
||||||
spawn.mapRect(4000, -1300, 1050, 100);
|
spawn.mapRect(4000, -1300, 1050, 100);
|
||||||
|
|
||||||
//steep stairs
|
//steep stairs
|
||||||
|
|||||||
10
js/mobs.js
10
js/mobs.js
@@ -953,8 +953,14 @@ const mobs = {
|
|||||||
if (b.isModFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500
|
if (b.isModFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500
|
||||||
|
|
||||||
//energy and heal drain should be calculated after damage boosts
|
//energy and heal drain should be calculated after damage boosts
|
||||||
if (b.modEnergySiphon && dmg !== Infinity) mech.energy += Math.min(this.health, dmg) * b.modEnergySiphon
|
if (b.modEnergySiphon && dmg !== Infinity) {
|
||||||
if (b.modHealthDrain && dmg !== Infinity) mech.addHealth(Math.min(this.health, dmg) * b.modHealthDrain)
|
mech.energy += Math.min(this.health, dmg) * b.modEnergySiphon
|
||||||
|
if (mech.energy > mech.maxEnergy) mech.energy = mech.maxEnergy
|
||||||
|
}
|
||||||
|
if (b.modHealthDrain && dmg !== Infinity) {
|
||||||
|
mech.addHealth(Math.min(this.health, dmg) * b.modHealthDrain)
|
||||||
|
if (mech.health > mech.maxHealth) mech.health = mech.maxHealth
|
||||||
|
}
|
||||||
this.health -= dmg
|
this.health -= dmg
|
||||||
//this.fill = this.color + this.health + ')';
|
//this.fill = this.color + this.health + ')';
|
||||||
this.onDamage(dmg); //custom damage effects
|
this.onDamage(dmg); //custom damage effects
|
||||||
|
|||||||
33
js/player.js
33
js/player.js
@@ -759,7 +759,7 @@ const mech = {
|
|||||||
fireCDcycle: 0,
|
fireCDcycle: 0,
|
||||||
fieldCDcycle: 0,
|
fieldCDcycle: 0,
|
||||||
fieldMode: 0, //basic field mode before upgrades
|
fieldMode: 0, //basic field mode before upgrades
|
||||||
fieldEnergyMax: 1, //can be increased by a mod
|
maxEnergy: 1, //can be increased by a mod
|
||||||
holdingTarget: null,
|
holdingTarget: null,
|
||||||
fieldShieldingScale: 1,
|
fieldShieldingScale: 1,
|
||||||
timeSkipLastCycle: 0,
|
timeSkipLastCycle: 0,
|
||||||
@@ -777,7 +777,7 @@ const mech = {
|
|||||||
mech.fieldThreshold = Math.cos(mech.fieldArc * Math.PI)
|
mech.fieldThreshold = Math.cos(mech.fieldArc * Math.PI)
|
||||||
},
|
},
|
||||||
setHoldDefaults() {
|
setHoldDefaults() {
|
||||||
if (mech.energy < mech.fieldEnergyMax) mech.energy = mech.fieldEnergyMax;
|
if (mech.energy < mech.maxEnergy) mech.energy = mech.maxEnergy;
|
||||||
mech.fieldRegen = b.modEnergyRegen; //0.001
|
mech.fieldRegen = b.modEnergyRegen; //0.001
|
||||||
mech.fieldMeterColor = "#0cf"
|
mech.fieldMeterColor = "#0cf"
|
||||||
mech.fieldShieldingScale = 1;
|
mech.fieldShieldingScale = 1;
|
||||||
@@ -796,17 +796,18 @@ const mech = {
|
|||||||
},
|
},
|
||||||
fieldMeterColor: "#0cf",
|
fieldMeterColor: "#0cf",
|
||||||
drawFieldMeter(bgColor = "rgba(0, 0, 0, 0.4)", range = 60) {
|
drawFieldMeter(bgColor = "rgba(0, 0, 0, 0.4)", range = 60) {
|
||||||
if (mech.energy < mech.fieldEnergyMax) {
|
if (mech.energy < mech.maxEnergy) {
|
||||||
mech.energy += mech.fieldRegen;
|
mech.energy += mech.fieldRegen;
|
||||||
ctx.fillStyle = bgColor;
|
ctx.fillStyle = bgColor;
|
||||||
const xOff = mech.pos.x - mech.radius * mech.fieldEnergyMax
|
const xOff = mech.pos.x - mech.radius * mech.maxEnergy
|
||||||
const yOff = mech.pos.y - 50
|
const yOff = mech.pos.y - 50
|
||||||
ctx.fillRect(xOff, yOff, range * mech.fieldEnergyMax, 10);
|
ctx.fillRect(xOff, yOff, range * mech.maxEnergy, 10);
|
||||||
ctx.fillStyle = mech.fieldMeterColor;
|
ctx.fillStyle = mech.fieldMeterColor;
|
||||||
ctx.fillRect(xOff, yOff, range * mech.energy, 10);
|
ctx.fillRect(xOff, yOff, range * mech.energy, 10);
|
||||||
}
|
}
|
||||||
|
if (mech.energy < 0) mech.energy = 0
|
||||||
// else {
|
// else {
|
||||||
// mech.energy = mech.fieldEnergyMax
|
// mech.energy = mech.maxEnergy
|
||||||
// }
|
// }
|
||||||
},
|
},
|
||||||
lookingAt(who) {
|
lookingAt(who) {
|
||||||
@@ -1019,7 +1020,7 @@ const mech = {
|
|||||||
y: powerUp[i].velocity.y * 0.11
|
y: powerUp[i].velocity.y * 0.11
|
||||||
});
|
});
|
||||||
if (dist2 < 5000 && !game.isChoosing) { //use power up if it is close enough
|
if (dist2 < 5000 && !game.isChoosing) { //use power up if it is close enough
|
||||||
if (b.isModMassEnergy) mech.energy = mech.fieldEnergyMax * 2;
|
if (b.isModMassEnergy) mech.energy = mech.maxEnergy * 2;
|
||||||
Matter.Body.setVelocity(player, { //player knock back, after grabbing power up
|
Matter.Body.setVelocity(player, { //player knock back, after grabbing power up
|
||||||
x: player.velocity.x + ((powerUp[i].velocity.x * powerUp[i].mass) / player.mass) * 0.3,
|
x: player.velocity.x + ((powerUp[i].velocity.x * powerUp[i].mass) / player.mass) * 0.3,
|
||||||
y: player.velocity.y + ((powerUp[i].velocity.y * powerUp[i].mass) / player.mass) * 0.3
|
y: player.velocity.y + ((powerUp[i].velocity.y * powerUp[i].mass) / player.mass) * 0.3
|
||||||
@@ -1038,7 +1039,7 @@ const mech = {
|
|||||||
if (mech.energy > fieldBlockCost * 0.2) { //shield needs at least some of the cost to block
|
if (mech.energy > fieldBlockCost * 0.2) { //shield needs at least some of the cost to block
|
||||||
mech.energy -= fieldBlockCost
|
mech.energy -= fieldBlockCost
|
||||||
if (mech.energy < 0) mech.energy = 0;
|
if (mech.energy < 0) mech.energy = 0;
|
||||||
if (mech.energy > mech.fieldEnergyMax) mech.energy = mech.fieldEnergyMax;
|
if (mech.energy > mech.maxEnergy) mech.energy = mech.maxEnergy;
|
||||||
|
|
||||||
const unit = Vector.normalise(Vector.sub(player.position, who.position))
|
const unit = Vector.normalise(Vector.sub(player.position, who.position))
|
||||||
if (b.modBlockDmg) {
|
if (b.modBlockDmg) {
|
||||||
@@ -1378,7 +1379,7 @@ const mech = {
|
|||||||
effect: () => {
|
effect: () => {
|
||||||
// mech.fieldRegen *= 2;
|
// mech.fieldRegen *= 2;
|
||||||
mech.hold = function () {
|
mech.hold = function () {
|
||||||
if (mech.energy > mech.fieldEnergyMax - 0.02 && mech.fieldCDcycle < mech.cycle) {
|
if (mech.energy > mech.maxEnergy - 0.02 && mech.fieldCDcycle < mech.cycle) {
|
||||||
if (b.isModSporeField) {
|
if (b.isModSporeField) {
|
||||||
// mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones
|
// mech.fieldCDcycle = mech.cycle + 10; // set cool down to prevent +energy from making huge numbers of drones
|
||||||
const len = Math.floor(6 + 4 * Math.random())
|
const len = Math.floor(6 + 4 * Math.random())
|
||||||
@@ -1926,20 +1927,21 @@ const mech = {
|
|||||||
mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
mech.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mech.energy < mech.fieldEnergyMax) {
|
if (mech.energy < mech.maxEnergy) {
|
||||||
mech.energy += mech.fieldRegen;
|
mech.energy += mech.fieldRegen;
|
||||||
const xOff = mech.pos.x - mech.radius * mech.fieldEnergyMax
|
const xOff = mech.pos.x - mech.radius * mech.maxEnergy
|
||||||
const yOff = mech.pos.y - 50
|
const yOff = mech.pos.y - 50
|
||||||
ctx.fillStyle = "rgba(0, 0, 0, 0.3)";
|
ctx.fillStyle = "rgba(0, 0, 0, 0.3)";
|
||||||
ctx.fillRect(xOff, yOff, 60 * mech.fieldEnergyMax, 10);
|
ctx.fillRect(xOff, yOff, 60 * mech.maxEnergy, 10);
|
||||||
ctx.fillStyle = mech.fieldMeterColor;
|
ctx.fillStyle = mech.fieldMeterColor;
|
||||||
ctx.fillRect(xOff, yOff, 60 * mech.energy, 10);
|
ctx.fillRect(xOff, yOff, 60 * mech.energy, 10);
|
||||||
ctx.beginPath()
|
ctx.beginPath()
|
||||||
ctx.rect(xOff, yOff, 60 * mech.fieldEnergyMax, 10);
|
ctx.rect(xOff, yOff, 60 * mech.maxEnergy, 10);
|
||||||
ctx.strokeStyle = "rgb(0, 0, 0)";
|
ctx.strokeStyle = "rgb(0, 0, 0)";
|
||||||
ctx.lineWidth = 1;
|
ctx.lineWidth = 1;
|
||||||
ctx.stroke();
|
ctx.stroke();
|
||||||
}
|
}
|
||||||
|
if (mech.energy < 0) mech.energy = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2000,6 +2002,7 @@ const mech = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//grab power ups into the field
|
||||||
for (let i = 0, len = powerUp.length; i < len; ++i) {
|
for (let i = 0, len = powerUp.length; i < len; ++i) {
|
||||||
const dxP = mech.fieldPosition.x - powerUp[i].position.x;
|
const dxP = mech.fieldPosition.x - powerUp[i].position.x;
|
||||||
const dyP = mech.fieldPosition.y - powerUp[i].position.y;
|
const dyP = mech.fieldPosition.y - powerUp[i].position.y;
|
||||||
@@ -2014,11 +2017,11 @@ const mech = {
|
|||||||
y: powerUp[i].velocity.y * 0.11
|
y: powerUp[i].velocity.y * 0.11
|
||||||
});
|
});
|
||||||
if (dist2 < 5000 && !game.isChoosing) { //use power up if it is close enough
|
if (dist2 < 5000 && !game.isChoosing) { //use power up if it is close enough
|
||||||
if (b.isModMassEnergy) mech.energy = mech.fieldEnergyMax * 2;
|
if (b.isModMassEnergy) mech.energy = mech.maxEnergy * 2;
|
||||||
powerUp[i].effect();
|
powerUp[i].effect();
|
||||||
Matter.World.remove(engine.world, powerUp[i]);
|
Matter.World.remove(engine.world, powerUp[i]);
|
||||||
powerUp.splice(i, 1);
|
powerUp.splice(i, 1);
|
||||||
mech.fieldRadius += 50
|
// mech.fieldRadius += 50
|
||||||
break; //because the array order is messed up after splice
|
break; //because the array order is messed up after splice
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ const powerUps = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (target.ammo === Infinity) {
|
if (target.ammo === Infinity) {
|
||||||
mech.energy = mech.fieldEnergyMax;
|
if (mech.energy < mech.maxEnergy) mech.energy = mech.maxEnergy;
|
||||||
if (!game.lastLogTime) game.makeTextLog("<span style='font-size:115%;'><span class='color-f'>+energy</span></span>", 300);
|
if (!game.lastLogTime) game.makeTextLog("<span style='font-size:115%;'><span class='color-f'>+energy</span></span>", 300);
|
||||||
} else {
|
} else {
|
||||||
let ammo = Math.ceil((target.ammoPack * (1 + 0.1 * Math.random())));
|
let ammo = Math.ceil((target.ammoPack * (1 + 0.1 * Math.random())));
|
||||||
@@ -89,7 +89,7 @@ const powerUps = {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// target = b.guns[Math.floor(Math.random() * b.guns.length)]; //if you don't have any guns just add ammo to a random gun you don't have yet
|
// target = b.guns[Math.floor(Math.random() * b.guns.length)]; //if you don't have any guns just add ammo to a random gun you don't have yet
|
||||||
mech.energy = mech.fieldEnergyMax;
|
if (mech.energy < mech.maxEnergy) mech.energy = mech.maxEnergy;
|
||||||
if (!game.lastLogTime) game.makeTextLog("<span style='font-size:115%;'><span class='color-f'>+energy</span></span>", 300);
|
if (!game.lastLogTime) game.makeTextLog("<span style='font-size:115%;'><span class='color-f'>+energy</span></span>", 300);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,17 +110,18 @@ const powerUps = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let choice1 = pick(mech.fieldUpgrades)
|
let choice1 = pick(mech.fieldUpgrades)
|
||||||
let choice2 = pick(mech.fieldUpgrades, choice1)
|
let choice2 = -1
|
||||||
let choice3 = -1
|
let choice3 = -1
|
||||||
if (choice1 > -1) {
|
if (choice1 > -1) {
|
||||||
let text = `<div class='cancel' onclick='powerUps.cancel("field")'>✕</div><h3 style = 'color:#fff; text-align:left; margin: 0px;'>choose a field</h3>`
|
let text = `<div class='cancel' onclick='powerUps.cancel("field")'>✕</div><h3 style = 'color:#fff; text-align:left; margin: 0px;'>choose a field</h3>`
|
||||||
text += `<div class="choose-grid-module" onclick="powerUps.choose('field',${choice1})"><div class="grid-title"><div class="circle-grid field"></div> ${mech.fieldUpgrades[choice1].name}</div> ${mech.fieldUpgrades[choice1].description}</div>`
|
text += `<div class="choose-grid-module" onclick="powerUps.choose('field',${choice1})"><div class="grid-title"><div class="circle-grid field"></div> ${mech.fieldUpgrades[choice1].name}</div> ${mech.fieldUpgrades[choice1].description}</div>`
|
||||||
if (choice2 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('field',${choice2})"><div class="grid-title"><div class="circle-grid field"></div> ${mech.fieldUpgrades[choice2].name}</div> ${mech.fieldUpgrades[choice2].description}</div>`
|
|
||||||
if (!b.isModBayesian) {
|
if (!b.isModBayesian) {
|
||||||
|
choice2 = pick(mech.fieldUpgrades, choice1)
|
||||||
|
if (choice2 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('field',${choice2})"><div class="grid-title"><div class="circle-grid field"></div> ${mech.fieldUpgrades[choice2].name}</div> ${mech.fieldUpgrades[choice2].description}</div>`
|
||||||
choice3 = pick(mech.fieldUpgrades, choice1, choice2)
|
choice3 = pick(mech.fieldUpgrades, choice1, choice2)
|
||||||
if (choice3 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('field',${choice3})"><div class="grid-title"><div class="circle-grid field"></div> ${mech.fieldUpgrades[choice3].name}</div> ${mech.fieldUpgrades[choice3].description}</div>`
|
if (choice3 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('field',${choice3})"><div class="grid-title"><div class="circle-grid field"></div> ${mech.fieldUpgrades[choice3].name}</div> ${mech.fieldUpgrades[choice3].description}</div>`
|
||||||
}
|
}
|
||||||
if (b.isModFourOptions) {
|
if (b.isModExtraChoice) {
|
||||||
let choice4 = pick(mech.fieldUpgrades, choice1, choice2, choice3)
|
let choice4 = pick(mech.fieldUpgrades, choice1, choice2, choice3)
|
||||||
if (choice4 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('field',${choice4})"><div class="grid-title"><div class="circle-grid field"></div> ${mech.fieldUpgrades[choice4].name}</div> ${mech.fieldUpgrades[choice4].description}</div>`
|
if (choice4 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('field',${choice4})"><div class="grid-title"><div class="circle-grid field"></div> ${mech.fieldUpgrades[choice4].name}</div> ${mech.fieldUpgrades[choice4].description}</div>`
|
||||||
}
|
}
|
||||||
@@ -154,17 +155,18 @@ const powerUps = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let choice1 = pick()
|
let choice1 = pick()
|
||||||
let choice2 = pick(choice1)
|
let choice2 = -1
|
||||||
let choice3 = -1
|
let choice3 = -1
|
||||||
if (choice1 > -1) {
|
if (choice1 > -1) {
|
||||||
let text = `<div class='cancel' onclick='powerUps.cancel("mod")'>✕</div><h3 style = 'color:#fff; text-align:left; margin: 0px;'>choose a mod</h3>`
|
let text = `<div class='cancel' onclick='powerUps.cancel("mod")'>✕</div><h3 style = 'color:#fff; text-align:left; margin: 0px;'>choose a mod</h3>`
|
||||||
text += `<div class="choose-grid-module" onclick="powerUps.choose('mod',${choice1})"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[choice1].name}</div> ${b.mods[choice1].description}</div>`
|
text += `<div class="choose-grid-module" onclick="powerUps.choose('mod',${choice1})"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[choice1].name}</div> ${b.mods[choice1].description}</div>`
|
||||||
if (choice2 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('mod',${choice2})"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[choice2].name}</div> ${b.mods[choice2].description}</div>`
|
|
||||||
if (!b.isModBayesian) {
|
if (!b.isModBayesian) {
|
||||||
|
choice2 = pick(choice1)
|
||||||
|
if (choice2 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('mod',${choice2})"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[choice2].name}</div> ${b.mods[choice2].description}</div>`
|
||||||
choice3 = pick(choice1, choice2)
|
choice3 = pick(choice1, choice2)
|
||||||
if (choice3 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('mod',${choice3})"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[choice3].name}</div> ${b.mods[choice3].description}</div>`
|
if (choice3 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('mod',${choice3})"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[choice3].name}</div> ${b.mods[choice3].description}</div>`
|
||||||
}
|
}
|
||||||
if (b.isModFourOptions) {
|
if (b.isModExtraChoice) {
|
||||||
let choice4 = pick(choice1, choice2, choice3)
|
let choice4 = pick(choice1, choice2, choice3)
|
||||||
if (choice4 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('mod',${choice4})"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[choice4].name}</div> ${b.mods[choice4].description}</div>`
|
if (choice4 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('mod',${choice4})"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[choice4].name}</div> ${b.mods[choice4].description}</div>`
|
||||||
}
|
}
|
||||||
@@ -191,17 +193,18 @@ const powerUps = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let choice1 = pick(b.guns)
|
let choice1 = pick(b.guns)
|
||||||
let choice2 = pick(b.guns, choice1)
|
let choice2 = -1
|
||||||
let choice3 = -1
|
let choice3 = -1
|
||||||
if (choice1 > -1) {
|
if (choice1 > -1) {
|
||||||
let text = `<div class='cancel' onclick='powerUps.cancel("gun")'>✕</div><h3 style = 'color:#fff; text-align:left; margin: 0px;'>choose a gun</h3>`
|
let text = `<div class='cancel' onclick='powerUps.cancel("gun")'>✕</div><h3 style = 'color:#fff; text-align:left; margin: 0px;'>choose a gun</h3>`
|
||||||
text += `<div class="choose-grid-module" onclick="powerUps.choose('gun',${choice1})"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[choice1].name}</div> ${b.guns[choice1].description}</div>`
|
text += `<div class="choose-grid-module" onclick="powerUps.choose('gun',${choice1})"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[choice1].name}</div> ${b.guns[choice1].description}</div>`
|
||||||
if (choice2 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('gun',${choice2})"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[choice2].name}</div> ${b.guns[choice2].description}</div>`
|
|
||||||
if (!b.isModBayesian) {
|
if (!b.isModBayesian) {
|
||||||
|
choice2 = pick(b.guns, choice1)
|
||||||
|
if (choice2 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('gun',${choice2})"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[choice2].name}</div> ${b.guns[choice2].description}</div>`
|
||||||
choice3 = pick(b.guns, choice1, choice2)
|
choice3 = pick(b.guns, choice1, choice2)
|
||||||
if (choice3 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('gun',${choice3})"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[choice3].name}</div> ${b.guns[choice3].description}</div>`
|
if (choice3 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('gun',${choice3})"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[choice3].name}</div> ${b.guns[choice3].description}</div>`
|
||||||
}
|
}
|
||||||
if (b.isModFourOptions) {
|
if (b.isModExtraChoice) {
|
||||||
let choice4 = pick(b.guns, choice1, choice2, choice3)
|
let choice4 = pick(b.guns, choice1, choice2, choice3)
|
||||||
if (choice4 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('gun',${choice4})"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[choice4].name}</div> ${b.guns[choice4].description}</div>`
|
if (choice4 > -1) text += `<div class="choose-grid-module" onclick="powerUps.choose('gun',${choice4})"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[choice4].name}</div> ${b.guns[choice4].description}</div>`
|
||||||
}
|
}
|
||||||
|
|||||||
17
js/spawn.js
17
js/spawn.js
@@ -517,10 +517,9 @@ const spawn = {
|
|||||||
|
|
||||||
//when player is inside event horizon
|
//when player is inside event horizon
|
||||||
if (Vector.magnitude(Vector.sub(this.position, player.position)) < eventHorizon) {
|
if (Vector.magnitude(Vector.sub(this.position, player.position)) < eventHorizon) {
|
||||||
if (mech.energy > 0.1) {
|
mech.energy -= 0.004
|
||||||
mech.energy -= 0.005
|
if (mech.energy < 0.1) {
|
||||||
} else {
|
mech.damage(0.00015 * game.dmgScale);
|
||||||
mech.damage(0.0002 * game.dmgScale);
|
|
||||||
}
|
}
|
||||||
const angle = Math.atan2(player.position.y - this.position.y, player.position.x - this.position.x);
|
const angle = Math.atan2(player.position.y - this.position.y, player.position.x - this.position.x);
|
||||||
player.force.x -= 0.00125 * player.mass * Math.cos(angle) * (mech.onGround ? 1.8 : 1);
|
player.force.x -= 0.00125 * player.mass * Math.cos(angle) * (mech.onGround ? 1.8 : 1);
|
||||||
@@ -616,10 +615,9 @@ const spawn = {
|
|||||||
ctx.fill();
|
ctx.fill();
|
||||||
//when player is inside event horizon
|
//when player is inside event horizon
|
||||||
if (Vector.magnitude(Vector.sub(this.position, player.position)) < eventHorizon) {
|
if (Vector.magnitude(Vector.sub(this.position, player.position)) < eventHorizon) {
|
||||||
if (mech.energy > 0.1) {
|
mech.energy -= 0.006
|
||||||
mech.energy -= 0.0075
|
if (mech.energy < 0.1) {
|
||||||
} else {
|
mech.damage(0.0002 * game.dmgScale);
|
||||||
mech.damage(0.0003 * game.dmgScale);
|
|
||||||
}
|
}
|
||||||
const angle = Math.atan2(player.position.y - this.position.y, player.position.x - this.position.x);
|
const angle = Math.atan2(player.position.y - this.position.y, player.position.x - this.position.x);
|
||||||
player.force.x -= 0.0013 * Math.cos(angle) * player.mass * (mech.onGround ? 1.7 : 1);
|
player.force.x -= 0.0013 * Math.cos(angle) * player.mass * (mech.onGround ? 1.7 : 1);
|
||||||
@@ -936,7 +934,8 @@ const spawn = {
|
|||||||
ctx.lineTo(best.x, best.y);
|
ctx.lineTo(best.x, best.y);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
stabber(x, y, radius = 25 + Math.ceil(Math.random() * 15)) {
|
stabber(x, y, radius = 25 + Math.ceil(Math.random() * 12)) {
|
||||||
|
if (radius > 80) radius = 65;
|
||||||
mobs.spawn(x, y, 6, radius, "rgb(220,50,205)"); //can't have sides above 6 or collision events don't work (probably because of a convex problem)
|
mobs.spawn(x, y, 6, radius, "rgb(220,50,205)"); //can't have sides above 6 or collision events don't work (probably because of a convex problem)
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.accelMag = 0.0006 * game.accelScale;
|
me.accelMag = 0.0006 * game.accelScale;
|
||||||
|
|||||||
@@ -268,6 +268,7 @@ summary {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: none;
|
display: none;
|
||||||
|
/* background-color also set in mass-energy mod */
|
||||||
background-color: #f67;
|
background-color: #f67;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity 1s;
|
transition: opacity 1s;
|
||||||
|
|||||||
6
todo.txt
6
todo.txt
@@ -2,6 +2,12 @@
|
|||||||
|
|
||||||
|
|
||||||
************** TODO - n-gon **************
|
************** TODO - n-gon **************
|
||||||
|
|
||||||
|
mod - annihilation might be unbalanced?
|
||||||
|
|
||||||
|
boss mob - let it die multiple times and come back to life
|
||||||
|
on death event spawns a new version of self, but with a decrementing counter
|
||||||
|
|
||||||
foam - check for touching map / blocks and slow foam down rather then bounce off walls
|
foam - check for touching map / blocks and slow foam down rather then bounce off walls
|
||||||
quantum foam should just skip the shield
|
quantum foam should just skip the shield
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user