mod - spores follow player
This commit is contained in:
@@ -285,12 +285,19 @@
|
|||||||
<path transform="translate(10.9,0) scale(1.25)" d="M0 0 h1 l 0.7 0.7 v1 l -0.7 0.7 h-1 l -0.7 -0.7 v-1 l 0.7 -0.7 Z" />
|
<path transform="translate(10.9,0) scale(1.25)" d="M0 0 h1 l 0.7 0.7 v1 l -0.7 0.7 h-1 l -0.7 -0.7 v-1 l 0.7 -0.7 Z" />
|
||||||
<path transform="translate(14,0)" d="M0 0 h1 v0.2 h1.7 l0.3 0.3 v2.6 h-1 v-1.7 h-1 v1.7 h-1 z" />
|
<path transform="translate(14,0)" d="M0 0 h1 v0.2 h1.7 l0.3 0.3 v2.6 h-1 v-1.7 h-1 v1.7 h-1 z" />
|
||||||
</g>
|
</g>
|
||||||
<g class="draw-lines" transform="translate(100,210) scale(34)" fill='none' stroke='#222' stroke-linejoin="round" stroke-linecap="round">
|
<!-- <g class="draw-lines" transform="translate(100,210) scale(34)" fill='none' stroke='#222' stroke-linejoin="round" stroke-linecap="round">
|
||||||
<path d="M0 0 h1 v0.2 h1.7 l0.3 0.3 v2.6 h-1 v-1.7 h-1 v1.7 h-1 z" stroke-width='0.0875' />
|
<path d="M0 0 h1 v0.2 h1.7 l0.3 0.3 v2.6 h-1 v-1.7 h-1 v1.7 h-1 z" stroke-width='0.0875' />
|
||||||
<rect x="4" y="1.25" width="1" height="0.5" stroke-width='0.0875' rx='0.03' />
|
<rect x="4" y="1.25" width="1" height="0.5" stroke-width='0.0875' rx='0.03' />
|
||||||
<path transform="translate(6.9,0) scale(1.25)" d="M0 0 h1 l 0.7 0.7 v2.3 l-0.2 0.2 h-1.8 v-0.5 h1.4 L 1.1 2.4 h-1.1 l -0.7 -0.7 v-1 l 0.7 -0.7 Z" stroke-width='0.07' />
|
<path transform="translate(6.9,0) scale(1.25)" d="M0 0 h1 l 0.7 0.7 v2.3 l-0.2 0.2 h-1.8 v-0.5 h1.4 L 1.1 2.4 h-1.1 l -0.7 -0.7 v-1 l 0.7 -0.7 Z" stroke-width='0.07' />
|
||||||
<path transform="translate(10.9,0) scale(1.25)" d="M0 0 h1 l 0.7 0.7 v1 l -0.7 0.7 h-1 l -0.7 -0.7 v-1 l 0.7 -0.7 Z" stroke-width='0.07' />
|
<path transform="translate(10.9,0) scale(1.25)" d="M0 0 h1 l 0.7 0.7 v1 l -0.7 0.7 h-1 l -0.7 -0.7 v-1 l 0.7 -0.7 Z" stroke-width='0.07' />
|
||||||
<path transform="translate(14,0)" d="M0 0 h1 v0.2 h1.7 l0.3 0.3 v2.6 h-1 v-1.7 h-1 v1.7 h-1 z" stroke-width='0.0875' />
|
<path transform="translate(14,0)" d="M0 0 h1 v0.2 h1.7 l0.3 0.3 v2.6 h-1 v-1.7 h-1 v1.7 h-1 z" stroke-width='0.0875' />
|
||||||
|
</g> -->
|
||||||
|
<g class="draw-lines" transform="translate(100,210) scale(34)" fill='none' stroke='#222' stroke-linejoin="round" stroke-linecap="round">
|
||||||
|
<path d="M0 0 v3.1 h1 v-1.7 h1 v1.7 h1 v-2.6 l-0.3-0.3 h-1.7 v-0.2 h-1" stroke-width='0.0875' />
|
||||||
|
<rect x="4" y="1.25" width="1" height="0.5" stroke-width='0.0875' rx='0.03' />
|
||||||
|
<path transform="translate(6.9,0) scale(1.25)" d="M0 0 h1 l 0.7 0.7 v2.3 l-0.2 0.2 h-1.8 v-0.5 h1.4 L 1.1 2.4 h-1.1 l -0.7 -0.7 v-1 l 0.7 -0.7 Z" stroke-width='0.07' />
|
||||||
|
<path transform="translate(10.9,0) scale(1.25)" d="M0 0 l-0.7 0.7 v1 l0.7 0.7 h1 l0.7 -0.7 v-1 l-0.7 -0.7 h-1 Z" stroke-width='0.07' />
|
||||||
|
<path transform="translate(14,0)" d="M0 0 h1 v0.2 h1.7 l0.3 0.3 v2.6 h-1 v-1.7 h-1 v1.7 h-1 z" stroke-width='0.0875' />
|
||||||
</g>
|
</g>
|
||||||
<!-- mouse -->
|
<!-- mouse -->
|
||||||
<g class="draw-lines3" transform="translate(290,430) scale(0.28)" stroke-linecap="round" stroke-linejoin="round" stroke-width="10px" stroke="#222" fill="none">
|
<g class="draw-lines3" transform="translate(290,430) scale(0.28)" stroke-linecap="round" stroke-linejoin="round" stroke-width="10px" stroke="#222" fill="none">
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ const b = {
|
|||||||
isModEnergyDamage: null,
|
isModEnergyDamage: null,
|
||||||
isModBotSpawner: null,
|
isModBotSpawner: null,
|
||||||
modWaveHelix: null,
|
modWaveHelix: null,
|
||||||
|
isModSporeFollow: 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) {
|
||||||
b.modAcidDmg = 0.7
|
b.modAcidDmg = 0.7
|
||||||
@@ -216,7 +217,7 @@ const b = {
|
|||||||
allowed() {
|
allowed() {
|
||||||
return b.isModLowHealthDmg
|
return b.isModLowHealthDmg
|
||||||
},
|
},
|
||||||
requires: "quasistatic equilibrium",
|
requires: "negative feedback",
|
||||||
effect() {
|
effect() {
|
||||||
b.isModHarmDamage = true;
|
b.isModHarmDamage = true;
|
||||||
},
|
},
|
||||||
@@ -1163,6 +1164,22 @@ const b = {
|
|||||||
b.isModFastSpores = false
|
b.isModFastSpores = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "diplochory",
|
||||||
|
description: "<strong class='color-p' style='letter-spacing: 2px;'>spores</strong> use the player for <strong>dispersal</strong><br>until they <strong>locate</strong> a viable host",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return b.haveGunCheck("spores") || b.modSporesOnDeath > 0 || b.isModStomp || b.isModSporeField
|
||||||
|
},
|
||||||
|
requires: "spores",
|
||||||
|
effect() {
|
||||||
|
b.isModSporeFollow = true
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
b.isModSporeFollow = false
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "redundant systems",
|
name: "redundant systems",
|
||||||
description: "<strong>drone</strong> collisions no longer reduce their <strong>lifespan</strong>",
|
description: "<strong>drone</strong> collisions no longer reduce their <strong>lifespan</strong>",
|
||||||
@@ -2004,14 +2021,17 @@ const b = {
|
|||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body
|
mask: cat.map | cat.mob | cat.mobBullet | cat.mobShield //no collide with body
|
||||||
},
|
},
|
||||||
endCycle: game.cycle + Math.floor((660 + Math.floor(Math.random() * 240)) * b.isModBulletsLastLonger),
|
endCycle: game.cycle + Math.floor((660 + Math.floor(Math.random() * 360)) * b.isModBulletsLastLonger),
|
||||||
minDmgSpeed: 0,
|
minDmgSpeed: 0,
|
||||||
onDmg(who) {
|
playerOffPosition: { //used when following player to keep spores separate
|
||||||
// mobs.statusPoison(who, 0.5, 180) // (2.2) * 1.3 * 30/180 // 6 ticks (3 seconds)
|
x: 100 * (Math.random() - 0.5),
|
||||||
|
y: 100 * (Math.random() - 0.5)
|
||||||
|
},
|
||||||
|
onDmg() {
|
||||||
this.endCycle = 0; //bullet ends cycle after doing damage
|
this.endCycle = 0; //bullet ends cycle after doing damage
|
||||||
},
|
},
|
||||||
onEnd() {},
|
onEnd() {},
|
||||||
lookFrequency: 97 + Math.floor(77 * Math.random()),
|
lookFrequency: 97 + Math.floor(93 * Math.random()),
|
||||||
do() {
|
do() {
|
||||||
//find mob targets
|
//find mob targets
|
||||||
if (!(game.cycle % this.lookFrequency)) {
|
if (!(game.cycle % this.lookFrequency)) {
|
||||||
@@ -2034,9 +2054,17 @@ const b = {
|
|||||||
}
|
}
|
||||||
//accelerate towards mobs
|
//accelerate towards mobs
|
||||||
if (this.lockedOn && this.lockedOn.alive) {
|
if (this.lockedOn && this.lockedOn.alive) {
|
||||||
this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, this.lockedOn.position)), -this.mass * this.thrust)
|
this.force = Vector.mult(Vector.normalise(Vector.sub(this.lockedOn.position, this.position)), this.mass * this.thrust)
|
||||||
// this.force.x -= THRUST * this.lockedOn.x
|
|
||||||
// this.force.y -= THRUST * this.lockedOn.y
|
} else if (b.isModSporeFollow && this.lockedOn !== undefined) { //move towards player
|
||||||
|
//checking for undefined means that the spores don't go after the player until it has looked and not found a target
|
||||||
|
const dx = this.position.x - mech.pos.x;
|
||||||
|
const dy = this.position.y - mech.pos.y;
|
||||||
|
if (dx * dx + dy * dy > 10000) {
|
||||||
|
this.force = Vector.mult(Vector.normalise(Vector.sub(mech.pos, Vector.add(this.playerOffPosition, this.position))), this.mass * this.thrust)
|
||||||
|
}
|
||||||
|
// this.force = Vector.mult(Vector.normalise(Vector.sub(mech.pos, this.position)), this.mass * this.thrust)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this.force.y += this.mass * 0.0001; //gravity
|
this.force.y += this.mass * 0.0001; //gravity
|
||||||
}
|
}
|
||||||
@@ -2646,10 +2674,11 @@ const b = {
|
|||||||
mech.fireCDcycle = mech.cycle + Math.floor(3 * b.modFireRate); // cool down
|
mech.fireCDcycle = mech.cycle + Math.floor(3 * b.modFireRate); // cool down
|
||||||
const dir = mech.angle
|
const dir = mech.angle
|
||||||
const SPEED = 10
|
const SPEED = 10
|
||||||
const wiggleMag = mech.crouch ? 5 : 12
|
const wiggleMag = mech.crouch ? 6 : 12
|
||||||
|
const size = 5 * b.modBulletSize * (b.modWaveHelix === 1 ? 1 : 0.7)
|
||||||
for (let i = 0; i < b.modWaveHelix; i++) {
|
for (let i = 0; i < b.modWaveHelix; i++) {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
bullet[me] = Bodies.polygon(mech.pos.x + 25 * Math.cos(dir), mech.pos.y + 25 * Math.sin(dir), 7, 5 * b.modBulletSize, {
|
bullet[me] = Bodies.polygon(mech.pos.x + 25 * Math.cos(dir), mech.pos.y + 25 * Math.sin(dir), 7, size, {
|
||||||
angle: dir,
|
angle: dir,
|
||||||
cycle: -0.5,
|
cycle: -0.5,
|
||||||
endCycle: game.cycle + Math.floor((b.isModWaveReflect ? 480 : 120) * b.isModBulletsLastLonger),
|
endCycle: game.cycle + Math.floor((b.isModWaveReflect ? 480 : 120) * b.isModBulletsLastLonger),
|
||||||
@@ -2681,7 +2710,7 @@ const b = {
|
|||||||
for (let i = 0; i < q.length; i++) {
|
for (let i = 0; i < q.length; i++) {
|
||||||
slowCheck = 0.3;
|
slowCheck = 0.3;
|
||||||
Matter.Body.setPosition(this, Vector.add(this.position, q[i].velocity)) //move with the medium
|
Matter.Body.setPosition(this, Vector.add(this.position, q[i].velocity)) //move with the medium
|
||||||
let dmg = b.dmgScale * 0.43 / Math.sqrt(q[i].mass) * (b.modWaveHelix ? 0.6 : 1) //1 - 0.4 = 0.6 for helix mod 40% damage reduction
|
let dmg = b.dmgScale * 0.43 / Math.sqrt(q[i].mass) * (b.modWaveHelix === 1 ? 1 : 0.6) //1 - 0.4 = 0.6 for helix mod 40% damage reduction
|
||||||
q[i].damage(dmg);
|
q[i].damage(dmg);
|
||||||
q[i].foundPlayer();
|
q[i].foundPlayer();
|
||||||
game.drawList.push({ //add dmg to draw queue
|
game.drawList.push({ //add dmg to draw queue
|
||||||
|
|||||||
13
js/player.js
13
js/player.js
@@ -978,7 +978,7 @@ const mech = {
|
|||||||
x: powerUp[i].velocity.x * 0.11,
|
x: powerUp[i].velocity.x * 0.11,
|
||||||
y: powerUp[i].velocity.y * 0.11
|
y: powerUp[i].velocity.y * 0.11
|
||||||
});
|
});
|
||||||
if (dist2 < 5000) { //use power up if it is close enough
|
if (dist2 < 5000 && !game.isChoosing) { //use power up if it is close enough
|
||||||
if (b.isModMassEnergy) mech.energy = mech.fieldEnergyMax * 2;
|
if (b.isModMassEnergy) mech.energy = mech.fieldEnergyMax * 2;
|
||||||
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,
|
||||||
@@ -1061,7 +1061,6 @@ const mech = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
pushMobsFacing() { // find mobs in range and in direction looking
|
pushMobsFacing() { // find mobs in range and in direction looking
|
||||||
|
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (
|
if (
|
||||||
Vector.magnitude(Vector.sub(mob[i].position, player.position)) - mob[i].radius < mech.fieldRange &&
|
Vector.magnitude(Vector.sub(mob[i].position, player.position)) - mob[i].radius < mech.fieldRange &&
|
||||||
@@ -1304,7 +1303,7 @@ const mech = {
|
|||||||
mech.grabPowerUp();
|
mech.grabPowerUp();
|
||||||
mech.lookForPickUp(180);
|
mech.lookForPickUp(180);
|
||||||
|
|
||||||
const DRAIN = 0.0023
|
const DRAIN = 0.0017
|
||||||
if (mech.energy > DRAIN) {
|
if (mech.energy > DRAIN) {
|
||||||
mech.energy -= DRAIN;
|
mech.energy -= DRAIN;
|
||||||
if (mech.energy < DRAIN) {
|
if (mech.energy < DRAIN) {
|
||||||
@@ -1472,7 +1471,7 @@ const mech = {
|
|||||||
y: best.y
|
y: best.y
|
||||||
};
|
};
|
||||||
if (best.who.alive) {
|
if (best.who.alive) {
|
||||||
const dmg = 0.5 * b.dmgScale; //********** SCALE DAMAGE HERE *********************
|
const dmg = 0.55 * b.dmgScale; //********** SCALE DAMAGE HERE *********************
|
||||||
best.who.damage(dmg);
|
best.who.damage(dmg);
|
||||||
best.who.locatePlayer();
|
best.who.locatePlayer();
|
||||||
|
|
||||||
@@ -1546,7 +1545,7 @@ const mech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "negative mass field",
|
name: "negative mass field",
|
||||||
description: "use <strong class='color-f'>energy</strong> to nullify <strong style='letter-spacing: 12px;'>gravity</strong><br>reduce <strong>harm</strong> by <strong>75%</strong> while field is active", //<br><strong>launch</strong> larger blocks at much higher speeds
|
description: "use <strong class='color-f'>energy</strong> to nullify <strong style='letter-spacing: 12px;'>gravity</strong><br>reduce <strong>harm</strong> by <strong>80%</strong> while field is active", //<br><strong>launch</strong> larger blocks at much higher speeds
|
||||||
fieldDrawRadius: 0,
|
fieldDrawRadius: 0,
|
||||||
isEasyToAim: true,
|
isEasyToAim: true,
|
||||||
effect: () => {
|
effect: () => {
|
||||||
@@ -1565,7 +1564,7 @@ const mech = {
|
|||||||
mech.lookForPickUp();
|
mech.lookForPickUp();
|
||||||
const DRAIN = 0.00035
|
const DRAIN = 0.00035
|
||||||
if (mech.energy > DRAIN) {
|
if (mech.energy > DRAIN) {
|
||||||
mech.fieldDamageResistance = 0.25; // 1 - 0.75
|
mech.fieldDamageResistance = 0.2; // 1 - 0.8
|
||||||
// mech.pushMobs360();
|
// mech.pushMobs360();
|
||||||
|
|
||||||
//repulse mobs
|
//repulse mobs
|
||||||
@@ -1813,7 +1812,7 @@ const mech = {
|
|||||||
mech.grabPowerUp();
|
mech.grabPowerUp();
|
||||||
mech.lookForPickUp();
|
mech.lookForPickUp();
|
||||||
|
|
||||||
const DRAIN = (0.0005 + 0.0001 * player.speed) * (mech.fireCDcycle > mech.cycle ? 9 / b.modRenormalization : 1) //game.mouseDown
|
const DRAIN = (0.0004 + 0.00007 * player.speed) * (mech.fireCDcycle > mech.cycle ? 7 / b.modRenormalization : 1) //game.mouseDown
|
||||||
if (mech.energy > DRAIN) {
|
if (mech.energy > DRAIN) {
|
||||||
mech.energy -= DRAIN;
|
mech.energy -= DRAIN;
|
||||||
if (mech.energy < 0.001) {
|
if (mech.energy < 0.001) {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ const powerUps = {
|
|||||||
game.isChoosing = false; //stops p from un pausing on key down
|
game.isChoosing = false; //stops p from un pausing on key down
|
||||||
requestAnimationFrame(cycle);
|
requestAnimationFrame(cycle);
|
||||||
},
|
},
|
||||||
cancel(what) {
|
cancel() {
|
||||||
document.body.style.cursor = "none";
|
document.body.style.cursor = "none";
|
||||||
document.getElementById("choose-grid").style.display = "none"
|
document.getElementById("choose-grid").style.display = "none"
|
||||||
document.getElementById("choose-background").style.display = "none"
|
document.getElementById("choose-background").style.display = "none"
|
||||||
|
|||||||
17
todo.txt
17
todo.txt
@@ -1,11 +1,18 @@
|
|||||||
mod - your damage scales with current energy
|
|
||||||
mod - 10% chance after killing a mob to gain a bot
|
mod - spores follow player
|
||||||
that follows you until you exit the map
|
|
||||||
mod - move extra fast with less energy cost in time dilation
|
|
||||||
mod - double helix fire two wave bullets, but they do 40% less damage
|
|
||||||
|
|
||||||
************** TODO - n-gon **************
|
************** TODO - n-gon **************
|
||||||
|
|
||||||
|
player health becomes NaN
|
||||||
|
occurred a few times at higher levels
|
||||||
|
game.dmgScale, game.healScale not corrupted
|
||||||
|
|
||||||
|
mod - killing a stunned mob gives something
|
||||||
|
ammo or heal power up?
|
||||||
|
|
||||||
|
mod - scale squirrel cage rotor with current energy
|
||||||
|
is variable speed going to be hard to deal with?
|
||||||
|
|
||||||
boss level for timeSkipBoss because of game instability for boss on normal levels
|
boss level for timeSkipBoss because of game instability for boss on normal levels
|
||||||
boss level needs to be very simple (maybe no other mobs, or no random mobs)
|
boss level needs to be very simple (maybe no other mobs, or no random mobs)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user