swarn gun
This commit is contained in:
228
js/bullets.js
228
js/bullets.js
@@ -53,9 +53,9 @@ const b = {
|
|||||||
isModDeathAvoidOnCD: null,
|
isModDeathAvoidOnCD: null,
|
||||||
modWaveSpeedMap: null,
|
modWaveSpeedMap: null,
|
||||||
modWaveSpeedBody: null,
|
modWaveSpeedBody: null,
|
||||||
modFieldEfficiency: null,
|
|
||||||
isModSporeField: null,
|
isModSporeField: null,
|
||||||
isModMissileField: null,
|
isModMissileField: null,
|
||||||
|
isModSwarmField: null,
|
||||||
isModFlechetteMultiShot: null,
|
isModFlechetteMultiShot: null,
|
||||||
isModMineAmmoBack: null,
|
isModMineAmmoBack: null,
|
||||||
isModPlasmaRange: null,
|
isModPlasmaRange: null,
|
||||||
@@ -66,6 +66,8 @@ const b = {
|
|||||||
modThrowChargeRate: null,
|
modThrowChargeRate: null,
|
||||||
isModBlockStun: null,
|
isModBlockStun: null,
|
||||||
isModStunField: null,
|
isModStunField: null,
|
||||||
|
isModHarmDamage: null,
|
||||||
|
isModAlphaRadiation: null,
|
||||||
modOnHealthChange() { //used with acid mod
|
modOnHealthChange() { //used with acid mod
|
||||||
if (b.isModAcidDmg && mech.health > 0.8) {
|
if (b.isModAcidDmg && mech.health > 0.8) {
|
||||||
game.playerDmgColor = "rgba(0,80,80,0.9)"
|
game.playerDmgColor = "rgba(0,80,80,0.9)"
|
||||||
@@ -91,25 +93,6 @@ const b = {
|
|||||||
b.modBulletSize = 1;
|
b.modBulletSize = 1;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "fluoroantimonic acid",
|
|
||||||
description: "each <strong>bullet</strong> does instant <strong class='color-p'>acid</strong> <strong class='color-d'>damage</strong><br><strong>active</strong> when you are above <strong>80%</strong> base health",
|
|
||||||
maxCount: 1,
|
|
||||||
count: 0,
|
|
||||||
allowed() {
|
|
||||||
return mech.health > 0.8 || build.isCustomSelection
|
|
||||||
},
|
|
||||||
requires: "health above 80%",
|
|
||||||
effect() {
|
|
||||||
b.isModAcidDmg = true;
|
|
||||||
b.modOnHealthChange();
|
|
||||||
},
|
|
||||||
remove() {
|
|
||||||
b.modAcidDmg = 0;
|
|
||||||
b.isModAcidDmg = false;
|
|
||||||
game.playerDmgColor = "rgba(0,0,0,0.7)"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "kinetic bombardment",
|
name: "kinetic bombardment",
|
||||||
description: "do up to <strong>33%</strong> more <strong class='color-d'>damage</strong> at a distance<br><em>increase maxes out at about 40 steps away</em>",
|
description: "do up to <strong>33%</strong> more <strong class='color-d'>damage</strong> at a distance<br><em>increase maxes out at about 40 steps away</em>",
|
||||||
@@ -143,7 +126,26 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "quasistatic equilibrium",
|
name: "fluoroantimonic acid",
|
||||||
|
description: "each <strong>bullet</strong> does instant <strong class='color-p'>acid</strong> <strong class='color-d'>damage</strong><br><strong>active</strong> when you are above <strong>80%</strong> base health",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return mech.health > 0.8 || build.isCustomSelection
|
||||||
|
},
|
||||||
|
requires: "health above 80%",
|
||||||
|
effect() {
|
||||||
|
b.isModAcidDmg = true;
|
||||||
|
b.modOnHealthChange();
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
b.modAcidDmg = 0;
|
||||||
|
b.isModAcidDmg = false;
|
||||||
|
game.playerDmgColor = "rgba(0,0,0,0.7)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "negative feedback",
|
||||||
description: "do extra <strong class='color-d'>damage</strong> at low health<br><em>up to <strong>50%</strong> increase when near death</em>",
|
description: "do extra <strong class='color-d'>damage</strong> at low health<br><em>up to <strong>50%</strong> increase when near death</em>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -158,6 +160,22 @@ const b = {
|
|||||||
b.isModLowHealthDmg = false;
|
b.isModLowHealthDmg = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "radiative equilibrium",
|
||||||
|
description: "after receiving any <strong>harm</strong><br>do <strong>2x</strong> <strong class='color-d'>damage</strong> for <strong>5 seconds</strong>",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return b.isModLowHealthDmg
|
||||||
|
},
|
||||||
|
requires: "quasistatic equilibrium",
|
||||||
|
effect() {
|
||||||
|
b.isModHarmDamage = true;
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
b.isModHarmDamage = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "high explosives",
|
name: "high explosives",
|
||||||
description: "<strong class='color-e'>explosions</strong> do <strong>+20%</strong> more <strong class='color-d'>damage</strong><br><strong class='color-e'>explosive</strong> area is <strong>+44% larger</strong>",
|
description: "<strong class='color-e'>explosions</strong> do <strong>+20%</strong> more <strong class='color-d'>damage</strong><br><strong class='color-e'>explosive</strong> area is <strong>+44% larger</strong>",
|
||||||
@@ -313,9 +331,9 @@ const b = {
|
|||||||
maxCount: 3,
|
maxCount: 3,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" || b.haveGunCheck("spores") || b.haveGunCheck("drones") || b.haveGunCheck("super balls") || b.haveGunCheck("foam") || b.haveGunCheck("wave beam")
|
return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" || b.haveGunCheck("spores") || b.haveGunCheck("drones") || b.haveGunCheck("super balls") || b.haveGunCheck("foam") || b.haveGunCheck("wave beam") || b.haveGunCheck("swarm")
|
||||||
},
|
},
|
||||||
requires: "drones, spores, super balls,<br> foam, or wave beam",
|
requires: "drones, spores, super balls,<br> foam, wave beam, or swarm",
|
||||||
effect() {
|
effect() {
|
||||||
b.isModBulletsLastLonger += 0.33
|
b.isModBulletsLastLonger += 0.33
|
||||||
},
|
},
|
||||||
@@ -1004,7 +1022,7 @@ const b = {
|
|||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return b.haveGunCheck("drones") || (mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(b.isModSporeField || b.isModMissileField))
|
return b.haveGunCheck("drones") || (mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(b.isModSporeField || b.isModMissileField || b.isModSwarmField))
|
||||||
},
|
},
|
||||||
requires: "drones",
|
requires: "drones",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -1014,6 +1032,22 @@ const b = {
|
|||||||
b.isModDroneCollide = true;
|
b.isModDroneCollide = true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "alpha radiation",
|
||||||
|
description: "the <strong>swarm</strong> bots deliver a dose of<br><strong class='color-p'>radioactive</strong> <strong class='color-d'>damage</strong> over 3 seconds",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return b.haveGunCheck("swarm") || (mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && b.isModSwarmField)
|
||||||
|
},
|
||||||
|
requires: "swarm",
|
||||||
|
effect() {
|
||||||
|
b.isModAlphaRadiation = true
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
b.isModAlphaRadiation = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "foam stabilization",
|
name: "foam stabilization",
|
||||||
description: "<strong>foam</strong> can stick to shields",
|
description: "<strong>foam</strong> can stick to shields",
|
||||||
@@ -1057,18 +1091,18 @@ const b = {
|
|||||||
requires: "laser",
|
requires: "laser",
|
||||||
effect() {
|
effect() {
|
||||||
b.modLaserReflections++;
|
b.modLaserReflections++;
|
||||||
b.modLaserDamage += 0.025; //base is 0.05
|
b.modLaserDamage += 0.035; //base is 0.06
|
||||||
b.modLaserFieldDrain += 0.001 //base is 0.002
|
b.modLaserFieldDrain += 0.001 //base is 0.002
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
b.modLaserReflections = 2;
|
b.modLaserReflections = 2;
|
||||||
b.modLaserDamage = 0.06;
|
b.modLaserDamage = 0.07;
|
||||||
b.modLaserFieldDrain = 0.002;
|
b.modLaserFieldDrain = 0.002;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "flux pinning",
|
name: "flux pinning",
|
||||||
description: "blocking <strong>stuns</strong> mobs for <strong>+1</strong> second<br>with the <strong>perfect diamagnetism</strong> field",
|
description: "blocking with <strong>perfect diamagnetism</strong><br><strong>stuns</strong> mobs for <strong>+1</strong> second",
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -1082,22 +1116,6 @@ const b = {
|
|||||||
b.isModStunField = 0;
|
b.isModStunField = 0;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "bremsstrahlung radiation",
|
|
||||||
description: "<strong>blocking</strong> with your field does <strong class='color-d'>damage</strong>",
|
|
||||||
maxCount: 9,
|
|
||||||
count: 0,
|
|
||||||
allowed() {
|
|
||||||
return mech.fieldUpgrades[mech.fieldMode].name === "standing wave harmonics" || mech.fieldUpgrades[mech.fieldMode].name === "perfect diamagnetism"
|
|
||||||
},
|
|
||||||
requires: "standing wave harmonics<br>or perfect diamagnetism",
|
|
||||||
effect() {
|
|
||||||
b.modBlockDmg += 0.4 //if you change this value also update the for loop in the electricity graphics in mech.pushMass
|
|
||||||
},
|
|
||||||
remove() {
|
|
||||||
b.modBlockDmg = 0;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "plasma jet",
|
name: "plasma jet",
|
||||||
description: "increase <strong>plasma torch's</strong> range by <strong>33%</strong>",
|
description: "increase <strong>plasma torch's</strong> range by <strong>33%</strong>",
|
||||||
@@ -1130,6 +1148,22 @@ const b = {
|
|||||||
b.isModHawking = 0;
|
b.isModHawking = 0;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "bremsstrahlung radiation",
|
||||||
|
description: "<strong>blocking</strong> with your field does <strong class='color-d'>damage</strong>",
|
||||||
|
maxCount: 9,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return mech.fieldUpgrades[mech.fieldMode].name === "standing wave harmonics"
|
||||||
|
},
|
||||||
|
requires: "standing wave harmonics",
|
||||||
|
effect() {
|
||||||
|
b.modBlockDmg += 0.5 //if you change this value also update the for loop in the electricity graphics in mech.pushMass
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
b.modBlockDmg = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "frequency resonance",
|
name: "frequency resonance",
|
||||||
description: "<strong>standing wave harmonics</strong> shield is retuned<br>increase <strong>size</strong> and <strong>blocking</strong> efficiency by <strong>30%</strong>",
|
description: "<strong>standing wave harmonics</strong> shield is retuned<br>increase <strong>size</strong> and <strong>blocking</strong> efficiency by <strong>30%</strong>",
|
||||||
@@ -1154,7 +1188,7 @@ const b = {
|
|||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !b.isModMissileField
|
return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(b.isModMissileField || b.isModSwarmField)
|
||||||
},
|
},
|
||||||
requires: "nano-scale manufacturing",
|
requires: "nano-scale manufacturing",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -1170,7 +1204,7 @@ const b = {
|
|||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !b.isModSporeField
|
return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(b.isModSporeField || b.isModSwarmField)
|
||||||
},
|
},
|
||||||
requires: "nano-scale manufacturing",
|
requires: "nano-scale manufacturing",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -1180,6 +1214,22 @@ const b = {
|
|||||||
b.isModMissileField = false;
|
b.isModMissileField = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "swarm manufacturing",
|
||||||
|
description: "<strong>nano-scale manufacturing</strong> is repurposed<br>excess <strong class='color-f'>energy</strong> used to construct <strong>swarm</strong> bots",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(b.isModSporeField || b.isModMissileField)
|
||||||
|
},
|
||||||
|
requires: "nano-scale manufacturing",
|
||||||
|
effect() {
|
||||||
|
b.isModSwarmField = true;
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
b.isModSwarmField = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "quantum dissipation",
|
name: "quantum dissipation",
|
||||||
description: "<strong>phase decoherence field</strong> uses <strong class='color-f'>energy</strong> to <br><strong class='color-d'>damage</strong> unshielded <strong>mobs</strong> that you <strong>overlap</strong>",
|
description: "<strong>phase decoherence field</strong> uses <strong class='color-f'>energy</strong> to <br><strong class='color-d'>damage</strong> unshielded <strong>mobs</strong> that you <strong>overlap</strong>",
|
||||||
@@ -1803,6 +1853,75 @@ const b = {
|
|||||||
});
|
});
|
||||||
World.add(engine.world, bullet[bIndex]); //add bullet to world
|
World.add(engine.world, bullet[bIndex]); //add bullet to world
|
||||||
},
|
},
|
||||||
|
swarm(speed = 0, spread = 2 * Math.PI) {
|
||||||
|
const me = bullet.length;
|
||||||
|
const THRUST = 0.004
|
||||||
|
const dir = mech.angle + spread * (Math.random() - 0.5);
|
||||||
|
const RADIUS = 17 * b.modBulletSize
|
||||||
|
bullet[me] = Bodies.polygon(mech.pos.x + 30 * Math.cos(mech.angle), mech.pos.y + 30 * Math.sin(mech.angle), 3, RADIUS, {
|
||||||
|
angle: dir - Math.PI,
|
||||||
|
inertia: Infinity,
|
||||||
|
friction: 0,
|
||||||
|
frictionAir: 0.10,
|
||||||
|
restitution: 0.2,
|
||||||
|
dmg: 0.3, //damage done in addition to the damage from momentum
|
||||||
|
lookFrequency: 10 + Math.floor(7 * Math.random()),
|
||||||
|
endCycle: game.cycle + 90 * b.isModBulletsLastLonger, //Math.floor((1200 + 420 * Math.random()) * b.isModBulletsLastLonger),
|
||||||
|
classType: "bullet",
|
||||||
|
collisionFilter: {
|
||||||
|
category: cat.bullet,
|
||||||
|
mask: cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield //self collide
|
||||||
|
},
|
||||||
|
minDmgSpeed: 0,
|
||||||
|
lockedOn: null,
|
||||||
|
isFollowMouse: true,
|
||||||
|
onDmg(who) {
|
||||||
|
this.endCycle = game.cycle
|
||||||
|
if (b.isModAlphaRadiation) mobs.statusPoison(who, 0.08, 180)
|
||||||
|
},
|
||||||
|
onEnd() {},
|
||||||
|
do() {
|
||||||
|
// this.force.y += this.mass * 0.0002;
|
||||||
|
//find mob targets
|
||||||
|
if (!(game.cycle % this.lookFrequency)) {
|
||||||
|
const scale = 0.9;
|
||||||
|
Matter.Body.scale(this, scale, scale);
|
||||||
|
this.lockedOn = null;
|
||||||
|
let closeDist = Infinity;
|
||||||
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
|
if (
|
||||||
|
mob[i].dropPowerUp &&
|
||||||
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
||||||
|
) {
|
||||||
|
const TARGET_VECTOR = Vector.sub(this.position, mob[i].position)
|
||||||
|
const DIST = Vector.magnitude(TARGET_VECTOR);
|
||||||
|
if (DIST < closeDist) {
|
||||||
|
closeDist = DIST;
|
||||||
|
this.lockedOn = mob[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.lockedOn) { //accelerate towards mobs
|
||||||
|
this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, this.lockedOn.position)), -this.mass * THRUST)
|
||||||
|
} else {
|
||||||
|
this.force = Vector.mult(Vector.normalise(this.velocity), this.mass * THRUST)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
World.add(engine.world, bullet[me]); //add bullet to world
|
||||||
|
// Matter.Body.setAngularVelocity(bullet[me], 2 * (0.5 - Math.random())) //doesn't work due to high friction
|
||||||
|
Matter.Body.setVelocity(bullet[me], {
|
||||||
|
x: speed * Math.cos(dir),
|
||||||
|
y: speed * Math.sin(dir)
|
||||||
|
});
|
||||||
|
// Matter.Body.setVelocity(bullet[me], {
|
||||||
|
// x: mech.Vx / 2 + speed * Math.cos(dir),
|
||||||
|
// y: mech.Vy / 2 + speed * Math.sin(dir)
|
||||||
|
// });
|
||||||
|
},
|
||||||
drone(speed = 1) {
|
drone(speed = 1) {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
const THRUST = 0.0015
|
const THRUST = 0.0015
|
||||||
@@ -2704,6 +2823,25 @@ const b = {
|
|||||||
mech.fireCDcycle = mech.cycle + Math.floor((mech.crouch ? 25 : 5) * b.modFireRate); // cool down
|
mech.fireCDcycle = mech.cycle + Math.floor((mech.crouch ? 25 : 5) * b.modFireRate); // cool down
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "swarm", //11
|
||||||
|
description: "rapidly deploy <strong>short-lived</strong> bots<br>that <strong>seek</strong> out nearby mobs",
|
||||||
|
ammo: 0,
|
||||||
|
ammoPack: 80,
|
||||||
|
have: false,
|
||||||
|
isStarterGun: true,
|
||||||
|
isEasyToAim: true,
|
||||||
|
fire() {
|
||||||
|
if (mech.crouch) {
|
||||||
|
b.swarm(20, 0.3)
|
||||||
|
mech.fireCDcycle = mech.cycle + Math.floor(10 * b.modFireRate); // cool down
|
||||||
|
} else {
|
||||||
|
b.swarm(2)
|
||||||
|
mech.fireCDcycle = mech.cycle + Math.floor(3 * b.modFireRate); // cool down
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "foam", //12
|
name: "foam", //12
|
||||||
description: "spray bubbly foam that <strong>sticks</strong> to mobs<br>does <strong class='color-d'>damage</strong> over time and <strong>slows</strong> movement",
|
description: "spray bubbly foam that <strong>sticks</strong> to mobs<br>does <strong class='color-d'>damage</strong> over time and <strong>slows</strong> movement",
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ function collisionChecks(event) {
|
|||||||
if (obj.classType === "bullet" && obj.speed > obj.minDmgSpeed) {
|
if (obj.classType === "bullet" && obj.speed > obj.minDmgSpeed) {
|
||||||
// const dmg = b.dmgScale * (obj.dmg + 0.15 * obj.mass * Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity)));
|
// const dmg = b.dmgScale * (obj.dmg + 0.15 * obj.mass * Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity)));
|
||||||
let dmg = b.dmgScale * (obj.dmg + b.modAcidDmg + 0.15 * obj.mass * Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity)))
|
let dmg = b.dmgScale * (obj.dmg + b.modAcidDmg + 0.15 * obj.mass * Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity)))
|
||||||
|
// console.log(obj.dmg, 0.15 * obj.mass * Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity)))
|
||||||
// console.log(obj.dmg / (0.15 * obj.mass * Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity))))
|
// console.log(obj.dmg / (0.15 * obj.mass * Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity))))
|
||||||
if (b.isModCrit && !mob[k].seePlayer.recall && !mob[k].shield) dmg *= 5
|
if (b.isModCrit && !mob[k].seePlayer.recall && !mob[k].shield) dmg *= 5
|
||||||
mob[k].foundPlayer();
|
mob[k].foundPlayer();
|
||||||
|
|||||||
@@ -689,9 +689,6 @@ const game = {
|
|||||||
if (b.isModEnergyLoss) {
|
if (b.isModEnergyLoss) {
|
||||||
mech.energy = 0.05;
|
mech.energy = 0.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else { //haven't killed a mob in the last 5 seconds
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(game.cycle % 420)) { //once every 7 seconds
|
if (!(game.cycle % 420)) { //once every 7 seconds
|
||||||
|
|||||||
10
js/level.js
10
js/level.js
@@ -14,9 +14,9 @@ const level = {
|
|||||||
start() {
|
start() {
|
||||||
if (level.levelsCleared === 0) {
|
if (level.levelsCleared === 0) {
|
||||||
// level.difficultyIncrease(9)
|
// level.difficultyIncrease(9)
|
||||||
// b.giveGuns("mine")
|
// b.giveGuns("swarm")
|
||||||
// mech.setField("time dilation field")
|
// mech.setField("time dilation field")
|
||||||
// b.giveMod("irradiated needles");
|
// b.giveMod("quantum immortality");
|
||||||
// b.giveMod("reflective cavity");
|
// b.giveMod("reflective cavity");
|
||||||
|
|
||||||
level.intro(); //starting level
|
level.intro(); //starting level
|
||||||
@@ -136,7 +136,7 @@ const level = {
|
|||||||
// powerUps.spawn(950, -425, "gun", false);
|
// powerUps.spawn(950, -425, "gun", false);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
spawn.nodeBoss(-500, -600, spawn.allowedBossList[Math.floor(Math.random() * spawn.allowedBossList.length)]);
|
// spawn.nodeBoss(-500, -600, spawn.allowedBossList[Math.floor(Math.random() * spawn.allowedBossList.length)]);
|
||||||
// spawn.lineBoss(-500, -600, spawn.allowedBossList[Math.floor(Math.random() * spawn.allowedBossList.length)]);
|
// spawn.lineBoss(-500, -600, spawn.allowedBossList[Math.floor(Math.random() * spawn.allowedBossList.length)]);
|
||||||
// spawn.bodyRect(-135, -50, 50, 50);
|
// spawn.bodyRect(-135, -50, 50, 50);
|
||||||
// spawn.bodyRect(-140, -100, 50, 50);
|
// spawn.bodyRect(-140, -100, 50, 50);
|
||||||
@@ -147,8 +147,8 @@ const level = {
|
|||||||
// powerUps.spawn(450, -400, "mod", false, 6);
|
// powerUps.spawn(450, -400, "mod", false, 6);
|
||||||
// powerUps.spawn(450, -400, "mod", false);
|
// powerUps.spawn(450, -400, "mod", false);
|
||||||
// spawn.bodyRect(-45, -100, 40, 50);
|
// spawn.bodyRect(-45, -100, 40, 50);
|
||||||
spawn.starter(800, -450, 150);
|
// spawn.starter(800, -450, 150);
|
||||||
// spawn.cellBoss(400, -750);
|
spawn.laserBoss(400, -750);
|
||||||
|
|
||||||
// spawn.randomLevelBoss(400, -750)
|
// spawn.randomLevelBoss(400, -750)
|
||||||
|
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ const mobs = {
|
|||||||
x: who.position.x,
|
x: who.position.x,
|
||||||
y: who.position.y,
|
y: who.position.y,
|
||||||
radius: Math.log(2 * dmg + 1.1) * 40,
|
radius: Math.log(2 * dmg + 1.1) * 40,
|
||||||
color: `rgba(255,${Math.floor(255*Math.random())},0,0.9)`,
|
color: `rgba(255,${Math.floor(200*Math.random())},0,0.9)`,
|
||||||
time: game.drawTime
|
time: game.drawTime
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -984,8 +984,7 @@ const mobs = {
|
|||||||
dmg /= Math.sqrt(this.mass)
|
dmg /= Math.sqrt(this.mass)
|
||||||
if (this.shield) dmg *= 0.04
|
if (this.shield) dmg *= 0.04
|
||||||
if (b.isModLowHealthDmg) dmg *= (3 / (2 + mech.health)) //up to 50% dmg at zero player health
|
if (b.isModLowHealthDmg) dmg *= (3 / (2 + mech.health)) //up to 50% dmg at zero player health
|
||||||
|
if (b.isModHarmDamage && mech.lastHarmCycle + 300 > mech.cycle) dmg *= 2;
|
||||||
// if (b.isModFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(1000, Math.min(3500, this.distanceToPlayer())) - 1000) * 0.01 //up to 50% dmg at max range of 3500
|
|
||||||
if (b.isModEnergyLoss) dmg *= 1.5;
|
if (b.isModEnergyLoss) dmg *= 1.5;
|
||||||
if (b.isModFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500
|
if (b.isModFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500
|
||||||
if (b.modEnergySiphon && dmg !== Infinity) mech.energy += Math.min(this.health, dmg) * b.modEnergySiphon
|
if (b.modEnergySiphon && dmg !== Infinity) mech.energy += Math.min(this.health, dmg) * b.modEnergySiphon
|
||||||
|
|||||||
94
js/player.js
94
js/player.js
@@ -54,6 +54,7 @@ const mech = {
|
|||||||
},
|
},
|
||||||
cycle: 0,
|
cycle: 0,
|
||||||
lastKillCycle: 0,
|
lastKillCycle: 0,
|
||||||
|
lastHarmCycle: 0,
|
||||||
width: 50,
|
width: 50,
|
||||||
radius: 30,
|
radius: 30,
|
||||||
fillColor: "#fff", //changed by mod piezoelectric plating (damage immunity)
|
fillColor: "#fff", //changed by mod piezoelectric plating (damage immunity)
|
||||||
@@ -249,19 +250,59 @@ const mech = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//horizontal move on ground
|
//horizontal move on ground
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// function blink(dir) {
|
||||||
|
// dir *= 6
|
||||||
|
// mech.fieldCDcycle = mech.cycle + 15;
|
||||||
|
// for (let i = 0; i < 100; i++) {
|
||||||
|
// Matter.Body.setPosition(player, {
|
||||||
|
// x: player.position.x + dir,
|
||||||
|
// y: player.position.y
|
||||||
|
// });
|
||||||
|
// const bounds = {
|
||||||
|
// min: {
|
||||||
|
// x: player.bounds.min.x,
|
||||||
|
// y: player.bounds.min.y
|
||||||
|
// },
|
||||||
|
// max: {
|
||||||
|
// x: player.bounds.max.x,
|
||||||
|
// y: player.bounds.max.y - 30
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (Matter.Query.region(map, bounds).length !== 0 || Matter.Query.region(body, bounds).length !== 0) {
|
||||||
|
// Matter.Body.setPosition(player, {
|
||||||
|
// x: player.position.x - dir,
|
||||||
|
// y: player.position.y
|
||||||
|
// });
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
//apply a force to move
|
//apply a force to move
|
||||||
if (keys[65] || keys[37]) { //left / a
|
if (keys[65] || keys[37]) { //left / a
|
||||||
|
// if (game.mouseDownRight && mech.fieldCDcycle < mech.cycle && !mech.crouch) {
|
||||||
|
// blink(-1)
|
||||||
|
// } else {
|
||||||
if (player.velocity.x > -2) {
|
if (player.velocity.x > -2) {
|
||||||
player.force.x -= mech.Fx * 1.5
|
player.force.x -= mech.Fx * 1.5
|
||||||
} else {
|
} else {
|
||||||
player.force.x -= mech.Fx
|
player.force.x -= mech.Fx
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
} else if (keys[68] || keys[39]) { //right / d
|
} else if (keys[68] || keys[39]) { //right / d
|
||||||
|
// if (game.mouseDownRight && mech.fieldCDcycle < mech.cycle && !mech.crouch) {
|
||||||
|
// blink(1)
|
||||||
|
// } else {
|
||||||
if (player.velocity.x < 2) {
|
if (player.velocity.x < 2) {
|
||||||
player.force.x += mech.Fx * 1.5
|
player.force.x += mech.Fx * 1.5
|
||||||
} else {
|
} else {
|
||||||
player.force.x += mech.Fx
|
player.force.x += mech.Fx
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
} else {
|
} else {
|
||||||
const stoppingFriction = 0.92;
|
const stoppingFriction = 0.92;
|
||||||
Matter.Body.setVelocity(player, {
|
Matter.Body.setVelocity(player, {
|
||||||
@@ -323,10 +364,6 @@ const mech = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function randomizeMods() {
|
function randomizeMods() {
|
||||||
b.setupAllMods(); //remove all mods
|
|
||||||
//remove all bullets
|
|
||||||
for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]);
|
|
||||||
bullet = [];
|
|
||||||
for (let i = 0; i < totalMods; i++) {
|
for (let i = 0; i < totalMods; i++) {
|
||||||
//find what mods I don't have
|
//find what mods I don't have
|
||||||
let options = [];
|
let options = [];
|
||||||
@@ -335,6 +372,7 @@ const mech = {
|
|||||||
b.mods[i].name !== "quantum immortality" &&
|
b.mods[i].name !== "quantum immortality" &&
|
||||||
b.mods[i].name !== "Born rule" &&
|
b.mods[i].name !== "Born rule" &&
|
||||||
b.mods[i].name !== "leveraged investment" &&
|
b.mods[i].name !== "leveraged investment" &&
|
||||||
|
b.mods[i].name !== "reallocation" &&
|
||||||
b.mods[i].allowed()
|
b.mods[i].allowed()
|
||||||
) options.push(i);
|
) options.push(i);
|
||||||
}
|
}
|
||||||
@@ -354,7 +392,7 @@ const mech = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function randomizeHealth() {
|
function randomizeHealth() {
|
||||||
mech.health = 0.55 + Math.random()
|
mech.health = 0.6 + Math.random()
|
||||||
if (mech.health > 1) mech.health = 1;
|
if (mech.health > 1) mech.health = 1;
|
||||||
mech.displayHealth();
|
mech.displayHealth();
|
||||||
}
|
}
|
||||||
@@ -375,7 +413,7 @@ const mech = {
|
|||||||
//randomize ammo
|
//randomize ammo
|
||||||
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
||||||
if (b.guns[b.inventory[i]].ammo !== Infinity) {
|
if (b.guns[b.inventory[i]].ammo !== Infinity) {
|
||||||
b.guns[b.inventory[i]].ammo = Math.max(0, Math.floor(6 * b.guns[b.inventory[i]].ammo * (Math.random() - 0.1)))
|
b.guns[b.inventory[i]].ammo = Math.max(0, Math.floor(5 * b.guns[b.inventory[i]].ammo * (Math.random() - 0.1)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
game.makeGunHUD(); //update gun HUD
|
game.makeGunHUD(); //update gun HUD
|
||||||
@@ -385,23 +423,29 @@ const mech = {
|
|||||||
ctx.fillStyle = "rgba(255,255,255,0)";
|
ctx.fillStyle = "rgba(255,255,255,0)";
|
||||||
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||||
}
|
}
|
||||||
randomizeHealth()
|
|
||||||
randomizeField()
|
function randomizeEverything() {
|
||||||
randomizeGuns()
|
b.setupAllMods(); //remove all mods
|
||||||
randomizeMods()
|
for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]);
|
||||||
|
bullet = []; //remove all bullets
|
||||||
|
randomizeHealth()
|
||||||
|
randomizeField()
|
||||||
|
randomizeGuns()
|
||||||
|
randomizeMods()
|
||||||
|
}
|
||||||
|
|
||||||
|
randomizeEverything()
|
||||||
|
const swapPeriod = 1000
|
||||||
for (let i = 0, len = 7; i < len; i++) {
|
for (let i = 0, len = 7; i < len; i++) {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
randomizeHealth()
|
randomizeEverything()
|
||||||
randomizeField()
|
|
||||||
randomizeGuns()
|
|
||||||
randomizeMods()
|
|
||||||
game.replaceTextLog = true;
|
game.replaceTextLog = true;
|
||||||
game.makeTextLog(`probability amplitude will synchronize in ${len-i-1} seconds`, 1000);
|
game.makeTextLog(`probability amplitude will synchronize in ${len-i-1} seconds`, swapPeriod);
|
||||||
game.wipe = function () { //set wipe to have trails
|
game.wipe = function () { //set wipe to have trails
|
||||||
ctx.fillStyle = `rgba(255,255,255,${(i+1)*(i+1)*0.006})`;
|
ctx.fillStyle = `rgba(255,255,255,${(i+1)*(i+1)*0.006})`;
|
||||||
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||||
}
|
}
|
||||||
}, (i + 1) * 1000);
|
}, (i + 1) * swapPeriod);
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
@@ -410,7 +454,7 @@ const mech = {
|
|||||||
}
|
}
|
||||||
game.replaceTextLog = true;
|
game.replaceTextLog = true;
|
||||||
game.makeTextLog("your quantum probability has stabilized", 1000);
|
game.makeTextLog("your quantum probability has stabilized", 1000);
|
||||||
}, 8000);
|
}, 8 * swapPeriod);
|
||||||
|
|
||||||
} else if (mech.alive) { //normal death code here
|
} else if (mech.alive) { //normal death code here
|
||||||
mech.alive = false;
|
mech.alive = false;
|
||||||
@@ -458,6 +502,7 @@ const mech = {
|
|||||||
defaultFPSCycle: 0, //tracks when to return to normal fps
|
defaultFPSCycle: 0, //tracks when to return to normal fps
|
||||||
collisionImmuneCycle: 0, //used in engine
|
collisionImmuneCycle: 0, //used in engine
|
||||||
damage(dmg) {
|
damage(dmg) {
|
||||||
|
mech.lastHarmCycle = mech.cycle
|
||||||
dmg *= mech.fieldDamageResistance
|
dmg *= mech.fieldDamageResistance
|
||||||
if (b.isModEntanglement && b.inventory[0] === b.activeGun) {
|
if (b.isModEntanglement && b.inventory[0] === b.activeGun) {
|
||||||
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
||||||
@@ -1194,7 +1239,7 @@ const mech = {
|
|||||||
ctx.fillStyle = "rgba(110,170,200," + (0.06 + 0.03 * Math.random()) + ")";
|
ctx.fillStyle = "rgba(110,170,200," + (0.06 + 0.03 * Math.random()) + ")";
|
||||||
ctx.strokeStyle = "rgba(110, 200, 235, " + (0.35 + 0.05 * Math.random()) + ")"
|
ctx.strokeStyle = "rgba(110, 200, 235, " + (0.35 + 0.05 * Math.random()) + ")"
|
||||||
} else {
|
} else {
|
||||||
ctx.fillStyle = "rgba(110,170,200," + (0.2 + 0.13 * Math.random() - 0.15 * wave) + ")";
|
ctx.fillStyle = "rgba(110,170,200," + (0.27 + 0.2 * Math.random() - 0.1 * wave) + ")";
|
||||||
ctx.strokeStyle = "rgba(110, 200, 235, " + (0.4 + 0.5 * Math.random()) + ")"
|
ctx.strokeStyle = "rgba(110, 200, 235, " + (0.4 + 0.5 * Math.random()) + ")"
|
||||||
}
|
}
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
@@ -1635,18 +1680,18 @@ const mech = {
|
|||||||
isEasyToAim: true,
|
isEasyToAim: true,
|
||||||
effect: () => {
|
effect: () => {
|
||||||
mech.fieldRegen *= 2;
|
mech.fieldRegen *= 2;
|
||||||
mech.fieldShieldingScale = b.modFieldEfficiency;
|
|
||||||
mech.hold = function () {
|
mech.hold = function () {
|
||||||
if (mech.energy > mech.fieldEnergyMax - 0.02 && mech.fieldCDcycle < mech.cycle) {
|
if (mech.energy > mech.fieldEnergyMax - 0.02 && mech.fieldCDcycle < mech.cycle) {
|
||||||
mech.fieldCDcycle = mech.cycle + 17; // set cool down to prevent +energy from making huge numbers of drones
|
|
||||||
if (b.isModSporeField) {
|
if (b.isModSporeField) {
|
||||||
|
mech.fieldCDcycle = mech.cycle + 17; // set cool down to prevent +energy from making huge numbers of drones
|
||||||
const len = Math.floor(6 + 3 * Math.random())
|
const len = Math.floor(6 + 3 * Math.random())
|
||||||
mech.energy -= len * 0.08;
|
mech.energy -= len * 0.07;
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
b.spore(player)
|
b.spore(player)
|
||||||
}
|
}
|
||||||
} else if (b.isModMissileField) {
|
} else if (b.isModMissileField) {
|
||||||
mech.energy -= 0.55;
|
mech.fieldCDcycle = mech.cycle + 17; // set cool down to prevent +energy from making huge numbers of drones
|
||||||
|
mech.energy -= 0.5;
|
||||||
b.missile({
|
b.missile({
|
||||||
x: mech.pos.x + 40 * Math.cos(mech.angle),
|
x: mech.pos.x + 40 * Math.cos(mech.angle),
|
||||||
y: mech.pos.y + 40 * Math.sin(mech.angle) - 3
|
y: mech.pos.y + 40 * Math.sin(mech.angle) - 3
|
||||||
@@ -1654,7 +1699,12 @@ const mech = {
|
|||||||
mech.angle + (0.5 - Math.random()) * (mech.crouch ? 0 : 0.2),
|
mech.angle + (0.5 - Math.random()) * (mech.crouch ? 0 : 0.2),
|
||||||
-3 * (0.5 - Math.random()) + (mech.crouch ? 25 : -8) * b.modFireRate,
|
-3 * (0.5 - Math.random()) + (mech.crouch ? 25 : -8) * b.modFireRate,
|
||||||
1, b.modBabyMissiles)
|
1, b.modBabyMissiles)
|
||||||
|
} else if (b.isModSwarmField) {
|
||||||
|
// mech.fieldCDcycle = mech.cycle + 17; // set cool down to prevent +energy from making huge numbers of drones
|
||||||
|
mech.energy -= 0.05;
|
||||||
|
b.swarm(1)
|
||||||
} else {
|
} else {
|
||||||
|
mech.fieldCDcycle = mech.cycle + 17; // set cool down to prevent +energy from making huge numbers of drones
|
||||||
mech.energy -= 0.33;
|
mech.energy -= 0.33;
|
||||||
b.drone(1)
|
b.drone(1)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -743,17 +743,18 @@ const spawn = {
|
|||||||
}
|
}
|
||||||
me.dmg = 0.14 * game.dmgScale;
|
me.dmg = 0.14 * game.dmgScale;
|
||||||
me.frictionAir = 0.03;
|
me.frictionAir = 0.03;
|
||||||
me.torque -= me.inertia * 0.002
|
// me.torque -= me.inertia * 0.002
|
||||||
Matter.Body.rotate(me, 0.25);
|
|
||||||
Matter.Body.setDensity(me, 0.03); //extra dense //normal is 0.001 //makes effective life much larger
|
Matter.Body.setDensity(me, 0.03); //extra dense //normal is 0.001 //makes effective life much larger
|
||||||
// spawn.shield(me, x, y, 1); //not working, not sure why
|
// spawn.shield(me, x, y, 1); //not working, not sure why
|
||||||
me.onDeath = function () {
|
me.onDeath = function () {
|
||||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||||
};
|
};
|
||||||
|
me.rotateVelocity = 0.0035 * Math.sqrt(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
|
||||||
// Matter.Body.rotate(this, -0.003 / (0.3 + this.health))
|
// Matter.Body.rotate(this, -0.003 / (0.3 + this.health))
|
||||||
this.torque -= this.inertia * 0.0000025 / (4 + this.health);
|
Matter.Body.rotate(me, this.rotateVelocity)
|
||||||
|
// this.torque -= this.inertia * 0.0000025 / (4 + this.health);
|
||||||
Matter.Body.setVelocity(this, {
|
Matter.Body.setVelocity(this, {
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 0
|
y: 0
|
||||||
|
|||||||
5
todo.txt
5
todo.txt
@@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
************** TODO - n-gon **************
|
************** TODO - n-gon **************
|
||||||
|
|
||||||
desublimated ammo + mine reclaimation not fun game play interaction
|
mod - drop a mine after taking damage
|
||||||
|
|
||||||
|
|
||||||
work on burn status effect
|
work on burn status effect
|
||||||
graphics don't look right
|
graphics don't look right
|
||||||
@@ -28,8 +27,6 @@ dash - mod when pressing left or right on the ground, teleport to the right unt
|
|||||||
do repeated horizontal zone queries until they hit map or block
|
do repeated horizontal zone queries until they hit map or block
|
||||||
up to a max range of like 10 player widths
|
up to a max range of like 10 player widths
|
||||||
|
|
||||||
bug - mech.fieldShieldingScale doesn't reset when switching fields
|
|
||||||
|
|
||||||
mod - blocks stun mobs
|
mod - blocks stun mobs
|
||||||
mod or field - turn blocks into spores or drones
|
mod or field - turn blocks into spores or drones
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user