renormalization
This commit is contained in:
56
js/bullet.js
56
js/bullet.js
@@ -751,7 +751,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Vector.magnitudeSquared(Vector.sub(this.position, powerUp[i].position)) < 60000 && !game.isChoosing) {
|
if (Vector.magnitudeSquared(Vector.sub(this.position, powerUp[i].position)) < 60000 && !game.isChoosing) {
|
||||||
powerUps.onPickUp();
|
powerUps.onPickUp(this.position);
|
||||||
powerUp[i].effect();
|
powerUp[i].effect();
|
||||||
Matter.World.remove(engine.world, powerUp[i]);
|
Matter.World.remove(engine.world, powerUp[i]);
|
||||||
powerUp.splice(i, 1);
|
powerUp.splice(i, 1);
|
||||||
@@ -898,7 +898,7 @@ const b = {
|
|||||||
if (this.target.isShielded) {
|
if (this.target.isShielded) {
|
||||||
this.target.damage(b.dmgScale * 0.005, true); //shield damage bypass
|
this.target.damage(b.dmgScale * 0.005, true); //shield damage bypass
|
||||||
//shrink if mob is shielded
|
//shrink if mob is shielded
|
||||||
const SCALE = 1 - 0.016 / mod.isBulletsLastLonger
|
const SCALE = 1 - 0.018 / mod.isBulletsLastLonger
|
||||||
Matter.Body.scale(this, SCALE, SCALE);
|
Matter.Body.scale(this, SCALE, SCALE);
|
||||||
this.radius *= SCALE;
|
this.radius *= SCALE;
|
||||||
} else {
|
} else {
|
||||||
@@ -977,9 +977,7 @@ const b = {
|
|||||||
bullet[me].endCycle = game.cycle + 60 + 18 * Math.random();
|
bullet[me].endCycle = game.cycle + 60 + 18 * Math.random();
|
||||||
bullet[me].dmg = dmg
|
bullet[me].dmg = dmg
|
||||||
bullet[me].onDmg = function (who) {
|
bullet[me].onDmg = function (who) {
|
||||||
if (mod.isNailPoison) {
|
if (mod.isNailPoison) mobs.statusDoT(who, dmg * 0.15, 180) // one tick every 30 cycles
|
||||||
mobs.statusDoT(who, dmg * 0.055, 300) //66% / (360 / 30) one tick every 30 cycles in 360 cycles total
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
bullet[me].do = function () {};
|
bullet[me].do = function () {};
|
||||||
},
|
},
|
||||||
@@ -1137,7 +1135,7 @@ const b = {
|
|||||||
minDmgSpeed: 2,
|
minDmgSpeed: 2,
|
||||||
lookFrequency: 40 + Math.floor(7 * Math.random()),
|
lookFrequency: 40 + Math.floor(7 * Math.random()),
|
||||||
acceleration: 0.0015 * (1 + 0.3 * Math.random()),
|
acceleration: 0.0015 * (1 + 0.3 * Math.random()),
|
||||||
range: 600 * (1 + 0.2 * Math.random()) + 200 * mod.isLaserBotUpgrade,
|
range: 500 * (1 + 0.2 * Math.random()) + 150 * mod.isLaserBotUpgrade,
|
||||||
followRange: 150 + Math.floor(30 * Math.random()),
|
followRange: 150 + Math.floor(30 * Math.random()),
|
||||||
offPlayer: {
|
offPlayer: {
|
||||||
x: 0,
|
x: 0,
|
||||||
@@ -1206,7 +1204,7 @@ const b = {
|
|||||||
bestVertexDistance = dist
|
bestVertexDistance = dist
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const dmg = b.dmgScale * (0.04 + 0.04 * this.isUpgraded);
|
const dmg = b.dmgScale * (0.06 + 0.06 * this.isUpgraded);
|
||||||
this.lockedOn.damage(dmg);
|
this.lockedOn.damage(dmg);
|
||||||
this.lockedOn.locatePlayer();
|
this.lockedOn.locatePlayer();
|
||||||
|
|
||||||
@@ -1577,7 +1575,8 @@ const b = {
|
|||||||
name: "shotgun",
|
name: "shotgun",
|
||||||
description: "fire a <strong>burst</strong> of short range <strong> bullets</strong> <br><em>crouch to reduce recoil</em>",
|
description: "fire a <strong>burst</strong> of short range <strong> bullets</strong> <br><em>crouch to reduce recoil</em>",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 6,
|
ammoPack: 7,
|
||||||
|
defaultAmmoPack: 7,
|
||||||
have: false,
|
have: false,
|
||||||
fire() {
|
fire() {
|
||||||
let knock, spread
|
let knock, spread
|
||||||
@@ -1619,7 +1618,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const side = 21 * mod.bulletSize
|
const side = 21 * mod.bulletSize
|
||||||
for (let i = 0; i < 15; i++) {
|
for (let i = 0; i < 17; i++) {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
const dir = mech.angle + (Math.random() - 0.5) * spread
|
const dir = mech.angle + (Math.random() - 0.5) * spread
|
||||||
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));
|
||||||
@@ -1631,7 +1630,7 @@ const b = {
|
|||||||
});
|
});
|
||||||
bullet[me].endCycle = game.cycle + 40
|
bullet[me].endCycle = game.cycle + 40
|
||||||
bullet[me].minDmgSpeed = 15
|
bullet[me].minDmgSpeed = 15
|
||||||
// bullet[me].dmg = 0.1
|
// bullet[me].restitution = 0.4
|
||||||
bullet[me].frictionAir = 0.034;
|
bullet[me].frictionAir = 0.034;
|
||||||
bullet[me].do = function () {
|
bullet[me].do = function () {
|
||||||
if (!mech.isBodiesAsleep) {
|
if (!mech.isBodiesAsleep) {
|
||||||
@@ -1702,8 +1701,8 @@ const b = {
|
|||||||
name: "flechettes",
|
name: "flechettes",
|
||||||
description: "fire a volley of <strong class='color-p'>uranium-235</strong> <strong>needles</strong><br>does <strong class='color-d'>damage</strong> over <strong>3</strong> seconds",
|
description: "fire a volley of <strong class='color-p'>uranium-235</strong> <strong>needles</strong><br>does <strong class='color-d'>damage</strong> over <strong>3</strong> seconds",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 35,
|
ammoPack: 40,
|
||||||
defaultAmmoPack: 35,
|
defaultAmmoPack: 40,
|
||||||
have: false,
|
have: false,
|
||||||
count: 0, //used to track how many shots are in a volley before a big CD
|
count: 0, //used to track how many shots are in a volley before a big CD
|
||||||
lastFireCycle: 0, //use to remember how longs its been since last fire, used to reset count
|
lastFireCycle: 0, //use to remember how longs its been since last fire, used to reset count
|
||||||
@@ -1731,9 +1730,9 @@ const b = {
|
|||||||
who.foundPlayer();
|
who.foundPlayer();
|
||||||
|
|
||||||
if (mod.isFastDot) {
|
if (mod.isFastDot) {
|
||||||
mobs.statusDoT(who, 3.6, 30)
|
mobs.statusDoT(who, 3.9, 30)
|
||||||
} else {
|
} else {
|
||||||
mobs.statusDoT(who, 0.6, mod.isSlowDot ? 360 : 180)
|
mobs.statusDoT(who, 0.65, mod.isSlowDot ? 360 : 180)
|
||||||
}
|
}
|
||||||
|
|
||||||
game.drawList.push({ //add dmg to draw queue
|
game.drawList.push({ //add dmg to draw queue
|
||||||
@@ -1774,7 +1773,6 @@ const b = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const SPEED = 50
|
const SPEED = 50
|
||||||
Matter.Body.setVelocity(bullet[me], {
|
Matter.Body.setVelocity(bullet[me], {
|
||||||
x: mech.Vx / 2 + SPEED * Math.cos(angle),
|
x: mech.Vx / 2 + SPEED * Math.cos(angle),
|
||||||
@@ -1806,7 +1804,7 @@ const b = {
|
|||||||
name: "wave beam",
|
name: "wave beam",
|
||||||
description: "emit a <strong>sine wave</strong> of oscillating particles<br>particles <strong>slowly</strong> propagate through <strong>solids</strong>",
|
description: "emit a <strong>sine wave</strong> of oscillating particles<br>particles <strong>slowly</strong> propagate through <strong>solids</strong>",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 90,
|
ammoPack: 80,
|
||||||
have: false,
|
have: false,
|
||||||
fire() {
|
fire() {
|
||||||
mech.fireCDcycle = mech.cycle + Math.floor(3 * b.fireCD); // cool down
|
mech.fireCDcycle = mech.cycle + Math.floor(3 * b.fireCD); // cool down
|
||||||
@@ -2311,13 +2309,6 @@ const b = {
|
|||||||
} else {
|
} else {
|
||||||
if (Matter.Query.collides(this, map).length) {
|
if (Matter.Query.collides(this, map).length) {
|
||||||
onCollide(this)
|
onCollide(this)
|
||||||
|
|
||||||
// this.stuck = function () {
|
|
||||||
// Matter.Body.setVelocity(this, {
|
|
||||||
// x: 0,
|
|
||||||
// y: 0
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
} else { //if colliding with nothing just fall
|
} else { //if colliding with nothing just fall
|
||||||
this.force.y += this.mass * 0.001;
|
this.force.y += this.mass * 0.001;
|
||||||
}
|
}
|
||||||
@@ -2527,7 +2518,7 @@ const b = {
|
|||||||
fire() {
|
fire() {
|
||||||
if (mech.crouch) {
|
if (mech.crouch) {
|
||||||
b.iceIX(10, 0.3)
|
b.iceIX(10, 0.3)
|
||||||
mech.fireCDcycle = mech.cycle + Math.floor(10 * b.fireCD); // cool down
|
mech.fireCDcycle = mech.cycle + Math.floor(8 * b.fireCD); // cool down
|
||||||
} else {
|
} else {
|
||||||
b.iceIX(2)
|
b.iceIX(2)
|
||||||
mech.fireCDcycle = mech.cycle + Math.floor(3 * b.fireCD); // cool down
|
mech.fireCDcycle = mech.cycle + Math.floor(3 * b.fireCD); // cool down
|
||||||
@@ -2606,13 +2597,12 @@ const b = {
|
|||||||
bullet[me].charge = 0;
|
bullet[me].charge = 0;
|
||||||
bullet[me].do = function () {
|
bullet[me].do = function () {
|
||||||
if ((!game.mouseDown && this.charge > 0.6) || mech.energy < 0.005) { //fire on mouse release
|
if ((!game.mouseDown && this.charge > 0.6) || mech.energy < 0.005) { //fire on mouse release
|
||||||
if (mech.energy < 0.005) {
|
if (mech.energy < 0.005 && !mod.isRailTimeSlow) {
|
||||||
this.charge = 0.1;
|
// this.charge = 0;
|
||||||
|
mech.energy += this.charge * 0.4
|
||||||
mech.fireCDcycle = mech.cycle + 120; // cool down if out of energy
|
mech.fireCDcycle = mech.cycle + 120; // cool down if out of energy
|
||||||
//normal bullet behavior occurs after firing, overwrite this function
|
this.endCycle = 0;
|
||||||
this.do = function () {
|
return
|
||||||
this.force.y += this.mass * 0.001; //normal gravity
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
mech.fireCDcycle = mech.cycle + 2; // set fire cool down
|
mech.fireCDcycle = mech.cycle + 2; // set fire cool down
|
||||||
//normal bullet behavior occurs after firing, overwrite this function
|
//normal bullet behavior occurs after firing, overwrite this function
|
||||||
@@ -3024,7 +3014,7 @@ const b = {
|
|||||||
if (mod.isPulseAim) { //find mobs in line of sight
|
if (mod.isPulseAim) { //find mobs in line of sight
|
||||||
let dist = 2200
|
let dist = 2200
|
||||||
energy = 0.25 * Math.min(mech.energy, 1.75)
|
energy = 0.25 * Math.min(mech.energy, 1.75)
|
||||||
explosionRange = 1000 * energy
|
explosionRange = 1100 * energy
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
const newDist = Vector.magnitude(Vector.sub(path[0], mob[i].position))
|
const newDist = Vector.magnitude(Vector.sub(path[0], mob[i].position))
|
||||||
if (explosionRange < newDist &&
|
if (explosionRange < newDist &&
|
||||||
@@ -3036,8 +3026,6 @@ const b = {
|
|||||||
path[path.length - 1] = mob[i].position
|
path[path.length - 1] = mob[i].position
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (!best.who) {
|
if (!best.who) {
|
||||||
vertexCollision(path[0], path[1], mob);
|
vertexCollision(path[0], path[1], mob);
|
||||||
@@ -3058,7 +3046,7 @@ const b = {
|
|||||||
} else {
|
} else {
|
||||||
energy = 0.3 * Math.min(mech.energy, 1.75)
|
energy = 0.3 * Math.min(mech.energy, 1.75)
|
||||||
mech.energy -= energy * mod.isLaserDiode
|
mech.energy -= energy * mod.isLaserDiode
|
||||||
explosionRange = 1000 * energy
|
explosionRange = 1100 * energy
|
||||||
if (best.who) b.explosion(path[1], explosionRange, true)
|
if (best.who) b.explosion(path[1], explosionRange, true)
|
||||||
mech.fireCDcycle = mech.cycle + Math.floor(50 * b.fireCD); // cool down
|
mech.fireCDcycle = mech.cycle + Math.floor(50 * b.fireCD); // cool down
|
||||||
}
|
}
|
||||||
|
|||||||
34
js/level.js
34
js/level.js
@@ -18,7 +18,7 @@ const level = {
|
|||||||
// mech.isStealth = true;
|
// mech.isStealth = true;
|
||||||
// mod.giveMod("bot replication");
|
// mod.giveMod("bot replication");
|
||||||
// mod.nailBotCount += 10
|
// mod.nailBotCount += 10
|
||||||
// b.giveGuns("neutron bomb")
|
// b.giveGuns("rail gun")
|
||||||
// mech.setField("plasma torch")
|
// mech.setField("plasma torch")
|
||||||
|
|
||||||
level.intro(); //starting level
|
level.intro(); //starting level
|
||||||
@@ -418,8 +418,8 @@ const level = {
|
|||||||
const button = level.button(6600, 2675)
|
const button = level.button(6600, 2675)
|
||||||
const hazard = level.hazard(4550, 2750, 4550, 150)
|
const hazard = level.hazard(4550, 2750, 4550, 150)
|
||||||
const balance1 = level.spinner(300, -395, 25, 390, 0.001) //entrance
|
const balance1 = level.spinner(300, -395, 25, 390, 0.001) //entrance
|
||||||
const balance2 = level.spinner(2605, 500, 390, 25, 0.005) //falling
|
const balance2 = level.spinner(2605, 500, 390, 25, 0.001) //falling
|
||||||
const balance3 = level.spinner(2608, 1900, 584, 25, 0.005) //falling
|
const balance3 = level.spinner(2608, 1900, 584, 25, 0.001) //falling
|
||||||
const balance4 = level.spinner(9300, 2205, 25, 380, 0.001) //exit
|
const balance4 = level.spinner(9300, 2205, 25, 380, 0.001) //exit
|
||||||
|
|
||||||
level.custom = () => {
|
level.custom = () => {
|
||||||
@@ -526,7 +526,7 @@ const level = {
|
|||||||
spawn.bodyRect(6800, 2490, 50, 50);
|
spawn.bodyRect(6800, 2490, 50, 50);
|
||||||
spawn.bodyRect(6800, 2540, 50, 50);
|
spawn.bodyRect(6800, 2540, 50, 50);
|
||||||
spawn.bodyRect(6800, 2590, 50, 50);
|
spawn.bodyRect(6800, 2590, 50, 50);
|
||||||
spawn.bodyRect(8225, 2200, 100, 400);
|
spawn.bodyRect(8225, 2225, 50, 375);
|
||||||
spawn.mapRect(6250, 1875, 700, 150);
|
spawn.mapRect(6250, 1875, 700, 150);
|
||||||
spawn.mapRect(8000, 1875, 600, 150);
|
spawn.mapRect(8000, 1875, 600, 150);
|
||||||
|
|
||||||
@@ -745,6 +745,8 @@ const level = {
|
|||||||
spawn.wireHead();
|
spawn.wireHead();
|
||||||
},
|
},
|
||||||
satellite() {
|
satellite() {
|
||||||
|
// level.chain(4025, -1175, 15, 20)
|
||||||
|
|
||||||
const elevator = level.platform(4210, -1325, 380, 30, -10)
|
const elevator = level.platform(4210, -1325, 380, 30, -10)
|
||||||
level.custom = () => {
|
level.custom = () => {
|
||||||
level.playerExitCheck();
|
level.playerExitCheck();
|
||||||
@@ -3315,4 +3317,28 @@ const level = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
chain(x, y, len = 15, radius = 20) {
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
body[body.length] = Bodies.polygon(x, y + 2 * radius * i, 12, radius, {
|
||||||
|
inertia: Infinity
|
||||||
|
});
|
||||||
|
}
|
||||||
|
for (let i = 1; i < len; i++) {
|
||||||
|
consBB[consBB.length] = Constraint.create({
|
||||||
|
bodyA: body[body.length - i],
|
||||||
|
bodyB: body[body.length - i - 1],
|
||||||
|
stiffness: 0.4,
|
||||||
|
damping: 0.01
|
||||||
|
});
|
||||||
|
}
|
||||||
|
cons[cons.length] = Constraint.create({ //pin first block to a point in space
|
||||||
|
pointA: {
|
||||||
|
x: x,
|
||||||
|
y: y - radius
|
||||||
|
},
|
||||||
|
bodyB: body[body.length - len],
|
||||||
|
stiffness: 0.4,
|
||||||
|
damping: 0.01
|
||||||
|
});
|
||||||
|
},
|
||||||
};
|
};
|
||||||
30
js/mods.js
30
js/mods.js
@@ -70,7 +70,7 @@ const mod = {
|
|||||||
},
|
},
|
||||||
damageFromMods() {
|
damageFromMods() {
|
||||||
let dmg = 1
|
let dmg = 1
|
||||||
if (mod.isLowHealthDmg) dmg *= 1 + 0.4 * Math.max(0, 1 - mech.health)
|
if (mod.isLowHealthDmg) dmg *= 1 + 0.5 * Math.max(0, 1 - mech.health)
|
||||||
if (mod.isHarmDamage && mech.lastHarmCycle + 600 > mech.cycle) dmg *= 2;
|
if (mod.isHarmDamage && mech.lastHarmCycle + 600 > mech.cycle) dmg *= 2;
|
||||||
if (mod.isEnergyLoss) dmg *= 1.33;
|
if (mod.isEnergyLoss) dmg *= 1.33;
|
||||||
if (mod.isAcidDmg && mech.health > 1) dmg *= 1.4;
|
if (mod.isAcidDmg && mech.health > 1) dmg *= 1.4;
|
||||||
@@ -199,7 +199,7 @@ const mod = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "negative feedback",
|
name: "negative feedback",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>4%</strong><br>for each <strong>10%</strong> missing <strong>health</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>5%</strong><br>for every <strong>10%</strong> missing base <strong>health</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -1058,7 +1058,7 @@ const mod = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "logistics",
|
name: "logistics",
|
||||||
description: "<strong class='color-g'>ammo</strong> power ups give <strong>100%</strong> more <strong class='color-g'>ammo</strong><br>but <strong class='color-g'>ammo</strong> is only added to your <strong>current gun</strong>",
|
description: "<strong class='color-g'>ammo</strong> power ups give <strong>200%</strong> <strong class='color-g'>ammo</strong><br>but <strong class='color-g'>ammo</strong> is only added to your <strong>current gun</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -1391,7 +1391,7 @@ const mod = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "shotgun spin-statistics",
|
name: "shotgun spin-statistics",
|
||||||
description: "firing the <strong>shotgun</strong> makes you <br><strong>immune</strong> to <strong class='color-harm'>harm</strong> while on cooldown",
|
description: "<strong>immune</strong> to <strong class='color-harm'>harm</strong> while firing the <strong>shotgun</strong><br>receive <strong>33%</strong> less <strong>shotgun</strong> <strong class='color-g'>ammo</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -1400,9 +1400,21 @@ const mod = {
|
|||||||
requires: "shotgun",
|
requires: "shotgun",
|
||||||
effect() {
|
effect() {
|
||||||
mod.isShotgunImmune = true;
|
mod.isShotgunImmune = true;
|
||||||
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
|
if (b.guns[i].name === "shotgun") {
|
||||||
|
b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * 0.66
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
mod.isShotgunImmune = false;
|
mod.isShotgunImmune = false;
|
||||||
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
|
if (b.guns[i].name === "shotgun") {
|
||||||
|
b.guns[i].ammoPack = b.guns[i].defaultAmmoPack;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1785,7 +1797,7 @@ const mod = {
|
|||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return mod.nailBotCount + mod.grenadeFragments + mod.nailsDeathMob / 2 + mod.haveGunCheck("mine") + mod.isRailNails + mod.isNailShot > 1
|
return mod.nailBotCount + mod.grenadeFragments + mod.nailsDeathMob / 2 + (mod.haveGunCheck("mine") + mod.isRailNails + mod.isNailShot) * 2 > 1
|
||||||
},
|
},
|
||||||
requires: "nails",
|
requires: "nails",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -1999,12 +2011,12 @@ const mod = {
|
|||||||
requires: "laser",
|
requires: "laser",
|
||||||
effect() {
|
effect() {
|
||||||
mod.laserReflections++;
|
mod.laserReflections++;
|
||||||
mod.laserDamage += 0.045; //base is 0.08
|
mod.laserDamage += 0.05; //base is 0.1
|
||||||
mod.laserFieldDrain += 0.001 //base is 0.002
|
mod.laserFieldDrain += 0.001 //base is 0.002
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
mod.laserReflections = 2;
|
mod.laserReflections = 2;
|
||||||
mod.laserDamage = 0.09;
|
mod.laserDamage = 0.1;
|
||||||
mod.laserFieldDrain = 0.002;
|
mod.laserFieldDrain = 0.002;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2097,7 +2109,7 @@ const mod = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Lorentz transformation",
|
name: "Lorentz transformation",
|
||||||
description: "<strong>move</strong>, <strong>jump</strong>, and <strong>shoot</strong> <strong>33%</strong> faster<br>while <strong>time dilation</strong> is active or inactive ",
|
description: "<strong>move</strong>, <strong>jump</strong>, and <strong>shoot</strong> <strong>33%</strong> faster",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -2300,7 +2312,7 @@ const mod = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "renormalization",
|
name: "renormalization",
|
||||||
description: "<strong>phase decoherence</strong> adds <strong>visibility</strong> to bullets<br><strong>80%</strong> less <strong class='color-f'>energy</strong> drain when <strong>firing</strong>",
|
description: "using a <strong class='color-r'>reroll</strong> to change selection options<br>has a <strong>60%</strong> chance to spawn a <strong class='color-r'>reroll</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
|
|||||||
13
js/player.js
13
js/player.js
@@ -942,7 +942,7 @@ const mech = {
|
|||||||
y: powerUp[i].velocity.y * 0.11
|
y: powerUp[i].velocity.y * 0.11
|
||||||
});
|
});
|
||||||
if (dist2 < 5000 && !game.isChoosing) { //use power up if it is close enough
|
if (dist2 < 5000 && !game.isChoosing) { //use power up if it is close enough
|
||||||
powerUps.onPickUp();
|
powerUps.onPickUp(mech.pos);
|
||||||
Matter.Body.setVelocity(player, { //player knock back, after grabbing power up
|
Matter.Body.setVelocity(player, { //player knock back, after grabbing power up
|
||||||
x: player.velocity.x + ((powerUp[i].velocity.x * powerUp[i].mass) / player.mass) * 0.3,
|
x: player.velocity.x + ((powerUp[i].velocity.x * powerUp[i].mass) / player.mass) * 0.3,
|
||||||
y: player.velocity.y + ((powerUp[i].velocity.y * powerUp[i].mass) / player.mass) * 0.3
|
y: player.velocity.y + ((powerUp[i].velocity.y * powerUp[i].mass) / player.mass) * 0.3
|
||||||
@@ -1733,25 +1733,18 @@ const mech = {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
function drawField(radius) {
|
function drawField(radius) {
|
||||||
radius *= 0.9 + 1.5 * mech.energy * mech.energy;
|
radius *= 0.9 + 2 * mech.energy * mech.energy;
|
||||||
const rotate = mech.cycle * 0.005;
|
const rotate = mech.cycle * 0.005;
|
||||||
mech.fieldPhase += 0.5 - 0.5 * Math.sqrt(Math.max(0.01, Math.min(mech.energy, 1)));
|
mech.fieldPhase += 0.5 - 0.5 * Math.sqrt(Math.max(0.01, Math.min(mech.energy, 1)));
|
||||||
const off1 = 1 + 0.06 * Math.sin(mech.fieldPhase);
|
const off1 = 1 + 0.06 * Math.sin(mech.fieldPhase);
|
||||||
const off2 = 1 - 0.06 * Math.sin(mech.fieldPhase);
|
const off2 = 1 - 0.06 * Math.sin(mech.fieldPhase);
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
ctx.ellipse(mech.pos.x, mech.pos.y, radius * off1, radius * off2, rotate, 0, 2 * Math.PI);
|
ctx.ellipse(mech.pos.x, mech.pos.y, radius * off1, radius * off2, rotate, 0, 2 * Math.PI);
|
||||||
if (mod.renormalization) {
|
|
||||||
for (let i = 0; i < bullet.length; i++) {
|
|
||||||
ctx.moveTo(bullet[i].position.x, bullet[i].position.y)
|
|
||||||
ctx.arc(bullet[i].position.x, bullet[i].position.y, radius, 0, 2 * Math.PI);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (mech.fireCDcycle > mech.cycle && (keys[32] || game.mouseDownRight)) {
|
if (mech.fireCDcycle > mech.cycle && (keys[32] || game.mouseDownRight)) {
|
||||||
ctx.lineWidth = 5;
|
ctx.lineWidth = 5;
|
||||||
ctx.strokeStyle = `rgba(0, 204, 255,1)`
|
ctx.strokeStyle = `rgba(0, 204, 255,1)`
|
||||||
ctx.stroke()
|
ctx.stroke()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
ctx.fillStyle = "#fff" //`rgba(0,0,0,${0.5+0.5*mech.energy})`;
|
ctx.fillStyle = "#fff" //`rgba(0,0,0,${0.5+0.5*mech.energy})`;
|
||||||
ctx.globalCompositeOperation = "destination-in"; //in or atop
|
ctx.globalCompositeOperation = "destination-in"; //in or atop
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
@@ -1777,7 +1770,7 @@ const mech = {
|
|||||||
// game.draw.bodyFill = "transparent"
|
// game.draw.bodyFill = "transparent"
|
||||||
// game.draw.bodyStroke = "transparent"
|
// game.draw.bodyStroke = "transparent"
|
||||||
|
|
||||||
const DRAIN = 0.00014 + ((!mod.renormalization && mech.fireCDcycle > mech.cycle) ? 0.007 : 0.001)
|
const DRAIN = 0.00014 + (mech.fireCDcycle > mech.cycle ? 0.007 : 0.001)
|
||||||
if (mech.energy > DRAIN) {
|
if (mech.energy > DRAIN) {
|
||||||
mech.energy -= DRAIN;
|
mech.energy -= DRAIN;
|
||||||
// if (mech.energy < 0.001) {
|
// if (mech.energy < 0.001) {
|
||||||
|
|||||||
@@ -100,6 +100,10 @@ const powerUps = {
|
|||||||
use(type) { //runs when you actually reroll a list of selections, type can be field, gun, or mod
|
use(type) { //runs when you actually reroll a list of selections, type can be field, gun, or mod
|
||||||
powerUps.reroll.changeRerolls(-1)
|
powerUps.reroll.changeRerolls(-1)
|
||||||
powerUps[type].effect();
|
powerUps[type].effect();
|
||||||
|
if (mod.renormalization && Math.random() < 0.6) {
|
||||||
|
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
|
||||||
|
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
|
||||||
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
heal: {
|
heal: {
|
||||||
@@ -388,11 +392,11 @@ const powerUps = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onPickUp() {
|
onPickUp(where) {
|
||||||
if (mod.isMassEnergy) mech.energy = mech.maxEnergy * 3;
|
if (mod.isMassEnergy) mech.energy = mech.maxEnergy * 3;
|
||||||
if (mod.isMineDrop) b.mine({
|
if (mod.isMineDrop) b.mine({
|
||||||
x: mech.pos.x,
|
x: where.x,
|
||||||
y: mech.pos.y
|
y: where.y
|
||||||
}, {
|
}, {
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 0
|
y: 0
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ const spawn = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
powerUpBoss(x, y, vertices = 9, radius = 150) {
|
powerUpBoss(x, y, vertices = 9, radius = 130) {
|
||||||
mobs.spawn(x, y, vertices, radius, "transparent");
|
mobs.spawn(x, y, vertices, radius, "transparent");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.isBoss = true;
|
me.isBoss = true;
|
||||||
@@ -1124,7 +1124,7 @@ const spawn = {
|
|||||||
me.onDeath = function () {
|
me.onDeath = function () {
|
||||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||||
};
|
};
|
||||||
me.rotateVelocity = Math.min(0.005, 0.002 * game.accelScale * game.accelScale) * (level.levelsCleared > 8 ? 1 : -1)
|
me.rotateVelocity = Math.min(0.0045, 0.0015 * game.accelScale * game.accelScale) * (level.levelsCleared > 8 ? 1 : -1)
|
||||||
me.do = function () {
|
me.do = function () {
|
||||||
this.fill = '#' + Math.random().toString(16).substr(-6); //flash colors
|
this.fill = '#' + Math.random().toString(16).substr(-6); //flash colors
|
||||||
if (!mech.isBodiesAsleep) {
|
if (!mech.isBodiesAsleep) {
|
||||||
|
|||||||
16
todo.txt
16
todo.txt
@@ -1,12 +1,21 @@
|
|||||||
|
mod: renormalization now gives a 60% chance to return a reroll after using a reroll
|
||||||
|
(the old renormalization was causing too much lag)
|
||||||
|
|
||||||
************** TODO - n-gon **************
|
************** TODO - n-gon **************
|
||||||
|
|
||||||
|
level Boss: fractal Sierpiński triangle
|
||||||
|
https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle
|
||||||
|
spawns a 1/2 size version of the boss, this version can also spawn a smaller version, but it is capped at some size level
|
||||||
|
they spawn once at the start of the level
|
||||||
|
if a version dies, one can be replaced every ten seconds by the largest version
|
||||||
|
|
||||||
performance issues with large numbers of spores
|
performance issues with large numbers of spores
|
||||||
consider limiting total bullets?
|
consider limiting total bullets?
|
||||||
300?
|
300?
|
||||||
|
|
||||||
level element: a hanging chain of connected blocks
|
level element: a hanging chain of connected blocks
|
||||||
|
level element: a zone with wind, anti-gravity, extra gravity
|
||||||
|
control with button
|
||||||
|
|
||||||
give mobs more animal-like behaviors like rain world
|
give mobs more animal-like behaviors like rain world
|
||||||
mobs play, look for food, explore
|
mobs play, look for food, explore
|
||||||
@@ -149,8 +158,6 @@ an effect when canceling a power up
|
|||||||
add player Scent Trails for mob navigation
|
add player Scent Trails for mob navigation
|
||||||
https://abitawake.com/news/articles/enemy-ai-chasing-a-player-without-navigation2d-or-a-star-pathfinding
|
https://abitawake.com/news/articles/enemy-ai-chasing-a-player-without-navigation2d-or-a-star-pathfinding
|
||||||
|
|
||||||
mod - you can no longer see your current health
|
|
||||||
|
|
||||||
settings - custom keys binding
|
settings - custom keys binding
|
||||||
|
|
||||||
css transition for pause menu
|
css transition for pause menu
|
||||||
@@ -163,9 +170,6 @@ gun: Spirit Bomb (singularity)
|
|||||||
uses energy
|
uses energy
|
||||||
hold above the player's head
|
hold above the player's head
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
animate new level spawn by having the map aspects randomly fly into place
|
animate new level spawn by having the map aspects randomly fly into place
|
||||||
|
|
||||||
n-gon outreach ideas
|
n-gon outreach ideas
|
||||||
|
|||||||
Reference in New Issue
Block a user