reworked text display, with colors

This commit is contained in:
landgreen
2019-11-03 15:54:34 -08:00
parent 3185c8c180
commit ed993eea21
8 changed files with 212 additions and 316 deletions

View File

@@ -29,7 +29,7 @@ const b = {
}, },
mods: [{ mods: [{
name: "depleted uranium rounds", name: "depleted uranium rounds",
description: "your bullets are <strong>larger</strong> and do more physical damage", description: "your bullets are <strong>larger</strong> and do more physical <span class='color-d'>damage</span>",
have: false, have: false,
effect: () => { effect: () => {
//good for guns that do mostly projectile damage: //good for guns that do mostly projectile damage:
@@ -41,7 +41,7 @@ const b = {
}, },
{ {
name: "auto-loading heuristics", name: "auto-loading heuristics",
description: "your <strong>rate of fire</strong> is 15% faster", description: "your rate of fire is 15% faster",
have: false, have: false,
effect: () => { effect: () => {
//good for guns with extra ammo: needles, M80, rapid fire, flak, super balls //good for guns with extra ammo: needles, M80, rapid fire, flak, super balls
@@ -51,7 +51,7 @@ const b = {
}, },
{ {
name: "desublimated ammunition", name: "desublimated ammunition",
description: "use 50% less <strong>ammo</strong> when <strong>crouching</strong>", description: "use 50% less <span class='color-b'>ammo</span> when <strong>crouching</strong>",
have: false, have: false,
effect: () => { effect: () => {
//good with guns that have less ammo: one shot, grenades, missiles, super balls, spray //good with guns that have less ammo: one shot, grenades, missiles, super balls, spray
@@ -60,7 +60,7 @@ const b = {
}, },
{ {
name: "corrosion resistant topology", name: "corrosion resistant topology",
description: "your bullets <strong>last 40% longer</strong>", description: "your <span class='color-b'>bullets</span> last 40% longer",
have: false, have: false,
effect: () => { effect: () => {
//good with: drones, super balls, spore, missiles, wave beam(range), rapid fire(range), flak(range) //good with: drones, super balls, spore, missiles, wave beam(range), rapid fire(range), flak(range)
@@ -69,7 +69,7 @@ const b = {
}, },
{ {
name: "anti-matter cores", name: "anti-matter cores",
description: "the radius of your <strong>explosions</strong> is doubled", description: "the radius of your <strong class='color-e'>explosions</strong> is doubled<br><span style='opacity:0.3;'>be careful</span>",
have: false, have: false,
effect: () => { effect: () => {
//at 1.4 gives a flat 40% increase, and increased range, balanced by limited guns and self damage //at 1.4 gives a flat 40% increase, and increased range, balanced by limited guns and self damage
@@ -79,16 +79,16 @@ const b = {
}, },
{ {
name: "energy siphon", name: "energy siphon",
description: "regenerate <strong>energy</strong> proportional to your damage done", description: "regenerate <span class='color-f'>energy</span> proportional to your <span class='color-d'>damage</span> done",
have: false, have: false,
effect: () => { effect: () => {
//good with laser, and all fields //good with laser, and all fields
b.modEnergySiphon = 0.25; b.modEnergySiphon = 0.2;
} }
}, },
{ {
name: "entropy transfer", name: "entropy transfer",
description: "<strong>heal</strong> proportional to your damage done", description: "<span class='color-h'>heal</span> proportional to your <span class='color-d'>damage</span> done",
have: false, have: false,
effect: () => { effect: () => {
//good with guns that overkill: one shot, grenade //good with guns that overkill: one shot, grenade
@@ -97,7 +97,7 @@ const b = {
}, },
{ {
name: "quantum immortality", name: "quantum immortality",
description: "after you die continue in an alternate reality with randomized abilities", description: "after you <strong style='color: #606;'>die</strong> continue in an <em>alternate reality</em><br>guns, ammo, and field are randomized",
have: false, have: false,
effect: () => { effect: () => {
b.modIsImmortal = true; b.modIsImmortal = true;
@@ -105,7 +105,7 @@ const b = {
}, },
{ {
name: "zoospore vector", name: "zoospore vector",
description: "when an enemy dies it has a 20% chance to release <strong>spores</strong>", description: "when an enemy <span style='color: #888;'>dies</span> it has a 20% chance to release <strong class='color-s'>spores</strong>",
have: false, have: false,
effect: () => { effect: () => {
b.modSpores = 0.20; //good late game maybe? b.modSpores = 0.20; //good late game maybe?
@@ -128,6 +128,7 @@ const b = {
giveGuns(gun = "all", ammoPacks = 2) { giveGuns(gun = "all", ammoPacks = 2) {
if (gun === "all") { if (gun === "all") {
b.activeGun = 0; b.activeGun = 0;
b.inventoryGun = 0;
for (let i = 0; i < b.guns.length; i++) { for (let i = 0; i < b.guns.length; i++) {
b.guns[i].have = true; b.guns[i].have = true;
b.guns[i].ammo = b.guns[i].ammoPack * ammoPacks; b.guns[i].ammo = b.guns[i].ammoPack * ammoPacks;
@@ -277,7 +278,7 @@ const b = {
x: bullet[me].position.x, x: bullet[me].position.x,
y: bullet[me].position.y, y: bullet[me].position.y,
radius: radius, radius: radius,
color: "rgba(255,0,0,0.4)", color: "rgba(255,25,0,0.6)",
time: game.drawTime time: game.drawTime
}); });
let dist, sub, knock; let dist, sub, knock;
@@ -297,7 +298,7 @@ const b = {
sub = Matter.Vector.sub(bullet[me].position, player.position); sub = Matter.Vector.sub(bullet[me].position, player.position);
dist = Matter.Vector.magnitude(sub); dist = Matter.Vector.magnitude(sub);
if (dist < radius) { if (dist < radius) {
mech.damage(radius * 0.00035); mech.damage(radius * 0.0002);
knock = Matter.Vector.mult(Matter.Vector.normalise(sub), -Math.sqrt(dmg) * player.mass / 30); knock = Matter.Vector.mult(Matter.Vector.normalise(sub), -Math.sqrt(dmg) * player.mass / 30);
player.force.x += knock.x; player.force.x += knock.x;
player.force.y += knock.y; player.force.y += knock.y;
@@ -309,7 +310,6 @@ const b = {
mech.drop(); mech.drop();
} }
//body knock backs //body knock backs
for (let i = 0, len = body.length; i < len; ++i) { for (let i = 0, len = body.length; i < len; ++i) {
sub = Matter.Vector.sub(bullet[me].position, body[i].position); sub = Matter.Vector.sub(bullet[me].position, body[i].position);
@@ -340,54 +340,6 @@ const b = {
} }
} }
// bullet knock backs (not working: no effect for drones, crash for superballs)
// for (let i = 0, len = bullet.length; i < len; ++i) {
// if (me !== i) {
// sub = Matter.Vector.sub(bullet[me].position, bullet[i].position);
// dist = Matter.Vector.magnitude(sub);
// if (dist < radius) {
// knock = Matter.Vector.mult(Matter.Vector.normalise(sub), (-Math.sqrt(dmg) * bullet[i].mass) / 10);
// bullet[i].force.x += knock.x;
// bullet[i].force.y += knock.y;
// console.log(sub, dist, knock)
// } else if (dist < alertRange) {
// knock = Matter.Vector.mult(Matter.Vector.normalise(sub), (-Math.sqrt(dmg) * bullet[i].mass) / 20);
// bullet[i].force.x += knock.x;
// bullet[i].force.y += knock.y;
// }
// }
// }
//destroy all bullets in range
// for (let i = 0, len = bullet.length; i < len; ++i) {
// if (me != i) {
// sub = Matter.Vector.sub(bullet[me].position, bullet[i].position);
// dist = Matter.Vector.magnitude(sub);
// if (dist < radius) {
// bullet[i].endCycle = mech.cycle;
// }
// }
// }
//mob damage and knock back with no alert
// for (let i = 0, len = mob.length; i < len; ++i) {
// if (mob[i].alive) {
// let vertices = mob[i].vertices;
// for (let j = 0, len = vertices.length; j < len; j++) {
// sub = Matter.Vector.sub(bullet[me].position, vertices[j]);
// dist = Matter.Vector.magnitude(sub);
// if (dist < radius) {
// mob[i].damage(dmg);
// mob[i].locatePlayer();
// knock = Matter.Vector.mult(Matter.Vector.normalise(sub), -Math.sqrt(dmg) * mob[i].mass / 18);
// mob[i].force.x += knock.x;
// mob[i].force.y += knock.y;
// break;
// }
// }
// }
// }
//mob damage and knock back with alert //mob damage and knock back with alert
let damageScale = 1; // reduce dmg for each new target to limit total AOE damage let damageScale = 1; // reduce dmg for each new target to limit total AOE damage
for (let i = 0, len = mob.length; i < len; ++i) { for (let i = 0, len = mob.length; i < len; ++i) {
@@ -475,7 +427,7 @@ const b = {
}, },
guns: [{ guns: [{
name: "laser", name: "laser",
description: "fire a beam of coherent light<br>reflects off walls at 75% intensity<br>uses energy instead of ammunition", description: "fire a <span style='color:#f00;'>beam</span> of coherent light<br>reflects off walls at 75% intensity<br>uses <span class='color-f'>energy</span> instead of ammunition",
ammo: 0, ammo: 0,
// ammoPack: 350, // ammoPack: 350,
ammoPack: Infinity, ammoPack: Infinity,
@@ -633,132 +585,9 @@ const b = {
ctx.globalAlpha = 1; ctx.globalAlpha = 1;
} }
} }
// }, {
// name: "entropic beam",
// description: "steal entropy to heal<br>reflects off walls at 75% intensity<br>uses energy instead of ammunition",
// ammo: 0,
// // ammoPack: 350,
// ammoPack: Infinity,
// have: false,
// fire() {
// // mech.fireCDcycle = mech.cycle + 1
// //laser drains energy as well as bullets
// const FIELD_DRAIN = 0.0001 //should be 0.001
// if (mech.fieldMeter < FIELD_DRAIN) {
// mech.fireCDcycle = mech.cycle + 100; // cool down if out of energy
// } else {
// mech.fieldMeter -= mech.fieldRegen + FIELD_DRAIN
// let best;
// const color = "#a0a";
// const range = 600;
// const path = [{
// x: mech.pos.x + 20 * Math.cos(mech.angle),
// y: mech.pos.y + 20 * Math.sin(mech.angle)
// },
// {
// x: mech.pos.x + range * Math.cos(mech.angle),
// y: mech.pos.y + range * Math.sin(mech.angle)
// }
// ];
// const vertexCollision = function (v1, v1End, domain) {
// for (let i = 0; i < domain.length; ++i) {
// let vertices = domain[i].vertices;
// const len = vertices.length - 1;
// for (let j = 0; j < len; j++) {
// results = game.checkLineIntersection(v1, v1End, vertices[j], vertices[j + 1]);
// if (results.onLine1 && results.onLine2) {
// const dx = v1.x - results.x;
// const dy = v1.y - results.y;
// const dist2 = dx * dx + dy * dy;
// if (dist2 < best.dist2 && (!domain[i].mob || domain[i].alive)) {
// best = {
// x: results.x,
// y: results.y,
// dist2: dist2,
// who: domain[i],
// v1: vertices[j],
// v2: vertices[j + 1]
// };
// }
// }
// }
// results = game.checkLineIntersection(v1, v1End, vertices[0], vertices[len]);
// if (results.onLine1 && results.onLine2) {
// const dx = v1.x - results.x;
// const dy = v1.y - results.y;
// const dist2 = dx * dx + dy * dy;
// if (dist2 < best.dist2 && (!domain[i].mob || domain[i].alive)) {
// best = {
// x: results.x,
// y: results.y,
// dist2: dist2,
// who: domain[i],
// v1: vertices[0],
// v2: vertices[len]
// };
// }
// }
// }
// };
// const checkforCollisions = function () {
// best = {
// x: null,
// y: null,
// dist2: Infinity,
// who: null,
// v1: null,
// v2: null
// };
// vertexCollision(path[path.length - 2], path[path.length - 1], mob);
// vertexCollision(path[path.length - 2], path[path.length - 1], map);
// vertexCollision(path[path.length - 2], path[path.length - 1], body);
// };
// const laserHitMob = function (dmg) {
// if (best.who.alive) {
// dmg *= b.dmgScale * 0.02;
// mech.addHealth(0.002)
// best.who.damage(dmg);
// best.who.locatePlayer();
// //draw mob damage circle
// ctx.fillStyle = color;
// ctx.beginPath();
// ctx.arc(path[path.length - 1].x, path[path.length - 1].y, Math.sqrt(dmg) * 100, 0, 2 * Math.PI);
// ctx.fill();
// }
// };
// checkforCollisions();
// if (best.dist2 != Infinity) {
// //if hitting something
// path[path.length - 1] = {
// x: best.x,
// y: best.y
// };
// laserHitMob(1);
// }
// ctx.fillStyle = color;
// ctx.strokeStyle = color;
// ctx.lineWidth = 4;
// for (let i = 1, len = path.length; i < len; ++i) {
// d = {
// x: path[i].x - path[i - 1].x,
// y: path[i].y - path[i - 1].y
// }
// const a = mech.cycle * 5
// p1 = {
// x: d.x / 2 * Math.cos(a) - d.y / 2 * Math.sin(a),
// y: d.x / 2 * Math.sin(a) + d.y / 2 * Math.cos(a),
// }
// const wave = 300 / Math.sqrt(d.x * d.x + d.y * d.y)
// ctx.beginPath();
// ctx.moveTo(path[i - 1].x, path[i - 1].y);
// ctx.bezierCurveTo(path[i - 1].x + p1.x * wave, path[i - 1].y + p1.y * wave, path[i].x + p1.x * wave, path[i].y + p1.y * wave, path[i].x, path[i].y);
// ctx.stroke();
// }
// }
// }
}, { }, {
name: "kinetic slugs", name: "kinetic slugs",
description: "fire a huge rod with high recoil<br>effective at long distances", description: "fire a large <strong>rod</strong> that does excessive physical <span class='color-d'>damage</span><br><em>high recoil</em>",
ammo: 0, ammo: 0,
ammoPack: 5, ammoPack: 5,
have: false, have: false,
@@ -782,7 +611,7 @@ const b = {
}, },
{ {
name: "minigun", name: "minigun",
description: "fire a stream of bullets", description: "rapidly fire a stream of small bullets",
ammo: 0, ammo: 0,
ammoPack: 105, ammoPack: 105,
have: false, have: false,
@@ -790,11 +619,11 @@ const b = {
const me = bullet.length; const me = bullet.length;
b.muzzleFlash(15); b.muzzleFlash(15);
// if (Math.random() > 0.2) mobs.alert(500); // if (Math.random() > 0.2) mobs.alert(500);
const dir = mech.angle + (Math.random() - 0.5) * ((mech.crouch) ? 0.07 : 0.16); const dir = mech.angle + (Math.random() - 0.5) * ((mech.crouch) ? 0.03 : 0.14);
bullet[me] = Bodies.rectangle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 17 * b.modBulletSize, 5 * b.modBulletSize, b.fireAttributes(dir)); bullet[me] = Bodies.rectangle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 17 * b.modBulletSize, 5 * b.modBulletSize, b.fireAttributes(dir));
b.fireProps(mech.crouch ? 11 : 5, mech.crouch ? 44 : 36, dir, me); //cd , speed b.fireProps(mech.crouch ? 11 : 5, mech.crouch ? 44 : 36, dir, me); //cd , speed
bullet[me].endCycle = game.cycle + Math.floor(65 * b.modBulletsLastLonger); bullet[me].endCycle = game.cycle + Math.floor(65 * b.modBulletsLastLonger);
bullet[me].frictionAir = 0.01; bullet[me].frictionAir = mech.crouch ? 0.007 : 0.01;
bullet[me].do = function () { bullet[me].do = function () {
this.force.y += this.mass * 0.0005; this.force.y += this.mass * 0.0005;
}; };
@@ -802,7 +631,7 @@ const b = {
}, },
{ {
name: "wave beam", name: "wave beam",
description: "fire a stream of oscillating particles<br>propagates through solids<br>effective at close range", description: "fire a stream of oscillating particles<br><strong style='opacity: 0.4;'>propagates through solids</strong>",
ammo: 0, ammo: 0,
ammoPack: 85, ammoPack: 85,
have: false, have: false,
@@ -855,7 +684,7 @@ const b = {
}, },
{ {
name: "super balls", name: "super balls",
description: "fire 3 very bouncy balls", description: "fire 3 very <strong>bouncy</strong> balls",
ammo: 0, ammo: 0,
ammoPack: 11, ammoPack: 11,
have: false, have: false,
@@ -883,7 +712,7 @@ const b = {
}, },
{ {
name: "shotgun", name: "shotgun",
description: "fire a burst of bullets with high recoil<br>more effective at close range", description: "fire a <strong>burst</strong> of bullets<br><em>high recoil</em>",
ammo: 0, ammo: 0,
ammoPack: 8, ammoPack: 8,
have: false, have: false,
@@ -911,7 +740,7 @@ const b = {
}, },
{ {
name: "fléchettes", name: "fléchettes",
description: "fire a narrow projectile<br>effective at long distances", description: "fire an accurate high speed needle<br>",
ammo: 0, ammo: 0,
ammoPack: 19, ammoPack: 19,
have: false, have: false,
@@ -935,9 +764,9 @@ const b = {
}, },
{ {
name: "missiles", name: "missiles",
description: "fire a missile that accelerates towards nearby targets<br>explodes when near target", description: "fire a missile that accelerates towards nearby targets<br><span class='color-e'>explodes</span> when near target",
ammo: 0, ammo: 0,
ammoPack: 9, ammoPack: 8,
have: false, have: false,
fireCycle: 0, fireCycle: 0,
ammoLoaded: 0, ammoLoaded: 0,
@@ -953,7 +782,7 @@ const b = {
bullet[me].force.y += 0.00045; //a small push down at first to make it seem like the missile is briefly falling bullet[me].force.y += 0.00045; //a small push down at first to make it seem like the missile is briefly falling
bullet[me].frictionAir = 0 bullet[me].frictionAir = 0
bullet[me].endCycle = game.cycle + Math.floor((265 + Math.random() * 20) * b.modBulletsLastLonger); bullet[me].endCycle = game.cycle + Math.floor((265 + Math.random() * 20) * b.modBulletsLastLonger);
bullet[me].explodeRad = 150 + 40 * Math.random(); bullet[me].explodeRad = 165 + 40 * Math.random();
bullet[me].lookFrequency = Math.floor(8 + Math.random() * 7); bullet[me].lookFrequency = Math.floor(8 + Math.random() * 7);
bullet[me].onEnd = b.explode; //makes bullet do explosive damage at end bullet[me].onEnd = b.explode; //makes bullet do explosive damage at end
bullet[me].onDmg = function () { bullet[me].onDmg = function () {
@@ -1040,7 +869,7 @@ const b = {
}, },
{ {
name: "flak", name: "flak",
description: "fire a cluster of explosive projectiles<br>explode on contact or after half a second", description: "fire a cluster of short range projectiles<br><span class='color-e'>explode</span> on contact or after half a second",
ammo: 0, ammo: 0,
ammoPack: 20, ammoPack: 20,
have: false, have: false,
@@ -1048,9 +877,9 @@ const b = {
b.muzzleFlash(30); b.muzzleFlash(30);
const totalBullets = 5 const totalBullets = 5
const angleStep = (mech.crouch ? 0.06 : 0.15) / totalBullets const angleStep = (mech.crouch ? 0.06 : 0.15) / totalBullets
const SPEED = mech.crouch ? 27 : 20 const SPEED = mech.crouch ? 30 : 25
const CD = mech.crouch ? 30 : 15 const CD = mech.crouch ? 45 : 11
const END = Math.floor((mech.crouch ? 27 : 18) * b.modBulletsLastLonger); const END = Math.floor((mech.crouch ? 30 : 18) * b.modBulletsLastLonger);
let dir = mech.angle - angleStep * totalBullets / 2; let dir = mech.angle - angleStep * totalBullets / 2;
const side1 = 17 * b.modBulletSize const side1 = 17 * b.modBulletSize
const side2 = 4 * b.modBulletSize const side2 = 4 * b.modBulletSize
@@ -1059,13 +888,13 @@ const b = {
dir += angleStep dir += angleStep
const me = bullet.length; const me = bullet.length;
bullet[me] = Bodies.rectangle(mech.pos.x + 50 * Math.cos(mech.angle), mech.pos.y + 50 * Math.sin(mech.angle), side1, side2, b.fireAttributes(dir)); bullet[me] = Bodies.rectangle(mech.pos.x + 50 * Math.cos(mech.angle), mech.pos.y + 50 * Math.sin(mech.angle), side1, side2, b.fireAttributes(dir));
b.fireProps(CD, SPEED + 25 * Math.random() - i, dir, me); //cd , speed b.fireProps(CD, SPEED + 15 * Math.random() - 2 * i, dir, me); //cd , speed
// Matter.Body.setDensity(bullet[me], 0.005); // Matter.Body.setDensity(bullet[me], 0.005);
bullet[me].endCycle = i + game.cycle + END bullet[me].endCycle = 2 * i + game.cycle + END
bullet[me].restitution = 0; bullet[me].restitution = 0;
bullet[me].friction = 1; bullet[me].friction = 1;
// bullet[me].dmg = 0.15; // bullet[me].dmg = 0.15;
bullet[me].explodeRad = 45 + (Math.random() - 0.5) * 50; bullet[me].explodeRad = (mech.crouch ? 70 : 45) + (Math.random() - 0.5) * 50;
bullet[me].onEnd = b.explode; bullet[me].onEnd = b.explode;
bullet[me].onDmg = function () { bullet[me].onDmg = function () {
this.endCycle = 0; //bullet ends cycle after hitting a mob and triggers explosion this.endCycle = 0; //bullet ends cycle after hitting a mob and triggers explosion
@@ -1083,50 +912,48 @@ const b = {
}, },
{ {
name: "grenades", name: "grenades",
description: "fire a bomb that explodes on contact or after 1.6 seconds", description: "fire a projectile that <span class='color-e'>explodes</span> on contact or after one second",
ammo: 0, ammo: 0,
ammoPack: 14, ammoPack: 11,
have: false, have: false,
fire() { fire() {
const me = bullet.length; const me = bullet.length;
const dir = mech.angle; // + Math.random() * 0.05; const dir = mech.angle; // + Math.random() * 0.05;
bullet[me] = Bodies.circle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 15 * b.modBulletSize, b.fireAttributes(dir, false)); bullet[me] = Bodies.circle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 15 * b.modBulletSize, b.fireAttributes(dir, false));
b.fireProps(mech.crouch ? 40 : 25, mech.crouch ? 41 : 32, dir, me); //cd , speed b.fireProps(mech.crouch ? 40 : 20, mech.crouch ? 43 : 32, dir, me); //cd , speed
b.drawOneBullet(bullet[me].vertices); b.drawOneBullet(bullet[me].vertices);
// Matter.Body.setDensity(bullet[me], 0.000001); // Matter.Body.setDensity(bullet[me], 0.000001);
bullet[me].totalCycles = 100; bullet[me].totalCycles = 100;
bullet[me].endCycle = game.cycle + Math.floor(70 * b.modBulletsLastLonger); bullet[me].endCycle = game.cycle + Math.floor((mech.crouch ? 120 : 60) * b.modBulletsLastLonger);
bullet[me].restitution = 0.25; bullet[me].restitution = 0.5;
bullet[me].explodeRad = 220; bullet[me].explodeRad = 210;
bullet[me].onEnd = b.explode; //makes bullet do explosive damage before despawn bullet[me].onEnd = b.explode; //makes bullet do explosive damage before despawn
bullet[me].minDmgSpeed = 1; bullet[me].minDmgSpeed = 1;
bullet[me].dmg = 0.5;
bullet[me].onDmg = function () { bullet[me].onDmg = function () {
this.endCycle = 0; //bullet ends cycle after doing damage //this triggers explosion this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion
}; };
bullet[me].do = function () { bullet[me].do = function () {
//extra gravity for harder arcs //extra gravity for harder arcs
this.force.y += this.mass * 0.0022; this.force.y += this.mass * 0.002;
}; };
} }
}, },
{ {
name: "vacuum bomb", name: "vacuum bomb",
description: "fire a huge bomb that sucks before it explodes", description: "fire a huge bomb that sucks before it <span class='color-e'>explodes</span><br>click left mouse <strong>again</strong> to detonate",
ammo: 0, ammo: 0,
ammoPack: 5, ammoPack: 4,
have: false, have: false,
fire() { fire() {
const me = bullet.length; const me = bullet.length;
const dir = mech.angle; const dir = mech.angle;
bullet[me] = Bodies.circle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 26 * b.modBulletSize, b.fireAttributes(dir, false)); bullet[me] = Bodies.circle(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 26 * b.modBulletSize, b.fireAttributes(dir, false));
bullet[me].radius = 22; //used from drawing timer bullet[me].radius = 22; //used from drawing timer
b.fireProps(mech.crouch ? 80 : 50, mech.crouch ? 37 : 0, dir, me); //cd , speed b.fireProps(10, mech.crouch ? 42 : 26, dir, me); //cd , speed
b.drawOneBullet(bullet[me].vertices); b.drawOneBullet(bullet[me].vertices);
// Matter.Body.setDensity(bullet[me], 0.001); bullet[me].endCycle = Infinity
bullet[me].endCycle = game.cycle + Math.floor((mech.crouch ? 100 : 150) * b.modBulletsLastLonger); bullet[me].endCycle = Infinity
bullet[me].endCycleLength = bullet[me].endCycle - game.cycle
// bullet[me].restitution = 0.3; // bullet[me].restitution = 0.3;
// bullet[me].frictionAir = 0.01; // bullet[me].frictionAir = 0.01;
// bullet[me].friction = 0.15; // bullet[me].friction = 0.15;
@@ -1140,12 +967,23 @@ const b = {
bullet[me].onDmg = function () { bullet[me].onDmg = function () {
// this.endCycle = 0; //bullet ends cycle after doing damage //this triggers explosion // this.endCycle = 0; //bullet ends cycle after doing damage //this triggers explosion
}; };
bullet[me].isArmed = false;
bullet[me].isSucking = false;
bullet[me].do = function () { bullet[me].do = function () {
//extra gravity for harder arcs //extra gravity for harder arcs
this.force.y += this.mass * 0.0022; this.force.y += this.mass * 0.0022;
mech.fireCDcycle = mech.cycle + 10 //can't fire until after the explosion
//before the explosion suck in stuff //set armed and sucking status
if (game.cycle > this.endCycle - 35 && !mech.isBodiesAsleep) { if (!this.isArmed && !game.mouseDown) {
this.isArmed = true
} else if (this.isArmed && game.mouseDown && !this.isSucking) {
this.isSucking = true;
this.endCycle = game.cycle + 35;
}
if (this.isSucking) {
if (!mech.isBodiesAsleep) {
const that = this const that = this
let mag = 0.1 let mag = 0.1
@@ -1173,21 +1011,20 @@ const b = {
suck(powerUp) suck(powerUp)
suck([player]) suck([player])
} }
//keep bomb in place //keep bomb in place
Matter.Body.setVelocity(this, { Matter.Body.setVelocity(this, {
x: 0, x: 0,
y: 0 y: 0
}); });
//draw suck //draw suck
const radius = 9 * this.explodeRad * (this.endCycle - game.cycle) / this.endCycleLength const radius = 2.5 * this.explodeRad * (this.endCycle - game.cycle) / 35
ctx.fillStyle = "rgba(0,0,0,0.1)"; ctx.fillStyle = "rgba(0,0,0,0.1)";
ctx.beginPath(); ctx.beginPath();
ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI); ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI);
ctx.fill(); ctx.fill();
} }
} else {
//draw timer // flashing lights to show armed
if (!(game.cycle % 10)) { if (!(game.cycle % 10)) {
if (this.isFlashOn) { if (this.isFlashOn) {
this.isFlashOn = false; this.isFlashOn = false;
@@ -1201,17 +1038,18 @@ const b = {
ctx.arc(this.position.x, this.position.y, this.radius, 0, 2 * Math.PI); ctx.arc(this.position.x, this.position.y, this.radius, 0, 2 * Math.PI);
ctx.fill(); ctx.fill();
//draw clock on timer //draw clock on timer
ctx.fillStyle = "#f12"; ctx.fillStyle = "#f04";
ctx.beginPath(); ctx.beginPath();
ctx.arc(this.position.x, this.position.y, this.radius * (1 - (this.endCycle - game.cycle) / this.endCycleLength), 0, 2 * Math.PI); ctx.arc(this.position.x, this.position.y, this.radius * 0.5, 0, 2 * Math.PI);
ctx.fill(); ctx.fill();
} }
}; }
}
} }
}, },
{ {
name: "spores", name: "spores",
description: "release an orb that discharges spores after 2 seconds<br>spores seek out targets<br>spores can pass through blocks", description: "release an orb that discharges <span class='color-s'>spores</span> after 2 seconds<br><span class='color-s'>spores</span> seek out targets<br><span class='color-s'>spores</span> can pass through blocks",
ammo: 0, ammo: 0,
ammoPack: 5, ammoPack: 5,
have: false, have: false,
@@ -1314,7 +1152,7 @@ const b = {
}, },
{ {
name: "drones", name: "drones",
description: "release drones that seek out targets<br>if no targets, drones move to mouse<br>", description: "release <span class='color-b'>drones</span> that seek out targets<br>if no targets are found, <span class='color-b'>drones</span> move towards mouse<br>",
ammo: 0, ammo: 0,
ammoPack: 20, ammoPack: 20,
have: false, have: false,

View File

@@ -1,6 +1,15 @@
// game Object ******************************************************** // game Object ********************************************************
//********************************************************************* //*********************************************************************
const game = { const game = {
// difficulty: {
// damageDone: 1,
// damageTaken: 1,
// mobQuickness: 1,
// powerUpDropRate: 1,
// fallingDamage: false,
// explosiveDamage: true,
// unlimitedAmmo: false,
// },
loop() { loop() {
game.cycle++; //tracks game cycles game.cycle++; //tracks game cycles
mech.cycle++; //tracks player cycles //used to alow time to stop for everything, but the player mech.cycle++; //tracks player cycles //used to alow time to stop for everything, but the player
@@ -710,13 +719,12 @@ const game = {
} }
}, },
mapFill: "#444", mapFill: "#444",
bodyFill: "#999", bodyFill: "rgba(140,140,140,0.85)", //"#999",
bodyStroke: "#222", bodyStroke: "#222",
drawMapPath() { drawMapPath() {
ctx.fillStyle = this.mapFill; ctx.fillStyle = this.mapFill;
ctx.fill(this.mapPath); ctx.fill(this.mapPath);
}, },
seeEdges() { seeEdges() {
const eye = { const eye = {
x: mech.pos.x + 20 * Math.cos(mech.angle), x: mech.pos.x + 20 * Math.cos(mech.angle),

View File

@@ -2,7 +2,19 @@
/* TODO: ******************************************* /* TODO: *******************************************
***************************************************** *****************************************************
make power ups keep moving to player if the field is turned off add Boss levels
add modular difficulty settings
take reduced dmg
slower mob look / CD
more drops
fewer mobs
make a new var to scale number of mobs and stop using levels cleared var
get text output to show multiple notifications at once by queuing them vertically
make power ups keep moving to player if the pickup field is turned off before they get picked up
not sure how to do this without adding a constant check not sure how to do this without adding a constant check
levels spawn by having the map aspects randomly fly into place levels spawn by having the map aspects randomly fly into place

View File

@@ -14,7 +14,7 @@ const level = {
if (game.levelsCleared === 0) { if (game.levelsCleared === 0) {
// game.levelsCleared = 16; //for testing to simulate possible mobs spawns // game.levelsCleared = 16; //for testing to simulate possible mobs spawns
// b.giveGuns("all", 1000) // b.giveGuns("all", 1000)
// b.giveGuns(3) // set a starting gun for testing // b.giveGuns(9) // set a starting gun for testing
// mech.fieldUpgrades[2].effect(); //give a field power up for testing // mech.fieldUpgrades[2].effect(); //give a field power up for testing
// b.giveMod(8) // b.giveMod(8)
@@ -36,8 +36,8 @@ const level = {
game.draw.setPaths(); game.draw.setPaths();
}, },
difficultyIncrease() { difficultyIncrease() {
game.dmgScale += 0.35; //damage done by mobs increases each level game.dmgScale += 0.3; //damage done by mobs increases each level
b.dmgScale *= 0.92; //damage done by player decreases each level b.dmgScale *= 0.94; //damage done by player decreases each level
game.accelScale *= 1.05 //mob acceleration increases each level game.accelScale *= 1.05 //mob acceleration increases each level
game.lookFreqScale *= 0.95 //mob cycles between looks decreases each level game.lookFreqScale *= 0.95 //mob cycles between looks decreases each level
game.CDScale *= 0.95 //mob CD time decreases each level game.CDScale *= 0.95 //mob CD time decreases each level
@@ -122,7 +122,8 @@ const level = {
// spawn.bodyRect(-45, -100, 40, 50); // spawn.bodyRect(-45, -100, 40, 50);
// spawn.focuser(800, -1150); // spawn.focuser(800, -1150);
// spawn.groupBoss(-600, -550); // spawn.groupBoss(-600, -550);
spawn.starter(800, -150, 100); spawn.striker(800, -150);
// spawn.beamer(800, -150);
// spawn.grower(800, -250); // spawn.grower(800, -250);
// spawn.blinker(800, -250, 40); // spawn.blinker(800, -250, 40);
// spawn.groupBoss(900, -1070); // spawn.groupBoss(900, -1070);
@@ -797,7 +798,7 @@ const level = {
spawn.mapRect(1600, -400, 1500, 500); //long center building spawn.mapRect(1600, -400, 1500, 500); //long center building
spawn.mapRect(1345, -1100, 250, 25); //left platform spawn.mapRect(1345, -1100, 250, 25); //left platform
spawn.mapRect(1755, -1100, 250, 25); //right platform spawn.mapRect(1755, -1100, 250, 25); //right platform
spawn.mapRect(1300, -1850, 750, 50); //left higher platform spawn.mapRect(1300, -1850, 780, 50); //left higher platform
spawn.mapRect(1300, -2150, 50, 350); //left higher platform left edge wall spawn.mapRect(1300, -2150, 50, 350); //left higher platform left edge wall
spawn.mapRect(1300, -2150, 450, 50); //left higher platform roof spawn.mapRect(1300, -2150, 450, 50); //left higher platform roof
spawn.mapRect(1500, -1860, 100, 50); //ground bump wall spawn.mapRect(1500, -1860, 100, 50); //ground bump wall
@@ -1554,7 +1555,7 @@ const level = {
}, },
levelAnnounce() { levelAnnounce() {
document.title = "n-gon: L" + (game.levelsCleared) + " " + level.levels[level.onLevel]; document.title = "n-gon: L" + (game.levelsCleared) + " " + level.levels[level.onLevel];
game.makeTextLog(`<div style='font-size: 25px;'>level ${game.levelsCleared} </div> <div style='font-size: 32px;'>${level.levels[level.onLevel]} </div>`, 300); // game.makeTextLog(`<div style='font-size: 25px;'>level ${game.levelsCleared} </div> <div style='font-size: 32px;'>${level.levels[level.onLevel]} </div>`, 300);
// if (game.levelsCleared === 0) text = ""; // if (game.levelsCleared === 0) text = "";
// text = "Level " + (game.levelsCleared + 1) + ": " + spawn.pickList[0] + "s + " + spawn.pickList[1] + "s"; // text = "Level " + (game.levelsCleared + 1) + ": " + spawn.pickList[0] + "s + " + spawn.pickList[1] + "s";
@@ -1572,7 +1573,7 @@ const level = {
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;
body[i].collisionFilter.category = 0x010000; body[i].collisionFilter.category = 0x010000;
body[i].collisionFilter.mask = 0x011111; body[i].collisionFilter.mask = 0x111111;
body[i].classType = "body"; body[i].classType = "body";
World.add(engine.world, body[i]); //add to world World.add(engine.world, body[i]); //add to world
} }

View File

@@ -252,6 +252,8 @@ const mobs = {
ctx.lineWidth = 1; ctx.lineWidth = 1;
ctx.stroke(); ctx.stroke();
ctx.setLineDash([]); ctx.setLineDash([]);
ctx.fillStyle = "rgba(255,0,170,0.03)";
ctx.fill();
} }
}, },
laser() { laser() {

View File

@@ -439,7 +439,7 @@ const mech = {
document.getElementById("fade-out").style.opacity = 1; //slowly fades out document.getElementById("fade-out").style.opacity = 1; //slowly fades out
setTimeout(function () { setTimeout(function () {
game.splashReturn(); game.splashReturn();
}, 5000); }, 3000);
} }
}, },
health: 0, health: 0,
@@ -912,12 +912,12 @@ const mech = {
}, },
hold() {}, hold() {},
fieldText() { fieldText() {
game.makeTextLog(`<strong style='font-size:30px;'>${mech.fieldUpgrades[mech.fieldMode].name}</strong><br> <span class='faded'>(right click or space bar)</span><p>${mech.fieldUpgrades[mech.fieldMode].description}</p>`, 1200); game.makeTextLog(`<strong style='font-size:30px;'>${mech.fieldUpgrades[mech.fieldMode].name}</strong><br><span class='faded'>(right click or space bar)</span><br><br>${mech.fieldUpgrades[mech.fieldMode].description}`, 1000);
document.getElementById("field").innerHTML = mech.fieldUpgrades[mech.fieldMode].name //add field document.getElementById("field").innerHTML = mech.fieldUpgrades[mech.fieldMode].name //add field
}, },
fieldUpgrades: [{ fieldUpgrades: [{
name: "field emitter", name: "field emitter",
description: "lets you <strong>pick up</strong> and throw objects<br><strong>shields</strong> you from damage", description: "<strong class='color-f'>shields</strong> you from <span class='color-d'>damage</span><br>lets you <strong>pick up</strong> and throw objects",
effect: () => { effect: () => {
mech.fieldMode = 0; mech.fieldMode = 0;
mech.fieldText(); mech.fieldText();
@@ -944,7 +944,7 @@ const mech = {
}, },
{ {
name: "time dilation field", name: "time dilation field",
description: "<strong>stop time</strong> while field is active<br> can fire while field is active", description: "<strong style='letter-spacing: 6px;'>stop time</strong>&nbsp; while field is active<br> <em>can fire while field is active</em>",
effect: () => { effect: () => {
mech.fieldMode = 1; mech.fieldMode = 1;
mech.fieldText(); mech.fieldText();
@@ -1015,7 +1015,7 @@ const mech = {
}, },
{ {
name: "electrostatic field", name: "electrostatic field",
description: "field does <strong>damage</strong> on contact<br> blocks are thrown at a higher velocity<br> increased field regeneration", description: "field does <strong class='color-d'>damage</strong> on contact<br> blocks are thrown at a higher velocity<br> increased <span class='color-f'>field</span> regeneration",
effect: () => { effect: () => {
mech.fieldMode = 2; mech.fieldMode = 2;
mech.fieldText(); mech.fieldText();
@@ -1088,7 +1088,7 @@ const mech = {
}, },
{ {
name: "negative mass field", name: "negative mass field",
description: "field nullifies <strong>gravity</strong><br> player can hold more massive objects<br>can fire while field is active", description: "field nullifies &nbsp;<strong style='letter-spacing: 6px;'>gravity</strong><br> player can hold more massive objects<br><em>can fire while field is active</em>",
effect: () => { effect: () => {
mech.fieldMode = 3; mech.fieldMode = 3;
mech.fieldText(); mech.fieldText();
@@ -1176,12 +1176,12 @@ const mech = {
}, },
{ {
name: "standing wave harmonics", name: "standing wave harmonics",
description: "oscillating shields always surround player<br> <span style='color:#a00;'>decreased</span> field regeneration", description: "you are surrounded by oscillating <strong style='color: #08f;'>shields</strong><br> <span style='color:#a00;'>decreased</span> field regeneration",
effect: () => { effect: () => {
mech.fieldMode = 4; mech.fieldMode = 4;
mech.fieldText(); mech.fieldText();
mech.setHoldDefaults(); mech.setHoldDefaults();
mech.fieldRegen *= 0.25; mech.fieldRegen *= 0.3;
mech.hold = function () { mech.hold = function () {
if (mech.isHolding) { if (mech.isHolding) {
@@ -1219,7 +1219,7 @@ const mech = {
}, },
{ {
name: "nano-scale manufacturing", name: "nano-scale manufacturing",
description: "excess field energy used to build <strong>drones</strong><br> increased field regeneration", description: "excess field energy used to build <strong class='color-b'>drones</strong><br> increased <span class='color-f'>field</span> regeneration",
effect: () => { effect: () => {
mech.fieldMode = 5; mech.fieldMode = 5;
mech.fieldText(); mech.fieldText();
@@ -1250,7 +1250,7 @@ const mech = {
}, },
{ {
name: "phase decoherence field", name: "phase decoherence field",
description: "<strong>intangible</strong> while field is active<br>can't see or be seen outside field", description: "<strong>intangible</strong> while field is active<br><em style='opacity: 0.6;'>can't see or be seen outside field</em>",
effect: () => { effect: () => {
mech.fieldMode = 6; mech.fieldMode = 6;
mech.fieldText(); mech.fieldText();

View File

@@ -11,7 +11,7 @@ const powerUps = {
let heal = (this.size / 40) ** 2 let heal = (this.size / 40) ** 2
heal = Math.min(1 - mech.health, heal) heal = Math.min(1 - mech.health, heal)
mech.addHealth(heal); mech.addHealth(heal);
if (!game.lastLogTime && heal > 0) game.makeTextLog('heal for ' + (heal * 100).toFixed(0) + '%', 180) if (!game.lastLogTime && heal > 0) game.makeTextLog("<span style='font-size:150;'> <span class='color-h'>heal</span> " + (heal * 100).toFixed(0) + "%</span>", 300)
} }
}, },
ammo: { ammo: {
@@ -41,13 +41,13 @@ const powerUps = {
} }
if (target.ammo === Infinity) { if (target.ammo === Infinity) {
mech.fieldMeter = 1; mech.fieldMeter = 1;
if (!game.lastLogTime) game.makeTextLog("+energy", 180); if (!game.lastLogTime) game.makeTextLog("<span style='font-size:150;'><span class='color-f'>+energy</span></span>", 300);
} else { } else {
//ammo given scales as mobs take more hits to kill //ammo given scales as mobs take more hits to kill
const ammo = Math.ceil((target.ammoPack * (0.6 + 0.04 * Math.random())) / b.dmgScale); const ammo = Math.ceil((target.ammoPack * (0.6 + 0.04 * Math.random())) / b.dmgScale);
target.ammo += ammo; target.ammo += ammo;
game.updateGunHUD(); game.updateGunHUD();
if (!game.lastLogTime) game.makeTextLog("+" + ammo + " ammo: " + target.name, 180); if (!game.lastLogTime) game.makeTextLog("<span style='font-size:150;'>+" + ammo + " ammo for " + target.name + "</span>", 300);
} }
} }
}, },
@@ -93,7 +93,7 @@ const powerUps = {
if (options.length > 0) { if (options.length > 0) {
let newMod = options[Math.floor(Math.random() * options.length)] let newMod = options[Math.floor(Math.random() * options.length)]
b.giveMod(newMod) b.giveMod(newMod)
game.makeTextLog(`<strong style='font-size:30px;'>${b.mods[newMod].name}</strong><br> <p>${b.mods[newMod].description}</p>`, 1200); game.makeTextLog(`<strong style='font-size:30px;'>${b.mods[newMod].name}</strong><br><br> ${b.mods[newMod].description}`, 1000);
if (options.length < 2) powerUps.haveAllMods = true if (options.length < 2) powerUps.haveAllMods = true
} }
} }
@@ -117,12 +117,8 @@ const powerUps = {
//give player a gun they don't already have if possible //give player a gun they don't already have if possible
if (options.length > 0) { if (options.length > 0) {
let newGun = options[Math.floor(Math.random() * options.length)]; let newGun = options[Math.floor(Math.random() * options.length)];
// newGun = 4; //makes every gun you pick up this type //enable for testing one gun if (b.activeGun === null) b.activeGun = newGun //if no active gun switch to new gun
if (b.activeGun === null) { game.makeTextLog(`<strong style='font-size:30px;'>${b.guns[newGun].name}</strong><br><span class='faded'>(left click)</span><br><br>${b.guns[newGun].description}`, 900);
b.activeGun = newGun //if no active gun switch to new gun
game.makeTextLog("Use <strong>left mouse</strong> to fire weapon.", Infinity);
}
game.makeTextLog(`<strong style='font-size:30px;'>${b.guns[newGun].name}</strong><br><span class='faded'>(left click)</span><p>${b.guns[newGun].description}</p>`, 1000);
b.guns[newGun].have = true; b.guns[newGun].have = true;
b.inventory.push(newGun); b.inventory.push(newGun);
b.guns[newGun].ammo += b.guns[newGun].ammoPack * 2; b.guns[newGun].ammo += b.guns[newGun].ammoPack * 2;
@@ -133,7 +129,7 @@ const powerUps = {
const ammo = Math.ceil(b.guns[ammoTarget].ammoPack * 2); const ammo = Math.ceil(b.guns[ammoTarget].ammoPack * 2);
b.guns[ammoTarget].ammo += ammo; b.guns[ammoTarget].ammo += ammo;
game.updateGunHUD(); game.updateGunHUD();
game.makeTextLog("+" + ammo + " ammo: " + b.guns[ammoTarget].name, 180); game.makeTextLog("<span style='font-size:150;'>+" + ammo + " ammo for " + b.guns[ammoTarget].name + "</span>", 300);
} }
} }
}, },

View File

@@ -112,8 +112,8 @@ summary {
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: #fff; background-color: #fff;
opacity: 0; opacity: 1;
transition: opacity 5s; transition: opacity 3s;
pointer-events: none; pointer-events: none;
} }
@@ -169,21 +169,64 @@ summary {
} }
#text-log { #text-log {
position: absolute; /* position: absolute;
top: 20px; top: 20px;
left: 0; left: 0;
width: 100%; width: 100%; */
line-height: 150%;
text-align: center;
z-index: 2; z-index: 2;
position: absolute;
bottom: 20px;
left: 20px;
/* left: 50%; */
/* transform: translate(-50%, 0); */
padding: 10px;
border-radius: 10px;
/* text-align: center; */
line-height: 150%;
font-size: 1.25em; font-size: 1.25em;
color: #000; color: #000;
background-color: rgba(255, 255, 255, 0.23);
opacity: 0; opacity: 0;
transition: opacity 0.5s; transition: opacity 0.5s;
pointer-events: none; pointer-events: none;
user-select: none; user-select: none;
} }
.color-f {
color: #0bf;
}
.color-b {
color: #023;
}
.color-d {
color: #f05;
}
.color-h {
color: #0d9;
}
.color-e {
color: #a10;
}
.color-s {
color: #066;
font-weight: 900;
letter-spacing: 2px;
}
.faded {
opacity: 0.7;
font-size: 90%;
}
.box { .box {
padding: 3px 8px 3px 8px; padding: 3px 8px 3px 8px;
border: 2px solid #444; border: 2px solid #444;
@@ -191,10 +234,6 @@ summary {
background-color: rgba(255, 255, 255, 0.5); background-color: rgba(255, 255, 255, 0.5);
} }
.faded {
opacity: 0.5;
font-size: 85%;
}
.wrapper { .wrapper {
display: grid; display: grid;