added several new mods
This commit is contained in:
269
js/bullets.js
269
js/bullets.js
@@ -33,9 +33,13 @@ const b = {
|
|||||||
modCollisionImmuneCycles: null,
|
modCollisionImmuneCycles: null,
|
||||||
modBlockDmg: null,
|
modBlockDmg: null,
|
||||||
isModPiezo: null,
|
isModPiezo: null,
|
||||||
isModFastDrones: null,
|
isModDroneCollide: null,
|
||||||
|
isModFastSpores: null,
|
||||||
isModStomp: null,
|
isModStomp: null,
|
||||||
modSuperBallNumber: null,
|
modSuperBallNumber: null,
|
||||||
|
modLaserReflections: null,
|
||||||
|
isModNoAmmo: null,
|
||||||
|
isModAmmoFromHealth: null,
|
||||||
setModDefaults() {
|
setModDefaults() {
|
||||||
b.modCount = 0;
|
b.modCount = 0;
|
||||||
b.modFireRate = 1;
|
b.modFireRate = 1;
|
||||||
@@ -47,7 +51,8 @@ const b = {
|
|||||||
b.modHealthDrain = 0;
|
b.modHealthDrain = 0;
|
||||||
b.modNoAmmo = 0;
|
b.modNoAmmo = 0;
|
||||||
b.isModBulletsLastLonger = 1;
|
b.isModBulletsLastLonger = 1;
|
||||||
b.isModFastDrones = false;
|
b.isModDroneCollide = true;
|
||||||
|
b.isModFastSpores = false
|
||||||
b.isModImmortal = false;
|
b.isModImmortal = false;
|
||||||
b.modSpores = 0;
|
b.modSpores = 0;
|
||||||
b.modAcidDmg = 0;
|
b.modAcidDmg = 0;
|
||||||
@@ -70,18 +75,24 @@ const b = {
|
|||||||
b.isModStomp = false;
|
b.isModStomp = false;
|
||||||
b.modCollisionImmuneCycles = 30;
|
b.modCollisionImmuneCycles = 30;
|
||||||
b.modSuperBallNumber = 4;
|
b.modSuperBallNumber = 4;
|
||||||
|
b.modLaserReflections = 2;
|
||||||
|
b.isModNoAmmo = false;
|
||||||
|
b.isModAmmoFromHealth = false;
|
||||||
mech.Fx = 0.015;
|
mech.Fx = 0.015;
|
||||||
mech.jumpForce = 0.38;
|
mech.jumpForce = 0.38;
|
||||||
mech.maxHealth = 1;
|
mech.maxHealth = 1;
|
||||||
mech.fieldEnergyMax = 1;
|
mech.fieldEnergyMax = 1;
|
||||||
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun is flak
|
||||||
|
if (b.guns[i].name === "flak") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack;
|
||||||
|
}
|
||||||
for (let i = 0; i < b.mods.length; i++) {
|
for (let i = 0; i < b.mods.length; i++) {
|
||||||
b.mods[i].count = 0
|
b.mods[i].count = 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
modOnHealthChange() {
|
modOnHealthChange() {
|
||||||
if (b.isModAcidDmg && mech.health > 0.9) {
|
if (b.isModAcidDmg && mech.health > 0.8) {
|
||||||
game.playerDmgColor = "rgba(0,80,80,0.9)"
|
game.playerDmgColor = "rgba(0,80,80,0.9)"
|
||||||
b.modAcidDmg = 1.4
|
b.modAcidDmg = 1.1
|
||||||
} else {
|
} else {
|
||||||
game.playerDmgColor = "rgba(0,0,0,0.7)"
|
game.playerDmgColor = "rgba(0,0,0,0.7)"
|
||||||
b.modAcidDmg = 0
|
b.modAcidDmg = 0
|
||||||
@@ -101,11 +112,11 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "fluoroantimonic acid",
|
name: "fluoroantimonic acid",
|
||||||
description: "each <strong>bullet</strong> does extra chemical <strong class='color-d'>damage</strong><br>only <strong>active</strong> when you are above <strong>90% health</strong>",
|
description: "each <strong>bullet</strong> does extra chemical <strong class='color-d'>damage</strong><br>only <strong>active</strong> when you are above <strong>80% health</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return true
|
return mech.health > 0.8
|
||||||
},
|
},
|
||||||
effect() {
|
effect() {
|
||||||
b.isModAcidDmg = true;
|
b.isModAcidDmg = true;
|
||||||
@@ -138,11 +149,11 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "quasistatic equilibrium",
|
name: "quasistatic equilibrium",
|
||||||
description: "do extra <strong class='color-d'>damage</strong> at low health<br><em>up to 50% increase when near death</em>",
|
description: "do extra <strong class='color-d'>damage</strong> at low health<br><em>up to <strong>50%</strong> increase when near death</em>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return true
|
return mech.health < 0.75
|
||||||
},
|
},
|
||||||
effect() {
|
effect() {
|
||||||
b.isModLowHealthDmg = true; //used in mob.damage()
|
b.isModLowHealthDmg = true; //used in mob.damage()
|
||||||
@@ -150,7 +161,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "high explosives",
|
name: "high explosives",
|
||||||
description: "<strong class='color-e'>explosions</strong> do +20% more <strong class='color-d'>damage</strong><br><strong class='color-e'>explosive</strong> area is +44% <strong>larger</strong>",
|
description: "<strong class='color-e'>explosions</strong> do <strong>+20%</strong> more <strong class='color-d'>damage</strong><br><strong class='color-e'>explosive</strong> area is +44% <strong>larger</strong>",
|
||||||
maxCount: 3,
|
maxCount: 3,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -174,7 +185,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "auto-loading heuristics",
|
name: "auto-loading heuristics",
|
||||||
description: "your <strong>delay</strong> after firing is +14% <strong>shorter</strong>",
|
description: "your <strong>delay</strong> after firing is <strong>+14% shorter</strong>",
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -186,7 +197,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "desublimated ammunition",
|
name: "desublimated ammunition",
|
||||||
description: "use 50% less <strong>ammo</strong> when <strong>crouching</strong>",
|
description: "use <strong>50%</strong> less <strong>ammo</strong> when <strong>crouching</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -198,11 +209,11 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Lorentzian topology",
|
name: "Lorentzian topology",
|
||||||
description: "your <strong>bullets</strong> last +33% <strong>longer</strong>",
|
description: "your <strong>bullets</strong> last <strong>+33% longer</strong>",
|
||||||
maxCount: 3,
|
maxCount: 3,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return true
|
return b.haveGunCheck("spores") || b.haveGunCheck("drones") || b.haveGunCheck("super balls") || b.haveGunCheck("foam")
|
||||||
},
|
},
|
||||||
effect() {
|
effect() {
|
||||||
b.isModBulletsLastLonger += 0.33
|
b.isModBulletsLastLonger += 0.33
|
||||||
@@ -219,7 +230,7 @@ const b = {
|
|||||||
effect() {
|
effect() {
|
||||||
b.modSpores += 0.11;
|
b.modSpores += 0.11;
|
||||||
for (let i = 0; i < 10; i++) {
|
for (let i = 0; i < 10; i++) {
|
||||||
b.spore(player) //spawn drone
|
b.spore(player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -270,7 +281,7 @@ const b = {
|
|||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return true
|
return mech.fieldUpgrades[mech.fieldMode].name !== "time dilation field" && mech.fieldUpgrades[mech.fieldMode].name !== "phase decoherence field"
|
||||||
},
|
},
|
||||||
effect() {
|
effect() {
|
||||||
b.modBlockDmg += 0.7 //if you change this value also update the for loop in the electricity graphics in mech.pushMass
|
b.modBlockDmg += 0.7 //if you change this value also update the for loop in the electricity graphics in mech.pushMass
|
||||||
@@ -278,7 +289,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "entanglement",
|
name: "entanglement",
|
||||||
description: "when your first gun is equipped<br>reduce <strong>harm</strong> by <strong>10%</strong> for each gun you have",
|
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,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -303,7 +314,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Calvatia",
|
name: "basidio-stomp",
|
||||||
description: "hard landings disrupt <strong style='letter-spacing: 2px;'>spores</strong> from the ground",
|
description: "hard landings disrupt <strong style='letter-spacing: 2px;'>spores</strong> from the ground",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -316,7 +327,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Pauli exclusion",
|
name: "Pauli exclusion",
|
||||||
description: `unable to <strong>collide</strong> with enemies for +2 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`,
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -329,7 +340,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "annihilation",
|
name: "annihilation",
|
||||||
description: "after <strong>touching</strong> enemies, they are annihilated",
|
description: "after <strong>touching</strong> enemies, they are <strong>annihilated</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -409,7 +420,7 @@ const b = {
|
|||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return true
|
return mech.health < 0.7
|
||||||
},
|
},
|
||||||
effect() {
|
effect() {
|
||||||
b.modRecursiveHealing += 1
|
b.modRecursiveHealing += 1
|
||||||
@@ -417,7 +428,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "mass-energy equivalence",
|
name: "mass-energy equivalence",
|
||||||
description: "power ups fill your <strong class='color-f'>energy</strong> and <strong class='color-h'>heal</strong> for +5%",
|
description: "power ups fill your <strong class='color-f'>energy</strong> and <strong class='color-h'>heal</strong> for <strong>+5%</strong><br><em>applies to guns, ammo, fields, mods, and heals</em>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -452,6 +463,36 @@ const b = {
|
|||||||
b.isModBayesian = 0.20;
|
b.isModBayesian = 0.20;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "catabolism",
|
||||||
|
description: "when you <strong>fire</strong> while <strong>out</strong> of <strong>ammo</strong><br>convert <strong>5%</strong> health into an <strong>ammo</strong> power up",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
effect: () => {
|
||||||
|
b.isModAmmoFromHealth = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "leveraged investment",
|
||||||
|
description: "<strong>remove</strong> all future <strong>ammo</strong> power ups<br>spawn 6 <strong class='color-m'>mods</strong> and 3 <strong class='color-h'>healing</strong> power ups",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
effect: () => {
|
||||||
|
b.isModNoAmmo = true;
|
||||||
|
for (let i = 0; i < 6; i++) { // spawn new mods
|
||||||
|
powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
|
||||||
|
}
|
||||||
|
for (let i = 0; i < 3; i++) { // spawn new mods
|
||||||
|
powerUps.spawn(mech.pos.x, mech.pos.y, "heal");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "+1 cardinality",
|
name: "+1 cardinality",
|
||||||
description: "one extra <strong>choice</strong> when selecting <strong>power ups</strong>",
|
description: "one extra <strong>choice</strong> when selecting <strong>power ups</strong>",
|
||||||
@@ -481,20 +522,32 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "brushless motors",
|
name: "redundant systems",
|
||||||
description: "your <strong>drones</strong> accelerate 33% <strong>faster</strong>",
|
description: "<strong>drone</strong> collisions no longer reduce their <strong>lifespan</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return b.haveGunCheck("drones")
|
return b.haveGunCheck("drones") || mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing"
|
||||||
},
|
},
|
||||||
effect() {
|
effect() {
|
||||||
b.isModFastDrones = true
|
b.isModDroneCollide = true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "super duper balls",
|
name: "tinsellated flagella",
|
||||||
description: "your <strong>super balls</strong> fire +1 extra ball",
|
description: "your <strong style='letter-spacing: 2px;'>spores</strong> accelerate <strong>33% faster</strong>",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return b.haveGunCheck("spores") || b.modSpores > 0 || b.isModStomp
|
||||||
|
},
|
||||||
|
effect() {
|
||||||
|
b.isModFastSpores = true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "super duper",
|
||||||
|
description: "you fire <strong>+1</strong> additional <strong>super ball</strong>",
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -504,7 +557,32 @@ const b = {
|
|||||||
b.modSuperBallNumber++
|
b.modSuperBallNumber++
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "specular reflection",
|
||||||
|
description: "your <strong>laser</strong> gains <strong>+1</strong> reflection",
|
||||||
|
maxCount: 9,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return b.haveGunCheck("laser")
|
||||||
|
},
|
||||||
|
effect() {
|
||||||
|
b.modLaserReflections++;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "optimized shell packing",
|
||||||
|
description: "<strong>flak</strong> ammo drops contain <strong>2x</strong> more shells",
|
||||||
|
maxCount: 3,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return b.haveGunCheck("flak")
|
||||||
|
},
|
||||||
|
effect() {
|
||||||
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun is flak
|
||||||
|
if (b.guns[i].name === "flak") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * (2 + this.count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
],
|
],
|
||||||
giveMod(index = 'random') {
|
giveMod(index = 'random') {
|
||||||
if (index === 'random') {
|
if (index === 'random') {
|
||||||
@@ -556,7 +634,12 @@ const b = {
|
|||||||
game.updateGunHUD();
|
game.updateGunHUD();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mech.fireCDcycle = mech.cycle + 30; //cooldown
|
|
||||||
|
if (b.isModAmmoFromHealth && mech.health > 0.05) {
|
||||||
|
mech.damage(0.05);
|
||||||
|
powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
|
||||||
|
}
|
||||||
|
mech.fireCDcycle = mech.cycle + 30; //fire cooldown
|
||||||
// game.makeTextLog("<div style='font-size:140%;'>NO AMMO</div><strong class = 'box'>E</strong> / <strong class = 'box'>Q</strong>", 200);
|
// game.makeTextLog("<div style='font-size:140%;'>NO AMMO</div><strong class = 'box'>E</strong> / <strong class = 'box'>Q</strong>", 200);
|
||||||
game.replaceTextLog = true;
|
game.replaceTextLog = true;
|
||||||
game.makeTextLog("<div style='font-size:140%;'>NO AMMO</div> <p style='font-size:90%;'><strong>Q</strong>, <strong>E</strong>, and <strong>mouse wheel</strong> change weapons</p>", 200);
|
game.makeTextLog("<div style='font-size:140%;'>NO AMMO</div> <p style='font-size:90%;'><strong>Q</strong>, <strong>E</strong>, and <strong>mouse wheel</strong> change weapons</p>", 200);
|
||||||
@@ -922,6 +1005,7 @@ const b = {
|
|||||||
angle: Math.random() * 2 * Math.PI,
|
angle: Math.random() * 2 * Math.PI,
|
||||||
friction: 0,
|
friction: 0,
|
||||||
frictionAir: 0.025,
|
frictionAir: 0.025,
|
||||||
|
thrust: b.isModFastSpores ? 0.0008 : 0.0004,
|
||||||
dmg: 2.2, //damage done in addition to the damage from momentum
|
dmg: 2.2, //damage done in addition to the damage from momentum
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
@@ -956,9 +1040,8 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//accelerate towards mobs
|
//accelerate towards mobs
|
||||||
const THRUST = 0.0004
|
|
||||||
if (this.lockedOn && this.lockedOn.alive) {
|
if (this.lockedOn && this.lockedOn.alive) {
|
||||||
this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, this.lockedOn.position)), -this.mass * THRUST)
|
this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, this.lockedOn.position)), -this.mass * this.thrust)
|
||||||
// this.force.x -= THRUST * this.lockedOn.x
|
// this.force.x -= THRUST * this.lockedOn.x
|
||||||
// this.force.y -= THRUST * this.lockedOn.y
|
// this.force.y -= THRUST * this.lockedOn.y
|
||||||
} else {
|
} else {
|
||||||
@@ -976,7 +1059,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
drone(speed = 1) {
|
drone(speed = 1) {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
const THRUST = b.isModFastDrones ? 0.002 : 0.0015
|
const THRUST = 0.0015
|
||||||
const dir = mech.angle + 0.2 * (Math.random() - 0.5);
|
const dir = mech.angle + 0.2 * (Math.random() - 0.5);
|
||||||
const RADIUS = (4.5 + 3 * Math.random()) * b.modBulletSize
|
const RADIUS = (4.5 + 3 * Math.random()) * b.modBulletSize
|
||||||
bullet[me] = Bodies.polygon(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 8, RADIUS, {
|
bullet[me] = Bodies.polygon(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 8, RADIUS, {
|
||||||
@@ -998,7 +1081,7 @@ const b = {
|
|||||||
isFollowMouse: true,
|
isFollowMouse: true,
|
||||||
onDmg() {
|
onDmg() {
|
||||||
this.lockedOn = null
|
this.lockedOn = null
|
||||||
if (this.endCycle > game.cycle + 180) {
|
if (this.endCycle > game.cycle + 180 && b.isModDroneCollide) {
|
||||||
this.endCycle -= 60
|
this.endCycle -= 60
|
||||||
if (game.cycle + 180 > this.endCycle) this.endCycle = game.cycle + 180
|
if (game.cycle + 180 > this.endCycle) this.endCycle = game.cycle + 180
|
||||||
}
|
}
|
||||||
@@ -1110,7 +1193,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
onEnd() {},
|
onEnd() {},
|
||||||
do() {
|
do() {
|
||||||
if (!(game.cycle % this.lookFrequency)) {
|
if (!(game.cycle % this.lookFrequency) && !mech.isStealth) {
|
||||||
let target
|
let target
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
||||||
@@ -1190,7 +1273,7 @@ const b = {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//find targets
|
//find targets
|
||||||
if (!(game.cycle % this.lookFrequency)) {
|
if (!(game.cycle % this.lookFrequency) && !mech.isStealth) {
|
||||||
this.lockedOn = null;
|
this.lockedOn = null;
|
||||||
let closeDist = this.range;
|
let closeDist = this.range;
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
@@ -1328,9 +1411,9 @@ const b = {
|
|||||||
b.muzzleFlash(35);
|
b.muzzleFlash(35);
|
||||||
// mobs.alert(650);
|
// mobs.alert(650);
|
||||||
const side = 13 * b.modBulletSize
|
const side = 13 * b.modBulletSize
|
||||||
for (let i = 0; i < 11; i++) {
|
for (let i = 0; i < 12; i++) {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
const dir = mech.angle + (Math.random() - 0.5) * (mech.crouch ? 0.35 : 1.1)
|
const dir = mech.angle + (Math.random() - 0.5) * (mech.crouch ? 0.40 : 1.2)
|
||||||
bullet[me] = Bodies.rectangle(mech.pos.x + 35 * Math.cos(mech.angle) + 15 * (Math.random() - 0.5), mech.pos.y + 35 * Math.sin(mech.angle) + 15 * (Math.random() - 0.5), side, side, b.fireAttributes(dir));
|
bullet[me] = Bodies.rectangle(mech.pos.x + 35 * Math.cos(mech.angle) + 15 * (Math.random() - 0.5), mech.pos.y + 35 * Math.sin(mech.angle) + 15 * (Math.random() - 0.5), side, side, b.fireAttributes(dir));
|
||||||
World.add(engine.world, bullet[me]); //add bullet to world
|
World.add(engine.world, bullet[me]); //add bullet to world
|
||||||
const SPEED = 50 + Math.random() * 10
|
const SPEED = 50 + Math.random() * 10
|
||||||
@@ -1479,7 +1562,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "missiles", //5
|
name: "missiles",
|
||||||
description: "fire missiles that accelerate towards enemies<br><strong class='color-e'>explodes</strong> when near target",
|
description: "fire missiles that accelerate towards enemies<br><strong class='color-e'>explodes</strong> when near target",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 4,
|
ammoPack: 4,
|
||||||
@@ -1577,10 +1660,11 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
name: "flak", //6
|
name: "flak",
|
||||||
description: "fire a cluster of short range projectiles<br><strong class='color-e'>explodes</strong> on contact or after half a second",
|
description: "fire a cluster of short range projectiles<br><strong class='color-e'>explodes</strong> on contact or after half a second",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 6,
|
ammoPack: 6,
|
||||||
|
defaultAmmoPack: 6, //use to revert ammoPack after mod changes drop rate
|
||||||
have: false,
|
have: false,
|
||||||
isStarterGun: true,
|
isStarterGun: true,
|
||||||
fire() {
|
fire() {
|
||||||
@@ -1820,7 +1904,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "drones", //11
|
name: "drones", //11
|
||||||
description: "deploy drones that <strong>crash</strong> into enemies<br>collisions reduce drone <strong>cycles</strong> by 1 second",
|
description: "deploy drones that <strong>crash</strong> into enemies<br>collisions reduce their <strong>lifespan</strong> by 1 second",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: (game.difficultyMode > 3) ? 8 : 10,
|
ammoPack: (game.difficultyMode > 3) ? 8 : 10,
|
||||||
have: false,
|
have: false,
|
||||||
@@ -1849,7 +1933,7 @@ const b = {
|
|||||||
frictionAir: 0.003,
|
frictionAir: 0.003,
|
||||||
friction: 0.2,
|
friction: 0.2,
|
||||||
restitution: 0.2,
|
restitution: 0.2,
|
||||||
dmg: 0, //damage done in addition to the damage from momentum
|
dmg: 0.1, //damage done in addition to the damage from momentum
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
@@ -1954,8 +2038,6 @@ const b = {
|
|||||||
bullet[me].endCycle = Infinity
|
bullet[me].endCycle = Infinity
|
||||||
bullet[me].charge = 0;
|
bullet[me].charge = 0;
|
||||||
bullet[me].do = function () {
|
bullet[me].do = function () {
|
||||||
const FIELD_DRAIN = 0.002 //laser drains energy as well as bullets
|
|
||||||
|
|
||||||
if ((!game.mouseDown && this.charge > 0.6)) { //fire on mouse release
|
if ((!game.mouseDown && this.charge > 0.6)) { //fire on mouse release
|
||||||
//normal bullet behavior occurs after firing, overwrite this function
|
//normal bullet behavior occurs after firing, overwrite this function
|
||||||
this.do = function () {
|
this.do = function () {
|
||||||
@@ -2014,7 +2096,7 @@ const b = {
|
|||||||
this.charge = this.charge * chargeRate + (1 - chargeRate) // this.charge converges to 1
|
this.charge = this.charge * chargeRate + (1 - chargeRate) // this.charge converges to 1
|
||||||
mech.fieldMeter -= (this.charge - lastCharge) * 0.28 //energy drain is proportional to charge gained, but doesn't stop normal mech.fieldRegen
|
mech.fieldMeter -= (this.charge - lastCharge) * 0.28 //energy drain is proportional to charge gained, but doesn't stop normal mech.fieldRegen
|
||||||
|
|
||||||
//draw laser targeting
|
//draw targeting
|
||||||
let best;
|
let best;
|
||||||
let range = 3000
|
let range = 3000
|
||||||
const dir = mech.angle
|
const dir = mech.angle
|
||||||
@@ -2087,7 +2169,7 @@ const b = {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//draw laser beam
|
//draw beam
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
ctx.moveTo(path[0].x, path[0].y);
|
ctx.moveTo(path[0].x, path[0].y);
|
||||||
ctx.lineTo(path[1].x, path[1].y);
|
ctx.lineTo(path[1].x, path[1].y);
|
||||||
@@ -2136,12 +2218,20 @@ const b = {
|
|||||||
isStarterGun: true,
|
isStarterGun: true,
|
||||||
fire() {
|
fire() {
|
||||||
const FIELD_DRAIN = 0.0018 //laser drains energy as well as bullets
|
const FIELD_DRAIN = 0.0018 //laser drains energy as well as bullets
|
||||||
const damage = 0.05
|
const reflectivity = 1 - 1 / (b.modLaserReflections * 1.5)
|
||||||
|
let damage = b.dmgScale * 0.05
|
||||||
if (mech.fieldMeter < FIELD_DRAIN) {
|
if (mech.fieldMeter < FIELD_DRAIN) {
|
||||||
mech.fireCDcycle = mech.cycle + 100; // cool down if out of energy
|
mech.fireCDcycle = mech.cycle + 100; // cool down if out of energy
|
||||||
} else {
|
} else {
|
||||||
mech.fieldMeter -= mech.fieldRegen + FIELD_DRAIN
|
mech.fieldMeter -= mech.fieldRegen + FIELD_DRAIN
|
||||||
let best;
|
let best = {
|
||||||
|
x: null,
|
||||||
|
y: null,
|
||||||
|
dist2: Infinity,
|
||||||
|
who: null,
|
||||||
|
v1: null,
|
||||||
|
v2: null
|
||||||
|
};
|
||||||
const color = "#f00";
|
const color = "#f00";
|
||||||
const range = 3000;
|
const range = 3000;
|
||||||
const path = [{
|
const path = [{
|
||||||
@@ -2207,92 +2297,71 @@ const b = {
|
|||||||
vertexCollision(path[path.length - 2], path[path.length - 1], map);
|
vertexCollision(path[path.length - 2], path[path.length - 1], map);
|
||||||
vertexCollision(path[path.length - 2], path[path.length - 1], body);
|
vertexCollision(path[path.length - 2], path[path.length - 1], body);
|
||||||
};
|
};
|
||||||
const laserHitMob = function (dmg) {
|
const laserHitMob = function () {
|
||||||
if (best.who.alive) {
|
if (best.who.alive) {
|
||||||
dmg *= b.dmgScale * damage;
|
best.who.damage(damage);
|
||||||
best.who.damage(dmg);
|
|
||||||
best.who.locatePlayer();
|
best.who.locatePlayer();
|
||||||
//draw mob damage circle
|
ctx.fillStyle = color; //draw mob damage circle
|
||||||
ctx.fillStyle = color;
|
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
ctx.arc(path[path.length - 1].x, path[path.length - 1].y, Math.sqrt(dmg) * 100, 0, 2 * Math.PI);
|
ctx.arc(path[path.length - 1].x, path[path.length - 1].y, Math.sqrt(damage) * 100, 0, 2 * Math.PI);
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
const reflection = function () { // https://math.stackexchange.com/questions/13261/how-to-get-a-reflection-vector
|
||||||
const reflection = function () {
|
|
||||||
// https://math.stackexchange.com/questions/13261/how-to-get-a-reflection-vector
|
|
||||||
const n = Vector.perp(Vector.normalise(Vector.sub(best.v1, best.v2)));
|
const n = Vector.perp(Vector.normalise(Vector.sub(best.v1, best.v2)));
|
||||||
const d = Vector.sub(path[path.length - 1], path[path.length - 2]);
|
const d = Vector.sub(path[path.length - 1], path[path.length - 2]);
|
||||||
const nn = Vector.mult(n, 2 * Vector.dot(d, n));
|
const nn = Vector.mult(n, 2 * Vector.dot(d, n));
|
||||||
const r = Vector.normalise(Vector.sub(d, nn));
|
const r = Vector.normalise(Vector.sub(d, nn));
|
||||||
path[path.length] = Vector.add(Vector.mult(r, range), path[path.length - 1]);
|
path[path.length] = Vector.add(Vector.mult(r, range), path[path.length - 1]);
|
||||||
};
|
};
|
||||||
//beam before reflection
|
|
||||||
checkForCollisions();
|
checkForCollisions();
|
||||||
if (best.dist2 != Infinity) {
|
let lastBestOdd
|
||||||
|
let lastBestEven = best.who //used in hack below
|
||||||
|
if (best.dist2 !== Infinity) {
|
||||||
//if hitting something
|
//if hitting something
|
||||||
path[path.length - 1] = {
|
path[path.length - 1] = {
|
||||||
x: best.x,
|
x: best.x,
|
||||||
y: best.y
|
y: best.y
|
||||||
};
|
};
|
||||||
laserHitMob(1);
|
laserHitMob();
|
||||||
|
for (let i = 0; i < b.modLaserReflections; i++) {
|
||||||
|
reflection();
|
||||||
|
checkForCollisions();
|
||||||
|
if (best.dist2 !== Infinity) { //if hitting something
|
||||||
|
lastReflection = best
|
||||||
|
|
||||||
//1st reflection beam
|
path[path.length - 1] = {
|
||||||
reflection();
|
x: best.x,
|
||||||
//ugly bug fix: this stops the reflection on a bug where the beam gets trapped inside a body
|
y: best.y
|
||||||
let who = best.who;
|
};
|
||||||
checkForCollisions();
|
damage *= reflectivity
|
||||||
if (best.dist2 != Infinity) {
|
laserHitMob();
|
||||||
//if hitting something
|
//I'm not clear on how this works, but it gets ride of a bug where the laser reflects inside a block, often vertically.
|
||||||
path[path.length - 1] = {
|
//I think it checks to see if the laser is reflecting off a different part of the same block, if it is "inside" a block
|
||||||
x: best.x,
|
if (i % 2) {
|
||||||
y: best.y
|
if (lastBestOdd === best.who) break
|
||||||
};
|
} else {
|
||||||
laserHitMob(0.8);
|
lastBestOdd = best.who
|
||||||
|
if (lastBestEven === best.who) break
|
||||||
//2nd reflection beam
|
|
||||||
//ugly bug fix: this stops the reflection on a bug where the beam gets trapped inside a body
|
|
||||||
if (who !== best.who) {
|
|
||||||
reflection();
|
|
||||||
checkForCollisions();
|
|
||||||
if (best.dist2 != Infinity) {
|
|
||||||
//if hitting something
|
|
||||||
path[path.length - 1] = {
|
|
||||||
x: best.x,
|
|
||||||
y: best.y
|
|
||||||
};
|
|
||||||
laserHitMob(0.63);
|
|
||||||
|
|
||||||
|
|
||||||
reflection();
|
|
||||||
checkForCollisions();
|
|
||||||
if (best.dist2 != Infinity) {
|
|
||||||
//if hitting something
|
|
||||||
path[path.length - 1] = {
|
|
||||||
x: best.x,
|
|
||||||
y: best.y
|
|
||||||
};
|
|
||||||
laserHitMob(0.5);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.fillStyle = color;
|
ctx.fillStyle = color;
|
||||||
ctx.strokeStyle = color;
|
ctx.strokeStyle = color;
|
||||||
ctx.lineWidth = 2;
|
ctx.lineWidth = 2;
|
||||||
ctx.lineDashOffset = 300 * Math.random()
|
ctx.lineDashOffset = 300 * Math.random()
|
||||||
// ctx.setLineDash([200 * Math.random(), 250 * Math.random()]);
|
|
||||||
|
|
||||||
ctx.setLineDash([50 + 120 * Math.random(), 50 * Math.random()]);
|
ctx.setLineDash([50 + 120 * Math.random(), 50 * Math.random()]);
|
||||||
for (let i = 1, len = path.length; i < len; ++i) {
|
for (let i = 1, len = path.length; i < len; ++i) {
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
ctx.moveTo(path[i - 1].x, path[i - 1].y);
|
ctx.moveTo(path[i - 1].x, path[i - 1].y);
|
||||||
ctx.lineTo(path[i].x, path[i].y);
|
ctx.lineTo(path[i].x, path[i].y);
|
||||||
ctx.stroke();
|
ctx.stroke();
|
||||||
ctx.globalAlpha *= 0.65; //reflections are less intense
|
ctx.globalAlpha *= reflectivity; //reflections are less intense
|
||||||
// ctx.globalAlpha -= 0.1; //reflections are less intense
|
|
||||||
}
|
}
|
||||||
ctx.setLineDash([0, 0]);
|
ctx.setLineDash([0, 0]);
|
||||||
ctx.globalAlpha = 1;
|
ctx.globalAlpha = 1;
|
||||||
|
|||||||
@@ -100,7 +100,9 @@ function collisionChecks(event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function collidePlayer(obj, speedThreshold = 12, massThreshold = 2) {
|
function collidePlayer(obj, speedThreshold = 12, massThreshold = 2) {
|
||||||
if (obj.classType === "body" && obj.speed > speedThreshold && obj.mass > massThreshold) { //dmg from hitting a body
|
//player dmg from hitting a body
|
||||||
|
if (obj.classType === "body" && obj.speed > speedThreshold && obj.mass > massThreshold &&
|
||||||
|
(obj.velocity.y > 0 || player.velocity.y > 0)) {
|
||||||
const v = Vector.magnitude(Vector.sub(player.velocity, obj.velocity));
|
const v = Vector.magnitude(Vector.sub(player.velocity, obj.velocity));
|
||||||
if (v > speedThreshold && mech.collisionImmune < mech.cycle) {
|
if (v > speedThreshold && mech.collisionImmune < mech.cycle) {
|
||||||
mech.collisionImmune = mech.cycle + b.modCollisionImmuneCycles; //player is immune to collision damage for 30 cycles
|
mech.collisionImmune = mech.cycle + b.modCollisionImmuneCycles; //player is immune to collision damage for 30 cycles
|
||||||
|
|||||||
@@ -557,7 +557,6 @@ const game = {
|
|||||||
game.reset();
|
game.reset();
|
||||||
game.firstRun = false;
|
game.firstRun = false;
|
||||||
|
|
||||||
|
|
||||||
//setup FPS cap
|
//setup FPS cap
|
||||||
game.fpsInterval = 1000 / game.fpsCap;
|
game.fpsInterval = 1000 / game.fpsCap;
|
||||||
game.then = Date.now();
|
game.then = Date.now();
|
||||||
|
|||||||
27
js/index.js
27
js/index.js
@@ -2,9 +2,18 @@
|
|||||||
/* TODO: *******************************************
|
/* TODO: *******************************************
|
||||||
*****************************************************
|
*****************************************************
|
||||||
|
|
||||||
add difficulty slider to custom?
|
speed up movement
|
||||||
|
higher gravity, larger jump force
|
||||||
|
faster horizontal acceleration
|
||||||
|
only increase top speed a bit
|
||||||
|
|
||||||
phase decoherence energy drain is proportional to player speed
|
mod: if you fire when out of ammo you gain 1 ammo pack at the cost of
|
||||||
|
10% max health
|
||||||
|
20% of your current health
|
||||||
|
|
||||||
|
mob: targeting laser, then a high speed, no gravity bullet
|
||||||
|
|
||||||
|
add difficulty slider to custom?
|
||||||
|
|
||||||
add recursive mod counts to pause screen
|
add recursive mod counts to pause screen
|
||||||
|
|
||||||
@@ -14,8 +23,6 @@ key required to open the exit to some levels
|
|||||||
|
|
||||||
css transition for pause menu
|
css transition for pause menu
|
||||||
|
|
||||||
mod: remove all ammo drops from the game, but double player damage
|
|
||||||
|
|
||||||
mod: like Born rule, but for guns
|
mod: like Born rule, but for guns
|
||||||
|
|
||||||
field that pushes everything back, and can destroy smaller blocks
|
field that pushes everything back, and can destroy smaller blocks
|
||||||
@@ -23,6 +30,7 @@ field that pushes everything back, and can destroy smaller blocks
|
|||||||
|
|
||||||
mod: make player invisible when...
|
mod: make player invisible when...
|
||||||
use the flag from phase field
|
use the flag from phase field
|
||||||
|
when health is low?
|
||||||
|
|
||||||
field: a larger radius that attracted enemies
|
field: a larger radius that attracted enemies
|
||||||
still deflected them near the robot
|
still deflected them near the robot
|
||||||
@@ -60,10 +68,6 @@ mod: do something at the end of each level
|
|||||||
take no damage
|
take no damage
|
||||||
don't shoot
|
don't shoot
|
||||||
|
|
||||||
mod: if you fire when out of ammo you gain 1 ammo pack at the cost of
|
|
||||||
10% max health
|
|
||||||
20% of your current health
|
|
||||||
|
|
||||||
gun: Spirit Bomb (singularity)
|
gun: Spirit Bomb (singularity)
|
||||||
use charge up like rail gun
|
use charge up like rail gun
|
||||||
electricity graphics like plasma torch
|
electricity graphics like plasma torch
|
||||||
@@ -243,7 +247,7 @@ const build = {
|
|||||||
text += `<div class="build-grid-module" onclick="build.choosePowerUp(this,${i},'gun')"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[i].name}</div> ${b.guns[i].description}</div>`
|
text += `<div class="build-grid-module" onclick="build.choosePowerUp(this,${i},'gun')"><div class="grid-title"><div class="circle-grid gun"></div> ${b.guns[i].name}</div> ${b.guns[i].description}</div>`
|
||||||
}
|
}
|
||||||
for (let i = 0, len = b.mods.length; i < len; i++) {
|
for (let i = 0, len = b.mods.length; i < len; i++) {
|
||||||
if (b.mods[i].name === "Born rule" || b.mods[i].name === "+1 cardinality") {
|
if (b.mods[i].name === "Born rule" || b.mods[i].name === "+1 cardinality" || b.mods[i].name === "leveraged investment") {
|
||||||
text += `<div class="build-grid-module" style="opacity:0.3;"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[i].name}</div> ${b.mods[i].description}</div>`
|
text += `<div class="build-grid-module" style="opacity:0.3;"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[i].name}</div> ${b.mods[i].description}</div>`
|
||||||
} else {
|
} else {
|
||||||
text += `<div class="build-grid-module" onclick="build.choosePowerUp(this,${i},'mod')"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[i].name}</div> ${b.mods[i].description}</div>`
|
text += `<div class="build-grid-module" onclick="build.choosePowerUp(this,${i},'mod')"><div class="grid-title"><div class="circle-grid mod"></div> ${b.mods[i].name}</div> ${b.mods[i].description}</div>`
|
||||||
@@ -318,8 +322,8 @@ const build = {
|
|||||||
document.getElementById("starting-level").innerHTML = `starting difficulty: <strong style="font-size:1.05em;">${difficulty}</strong>`
|
document.getElementById("starting-level").innerHTML = `starting difficulty: <strong style="font-size:1.05em;">${difficulty}</strong>`
|
||||||
},
|
},
|
||||||
startBuildRun() {
|
startBuildRun() {
|
||||||
|
spawn.setSpawnList(); //gives random mobs, not starter mobs
|
||||||
spawn.setSpawnList();
|
spawn.setSpawnList();
|
||||||
spawn.setSpawnList(); //gives random mobs, not starter
|
|
||||||
game.startGame();
|
game.startGame();
|
||||||
let difficulty = build.list.length * game.difficultyMode - 1
|
let difficulty = build.list.length * game.difficultyMode - 1
|
||||||
if (game.difficultyMode === 0) {
|
if (game.difficultyMode === 0) {
|
||||||
@@ -330,6 +334,9 @@ const build = {
|
|||||||
level.difficultyIncrease(difficulty)
|
level.difficultyIncrease(difficulty)
|
||||||
|
|
||||||
level.isBuildRun = true;
|
level.isBuildRun = true;
|
||||||
|
build.givePowerUps();
|
||||||
|
},
|
||||||
|
givePowerUps() {
|
||||||
for (let i = 0; i < build.list.length; i++) {
|
for (let i = 0; i < build.list.length; i++) {
|
||||||
if (build.list[i].type === "field") {
|
if (build.list[i].type === "field") {
|
||||||
mech.setField(build.list[i].index)
|
mech.setField(build.list[i].index)
|
||||||
|
|||||||
112
js/level.js
112
js/level.js
@@ -13,17 +13,13 @@ const level = {
|
|||||||
levelsCleared: 0,
|
levelsCleared: 0,
|
||||||
start() {
|
start() {
|
||||||
if (level.levelsCleared === 0) {
|
if (level.levelsCleared === 0) {
|
||||||
// level.difficultyIncrease(15)
|
// level.difficultyIncrease(5)
|
||||||
b.giveGuns("super balls")
|
// b.giveGuns("laser")
|
||||||
// mech.setField("phase decoherence field")
|
// mech.setField("phase decoherence field")
|
||||||
// b.giveMod("squirrel-cage rotor");
|
// b.giveMod("optimized shell packing");
|
||||||
b.giveMod("super duper balls");
|
|
||||||
b.giveMod("super duper balls");
|
|
||||||
b.giveMod("super duper balls");
|
|
||||||
|
|
||||||
|
level.intro(); //starting level
|
||||||
// level.intro(); //starting level
|
// level.testingMap();
|
||||||
level.testingMap();
|
|
||||||
// level.bosses();
|
// level.bosses();
|
||||||
// level.satellite();
|
// level.satellite();
|
||||||
// level.skyscrapers();
|
// level.skyscrapers();
|
||||||
@@ -38,6 +34,7 @@ const level = {
|
|||||||
level[level.levels[level.onLevel]](); //picks the current map from the the levels array
|
level[level.levels[level.onLevel]](); //picks the current map from the the levels array
|
||||||
level.levelAnnounce();
|
level.levelAnnounce();
|
||||||
}
|
}
|
||||||
|
// if (level.isBuildRun) build.givePowerUps();
|
||||||
game.noCameraScroll();
|
game.noCameraScroll();
|
||||||
game.setZoom();
|
game.setZoom();
|
||||||
level.addToWorld(); //add bodies to game engine
|
level.addToWorld(); //add bodies to game engine
|
||||||
@@ -54,26 +51,39 @@ const level = {
|
|||||||
// if (level.isBuildRun) num++
|
// if (level.isBuildRun) num++
|
||||||
for (let i = 0; i < num; i++) {
|
for (let i = 0; i < num; i++) {
|
||||||
game.difficulty++
|
game.difficulty++
|
||||||
game.dmgScale += 0.13; //damage done by mobs increases each level
|
game.dmgScale += 0.17; //damage done by mobs increases each level
|
||||||
b.dmgScale *= 0.93; //damage done by player decreases each level
|
b.dmgScale *= 0.91; //damage done by player decreases each level
|
||||||
game.accelScale *= 1.02 //mob acceleration increases each level
|
game.accelScale *= 1.02 //mob acceleration increases each level
|
||||||
game.lookFreqScale *= 0.98 //mob cycles between looks decreases each level
|
game.lookFreqScale *= 0.98 //mob cycles between looks decreases each level
|
||||||
game.CDScale *= 0.97 //mob CD time decreases each level
|
game.CDScale *= 0.97 //mob CD time decreases each level
|
||||||
}
|
}
|
||||||
game.healScale = 1 / (1 + game.difficulty * 0.065) //a higher denominator makes for lower heals // mech.health += heal * game.healScale;
|
game.healScale = 1 / (1 + game.difficulty * 0.09) //a higher denominator makes for lower heals // mech.health += heal * game.healScale;
|
||||||
},
|
},
|
||||||
difficultyDecrease(num = 1) { //used in easy mode for game.reset()
|
difficultyDecrease(num = 1) { //used in easy mode for game.reset()
|
||||||
for (let i = 0; i < num; i++) {
|
for (let i = 0; i < num; i++) {
|
||||||
game.difficulty--
|
game.difficulty--
|
||||||
game.dmgScale -= 0.13; //damage done by mobs increases each level
|
game.dmgScale -= 0.17; //damage done by mobs increases each level
|
||||||
if (game.dmgScale < 0.1) game.dmgScale = 0.1;
|
if (game.dmgScale < 0.1) game.dmgScale = 0.1;
|
||||||
b.dmgScale /= 0.93; //damage done by player decreases each level
|
b.dmgScale /= 0.91; //damage done by player decreases each level
|
||||||
game.accelScale /= 1.02 //mob acceleration increases each level
|
game.accelScale /= 1.02 //mob acceleration increases each level
|
||||||
game.lookFreqScale /= 0.98 //mob cycles between looks decreases each level
|
game.lookFreqScale /= 0.98 //mob cycles between looks decreases each level
|
||||||
game.CDScale /= 0.97 //mob CD time decreases each level
|
game.CDScale /= 0.97 //mob CD time decreases each level
|
||||||
}
|
}
|
||||||
if (game.difficulty < 1) game.difficulty = 1;
|
if (game.difficulty < 1) game.difficulty = 1;
|
||||||
game.healScale = 1 / (1 + game.difficulty * 0.065)
|
game.healScale = 1 / (1 + game.difficulty * 0.09)
|
||||||
|
},
|
||||||
|
levelAnnounce() {
|
||||||
|
let mode = document.getElementById("difficulty-select").value
|
||||||
|
if (mode === "0") {
|
||||||
|
mode = "(easy)"
|
||||||
|
} else if (mode === "1") {
|
||||||
|
mode = "(normal)"
|
||||||
|
} else if (mode === "2") {
|
||||||
|
mode = "(hard)"
|
||||||
|
} else if (mode === "4") {
|
||||||
|
mode = "(why)"
|
||||||
|
}
|
||||||
|
document.title = "n-gon: L" + (level.levelsCleared) + " " + level.levels[level.onLevel] + " " + mode;
|
||||||
},
|
},
|
||||||
//******************************************************************************************************************
|
//******************************************************************************************************************
|
||||||
//******************************************************************************************************************
|
//******************************************************************************************************************
|
||||||
@@ -1559,25 +1569,32 @@ const level = {
|
|||||||
spawn.randomBoss(1800, -800, -0.2);
|
spawn.randomBoss(1800, -800, -0.2);
|
||||||
spawn.randomBoss(4150, -1000, 0.6);
|
spawn.randomBoss(4150, -1000, 0.6);
|
||||||
|
|
||||||
if (game.difficulty > 2) { // tether ball
|
if (game.difficulty > 2) {
|
||||||
level.fillBG.push({
|
if (Math.random() < 0.7) {
|
||||||
x: 2495,
|
// tether ball
|
||||||
y: -500,
|
level.fillBG.push({
|
||||||
width: 10,
|
x: 2495,
|
||||||
height: 525,
|
y: -500,
|
||||||
color: "#ccc"
|
width: 10,
|
||||||
});
|
height: 525,
|
||||||
spawn.tetherBoss(2850, -80)
|
color: "#ccc"
|
||||||
cons[cons.length] = Constraint.create({
|
});
|
||||||
pointA: {
|
spawn.tetherBoss(2850, -80)
|
||||||
x: 2500,
|
cons[cons.length] = Constraint.create({
|
||||||
y: -500
|
pointA: {
|
||||||
},
|
x: 2500,
|
||||||
bodyB: mob[mob.length - 1],
|
y: -500
|
||||||
stiffness: 0.00012
|
},
|
||||||
});
|
bodyB: mob[mob.length - 1],
|
||||||
//chance to spawn a ring of exploding mobs around this boss
|
stiffness: 0.00012
|
||||||
if (game.difficulty > 4) spawn.nodeBoss(2850, -80, "spawns", 8, 20, 105);
|
});
|
||||||
|
//chance to spawn a ring of exploding mobs around this boss
|
||||||
|
if (game.difficulty > 4) spawn.nodeBoss(2850, -80, "spawns", 8, 20, 105);
|
||||||
|
} else if (game.difficulty > 3) {
|
||||||
|
spawn.shooterBoss(2200, -650);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
//*****************************************************************************************************************
|
//*****************************************************************************************************************
|
||||||
@@ -1763,32 +1780,7 @@ const level = {
|
|||||||
target.death();
|
target.death();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
levelAnnounce() {
|
addToWorld() {
|
||||||
let mode = document.getElementById("difficulty-select").value
|
|
||||||
if (mode === "0") {
|
|
||||||
mode = "(easy)"
|
|
||||||
} else if (mode === "1") {
|
|
||||||
mode = "(normal)"
|
|
||||||
} else if (mode === "2") {
|
|
||||||
mode = "(hard)"
|
|
||||||
} else if (mode === "6") {
|
|
||||||
mode = "(why)"
|
|
||||||
}
|
|
||||||
document.title = "n-gon: L" + (level.levelsCleared) + " " + level.levels[level.onLevel] + " " + mode;
|
|
||||||
// game.makeTextLog(`<div style='font-size: 25px;'>level ${game.difficulty} </div> <div style='font-size: 32px;'>${level.levels[level.onLevel]} </div>`, 300);
|
|
||||||
// if (game.difficulty === 0) text = "";
|
|
||||||
// text = "Level " + (game.difficulty + 1) + ": " + spawn.pickList[0] + "s + " + spawn.pickList[1] + "s";
|
|
||||||
|
|
||||||
// text = text + " with population: ";
|
|
||||||
// for (let i = 0, len = spawn.pickList.length; i < len; ++i) {
|
|
||||||
// if (spawn.pickList[i] != spawn.pickList[i - 1]) {
|
|
||||||
// text += spawn.pickList[i] + ", ";
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// this.speech(text);
|
|
||||||
// game.makeTextLog(text, 360);
|
|
||||||
},
|
|
||||||
addToWorld(mapName) {
|
|
||||||
//needs to be run to put bodies into the world
|
//needs to be run to put bodies into the world
|
||||||
for (let i = 0; i < body.length; i++) {
|
for (let i = 0; i < body.length; i++) {
|
||||||
//body[i].collisionFilter.group = 0;
|
//body[i].collisionFilter.group = 0;
|
||||||
|
|||||||
@@ -477,9 +477,9 @@ const mech = {
|
|||||||
|
|
||||||
//chance to build a drone on damage from mod
|
//chance to build a drone on damage from mod
|
||||||
if (b.isModDroneOnDamage) {
|
if (b.isModDroneOnDamage) {
|
||||||
const len = (dmg - 0.06 + 0.07 * Math.random()) / 0.05
|
const len = (dmg - 0.06 * Math.random()) * 40
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
if (Math.random() < 0.6) b.drone() //spawn drone
|
if (Math.random() < 0.75) b.drone() //spawn drone
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1512,7 +1512,7 @@ const mech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "phase decoherence field",
|
name: "phase decoherence field",
|
||||||
description: "use <strong class='color-f'>energy</strong> to to become <strong>intangible</strong><br><em style='opacity: 0.6;'>can't see or be seen outside field</em>",
|
description: "become <strong>intangible</strong> and <strong>invisible</strong><br>drains <strong class='color-f'>energy</strong> as you move",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
// mech.grabRange = 230
|
// mech.grabRange = 230
|
||||||
mech.hold = function () {
|
mech.hold = function () {
|
||||||
@@ -1523,7 +1523,7 @@ const mech = {
|
|||||||
mech.holding();
|
mech.holding();
|
||||||
mech.throwBlock();
|
mech.throwBlock();
|
||||||
} else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) {
|
} else if ((keys[32] || game.mouseDownRight) && mech.fieldCDcycle < mech.cycle) {
|
||||||
const DRAIN = 0.0015
|
const DRAIN = 0.0002 + 0.00027 * player.speed
|
||||||
if (mech.fieldMeter > DRAIN) {
|
if (mech.fieldMeter > DRAIN) {
|
||||||
mech.fieldMeter -= DRAIN;
|
mech.fieldMeter -= DRAIN;
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ const powerUps = {
|
|||||||
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())));
|
||||||
if (level.isBuildRun) ammo = Math.floor(ammo * 1.1) //extra ammo on build run because no ammo from getting a new gun
|
// if (level.isBuildRun) ammo = Math.floor(ammo * 1.1) //extra ammo on build run because no ammo from getting a new gun
|
||||||
target.ammo += ammo;
|
target.ammo += ammo;
|
||||||
game.updateGunHUD();
|
game.updateGunHUD();
|
||||||
game.makeTextLog("<div class='circle gun'></div> <span style='font-size:110%;'>+" + ammo + " ammo for " + target.name + "</span>", 300);
|
game.makeTextLog("<div class='circle gun'></div> <span style='font-size:110%;'>+" + ammo + " ammo for " + target.name + "</span>", 300);
|
||||||
@@ -227,17 +227,17 @@ const powerUps = {
|
|||||||
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "heal");
|
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "heal");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Math.random() < 0.15 && b.inventory.length > 0) {
|
if (Math.random() < 0.15 && b.inventory.length > 0 && !b.isModNoAmmo) {
|
||||||
powerUps.spawn(x, y, "ammo");
|
powerUps.spawn(x, y, "ammo");
|
||||||
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "ammo");
|
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "ammo");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Math.random() < 0.0025 * (3 - b.inventory.length)) { //a new gun has a low chance for each not acquired gun up to 3
|
if (Math.random() < 0.002 * (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() < b.isModBayesian) powerUps.spawn(x, y, "gun");
|
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "gun");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Math.random() < 0.003 * (12 - b.modCount)) { //a new mod has a low chance for each not acquired mod up to 7
|
if (Math.random() < 0.0027 * (14 - b.modCount)) { //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() < b.isModBayesian) powerUps.spawn(x, y, "mod");
|
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "mod");
|
||||||
return;
|
return;
|
||||||
@@ -252,13 +252,13 @@ const powerUps = {
|
|||||||
if (mech.fieldMode === 0) {
|
if (mech.fieldMode === 0) {
|
||||||
powerUps.spawn(x, y, "field")
|
powerUps.spawn(x, y, "field")
|
||||||
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "field")
|
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "field")
|
||||||
} else if (Math.random() < 0.75) {
|
} else if (Math.random() < 0.80) {
|
||||||
powerUps.spawn(x, y, "mod")
|
powerUps.spawn(x, y, "mod")
|
||||||
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "mod")
|
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "mod")
|
||||||
} else if (Math.random() < 0.2) {
|
} else if (Math.random() < 0.35) {
|
||||||
powerUps.spawn(x, y, "gun")
|
powerUps.spawn(x, y, "gun")
|
||||||
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "gun")
|
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "gun")
|
||||||
} else if (Math.random() < 0.6) {
|
} else if (Math.random() < 0.65) {
|
||||||
powerUps.spawn(x, y, "field");
|
powerUps.spawn(x, y, "field");
|
||||||
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "field");
|
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "field");
|
||||||
} else if (mech.health < 0.7) {
|
} else if (mech.health < 0.7) {
|
||||||
@@ -270,7 +270,7 @@ const powerUps = {
|
|||||||
powerUps.spawn(x, y, "heal");
|
powerUps.spawn(x, y, "heal");
|
||||||
powerUps.spawn(x, y, "heal");
|
powerUps.spawn(x, y, "heal");
|
||||||
}
|
}
|
||||||
} else {
|
} else if (!b.isModNoAmmo) {
|
||||||
powerUps.spawn(x, y, "ammo");
|
powerUps.spawn(x, y, "ammo");
|
||||||
powerUps.spawn(x, y, "ammo");
|
powerUps.spawn(x, y, "ammo");
|
||||||
powerUps.spawn(x, y, "ammo");
|
powerUps.spawn(x, y, "ammo");
|
||||||
@@ -286,7 +286,7 @@ const powerUps = {
|
|||||||
if (Math.random() < 0.5) {
|
if (Math.random() < 0.5) {
|
||||||
powerUps.spawn(x, y, "heal", false);
|
powerUps.spawn(x, y, "heal", false);
|
||||||
} else {
|
} else {
|
||||||
powerUps.spawn(x, y, "ammo", false);
|
if (!b.isModNoAmmo) powerUps.spawn(x, y, "ammo", false);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
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
|
||||||
|
|||||||
Reference in New Issue
Block a user