mod: logistics

added mods to spawn a gun, a field, and rerolls
added mod that gives max health for leftover power ups
   this mod has some interesting interactions with other mods
mod annihilation now uses 20% of base energy and doesn't trigger damage immunity
mod Hawking radiation removed
mod negative temperature: freezed mobs in range of negative mass field, but drain energy
mod: logistics
  ammo power ups are added to your current gun
  spawn 4 ammo immediately
This commit is contained in:
landgreen
2020-06-08 08:55:53 -07:00
parent cea1bcc7a3
commit d9d07b4f5d
9 changed files with 278 additions and 176 deletions

View File

@@ -22,15 +22,14 @@ const b = {
}
} else {
if (mod.isAmmoFromHealth) {
if (mech.health > 0.05) {
mech.damage(Math.max(0.01, mod.isAmmoFromHealth * mech.health));
if (mech.health > 2 * mod.isAmmoFromHealth * mech.maxHealth) {
mech.damage(mod.isAmmoFromHealth * mech.maxHealth);
powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
} else {
game.replaceTextLog = true;
game.makeTextLog("not enough health for catabolism to produce ammo", 120);
}
} else {
game.replaceTextLog = true;
game.makeTextLog("<div style='font-size:140%;'>NO AMMO</div> <p style='font-size:90%;'><strong>Q</strong>, <strong>E</strong>, and <strong>mouse wheel</strong> change weapons</p>", 200);
@@ -496,15 +495,11 @@ const b = {
this.endCycle = 0; //bullet ends cycle after doing damage
},
onEnd() {
if (mod.isMutualism && this.isMutualismActive) {
if (mod.isEnergyHealth) {
mech.energy += 0.01;
} else {
mech.health += 0.01
if (mech.health > mech.maxHealth) mech.health = mech.maxHealth;
mod.onHealthChange();
mech.displayHealth();
}
if (mod.isMutualism && this.isMutualismActive && !mod.isEnergyHealth) {
mech.health += 0.01
if (mech.health > mech.maxHealth) mech.health = mech.maxHealth;
mod.onHealthChange();
mech.displayHealth();
}
},
do() {
@@ -551,18 +546,11 @@ const b = {
});
World.add(engine.world, bullet[bIndex]); //add bullet to world
if (mod.isMutualism) {
if (mod.isEnergyHealth) {
if (mech.energy > 0.02) {
mech.energy -= 0.01; //energy takes an extra 25% damage for balancing purposes
bullet[bIndex].isMutualismActive = true
}
} else if (mech.health > 0.02) {
mech.health -= 0.01
mod.onHealthChange();
mech.displayHealth();
bullet[bIndex].isMutualismActive = true
}
if (mod.isMutualism && mech.health > 0.02) {
mech.health -= 0.01
mod.onHealthChange();
mech.displayHealth();
bullet[bIndex].isMutualismActive = true
}
},
iceIX(speed = 0, spread = 2 * Math.PI) {
@@ -772,7 +760,12 @@ const b = {
onDmg(who) {
if (!this.target && who.alive) {
this.target = who;
if (Matter.Query.collides(this, [who]).length > 0) {
if (who.radius < 20) {
this.targetRelativePosition = {
x: 0,
y: 0
} //find relative position vector for zero mob rotation
} else if (Matter.Query.collides(this, [who]).length > 0) {
const normal = Matter.Query.collides(this, [who])[0].normal
this.targetRelativePosition = Vector.rotate(Vector.sub(Vector.sub(this.position, who.position), Vector.mult(normal, -this.radius)), -who.angle) //find relative position vector for zero mob rotation
} else {
@@ -843,6 +836,8 @@ const b = {
Matter.Body.setPosition(this, Vector.add(Vector.add(rotate, this.target.velocity), this.target.position))
}
Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.9))
Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9);
// Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9)
if (this.target.isShielded) {
this.target.damage(b.dmgScale * 0.005, true); //shield damage bypass
@@ -1092,8 +1087,8 @@ const b = {
//randomize position relative to player
if (Math.random() < 0.15) {
this.offPlayer = {
x: 100 * (Math.random() - 0.5),
y: 90 * (Math.random() - 0.5),
x: 120 * (Math.random() - 0.5),
y: 120 * (Math.random() - 0.5) - 20,
}
}
}
@@ -1182,7 +1177,7 @@ const b = {
},
guns: [{
name: "minigun",
description: "<strong>rapidly</strong> fire a stream of small <strong>bullets</strong>",
description: "<strong>rapidly</strong> fire a stream of small <strong>bullets</strong><br>fire <strong>delay</strong> decreases as you shoot",
ammo: 0,
ammoPack: 75,
defaultAmmoPack: 75,
@@ -1211,7 +1206,7 @@ const b = {
bullet[me].onDmg = function (who) {
mobs.statusSlow(who, 30)
};
mech.energy -= mech.fieldRegen + 0.007
mech.energy -= mech.fieldRegen + 0.0075
if (mech.energy < 0.02) {
mech.fireCDcycle = mech.cycle + 60; // cool down
}
@@ -1219,7 +1214,6 @@ const b = {
bullet[me].do = function () {
this.force.y += this.mass * 0.0003;
};
}
},
{
@@ -1353,7 +1347,7 @@ const b = {
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
fire() {
function makeFlechette(angle = mech.angle) {
function makeFlechette(angle = mech.angle + 0.02 * (Math.random() - 0.5)) {
const me = bullet.length;
bullet[me] = Bodies.rectangle(mech.pos.x + 40 * Math.cos(mech.angle), mech.pos.y + 40 * Math.sin(mech.angle), 45, 1.4, b.fireAttributes(angle));
bullet[me].collisionFilter.mask = cat.body; //cat.mobShield | //cat.map | cat.body |
@@ -1914,7 +1908,6 @@ const b = {
}
}
const mobCollisions = Matter.Query.collides(this, mob)
if (mobCollisions.length) {
onCollide(this)
@@ -2320,7 +2313,7 @@ const b = {
mech.fireCDcycle = Infinity //can't fire until mouse is released
const lastCharge = this.charge
let chargeRate = (mech.crouch) ? 0.975 : 0.987
chargeRate *= Math.pow(b.fireCD, 0.04)
chargeRate *= Math.pow(b.fireCD, 0.03)
this.charge = this.charge * chargeRate + (1 - chargeRate) // this.charge converges to 1
mech.energy -= (this.charge - lastCharge) * 0.28 //energy drain is proportional to charge gained, but doesn't stop normal mech.fieldRegen
@@ -2679,7 +2672,7 @@ const b = {
const energy = 0.3 * Math.min(mech.energy, 1.75)
mech.energy -= energy * mod.isLaserDiode
if (best.who) b.explosion(path[1], 1000 * energy, true)
mech.fireCDcycle = mech.cycle + Math.floor(60 * b.fireCD); // cool down
mech.fireCDcycle = mech.cycle + Math.floor(50 * b.fireCD); // cool down
if (mod.isPulseStun) {
const range = 100 + 2000 * energy

View File

@@ -175,7 +175,9 @@ function collisionChecks(event) {
y: mob[k].velocity.y - 8 * Math.sin(angle)
});
if (mod.isAnnihilation && !mob[k].shield && !mob[k].isShielded) {
if (mod.isAnnihilation && !mob[k].shield && !mob[k].isShielded && mech.energy > 0.2) {
mech.energy -= 0.2
mech.immuneCycle = 0; //player doesn't go immune to collision damage
mob[k].death();
game.drawList.push({
//add dmg to draw queue
@@ -207,6 +209,7 @@ function collisionChecks(event) {
// console.log(obj.dmg / (0.15 * obj.mass * Vector.magnitude(Vector.sub(mob[k].velocity, obj.velocity))))
if (mod.isCrit && !mob[k].seePlayer.recall && !mob[k].shield) dmg *= 5
mob[k].foundPlayer();
console.log(dmg)
mob[k].damage(dmg);
// console.log(dmg)
obj.onDmg(mob[k]); //some bullets do actions when they hits things, like despawn

View File

@@ -499,6 +499,7 @@ const game = {
mod.setupAllMods(); //sets mods to default values
b.setFireCD();
game.updateModHUD();
powerUps.totalPowerUps = 0;
powerUps.reroll.rerolls = 0;
mech.maxHealth = 1
mech.maxEnergy = 1
@@ -645,21 +646,19 @@ const game = {
}
}
if (mod.isMutualism) {
if (mod.isMutualism && !mod.isEnergyHealth) {
for (let i = 0; i < bullet.length; i++) {
if (bullet[i].isMutualismActive) {
if (mod.isEnergyHealth) {
mech.energy += 0.01;
} else {
mech.health += 0.01
if (mech.health > mech.maxHealth) mech.health = mech.maxHealth;
mod.onHealthChange();
mech.displayHealth();
}
mech.health += 0.01
if (mech.health > mech.maxHealth) mech.health = mech.maxHealth;
mod.onHealthChange();
mech.displayHealth();
}
}
}
powerUps.totalPowerUps = powerUp.length
//if player is holding something this remembers it before it gets deleted
let holdTarget;
if (mech.holdingTarget) {

View File

@@ -17,12 +17,12 @@ const level = {
// game.enableConstructMode() //used to build maps in testing mode
// level.difficultyIncrease(9)
// mech.setField("time dilation field")
// mod.giveMod("timelike world line");
// mod.giveMod("Lorentz transformation");
// mod.giveMod("logistics");
// mod.giveMod("negative temperature");
b.giveGuns("minigun")
// b.giveGuns("flechettes")
// b.giveGuns("spores")
// mech.setField("pilot wave")
// mech.setField("negative mass field")
// mech.setField("phase decoherence field")
level.intro(); //starting level
@@ -56,6 +56,11 @@ const level = {
for (let i = 0; i < mod.foamBotCount; i++) {
b.foamBot()
}
if (mod.isArmorFromPowerUps) {
// for (let i = 0; i < powerUps.totalPowerUps; i++) {}
mech.maxHealth += 0.03 * powerUps.totalPowerUps
game.makeTextLog("<span style='font-size:115%;'> max health increased by " + (0.05 * powerUps.totalPowerUps * 100).toFixed(0) + "%</span>", 300)
}
},
isBuildRun: false,
difficultyIncrease(num = 1) {
@@ -188,7 +193,7 @@ const level = {
// spawn.launcherBoss(1200, -500)
// spawn.laserTargetingBoss(1600, -400)
// spawn.spawner(1600, -500)
spawn.sniper(1700, -120)
spawn.sniper(1700, -120, 50)
// spawn.sniper(1600, -120)
// spawn.sniper(1800, -120)
// spawn.cellBossCulture(1600, -500)

View File

@@ -76,7 +76,7 @@ const mod = {
if (mod.isEnergyLoss) dmg *= 1.33;
if (mod.isRest && player.speed < 1) dmg *= 1.20;
if (mod.isEnergyDamage) dmg *= 1 + mech.energy / 5.5;
if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.007
if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.006
return dmg * mod.slowFire
},
onHealthChange() { //used with acid mod
@@ -111,42 +111,6 @@ const mod = {
},
mods: [{
name: "heal",
description: "spawn <strong>6</strong> <strong class='color-h'>heal</strong> power ups",
maxCount: 9,
count: 0,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "heal");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "heal");
}
},
remove() {}
},
{
name: "ammo",
description: "spawn <strong>6 ammo</strong> power ups",
maxCount: 9,
count: 0,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
}
},
remove() {}
},
{
name: "capacitor",
// nameInfo: "<span id='mod-capacitor'></span>",
description: "increase <strong class='color-d'>damage</strong> based on stored <strong class='color-f'>energy</strong><br><strong>+1%</strong> <strong class='color-d'>damage</strong> for every <strong>5.5%</strong> <strong class='color-f'>energy</strong>",
@@ -296,22 +260,6 @@ const mod = {
b.setFireCD();
}
},
{
name: "desublimated ammunition",
description: "use <strong>50%</strong> less <strong>ammo</strong> when <strong>crouching</strong>",
maxCount: 1,
count: 0,
allowed() {
return true
},
requires: "",
effect() {
mod.noAmmo = 1
},
remove() {
mod.noAmmo = 0;
}
},
{
name: "mass driver",
description: "<strong>blocks</strong> do <strong>2x</strong> more <strong class='color-d'>damage</strong> to mobs<br>charge <strong>throws</strong> more <strong>quickly</strong> for less <strong class='color-f'>energy</strong>",
@@ -381,7 +329,7 @@ const mod = {
},
{
name: "scrap bots",
description: "<strong>+12%</strong> chance to build a <strong>bot</strong> after killing a mob<br>the bot will follow you until you <strong>exit</strong> the map",
description: "<strong>+12%</strong> chance to build a <strong>bot</strong> after killing a mob<br>the bot only functions until the end of the level",
maxCount: 6,
count: 0,
allowed() {
@@ -396,11 +344,11 @@ const mod = {
}
},
{
name: "self-replication",
name: "bot replication",
description: "<strong>duplicate</strong> your permanent <strong>bots</strong><br>remove <strong>80%</strong> of your <strong>ammo</strong>",
maxCount: 1,
count: 0,
isNonRefundable: true,
// isNonRefundable: true,
allowed() {
return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount > 2
},
@@ -720,22 +668,6 @@ const mod = {
mod.energySiphon = 0;
}
},
{
name: "entropy exchange",
description: "<strong class='color-h'>heal</strong> for <strong>+1.5%</strong> of <strong class='color-d'>damage</strong> done",
maxCount: 9,
count: 0,
allowed() {
return !mod.isEnergyHealth
},
requires: "not mass-energy equivalence",
effect() {
mod.healthDrain += 0.015;
},
remove() {
mod.healthDrain = 0;
}
},
{
name: "overcharge",
description: "increase your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>+50%</strong>",
@@ -753,6 +685,22 @@ const mod = {
mech.maxEnergy = 1;
}
},
{
name: "entropy exchange",
description: "<strong class='color-h'>heal</strong> for <strong>+1.5%</strong> of <strong class='color-d'>damage</strong> done",
maxCount: 9,
count: 0,
allowed() {
return !mod.isEnergyHealth
},
requires: "not mass-energy equivalence",
effect() {
mod.healthDrain += 0.015;
},
remove() {
mod.healthDrain = 0;
}
},
{
name: "supersaturation",
description: "increase your <strong>maximum</strong> <strong class='color-h'>health</strong> by <strong>+50%</strong>",
@@ -788,6 +736,22 @@ const mod = {
mod.recursiveHealing = 1;
}
},
{
name: "crystallized armor",
description: "increase <strong>maximum</strong> <strong class='color-h'>health</strong> by <strong>3%</strong> for each<br>unused <strong>power up</strong> at the end of a <strong>level</strong>",
maxCount: 1,
count: 0,
allowed() {
return !mod.isEnergyHealth
},
requires: "not mass-energy equivalence",
effect() {
mod.isArmorFromPowerUps = true;
},
remove() {
mod.isArmorFromPowerUps = false;
}
},
{
name: "pair production",
description: "<strong>power ups</strong> overfill your <strong class='color-f'>energy</strong><br>temporarily gain <strong>twice</strong> your max <strong class='color-f'>energy</strong>",
@@ -807,7 +771,7 @@ const mod = {
},
{
name: "Bayesian inference",
description: "<strong>37%</strong> chance for double <strong>power ups</strong> to drop<br><strong>ammo</strong> will no longer <strong>spawn</strong> from mobs",
description: "<strong>40%</strong> chance for double <strong>power ups</strong> to drop<br><strong>ammo</strong> will no longer <strong>spawn</strong> from mobs",
maxCount: 1,
count: 0,
allowed() {
@@ -815,15 +779,35 @@ const mod = {
},
requires: "",
effect: () => {
mod.bayesian = 0.37;
mod.bayesian = 0.40;
},
remove() {
mod.bayesian = 0;
}
},
{
name: "logistics",
description: "<strong>ammo</strong> power ups <strong>add</strong> to your current <strong>gun</strong><br>spawn <strong>4 ammo</strong>",
maxCount: 1,
count: 0,
allowed() {
return true
},
requires: "",
effect() {
mod.isAmmoForGun = true;
for (let i = 0; i < 4; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
}
},
remove() {
mod.isAmmoForGun = false;
}
},
{
name: "catabolism",
description: "gain <strong>ammo</strong> when you <strong>fire</strong> while <strong>out</strong> of <strong>ammo</strong><br>drains <strong>3%</strong> of current remaining <strong>health</strong>",
description: "gain <strong>ammo</strong> when you <strong>fire</strong> while <strong>out</strong> of <strong>ammo</strong><br>drains <strong>2%</strong> of <strong>max health</strong>",
maxCount: 1,
count: 0,
allowed() {
@@ -831,12 +815,28 @@ const mod = {
},
requires: "not mass-energy equivalence",
effect: () => {
mod.isAmmoFromHealth = 0.03;
mod.isAmmoFromHealth = 0.02;
},
remove() {
mod.isAmmoFromHealth = 0;
}
},
{
name: "desublimated ammunition",
description: "use <strong>50%</strong> less <strong>ammo</strong> when <strong>crouching</strong>",
maxCount: 1,
count: 0,
allowed() {
return true
},
requires: "",
effect() {
mod.noAmmo = 1
},
remove() {
mod.noAmmo = 0;
}
},
{
name: "cardinality",
description: "<strong>2</strong> extra <strong>choices</strong> when selecting <strong>power ups</strong>",
@@ -858,7 +858,6 @@ const mod = {
description: "spawn <strong>5</strong> <strong class='color-m'>mods</strong><br><strong>power ups</strong> are limited to <strong>one choice</strong>",
maxCount: 1,
count: 0,
// isNonRefundable: true,
allowed() {
return !mod.isExtraChoice
},
@@ -940,11 +939,14 @@ const mod = {
},
requires: "more than 6 mods",
effect: () => {
//remove bullets //mostly to get rid of bots
//remove bullets //to get rid of bots
for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]);
bullet = [];
let count = mod.totalCount + 1
let count = 0 //count mods
for (let i = 0, len = mod.mods.length; i < len; i++) { // spawn new mods power ups
if (!mod.mods[i].isNonRefundable) count += mod.mods[i].count
}
if (mod.isDeterminism) count -= 5 //remove the 5 bonus mods when getting rid of determinism
mod.setupAllMods(); // remove all mods
for (let i = 0; i < count; i++) { // spawn new mods power ups
@@ -1003,7 +1005,7 @@ const mod = {
},
{
name: "microstates",
description: "<strong>+7%</strong> <strong class='color-d'>damage</strong> for every <strong>10</strong> active <strong>bullets</strong>",
description: "<strong>+6%</strong> <strong class='color-d'>damage</strong> for every <strong>10</strong> active <strong>bullets</strong>",
maxCount: 1,
count: 0,
allowed() {
@@ -1040,7 +1042,7 @@ const mod = {
},
{
name: "depleted uranium rounds",
description: `your <strong>bullets</strong> are <strong>+16%</strong> larger<br>increased mass and physical <strong class='color-d'>damage</strong>`,
description: `your <strong>bullets</strong> are <strong>+18%</strong> larger<br>increased mass and physical <strong class='color-d'>damage</strong>`,
count: 0,
maxCount: 9,
allowed() {
@@ -1048,7 +1050,7 @@ const mod = {
},
requires: "minigun, shotgun, super balls",
effect() {
mod.bulletSize += 0.16
mod.bulletSize += 0.18
},
remove() {
mod.bulletSize = 1;
@@ -1515,7 +1517,7 @@ const mod = {
maxCount: 1,
count: 0,
allowed() {
return mod.haveGunCheck("spores") || mod.sporesOnDeath > 0 || mod.isSporeField
return (mod.haveGunCheck("spores") || mod.sporesOnDeath > 0 || mod.isSporeField) && !mod.isEnergyHealth
},
requires: "spores",
effect() {
@@ -1720,7 +1722,7 @@ const mod = {
},
{
name: "degenerate matter",
description: "<strong>negative mass field</strong><br><strong>harm</strong> reduction is increased to <strong>80%</strong>",
description: "<strong>harm</strong> reduction from <strong>negative mass field</strong><br>is increased from 60% to <strong>80%</strong>",
maxCount: 1,
count: 0,
allowed() {
@@ -1738,7 +1740,7 @@ const mod = {
},
{
name: "annihilation",
description: "after <strong>touching</strong> mobs, they are <strong>annihilated</strong>",
description: "after <strong>touching</strong> mobs, they are <strong>annihilated</strong><br>drains <strong>20%</strong> of base <strong class='color-f'>energy</strong>",
maxCount: 1,
count: 0,
allowed() {
@@ -1753,8 +1755,8 @@ const mod = {
}
},
{
name: "Hawking radiation",
description: "<strong>negative mass field</strong> leaks virtual particles<br>mobs inside the field take <strong class='color-d'>damage</strong>",
name: "negative temperature",
description: "<strong>negative mass field</strong> uses <strong class='color-f'>energy</strong><br>to <strong class='color-s'>freeze</strong> mobs caught in it's effect",
maxCount: 1,
count: 0,
allowed() {
@@ -1762,10 +1764,10 @@ const mod = {
},
requires: "negative mass field",
effect() {
mod.isHawking = true;
mod.isFreezeMobs = true;
},
remove() {
mod.isHawking = 0;
mod.isFreezeMobs = false;
}
},
{
@@ -1899,6 +1901,93 @@ const mod = {
mod.isPilotFreeze = false
}
},
{
name: "heals",
description: "spawn <strong>6</strong> <strong class='color-h'>heal</strong> power ups",
maxCount: 9,
count: 0,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "heal");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "heal");
}
},
remove() {}
},
{
name: "ammo",
description: "spawn <strong>6 ammo</strong> power ups",
maxCount: 9,
count: 0,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "ammo");
}
},
remove() {}
},
{
name: "rerolls",
description: "spawn <strong>6</strong> <strong class='color-r'>reroll</strong> power ups",
maxCount: 9,
count: 0,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < 6; i++) {
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
}
},
remove() {}
},
{
name: "gun",
description: "spawn a <strong>gun</strong> power up",
maxCount: 9,
count: 0,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
},
remove() {}
},
{
name: "field",
description: "spawn a <strong>field</strong> power up",
maxCount: 9,
count: 0,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
powerUps.spawn(mech.pos.x, mech.pos.y, "field");
if (Math.random() < mod.bayesian) powerUps.spawn(mech.pos.x, mech.pos.y, "field");
},
remove() {}
},
],
//variables use for gun mod upgrades
fireRate: null,
@@ -1954,7 +2043,7 @@ const mod = {
isMineAmmoBack: null,
isPlasmaRange: null,
isRailNails: null,
isHawking: null,
isFreezeMobs: null,
babyMissiles: null,
isIceCrystals: null,
throwChargeRate: null,
@@ -1991,4 +2080,6 @@ const mod = {
squirrelJump: null,
fastTimeJump: null,
isFastDot: null,
isArmorFromPowerUps: null,
isAmmoForGun: null
}

View File

@@ -554,7 +554,7 @@ const mech = {
document.getElementById("dmg").style.opacity = 0.1 + Math.min(0.6, dmg * 4);
}
if (dmg > 0.2 * mech.holdingMassScale) mech.drop(); //drop block if holding
if (dmg > 0.06 / mech.holdingMassScale) mech.drop(); //drop block if holding
const normalFPS = function () {
if (mech.defaultFPSCycle < mech.cycle) { //back to default values
@@ -1468,6 +1468,20 @@ const mech = {
y: player.velocity.y * 0.98
});
}
if (mod.isFreezeMobs) {
const ICE_DRAIN = 0.00015
for (let i = 0, len = mob.length; i < len; i++) {
if (mob[i].distanceToPlayer() + mob[i].radius < this.fieldDrawRadius && !mob[i].shield && !mob[i].isShielded) {
if (mech.energy > ICE_DRAIN) {
this.fieldDrawRadius -= 2;
mech.energy -= ICE_DRAIN;
mobs.statusSlow(mob[i], 45)
} else {
break;
}
}
}
}
//draw zero-G range
ctx.beginPath();
@@ -1475,31 +1489,6 @@ const mech = {
ctx.fillStyle = "#f5f5ff";
ctx.globalCompositeOperation = "difference";
ctx.fill();
if (mod.isHawking) {
for (let i = 0, len = mob.length; i < len; i++) {
if (mob[i].distanceToPlayer2() < this.fieldDrawRadius * this.fieldDrawRadius && Matter.Query.ray(map, mech.pos, mob[i].position).length === 0 && Matter.Query.ray(body, mech.pos, mob[i].position).length === 0) {
mob[i].damage(b.dmgScale * 0.085);
mob[i].locatePlayer();
//draw electricity
const sub = Vector.sub(mob[i].position, mech.pos)
const unit = Vector.normalise(sub);
const steps = 6
const step = Vector.magnitude(sub) / steps;
ctx.beginPath();
let x = mech.pos.x + 30 * unit.x;
let y = mech.pos.y + 30 * unit.y;
ctx.moveTo(x, y);
for (let i = 0; i < steps; i++) {
x += step * (unit.x + 0.7 * (Math.random() - 0.5))
y += step * (unit.y + 0.7 * (Math.random() - 0.5))
ctx.lineTo(x, y);
}
ctx.lineWidth = 1;
ctx.strokeStyle = "rgba(0,255,0,0.5)" //"#fff";
ctx.stroke();
}
}
}
ctx.globalCompositeOperation = "source-over";
}
} else if (mech.holdingTarget && mech.fieldCDcycle < mech.cycle) { //holding, but field button is released

View File

@@ -1,6 +1,7 @@
let powerUp = [];
const powerUps = {
totalPowerUps: 0, //used for mods that count power ups at the end of a level
choose(type, index) {
if (type === "gun") {
b.giveGuns(index)
@@ -110,16 +111,21 @@ const powerUps = {
//only get ammo for guns player has
let target;
if (b.inventory.length > 0) {
//add ammo to a gun in inventory
target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]];
//try 3 more times to give ammo to a gun with ammo, not Infinity
if (target.ammo === Infinity) {
target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]]
if (mod.isAmmoForGun) {
target = b.guns[b.activeGun];
} else {
//find a gun in your inventory
target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]];
//try 3 more times to give ammo to a gun with ammo, not Infinity
if (target.ammo === Infinity) {
target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]]
if (target.ammo === Infinity) target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]]
if (target.ammo === Infinity) {
target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]]
if (target.ammo === Infinity) target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]]
}
}
}
//give ammo
if (target.ammo === Infinity) {
if (mech.energy < mech.maxEnergy) mech.energy = mech.maxEnergy;
if (!game.lastLogTime) game.makeTextLog("<span style='font-size:115%;'><span class='color-f'>+energy</span></span>", 300);

View File

@@ -900,7 +900,7 @@ const spawn = {
Matter.Body.rotate(me, Math.random() * Math.PI * 2);
me.accelMag = 0.0005 * game.accelScale;
me.seePlayerFreq = Math.floor(25 * game.lookFreqScale);
me.memory = 600;
me.memory = 420;
me.restitution = 1;
me.frictionAir = 0.05;
me.frictionStatic = 0;
@@ -1009,7 +1009,7 @@ const spawn = {
// hitting player
if (best.who === player) {
if (mech.immuneCycle < mech.cycle) {
const dmg = 0.0005 * game.dmgScale;
const dmg = 0.002 * game.dmgScale;
mech.damage(dmg);
//draw damage
ctx.fillStyle = color;
@@ -1801,7 +1801,7 @@ const spawn = {
};
Matter.Body.setDensity(me, 0.00005); //normal is 0.001
me.timeLeft = 420 * (0.8 + 0.4 * Math.random());
me.accelMag = 0.00015 * (0.8 + 0.4 * Math.random()) * game.accelScale;
me.accelMag = 0.00017 * (0.8 + 0.4 * Math.random()) * game.accelScale;
me.frictionAir = 0.01 * (0.8 + 0.4 * Math.random());
me.restitution = 0.5;
me.leaveBody = false;