reworked text display, with colors
This commit is contained in:
388
js/bullets.js
388
js/bullets.js
@@ -29,7 +29,7 @@ const b = {
|
||||
},
|
||||
mods: [{
|
||||
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,
|
||||
effect: () => {
|
||||
//good for guns that do mostly projectile damage:
|
||||
@@ -41,7 +41,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
name: "auto-loading heuristics",
|
||||
description: "your <strong>rate of fire</strong> is 15% faster",
|
||||
description: "your rate of fire is 15% faster",
|
||||
have: false,
|
||||
effect: () => {
|
||||
//good for guns with extra ammo: needles, M80, rapid fire, flak, super balls
|
||||
@@ -51,7 +51,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
effect: () => {
|
||||
//good with guns that have less ammo: one shot, grenades, missiles, super balls, spray
|
||||
@@ -60,7 +60,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
effect: () => {
|
||||
//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",
|
||||
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,
|
||||
effect: () => {
|
||||
//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",
|
||||
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,
|
||||
effect: () => {
|
||||
//good with laser, and all fields
|
||||
b.modEnergySiphon = 0.25;
|
||||
b.modEnergySiphon = 0.2;
|
||||
}
|
||||
},
|
||||
{
|
||||
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,
|
||||
effect: () => {
|
||||
//good with guns that overkill: one shot, grenade
|
||||
@@ -97,7 +97,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
effect: () => {
|
||||
b.modIsImmortal = true;
|
||||
@@ -105,7 +105,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
effect: () => {
|
||||
b.modSpores = 0.20; //good late game maybe?
|
||||
@@ -128,6 +128,7 @@ const b = {
|
||||
giveGuns(gun = "all", ammoPacks = 2) {
|
||||
if (gun === "all") {
|
||||
b.activeGun = 0;
|
||||
b.inventoryGun = 0;
|
||||
for (let i = 0; i < b.guns.length; i++) {
|
||||
b.guns[i].have = true;
|
||||
b.guns[i].ammo = b.guns[i].ammoPack * ammoPacks;
|
||||
@@ -277,7 +278,7 @@ const b = {
|
||||
x: bullet[me].position.x,
|
||||
y: bullet[me].position.y,
|
||||
radius: radius,
|
||||
color: "rgba(255,0,0,0.4)",
|
||||
color: "rgba(255,25,0,0.6)",
|
||||
time: game.drawTime
|
||||
});
|
||||
let dist, sub, knock;
|
||||
@@ -297,7 +298,7 @@ const b = {
|
||||
sub = Matter.Vector.sub(bullet[me].position, player.position);
|
||||
dist = Matter.Vector.magnitude(sub);
|
||||
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);
|
||||
player.force.x += knock.x;
|
||||
player.force.y += knock.y;
|
||||
@@ -309,7 +310,6 @@ const b = {
|
||||
mech.drop();
|
||||
}
|
||||
|
||||
|
||||
//body knock backs
|
||||
for (let i = 0, len = body.length; i < len; ++i) {
|
||||
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
|
||||
let damageScale = 1; // reduce dmg for each new target to limit total AOE damage
|
||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||
@@ -475,7 +427,7 @@ const b = {
|
||||
},
|
||||
guns: [{
|
||||
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,
|
||||
// ammoPack: 350,
|
||||
ammoPack: Infinity,
|
||||
@@ -633,132 +585,9 @@ const b = {
|
||||
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",
|
||||
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,
|
||||
ammoPack: 5,
|
||||
have: false,
|
||||
@@ -782,7 +611,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
name: "minigun",
|
||||
description: "fire a stream of bullets",
|
||||
description: "rapidly fire a stream of small bullets",
|
||||
ammo: 0,
|
||||
ammoPack: 105,
|
||||
have: false,
|
||||
@@ -790,11 +619,11 @@ const b = {
|
||||
const me = bullet.length;
|
||||
b.muzzleFlash(15);
|
||||
// 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));
|
||||
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].frictionAir = 0.01;
|
||||
bullet[me].frictionAir = mech.crouch ? 0.007 : 0.01;
|
||||
bullet[me].do = function () {
|
||||
this.force.y += this.mass * 0.0005;
|
||||
};
|
||||
@@ -802,7 +631,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
ammoPack: 85,
|
||||
have: false,
|
||||
@@ -855,7 +684,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
name: "super balls",
|
||||
description: "fire 3 very bouncy balls",
|
||||
description: "fire 3 very <strong>bouncy</strong> balls",
|
||||
ammo: 0,
|
||||
ammoPack: 11,
|
||||
have: false,
|
||||
@@ -883,7 +712,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
ammoPack: 8,
|
||||
have: false,
|
||||
@@ -911,7 +740,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
name: "fléchettes",
|
||||
description: "fire a narrow projectile<br>effective at long distances",
|
||||
description: "fire an accurate high speed needle<br>",
|
||||
ammo: 0,
|
||||
ammoPack: 19,
|
||||
have: false,
|
||||
@@ -935,9 +764,9 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
ammoPack: 9,
|
||||
ammoPack: 8,
|
||||
have: false,
|
||||
fireCycle: 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].frictionAir = 0
|
||||
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].onEnd = b.explode; //makes bullet do explosive damage at end
|
||||
bullet[me].onDmg = function () {
|
||||
@@ -1040,7 +869,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
ammoPack: 20,
|
||||
have: false,
|
||||
@@ -1048,9 +877,9 @@ const b = {
|
||||
b.muzzleFlash(30);
|
||||
const totalBullets = 5
|
||||
const angleStep = (mech.crouch ? 0.06 : 0.15) / totalBullets
|
||||
const SPEED = mech.crouch ? 27 : 20
|
||||
const CD = mech.crouch ? 30 : 15
|
||||
const END = Math.floor((mech.crouch ? 27 : 18) * b.modBulletsLastLonger);
|
||||
const SPEED = mech.crouch ? 30 : 25
|
||||
const CD = mech.crouch ? 45 : 11
|
||||
const END = Math.floor((mech.crouch ? 30 : 18) * b.modBulletsLastLonger);
|
||||
let dir = mech.angle - angleStep * totalBullets / 2;
|
||||
const side1 = 17 * b.modBulletSize
|
||||
const side2 = 4 * b.modBulletSize
|
||||
@@ -1059,13 +888,13 @@ const b = {
|
||||
dir += angleStep
|
||||
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));
|
||||
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);
|
||||
bullet[me].endCycle = i + game.cycle + END
|
||||
bullet[me].endCycle = 2 * i + game.cycle + END
|
||||
bullet[me].restitution = 0;
|
||||
bullet[me].friction = 1;
|
||||
// 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].onDmg = function () {
|
||||
this.endCycle = 0; //bullet ends cycle after hitting a mob and triggers explosion
|
||||
@@ -1083,50 +912,48 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
ammoPack: 14,
|
||||
ammoPack: 11,
|
||||
have: false,
|
||||
fire() {
|
||||
const me = bullet.length;
|
||||
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));
|
||||
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);
|
||||
// Matter.Body.setDensity(bullet[me], 0.000001);
|
||||
bullet[me].totalCycles = 100;
|
||||
bullet[me].endCycle = game.cycle + Math.floor(70 * b.modBulletsLastLonger);
|
||||
bullet[me].restitution = 0.25;
|
||||
bullet[me].explodeRad = 220;
|
||||
bullet[me].endCycle = game.cycle + Math.floor((mech.crouch ? 120 : 60) * b.modBulletsLastLonger);
|
||||
bullet[me].restitution = 0.5;
|
||||
bullet[me].explodeRad = 210;
|
||||
bullet[me].onEnd = b.explode; //makes bullet do explosive damage before despawn
|
||||
bullet[me].minDmgSpeed = 1;
|
||||
bullet[me].dmg = 0.5;
|
||||
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 () {
|
||||
//extra gravity for harder arcs
|
||||
this.force.y += this.mass * 0.0022;
|
||||
this.force.y += this.mass * 0.002;
|
||||
};
|
||||
}
|
||||
},
|
||||
{
|
||||
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,
|
||||
ammoPack: 5,
|
||||
ammoPack: 4,
|
||||
have: false,
|
||||
fire() {
|
||||
const me = bullet.length;
|
||||
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].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);
|
||||
// Matter.Body.setDensity(bullet[me], 0.001);
|
||||
bullet[me].endCycle = game.cycle + Math.floor((mech.crouch ? 100 : 150) * b.modBulletsLastLonger);
|
||||
bullet[me].endCycleLength = bullet[me].endCycle - game.cycle
|
||||
bullet[me].endCycle = Infinity
|
||||
bullet[me].endCycle = Infinity
|
||||
// bullet[me].restitution = 0.3;
|
||||
// bullet[me].frictionAir = 0.01;
|
||||
// bullet[me].friction = 0.15;
|
||||
@@ -1140,78 +967,89 @@ const b = {
|
||||
bullet[me].onDmg = function () {
|
||||
// this.endCycle = 0; //bullet ends cycle after doing damage //this triggers explosion
|
||||
};
|
||||
bullet[me].isArmed = false;
|
||||
bullet[me].isSucking = false;
|
||||
bullet[me].do = function () {
|
||||
//extra gravity for harder arcs
|
||||
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
|
||||
if (game.cycle > this.endCycle - 35 && !mech.isBodiesAsleep) {
|
||||
const that = this
|
||||
let mag = 0.1
|
||||
//set armed and sucking status
|
||||
if (!this.isArmed && !game.mouseDown) {
|
||||
this.isArmed = true
|
||||
} else if (this.isArmed && game.mouseDown && !this.isSucking) {
|
||||
this.isSucking = true;
|
||||
this.endCycle = game.cycle + 35;
|
||||
}
|
||||
|
||||
function suck(who, radius = that.explodeRad * 2) {
|
||||
for (i = 0, len = who.length; i < len; i++) {
|
||||
const sub = Matter.Vector.sub(that.position, who[i].position);
|
||||
const dist = Matter.Vector.magnitude(sub);
|
||||
if (dist < radius && dist > 150) {
|
||||
knock = Matter.Vector.mult(Matter.Vector.normalise(sub), mag * who[i].mass / Math.sqrt(dist));
|
||||
who[i].force.x += knock.x;
|
||||
who[i].force.y += knock.y;
|
||||
if (this.isSucking) {
|
||||
if (!mech.isBodiesAsleep) {
|
||||
const that = this
|
||||
let mag = 0.1
|
||||
|
||||
function suck(who, radius = that.explodeRad * 2) {
|
||||
for (i = 0, len = who.length; i < len; i++) {
|
||||
const sub = Matter.Vector.sub(that.position, who[i].position);
|
||||
const dist = Matter.Vector.magnitude(sub);
|
||||
if (dist < radius && dist > 150) {
|
||||
knock = Matter.Vector.mult(Matter.Vector.normalise(sub), mag * who[i].mass / Math.sqrt(dist));
|
||||
who[i].force.x += knock.x;
|
||||
who[i].force.y += knock.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (game.cycle > this.endCycle - 5) {
|
||||
mag = -0.22
|
||||
suck(body)
|
||||
suck(mob)
|
||||
suck(powerUp)
|
||||
suck([player])
|
||||
} else {
|
||||
mag = 0.1
|
||||
suck(body)
|
||||
suck(mob)
|
||||
suck(powerUp)
|
||||
suck([player])
|
||||
}
|
||||
//keep bomb in place
|
||||
Matter.Body.setVelocity(this, {
|
||||
x: 0,
|
||||
y: 0
|
||||
});
|
||||
//draw suck
|
||||
const radius = 2.5 * this.explodeRad * (this.endCycle - game.cycle) / 35
|
||||
ctx.fillStyle = "rgba(0,0,0,0.1)";
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
}
|
||||
if (game.cycle > this.endCycle - 5) {
|
||||
mag = -0.22
|
||||
suck(body)
|
||||
suck(mob)
|
||||
suck(powerUp)
|
||||
suck([player])
|
||||
} else {
|
||||
mag = 0.1
|
||||
suck(body)
|
||||
suck(mob)
|
||||
suck(powerUp)
|
||||
suck([player])
|
||||
} else {
|
||||
// flashing lights to show armed
|
||||
if (!(game.cycle % 10)) {
|
||||
if (this.isFlashOn) {
|
||||
this.isFlashOn = false;
|
||||
} else {
|
||||
this.isFlashOn = true;
|
||||
}
|
||||
}
|
||||
|
||||
//keep bomb in place
|
||||
Matter.Body.setVelocity(this, {
|
||||
x: 0,
|
||||
y: 0
|
||||
});
|
||||
//draw suck
|
||||
const radius = 9 * this.explodeRad * (this.endCycle - game.cycle) / this.endCycleLength
|
||||
ctx.fillStyle = "rgba(0,0,0,0.1)";
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
}
|
||||
|
||||
//draw timer
|
||||
if (!(game.cycle % 10)) {
|
||||
if (this.isFlashOn) {
|
||||
this.isFlashOn = false;
|
||||
} else {
|
||||
this.isFlashOn = true;
|
||||
ctx.fillStyle = "#000";
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.position.x, this.position.y, this.radius, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
//draw clock on timer
|
||||
ctx.fillStyle = "#f04";
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.position.x, this.position.y, this.radius * 0.5, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
}
|
||||
}
|
||||
if (this.isFlashOn) {
|
||||
ctx.fillStyle = "#000";
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.position.x, this.position.y, this.radius, 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
//draw clock on timer
|
||||
ctx.fillStyle = "#f12";
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.position.x, this.position.y, this.radius * (1 - (this.endCycle - game.cycle) / this.endCycleLength), 0, 2 * Math.PI);
|
||||
ctx.fill();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
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,
|
||||
ammoPack: 5,
|
||||
have: false,
|
||||
@@ -1314,7 +1152,7 @@ const b = {
|
||||
},
|
||||
{
|
||||
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,
|
||||
ammoPack: 20,
|
||||
have: false,
|
||||
|
||||
12
js/game.js
12
js/game.js
@@ -1,6 +1,15 @@
|
||||
// game Object ********************************************************
|
||||
//*********************************************************************
|
||||
const game = {
|
||||
// difficulty: {
|
||||
// damageDone: 1,
|
||||
// damageTaken: 1,
|
||||
// mobQuickness: 1,
|
||||
// powerUpDropRate: 1,
|
||||
// fallingDamage: false,
|
||||
// explosiveDamage: true,
|
||||
// unlimitedAmmo: false,
|
||||
// },
|
||||
loop() {
|
||||
game.cycle++; //tracks game cycles
|
||||
mech.cycle++; //tracks player cycles //used to alow time to stop for everything, but the player
|
||||
@@ -710,13 +719,12 @@ const game = {
|
||||
}
|
||||
},
|
||||
mapFill: "#444",
|
||||
bodyFill: "#999",
|
||||
bodyFill: "rgba(140,140,140,0.85)", //"#999",
|
||||
bodyStroke: "#222",
|
||||
drawMapPath() {
|
||||
ctx.fillStyle = this.mapFill;
|
||||
ctx.fill(this.mapPath);
|
||||
},
|
||||
|
||||
seeEdges() {
|
||||
const eye = {
|
||||
x: mech.pos.x + 20 * Math.cos(mech.angle),
|
||||
|
||||
14
js/index.js
14
js/index.js
@@ -2,7 +2,19 @@
|
||||
/* 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
|
||||
|
||||
levels spawn by having the map aspects randomly fly into place
|
||||
|
||||
15
js/level.js
15
js/level.js
@@ -14,7 +14,7 @@ const level = {
|
||||
if (game.levelsCleared === 0) {
|
||||
// game.levelsCleared = 16; //for testing to simulate possible mobs spawns
|
||||
// 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
|
||||
// b.giveMod(8)
|
||||
|
||||
@@ -36,8 +36,8 @@ const level = {
|
||||
game.draw.setPaths();
|
||||
},
|
||||
difficultyIncrease() {
|
||||
game.dmgScale += 0.35; //damage done by mobs increases each level
|
||||
b.dmgScale *= 0.92; //damage done by player decreases each level
|
||||
game.dmgScale += 0.3; //damage done by mobs increases each level
|
||||
b.dmgScale *= 0.94; //damage done by player decreases each level
|
||||
game.accelScale *= 1.05 //mob acceleration increases each level
|
||||
game.lookFreqScale *= 0.95 //mob cycles between looks 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.focuser(800, -1150);
|
||||
// spawn.groupBoss(-600, -550);
|
||||
spawn.starter(800, -150, 100);
|
||||
spawn.striker(800, -150);
|
||||
// spawn.beamer(800, -150);
|
||||
// spawn.grower(800, -250);
|
||||
// spawn.blinker(800, -250, 40);
|
||||
// spawn.groupBoss(900, -1070);
|
||||
@@ -797,7 +798,7 @@ const level = {
|
||||
spawn.mapRect(1600, -400, 1500, 500); //long center building
|
||||
spawn.mapRect(1345, -1100, 250, 25); //left 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, 450, 50); //left higher platform roof
|
||||
spawn.mapRect(1500, -1860, 100, 50); //ground bump wall
|
||||
@@ -1554,7 +1555,7 @@ const level = {
|
||||
},
|
||||
levelAnnounce() {
|
||||
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 = "";
|
||||
// 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++) {
|
||||
//body[i].collisionFilter.group = 0;
|
||||
body[i].collisionFilter.category = 0x010000;
|
||||
body[i].collisionFilter.mask = 0x011111;
|
||||
body[i].collisionFilter.mask = 0x111111;
|
||||
body[i].classType = "body";
|
||||
World.add(engine.world, body[i]); //add to world
|
||||
}
|
||||
|
||||
@@ -252,6 +252,8 @@ const mobs = {
|
||||
ctx.lineWidth = 1;
|
||||
ctx.stroke();
|
||||
ctx.setLineDash([]);
|
||||
ctx.fillStyle = "rgba(255,0,170,0.03)";
|
||||
ctx.fill();
|
||||
}
|
||||
},
|
||||
laser() {
|
||||
|
||||
20
js/player.js
20
js/player.js
@@ -439,7 +439,7 @@ const mech = {
|
||||
document.getElementById("fade-out").style.opacity = 1; //slowly fades out
|
||||
setTimeout(function () {
|
||||
game.splashReturn();
|
||||
}, 5000);
|
||||
}, 3000);
|
||||
}
|
||||
},
|
||||
health: 0,
|
||||
@@ -912,12 +912,12 @@ const mech = {
|
||||
},
|
||||
hold() {},
|
||||
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
|
||||
},
|
||||
fieldUpgrades: [{
|
||||
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: () => {
|
||||
mech.fieldMode = 0;
|
||||
mech.fieldText();
|
||||
@@ -944,7 +944,7 @@ const mech = {
|
||||
},
|
||||
{
|
||||
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> while field is active<br> <em>can fire while field is active</em>",
|
||||
effect: () => {
|
||||
mech.fieldMode = 1;
|
||||
mech.fieldText();
|
||||
@@ -1015,7 +1015,7 @@ const mech = {
|
||||
},
|
||||
{
|
||||
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: () => {
|
||||
mech.fieldMode = 2;
|
||||
mech.fieldText();
|
||||
@@ -1088,7 +1088,7 @@ const mech = {
|
||||
},
|
||||
{
|
||||
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 <strong style='letter-spacing: 6px;'>gravity</strong><br> player can hold more massive objects<br><em>can fire while field is active</em>",
|
||||
effect: () => {
|
||||
mech.fieldMode = 3;
|
||||
mech.fieldText();
|
||||
@@ -1176,12 +1176,12 @@ const mech = {
|
||||
},
|
||||
{
|
||||
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: () => {
|
||||
mech.fieldMode = 4;
|
||||
mech.fieldText();
|
||||
mech.setHoldDefaults();
|
||||
mech.fieldRegen *= 0.25;
|
||||
mech.fieldRegen *= 0.3;
|
||||
|
||||
mech.hold = function () {
|
||||
if (mech.isHolding) {
|
||||
@@ -1219,7 +1219,7 @@ const mech = {
|
||||
},
|
||||
{
|
||||
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: () => {
|
||||
mech.fieldMode = 5;
|
||||
mech.fieldText();
|
||||
@@ -1250,7 +1250,7 @@ const mech = {
|
||||
},
|
||||
{
|
||||
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: () => {
|
||||
mech.fieldMode = 6;
|
||||
mech.fieldText();
|
||||
|
||||
@@ -11,7 +11,7 @@ const powerUps = {
|
||||
let heal = (this.size / 40) ** 2
|
||||
heal = Math.min(1 - mech.health, 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: {
|
||||
@@ -41,13 +41,13 @@ const powerUps = {
|
||||
}
|
||||
if (target.ammo === Infinity) {
|
||||
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 {
|
||||
//ammo given scales as mobs take more hits to kill
|
||||
const ammo = Math.ceil((target.ammoPack * (0.6 + 0.04 * Math.random())) / b.dmgScale);
|
||||
target.ammo += ammo;
|
||||
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) {
|
||||
let newMod = options[Math.floor(Math.random() * options.length)]
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -117,12 +117,8 @@ const powerUps = {
|
||||
//give player a gun they don't already have if possible
|
||||
if (options.length > 0) {
|
||||
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
|
||||
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);
|
||||
if (b.activeGun === null) b.activeGun = newGun //if no active gun switch to new gun
|
||||
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.guns[newGun].have = true;
|
||||
b.inventory.push(newGun);
|
||||
b.guns[newGun].ammo += b.guns[newGun].ammoPack * 2;
|
||||
@@ -133,7 +129,7 @@ const powerUps = {
|
||||
const ammo = Math.ceil(b.guns[ammoTarget].ammoPack * 2);
|
||||
b.guns[ammoTarget].ammo += ammo;
|
||||
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);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
59
style.css
59
style.css
@@ -112,8 +112,8 @@ summary {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #fff;
|
||||
opacity: 0;
|
||||
transition: opacity 5s;
|
||||
opacity: 1;
|
||||
transition: opacity 3s;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@@ -169,21 +169,64 @@ summary {
|
||||
}
|
||||
|
||||
#text-log {
|
||||
position: absolute;
|
||||
/* position: absolute;
|
||||
top: 20px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
line-height: 150%;
|
||||
text-align: center;
|
||||
width: 100%; */
|
||||
|
||||
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;
|
||||
color: #000;
|
||||
background-color: rgba(255, 255, 255, 0.23);
|
||||
|
||||
opacity: 0;
|
||||
transition: opacity 0.5s;
|
||||
pointer-events: 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 {
|
||||
padding: 3px 8px 3px 8px;
|
||||
border: 2px solid #444;
|
||||
@@ -191,10 +234,6 @@ summary {
|
||||
background-color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
.faded {
|
||||
opacity: 0.5;
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
display: grid;
|
||||
|
||||
Reference in New Issue
Block a user