pressure vessel
default foam gun fires a stream tech: pressure vessel - in addition to the stream, foam gun builds up charges. charges release after you stop firing capacitor tech doubles pressure vessel effect tech: syntactic foam - foam does 41% more damage per second quantum foam removed spore gun has 25% more ammo and fires 25% more often spores and worms move 25% faster nail gun has 5% more ammo all versions of nail gun have a much higher fire rate harpoon/grapple density reduced by 20% this also lowers damage about 10% harpoon/grapple properly follow conservation of momentum (a small jerk when it retracts) bug fixes
This commit is contained in:
226
js/bullet.js
226
js/bullet.js
@@ -208,8 +208,10 @@ const b = {
|
|||||||
}
|
}
|
||||||
if (b.inventory.length > 0) {
|
if (b.inventory.length > 0) {
|
||||||
b.activeGun = b.inventory[0];
|
b.activeGun = b.inventory[0];
|
||||||
|
b.inventoryGun = 0;
|
||||||
} else {
|
} else {
|
||||||
b.activeGun = null;
|
b.activeGun = null;
|
||||||
|
b.inventoryGun = 0;
|
||||||
}
|
}
|
||||||
simulation.makeGunHUD();
|
simulation.makeGunHUD();
|
||||||
break
|
break
|
||||||
@@ -974,7 +976,7 @@ const b = {
|
|||||||
bullet[me] = Bodies.polygon(where.x, where.y, 10, 4, b.fireAttributes(angle, false));
|
bullet[me] = Bodies.polygon(where.x, where.y, 10, 4, b.fireAttributes(angle, false));
|
||||||
b.fireProps((input.down ? 45 : 25) / Math.pow(0.92, tech.missileCount), input.down ? 35 : 20, angle, me); //cd , speed
|
b.fireProps((input.down ? 45 : 25) / Math.pow(0.92, tech.missileCount), input.down ? 35 : 20, angle, me); //cd , speed
|
||||||
Matter.Body.setDensity(bullet[me], 0.000001);
|
Matter.Body.setDensity(bullet[me], 0.000001);
|
||||||
bullet[me].endCycle = Infinity;
|
bullet[me].endCycle = 500 + simulation.cycle;
|
||||||
bullet[me].frictionAir = 0;
|
bullet[me].frictionAir = 0;
|
||||||
bullet[me].friction = 1;
|
bullet[me].friction = 1;
|
||||||
bullet[me].frictionStatic = 1;
|
bullet[me].frictionStatic = 1;
|
||||||
@@ -1132,6 +1134,8 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let gunIndex = null
|
let gunIndex = null
|
||||||
for (let i = 0, len = b.guns.length; i < len; i++) {
|
for (let i = 0, len = b.guns.length; i < len; i++) {
|
||||||
if (b.guns[i].name === "grenades") {
|
if (b.guns[i].name === "grenades") {
|
||||||
@@ -1364,7 +1368,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
minDmgSpeed: 4,
|
minDmgSpeed: 4,
|
||||||
lookFrequency: Math.floor(7 + Math.random() * 3),
|
lookFrequency: Math.floor(7 + Math.random() * 3),
|
||||||
density: tech.harpoonDensity, //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
|
density: tech.harpoonDensity, //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
|
||||||
drain: 0.004,
|
drain: 0.004,
|
||||||
beforeDmg(who) {
|
beforeDmg(who) {
|
||||||
if (tech.isShieldPierce && who.isShielded) { //disable shields
|
if (tech.isShieldPierce && who.isShielded) { //disable shields
|
||||||
@@ -1397,7 +1401,7 @@ const b = {
|
|||||||
this.caughtPowerUp.effect();
|
this.caughtPowerUp.effect();
|
||||||
Matter.Composite.remove(engine.world, this.caughtPowerUp);
|
Matter.Composite.remove(engine.world, this.caughtPowerUp);
|
||||||
powerUp.splice(index, 1);
|
powerUp.splice(index, 1);
|
||||||
if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.005 * 6 //0.005 is normal
|
if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.004 * 6 //0.005 is normal
|
||||||
} else {
|
} else {
|
||||||
this.dropCaughtPowerUp()
|
this.dropCaughtPowerUp()
|
||||||
}
|
}
|
||||||
@@ -1446,7 +1450,7 @@ const b = {
|
|||||||
if (m.energy < 0.05) this.dropCaughtPowerUp()
|
if (m.energy < 0.05) this.dropCaughtPowerUp()
|
||||||
|
|
||||||
//recoil on catching
|
//recoil on catching
|
||||||
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.00015 : 0.0003))
|
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
|
||||||
player.force.x += momentum.x
|
player.force.x += momentum.x
|
||||||
player.force.y += momentum.y
|
player.force.y += momentum.y
|
||||||
// refund ammo
|
// refund ammo
|
||||||
@@ -1519,6 +1523,10 @@ const b = {
|
|||||||
Matter.Body.setDensity(this, 0.0005); //reduce density on return
|
Matter.Body.setDensity(this, 0.0005); //reduce density on return
|
||||||
if (this.angularSpeed < 0.5) this.torque += this.inertia * 0.001 * (Math.random() - 0.5) //(Math.round(Math.random()) ? 1 : -1)
|
if (this.angularSpeed < 0.5) this.torque += this.inertia * 0.001 * (Math.random() - 0.5) //(Math.round(Math.random()) ? 1 : -1)
|
||||||
this.collisionFilter.mask = cat.map | cat.mob | cat.mobBullet | cat.mobShield // | cat.body
|
this.collisionFilter.mask = cat.map | cat.mob | cat.mobBullet | cat.mobShield // | cat.body
|
||||||
|
//recoil on catching
|
||||||
|
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
|
||||||
|
player.force.x += momentum.x
|
||||||
|
player.force.y += momentum.y
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
//grappling hook
|
//grappling hook
|
||||||
@@ -1576,6 +1584,10 @@ const b = {
|
|||||||
this.do = this.returnToPlayer
|
this.do = this.returnToPlayer
|
||||||
this.endCycle = simulation.cycle + 60
|
this.endCycle = simulation.cycle + 60
|
||||||
m.fireCDcycle = m.cycle + 120; //fire cooldown
|
m.fireCDcycle = m.cycle + 120; //fire cooldown
|
||||||
|
//recoil on catching
|
||||||
|
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
|
||||||
|
player.force.x += momentum.x
|
||||||
|
player.force.y += momentum.y
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1584,6 +1596,10 @@ const b = {
|
|||||||
this.collisionFilter.mask = 0
|
this.collisionFilter.mask = 0
|
||||||
this.do = this.returnToPlayer
|
this.do = this.returnToPlayer
|
||||||
this.endCycle = simulation.cycle + 60
|
this.endCycle = simulation.cycle + 60
|
||||||
|
//recoil on catching
|
||||||
|
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
|
||||||
|
player.force.x += momentum.x
|
||||||
|
player.force.y += momentum.y
|
||||||
}
|
}
|
||||||
this.draw();
|
this.draw();
|
||||||
}
|
}
|
||||||
@@ -1617,7 +1633,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
minDmgSpeed: 4,
|
minDmgSpeed: 4,
|
||||||
lookFrequency: Math.floor(7 + Math.random() * 3),
|
lookFrequency: Math.floor(7 + Math.random() * 3),
|
||||||
density: tech.harpoonDensity, //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
|
density: tech.harpoonDensity, //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
|
||||||
beforeDmg(who) {
|
beforeDmg(who) {
|
||||||
if (tech.isShieldPierce && who.isShielded) { //disable shields
|
if (tech.isShieldPierce && who.isShielded) { //disable shields
|
||||||
who.isShielded = false
|
who.isShielded = false
|
||||||
@@ -1659,7 +1675,7 @@ const b = {
|
|||||||
this.caughtPowerUp.effect();
|
this.caughtPowerUp.effect();
|
||||||
Matter.Composite.remove(engine.world, this.caughtPowerUp);
|
Matter.Composite.remove(engine.world, this.caughtPowerUp);
|
||||||
powerUp.splice(index, 1);
|
powerUp.splice(index, 1);
|
||||||
if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.005 * 6 //0.006 is normal
|
if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.004 * 6 //0.006 is normal
|
||||||
} else {
|
} else {
|
||||||
this.dropCaughtPowerUp()
|
this.dropCaughtPowerUp()
|
||||||
}
|
}
|
||||||
@@ -1712,7 +1728,7 @@ const b = {
|
|||||||
m.fireCDcycle = m.cycle + 35 * b.fireCDscale //lower cd to 25 if it is above 25
|
m.fireCDcycle = m.cycle + 35 * b.fireCDscale //lower cd to 25 if it is above 25
|
||||||
}
|
}
|
||||||
//recoil on catching
|
//recoil on catching
|
||||||
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.00015 : 0.0003))
|
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.0001 : 0.0002))
|
||||||
player.force.x += momentum.x
|
player.force.x += momentum.x
|
||||||
player.force.y += momentum.y
|
player.force.y += momentum.y
|
||||||
// refund ammo
|
// refund ammo
|
||||||
@@ -1769,6 +1785,10 @@ const b = {
|
|||||||
this.collisionFilter.category = 0
|
this.collisionFilter.category = 0
|
||||||
this.collisionFilter.mask = 0
|
this.collisionFilter.mask = 0
|
||||||
this.endCycle = simulation.cycle + 60
|
this.endCycle = simulation.cycle + 60
|
||||||
|
//recoil on jerking line
|
||||||
|
const momentum = Vector.mult(Vector.sub(this.velocity, player.velocity), (input.down ? 0.00015 : 0.0003))
|
||||||
|
player.force.x += momentum.x
|
||||||
|
player.force.y += momentum.y
|
||||||
} else {
|
} else {
|
||||||
this.grabPowerUp()
|
this.grabPowerUp()
|
||||||
}
|
}
|
||||||
@@ -2605,7 +2625,7 @@ const b = {
|
|||||||
// angle: Math.random() * 2 * Math.PI,
|
// angle: Math.random() * 2 * Math.PI,
|
||||||
friction: 0,
|
friction: 0,
|
||||||
frictionAir: 0.025,
|
frictionAir: 0.025,
|
||||||
thrust: (tech.isFastSpores ? 0.001 : 0.0005) * (1 + 0.5 * (Math.random() - 0.5)),
|
thrust: (tech.isFastSpores ? 0.0012 : 0.00055) * (1 + 0.5 * (Math.random() - 0.5)),
|
||||||
wormSize: wormSize,
|
wormSize: wormSize,
|
||||||
wormTail: 1 + Math.max(4, Math.min(wormSize - 2 * tech.wormSize, 30)),
|
wormTail: 1 + Math.max(4, Math.min(wormSize - 2 * tech.wormSize, 30)),
|
||||||
dmg: (tech.isMutualism ? 7 : 2.9) * wormSize, //bonus damage from tech.isMutualism //2.5 is extra damage as worm
|
dmg: (tech.isMutualism ? 7 : 2.9) * wormSize, //bonus damage from tech.isMutualism //2.5 is extra damage as worm
|
||||||
@@ -2723,7 +2743,7 @@ const b = {
|
|||||||
angle: Math.random() * 2 * Math.PI,
|
angle: Math.random() * 2 * Math.PI,
|
||||||
friction: 0,
|
friction: 0,
|
||||||
frictionAir: 0.025,
|
frictionAir: 0.025,
|
||||||
thrust: (tech.isFastSpores ? 0.0009 : 0.00045) * (1 + 0.3 * (Math.random() - 0.5)),
|
thrust: (tech.isFastSpores ? 0.0011 : 0.0005) * (1 + 0.3 * (Math.random() - 0.5)),
|
||||||
dmg: tech.isMutualism ? 16.8 : 7, //bonus damage from tech.isMutualism
|
dmg: tech.isMutualism ? 16.8 : 7, //bonus damage from tech.isMutualism
|
||||||
lookFrequency: 100 + Math.floor(117 * Math.random()),
|
lookFrequency: 100 + Math.floor(117 * Math.random()),
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
@@ -3496,7 +3516,7 @@ const b = {
|
|||||||
inertia: Infinity,
|
inertia: Infinity,
|
||||||
frictionAir: 0.003,
|
frictionAir: 0.003,
|
||||||
dmg: 0, //damage on impact
|
dmg: 0, //damage on impact
|
||||||
damage: (tech.isFastFoam ? 0.0275 : 0.011) * (tech.isBulletTeleport ? 1.43 : 1), //damage done over time
|
damage: tech.foamDamage * (tech.isFastFoam ? 2.5 : 1) * (tech.isBulletTeleport ? 1.43 : 1), //damage done over time
|
||||||
scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1),
|
scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1),
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
@@ -3575,6 +3595,35 @@ const b = {
|
|||||||
const SCALE = 1 - 0.004 / tech.isBulletsLastLonger //shrink if mob is shielded
|
const SCALE = 1 - 0.004 / tech.isBulletsLastLonger //shrink if mob is shielded
|
||||||
Matter.Body.scale(this, SCALE, SCALE);
|
Matter.Body.scale(this, SCALE, SCALE);
|
||||||
this.radius *= SCALE;
|
this.radius *= SCALE;
|
||||||
|
|
||||||
|
// if (true && !(simulation.cycle % 20)) {
|
||||||
|
// let electricity = (who) => {
|
||||||
|
// who.damage(2 * m.dmgScale, true)
|
||||||
|
// const unit = Vector.normalise(Vector.sub(this.position, who.position))
|
||||||
|
// //draw electricity
|
||||||
|
// const step = 80
|
||||||
|
// ctx.beginPath();
|
||||||
|
// let x = this.position.x - 20 * unit.x;
|
||||||
|
// let y = this.position.y - 20 * unit.y;
|
||||||
|
// ctx.moveTo(x, y);
|
||||||
|
// for (let i = 0; i < 3; i++) {
|
||||||
|
// x += step * (-unit.x + 1.5 * (Math.random() - 0.5))
|
||||||
|
// y += step * (-unit.y + 1.5 * (Math.random() - 0.5))
|
||||||
|
// ctx.lineTo(x, y);
|
||||||
|
// }
|
||||||
|
// ctx.lineWidth = 3;
|
||||||
|
// ctx.strokeStyle = "#f0f";
|
||||||
|
// ctx.stroke();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //find mobs that are close
|
||||||
|
// for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
|
// if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) - mob[i].radius < 5000 && !mob[i].isBadTarget) {
|
||||||
|
// electricity(mob[0])
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this.target.damage(m.dmgScale * this.damage);
|
this.target.damage(m.dmgScale * this.damage);
|
||||||
}
|
}
|
||||||
@@ -3650,7 +3699,7 @@ const b = {
|
|||||||
Composite.add(engine.world, bullet[me]); //add bullet to world
|
Composite.add(engine.world, bullet[me]); //add bullet to world
|
||||||
Matter.Body.setVelocity(bullet[me], velocity);
|
Matter.Body.setVelocity(bullet[me], velocity);
|
||||||
},
|
},
|
||||||
targetedBlock(who, isSpin = false, speed = 50 - Math.min(20, who.mass * 2), range = 1600) {
|
targetedBlock(who, speed = 50 - Math.min(20, who.mass * 2), range = 1600) {
|
||||||
let closestMob, dist
|
let closestMob, dist
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
if (who !== mob[i]) {
|
if (who !== mob[i]) {
|
||||||
@@ -4809,8 +4858,8 @@ const b = {
|
|||||||
name: "nail gun",
|
name: "nail gun",
|
||||||
description: "use compressed air to fire a stream of <strong>nails</strong><br><strong><em>delay</em></strong> after firing <strong>decreases</strong> as you shoot",
|
description: "use compressed air to fire a stream of <strong>nails</strong><br><strong><em>delay</em></strong> after firing <strong>decreases</strong> as you shoot",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 45,
|
ammoPack: 50,
|
||||||
defaultAmmoPack: 45,
|
defaultAmmoPack: 50,
|
||||||
recordedAmmo: 0,
|
recordedAmmo: 0,
|
||||||
have: false,
|
have: false,
|
||||||
nextFireCycle: 0, //use to remember how longs its been since last fire, used to reset count
|
nextFireCycle: 0, //use to remember how longs its been since last fire, used to reset count
|
||||||
@@ -4824,8 +4873,6 @@ const b = {
|
|||||||
}
|
}
|
||||||
} else if (tech.isRivets) {
|
} else if (tech.isRivets) {
|
||||||
this.fire = this.fireRivets
|
this.fire = this.fireRivets
|
||||||
} else if (tech.isDarts) {
|
|
||||||
this.fire = this.fireDarts
|
|
||||||
} else if (tech.isNeedles) {
|
} else if (tech.isNeedles) {
|
||||||
this.fire = this.fireNeedles
|
this.fire = this.fireNeedles
|
||||||
} else if (tech.nailInstantFireRate) {
|
} else if (tech.nailInstantFireRate) {
|
||||||
@@ -4838,29 +4885,13 @@ const b = {
|
|||||||
},
|
},
|
||||||
do() {},
|
do() {},
|
||||||
fire() {},
|
fire() {},
|
||||||
// for (let i = 0; i < 5; i++) {
|
|
||||||
// b.dart(where, m.angle + 0.1 * i)
|
|
||||||
// b.dart(where, m.angle - 0.1 * i)
|
|
||||||
// }
|
|
||||||
fireDarts() {
|
|
||||||
const where = {
|
|
||||||
x: m.pos.x + 30 * Math.cos(m.angle),
|
|
||||||
y: m.pos.y + 30 * Math.sin(m.angle)
|
|
||||||
}
|
|
||||||
m.fireCDcycle = m.cycle + 10 * b.fireCDscale; // cool down
|
|
||||||
b.dart(where, m.angle) //+ 0.6 * (Math.random() - 0.5)
|
|
||||||
// const spread = 0.5
|
|
||||||
// b.dart(where, m.angle + spread)
|
|
||||||
// b.dart(where, m.angle)
|
|
||||||
// b.dart(where, m.angle - spread)
|
|
||||||
},
|
|
||||||
fireRecoilNails() {
|
fireRecoilNails() {
|
||||||
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
|
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
|
||||||
const CD = Math.max(11 - 0.08 * (m.cycle - this.startingHoldCycle), 1) //CD scales with cycles fire is held down
|
const CD = Math.max(11 - 0.06 * (m.cycle - this.startingHoldCycle), 0.99) //CD scales with cycles fire is held down
|
||||||
this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
|
this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
|
||||||
|
|
||||||
m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
|
m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
|
||||||
this.baseFire(m.angle + (Math.random() - 0.5) * (input.down ? 0.1 : 0.13) / CD, 45 + 6 * Math.random())
|
this.baseFire(m.angle + (Math.random() - 0.5) * (input.down ? 0.04 : 0.13) / CD, 45 + 6 * Math.random())
|
||||||
//very complex recoil system
|
//very complex recoil system
|
||||||
if (m.onGround) {
|
if (m.onGround) {
|
||||||
if (input.down) {
|
if (input.down) {
|
||||||
@@ -4887,28 +4918,28 @@ const b = {
|
|||||||
},
|
},
|
||||||
fireNormal() {
|
fireNormal() {
|
||||||
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
|
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
|
||||||
const CD = Math.max(11 - 0.06 * (m.cycle - this.startingHoldCycle), 2) //CD scales with cycles fire is held down
|
const CD = Math.max(11 - 0.06 * (m.cycle - this.startingHoldCycle), 1) //CD scales with cycles fire is held down
|
||||||
this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
|
this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
|
||||||
|
|
||||||
m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
|
m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
|
||||||
this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (input.down ? 1.35 : 3.2) / CD)
|
this.baseFire(m.angle + (Math.random() - 0.5) * (input.down ? 0.05 : 0.3) / CD)
|
||||||
},
|
},
|
||||||
fireNeedles() {
|
fireNeedles() {
|
||||||
if (input.down) {
|
if (input.down) {
|
||||||
m.fireCDcycle = m.cycle + 38 * b.fireCDscale; // cool down
|
m.fireCDcycle = m.cycle + 30 * b.fireCDscale; // cool down
|
||||||
b.needle()
|
b.needle()
|
||||||
|
|
||||||
function cycle() {
|
function cycle() {
|
||||||
if (simulation.paused || m.isBodiesAsleep) { requestAnimationFrame(cycle) } else {
|
if (simulation.paused || m.isBodiesAsleep) { requestAnimationFrame(cycle) } else {
|
||||||
count++
|
count++
|
||||||
if (count % 2) b.needle()
|
if (count % 2) b.needle()
|
||||||
if (count < 5 && m.alive) requestAnimationFrame(cycle);
|
if (count < 7 && m.alive) requestAnimationFrame(cycle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let count = -1
|
let count = -1
|
||||||
requestAnimationFrame(cycle);
|
requestAnimationFrame(cycle);
|
||||||
} else {
|
} else {
|
||||||
m.fireCDcycle = m.cycle + 28 * b.fireCDscale; // cool down
|
m.fireCDcycle = m.cycle + 22 * b.fireCDscale; // cool down
|
||||||
b.needle()
|
b.needle()
|
||||||
|
|
||||||
function cycle() {
|
function cycle() {
|
||||||
@@ -4923,15 +4954,14 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
fireRivets() {
|
fireRivets() {
|
||||||
m.fireCDcycle = m.cycle + Math.floor((input.down ? 25 : 17) * b.fireCDscale); // cool down
|
m.fireCDcycle = m.cycle + Math.floor((input.down ? 22 : 14) * b.fireCDscale); // cool down
|
||||||
|
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
const size = tech.bulletSize * 8
|
const size = tech.bulletSize * 8
|
||||||
bullet[me] = Bodies.rectangle(m.pos.x + 35 * Math.cos(m.angle), m.pos.y + 35 * Math.sin(m.angle), 5 * size, size, b.fireAttributes(m.angle));
|
bullet[me] = Bodies.rectangle(m.pos.x + 35 * Math.cos(m.angle), m.pos.y + 35 * Math.sin(m.angle), 5 * size, size, b.fireAttributes(m.angle));
|
||||||
bullet[me].dmg = tech.isNailRadiation ? 0 : 2.75
|
bullet[me].dmg = tech.isNailRadiation ? 0 : 2.75
|
||||||
Matter.Body.setDensity(bullet[me], 0.002);
|
Matter.Body.setDensity(bullet[me], 0.002);
|
||||||
Composite.add(engine.world, bullet[me]); //add bullet to world
|
Composite.add(engine.world, bullet[me]); //add bullet to world
|
||||||
const SPEED = input.down ? 55 : 44
|
const SPEED = input.down ? 60 : 44
|
||||||
Matter.Body.setVelocity(bullet[me], {
|
Matter.Body.setVelocity(bullet[me], {
|
||||||
x: SPEED * Math.cos(m.angle),
|
x: SPEED * Math.cos(m.angle),
|
||||||
y: SPEED * Math.sin(m.angle)
|
y: SPEED * Math.sin(m.angle)
|
||||||
@@ -4993,7 +5023,7 @@ const b = {
|
|||||||
fireRecoilRivets() {
|
fireRecoilRivets() {
|
||||||
// m.fireCDcycle = m.cycle + Math.floor((input.down ? 25 : 17) * b.fireCDscale); // cool down
|
// m.fireCDcycle = m.cycle + Math.floor((input.down ? 25 : 17) * b.fireCDscale); // cool down
|
||||||
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
|
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
|
||||||
const CD = Math.max(25 - 0.14 * (m.cycle - this.startingHoldCycle), 6) //CD scales with cycles fire is held down
|
const CD = Math.max(25 - 0.14 * (m.cycle - this.startingHoldCycle), 5) //CD scales with cycles fire is held down
|
||||||
this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
|
this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
|
||||||
m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
|
m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
|
||||||
|
|
||||||
@@ -5003,7 +5033,7 @@ const b = {
|
|||||||
bullet[me].dmg = tech.isNailRadiation ? 0 : 2.75
|
bullet[me].dmg = tech.isNailRadiation ? 0 : 2.75
|
||||||
Matter.Body.setDensity(bullet[me], 0.002);
|
Matter.Body.setDensity(bullet[me], 0.002);
|
||||||
Composite.add(engine.world, bullet[me]); //add bullet to world
|
Composite.add(engine.world, bullet[me]); //add bullet to world
|
||||||
const SPEED = input.down ? 60 : 50
|
const SPEED = input.down ? 62 : 52
|
||||||
Matter.Body.setVelocity(bullet[me], {
|
Matter.Body.setVelocity(bullet[me], {
|
||||||
x: SPEED * Math.cos(m.angle),
|
x: SPEED * Math.cos(m.angle),
|
||||||
y: SPEED * Math.sin(m.angle)
|
y: SPEED * Math.sin(m.angle)
|
||||||
@@ -5071,8 +5101,8 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
fireInstantFireRate() {
|
fireInstantFireRate() {
|
||||||
m.fireCDcycle = m.cycle + Math.floor(2 * b.fireCDscale); // cool down
|
m.fireCDcycle = m.cycle + Math.floor(1 * b.fireCDscale); // cool down
|
||||||
this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (input.down ? 1.35 : 3.2) / 2)
|
this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (input.down ? 1.15 : 2) / 2)
|
||||||
},
|
},
|
||||||
baseFire(angle, speed = 30 + 6 * Math.random()) {
|
baseFire(angle, speed = 30 + 6 * Math.random()) {
|
||||||
b.nail({
|
b.nail({
|
||||||
@@ -5102,8 +5132,8 @@ const b = {
|
|||||||
name: "shotgun",
|
name: "shotgun",
|
||||||
description: "fire a wide <strong>burst</strong> of short range <strong> bullets</strong>",
|
description: "fire a wide <strong>burst</strong> of short range <strong> bullets</strong>",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 3.8,
|
ammoPack: 3.5,
|
||||||
defaultAmmoPack: 3.8,
|
defaultAmmoPack: 3.5,
|
||||||
have: false,
|
have: false,
|
||||||
do() {},
|
do() {},
|
||||||
fire() {
|
fire() {
|
||||||
@@ -5910,14 +5940,14 @@ const b = {
|
|||||||
name: "spores",
|
name: "spores",
|
||||||
description: "fire a <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> that discharges <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> seek out nearby mobs",
|
description: "fire a <strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> that discharges <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> seek out nearby mobs",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 2.3,
|
ammoPack: 2.6,
|
||||||
have: false,
|
have: false,
|
||||||
do() {},
|
do() {},
|
||||||
fire() {
|
fire() {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
const dir = m.angle;
|
const dir = m.angle;
|
||||||
bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 20, 4.5, b.fireAttributes(dir, false));
|
bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 20, 4.5, b.fireAttributes(dir, false));
|
||||||
b.fireProps(input.down ? 45 : 25, input.down ? 30 : 16, dir, me); //cd , speed
|
b.fireProps(input.down ? 40 : 20, input.down ? 30 : 16, dir, me); //cd , speed
|
||||||
Matter.Body.setDensity(bullet[me], 0.000001);
|
Matter.Body.setDensity(bullet[me], 0.000001);
|
||||||
bullet[me].endCycle = simulation.cycle + 480 + Math.max(0, 120 - 2 * bullet.length);
|
bullet[me].endCycle = simulation.cycle + 480 + Math.max(0, 120 - 2 * bullet.length);
|
||||||
bullet[me].frictionAir = 0;
|
bullet[me].frictionAir = 0;
|
||||||
@@ -6074,19 +6104,19 @@ const b = {
|
|||||||
charge: 0,
|
charge: 0,
|
||||||
isDischarge: false,
|
isDischarge: false,
|
||||||
chooseFireMethod() {
|
chooseFireMethod() {
|
||||||
if (tech.isCapacitor) {
|
if (tech.isFoamPressure) {
|
||||||
|
this.do = this.doCharges
|
||||||
|
this.fire = this.fireCharges
|
||||||
|
} else {
|
||||||
this.do = this.doStream
|
this.do = this.doStream
|
||||||
this.fire = this.fireStream
|
this.fire = this.fireStream
|
||||||
} else {
|
|
||||||
this.do = this.doCharges // () => {}
|
|
||||||
this.fire = this.fireCharges
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
doStream() {},
|
doStream() {},
|
||||||
fireStream() {
|
fireStream() {
|
||||||
const spread = (input.down ? 0.04 : 0.3) * (Math.random() - 0.5)
|
const spread = (input.down ? 0.04 : 0.3) * (Math.random() - 0.5)
|
||||||
const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12
|
const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12
|
||||||
const SPEED = Math.max(2, 14 - radius * 0.25)
|
const SPEED = (input.down ? 1.2 : 1) * Math.max(2, 14 - radius * 0.25)
|
||||||
const dir = m.angle + 0.15 * (Math.random() - 0.5)
|
const dir = m.angle + 0.15 * (Math.random() - 0.5)
|
||||||
const velocity = {
|
const velocity = {
|
||||||
x: SPEED * Math.cos(dir),
|
x: SPEED * Math.cos(dir),
|
||||||
@@ -6096,23 +6126,7 @@ const b = {
|
|||||||
x: m.pos.x + 30 * Math.cos(m.angle),
|
x: m.pos.x + 30 * Math.cos(m.angle),
|
||||||
y: m.pos.y + 30 * Math.sin(m.angle)
|
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||||
}
|
}
|
||||||
if (tech.foamFutureFire) {
|
b.foam(position, Vector.rotate(velocity, spread), radius)
|
||||||
simulation.drawList.push({ //add dmg to draw queue
|
|
||||||
x: position.x,
|
|
||||||
y: position.y,
|
|
||||||
radius: 5,
|
|
||||||
color: "rgba(0,50,50,0.3)",
|
|
||||||
time: 15 * tech.foamFutureFire
|
|
||||||
});
|
|
||||||
setTimeout(() => {
|
|
||||||
if (!simulation.paused) {
|
|
||||||
b.foam(position, Vector.rotate(velocity, spread), radius)
|
|
||||||
bullet[bullet.length - 1].damage *= (1 + 0.7 * tech.foamFutureFire)
|
|
||||||
}
|
|
||||||
}, 210 * tech.foamFutureFire);
|
|
||||||
} else {
|
|
||||||
b.foam(position, Vector.rotate(velocity, spread), radius)
|
|
||||||
}
|
|
||||||
m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale);
|
m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale);
|
||||||
},
|
},
|
||||||
doCharges() {
|
doCharges() {
|
||||||
@@ -6120,16 +6134,16 @@ const b = {
|
|||||||
//draw charge level
|
//draw charge level
|
||||||
ctx.fillStyle = "rgba(0,50,50,0.3)";
|
ctx.fillStyle = "rgba(0,50,50,0.3)";
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
const radius = 10 * Math.sqrt(this.charge)
|
const radius = 5 * Math.sqrt(this.charge)
|
||||||
const mag = 11 + radius
|
const mag = 11 + radius
|
||||||
ctx.arc(m.pos.x + mag * Math.cos(m.angle), m.pos.y + mag * Math.sin(m.angle), radius, 0, 2 * Math.PI);
|
ctx.arc(m.pos.x + mag * Math.cos(m.angle), m.pos.y + mag * Math.sin(m.angle), radius, 0, 2 * Math.PI);
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
|
|
||||||
if (this.isDischarge) {
|
if (this.isDischarge && m.cycle % 2) {
|
||||||
this.charge--
|
this.charge--
|
||||||
const spread = (input.down ? 0.04 : 0.5) * (Math.random() - 0.5)
|
const spread = (input.down ? 0.04 : 0.5) * (Math.random() - 0.5)
|
||||||
const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12
|
const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12
|
||||||
const SPEED = 18 - radius * 0.4;
|
const SPEED = (input.down ? 1.2 : 1) * 10 - radius * 0.4 + Math.min(5, Math.sqrt(this.charge));
|
||||||
const dir = m.angle + 0.15 * (Math.random() - 0.5)
|
const dir = m.angle + 0.15 * (Math.random() - 0.5)
|
||||||
const velocity = {
|
const velocity = {
|
||||||
x: SPEED * Math.cos(dir),
|
x: SPEED * Math.cos(dir),
|
||||||
@@ -6139,25 +6153,8 @@ const b = {
|
|||||||
x: m.pos.x + 30 * Math.cos(m.angle),
|
x: m.pos.x + 30 * Math.cos(m.angle),
|
||||||
y: m.pos.y + 30 * Math.sin(m.angle)
|
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||||
}
|
}
|
||||||
if (tech.foamFutureFire) {
|
b.foam(position, Vector.rotate(velocity, spread), radius)
|
||||||
simulation.drawList.push({ //add dmg to draw queue
|
m.fireCDcycle = m.cycle + 2; //disable firing and adding more charge until empty
|
||||||
x: position.x,
|
|
||||||
y: position.y,
|
|
||||||
radius: 5,
|
|
||||||
color: "rgba(0,50,50,0.3)",
|
|
||||||
time: 15 * tech.foamFutureFire
|
|
||||||
});
|
|
||||||
setTimeout(() => {
|
|
||||||
if (!simulation.paused) {
|
|
||||||
b.foam(position, Vector.rotate(velocity, spread), radius)
|
|
||||||
// (tech.isFastFoam ? 0.044 : 0.011) * (tech.isBulletTeleport ? 1.60 : 1)
|
|
||||||
bullet[bullet.length - 1].damage *= (1 + 0.7 * tech.foamFutureFire)
|
|
||||||
}
|
|
||||||
}, 250 * tech.foamFutureFire);
|
|
||||||
} else {
|
|
||||||
b.foam(position, Vector.rotate(velocity, spread), radius)
|
|
||||||
}
|
|
||||||
m.fireCDcycle = m.cycle + 1; //disable firing and adding more charge
|
|
||||||
} else if (!input.fire) {
|
} else if (!input.fire) {
|
||||||
this.isDischarge = true;
|
this.isDischarge = true;
|
||||||
}
|
}
|
||||||
@@ -6169,14 +6166,37 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
fireCharges() {
|
fireCharges() {
|
||||||
const capacity = 20
|
const spread = (input.down ? 0.04 : 0.3) * (Math.random() - 0.5)
|
||||||
if (tech.isCapacitor && this.charge === 0 && b.guns[b.activeGun].ammo > capacity) {
|
const radius = 5 + 8 * Math.random() + (tech.isAmmoFoamSize && this.ammo < 300) * 12
|
||||||
this.charge = capacity
|
const SPEED = (input.down ? 1.2 : 1) * Math.max(2, 14 - radius * 0.25)
|
||||||
b.guns[b.activeGun].ammo -= capacity
|
const dir = m.angle + 0.15 * (Math.random() - 0.5)
|
||||||
simulation.updateGunHUD();
|
const velocity = {
|
||||||
|
x: SPEED * Math.cos(dir),
|
||||||
|
y: SPEED * Math.sin(dir)
|
||||||
}
|
}
|
||||||
this.charge++
|
const position = {
|
||||||
m.fireCDcycle = m.cycle + Math.floor(1 + 0.3 * this.charge);
|
x: m.pos.x + 30 * Math.cos(m.angle),
|
||||||
|
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||||
|
}
|
||||||
|
// if (tech.foamFutureFire) {
|
||||||
|
// simulation.drawList.push({ //add dmg to draw queue
|
||||||
|
// x: position.x,
|
||||||
|
// y: position.y,
|
||||||
|
// radius: 5,
|
||||||
|
// color: "rgba(0,50,50,0.3)",
|
||||||
|
// time: 15 * tech.foamFutureFire
|
||||||
|
// });
|
||||||
|
// setTimeout(() => {
|
||||||
|
// if (!simulation.paused) {
|
||||||
|
// b.foam(position, Vector.rotate(velocity, spread), radius)
|
||||||
|
// bullet[bullet.length - 1].damage *= (1 + 0.7 * tech.foamFutureFire)
|
||||||
|
// }
|
||||||
|
// }, 210 * tech.foamFutureFire);
|
||||||
|
// } else {
|
||||||
|
// }
|
||||||
|
b.foam(position, Vector.rotate(velocity, spread), radius)
|
||||||
|
m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale);
|
||||||
|
this.charge += 1 + tech.isCapacitor
|
||||||
},
|
},
|
||||||
fire() {},
|
fire() {},
|
||||||
do() {},
|
do() {},
|
||||||
@@ -6215,7 +6235,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
//fire
|
//fire
|
||||||
if ((!input.fire && this.charge > 0.6)) {
|
if ((!input.fire && this.charge > 0.6)) {
|
||||||
tech.harpoonDensity = 0.008 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
|
tech.harpoonDensity = 0.0065 //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
|
||||||
const where = {
|
const where = {
|
||||||
x: m.pos.x + 30 * Math.cos(m.angle),
|
x: m.pos.x + 30 * Math.cos(m.angle),
|
||||||
y: m.pos.y + 30 * Math.sin(m.angle)
|
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||||
@@ -6270,7 +6290,7 @@ const b = {
|
|||||||
const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.03 : 0.06)
|
const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.03 : 0.06)
|
||||||
player.force.x -= recoil.x
|
player.force.x -= recoil.x
|
||||||
player.force.y -= recoil.y
|
player.force.y -= recoil.y
|
||||||
tech.harpoonDensity = 0.008 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
|
tech.harpoonDensity = 0.0065 //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
|
||||||
|
|
||||||
const harpoonSize = tech.isLargeHarpoon ? 1 + 0.1 * Math.sqrt(this.ammo) : 1
|
const harpoonSize = tech.isLargeHarpoon ? 1 + 0.1 * Math.sqrt(this.ammo) : 1
|
||||||
if (tech.extraHarpoons) {
|
if (tech.extraHarpoons) {
|
||||||
@@ -6475,7 +6495,7 @@ const b = {
|
|||||||
const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.015 : 0.035)
|
const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.015 : 0.035)
|
||||||
player.force.x -= recoil.x
|
player.force.x -= recoil.x
|
||||||
player.force.y -= recoil.y
|
player.force.y -= recoil.y
|
||||||
tech.harpoonDensity = 0.005 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
|
tech.harpoonDensity = 0.004 //0.001 is normal for blocks, 0.004 is normal for harpoon, 0.004*6 when buffed
|
||||||
},
|
},
|
||||||
// railGun2() {
|
// railGun2() {
|
||||||
// const where = {
|
// const where = {
|
||||||
|
|||||||
20
js/level.js
20
js/level.js
@@ -17,13 +17,13 @@ const level = {
|
|||||||
if (level.levelsCleared === 0) { //this code only runs on the first level
|
if (level.levelsCleared === 0) { //this code only runs on the first level
|
||||||
// simulation.isHorizontalFlipped = true
|
// simulation.isHorizontalFlipped = true
|
||||||
// m.setField("time dilation")
|
// m.setField("time dilation")
|
||||||
// b.giveGuns("matter wave")
|
// b.giveGuns("foam")
|
||||||
// tech.giveTech("phonon")
|
// tech.giveTech("rocket-propelled grenade")
|
||||||
// tech.giveTech("eternalism")
|
// tech.giveTech("needle gun")
|
||||||
// tech.giveTech("isotropic radiator")
|
// tech.giveTech("rivet gun")
|
||||||
// tech.giveTech("polyurethane balls")
|
// tech.giveTech("capacitor bank")
|
||||||
// tech.giveTech("grappling hook")
|
// tech.giveTech("rotary cannon")
|
||||||
// tech.giveTech("paradigm shift")
|
// tech.giveTech("pneumatic actuator")
|
||||||
// for (let i = 0; i < 1; i++) powerUps.directSpawn(450, -50, "tech");
|
// for (let i = 0; i < 1; i++) powerUps.directSpawn(450, -50, "tech");
|
||||||
// for (let i = 0; i < 15; i++) tech.giveTech()
|
// for (let i = 0; i < 15; i++) tech.giveTech()
|
||||||
// for (let i = 10; i < tech.tech.length; i++) { tech.tech[i].isBanished = true }
|
// for (let i = 10; i < tech.tech.length; i++) { tech.tech[i].isBanished = true }
|
||||||
@@ -2642,11 +2642,11 @@ const level = {
|
|||||||
spawn.mapRect(4850, -275, 50, 175);
|
spawn.mapRect(4850, -275, 50, 175);
|
||||||
|
|
||||||
//???
|
//???
|
||||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||||
m.addHealth(Infinity)
|
m.addHealth(Infinity)
|
||||||
|
|
||||||
// spawn.starter(1900, -500, 200) //big boy
|
// spawn.starter(1900, -500, 200) //big boy
|
||||||
// for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500)
|
for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500)
|
||||||
// spawn.slashBoss(1900, -500)
|
// spawn.slashBoss(1900, -500)
|
||||||
// spawn.launcherBoss(3200, -500)
|
// spawn.launcherBoss(3200, -500)
|
||||||
// spawn.laserTargetingBoss(1700, -500)
|
// spawn.laserTargetingBoss(1700, -500)
|
||||||
@@ -2672,7 +2672,7 @@ const level = {
|
|||||||
// spawn.shieldingBoss(1700, -500)
|
// spawn.shieldingBoss(1700, -500)
|
||||||
|
|
||||||
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
|
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
|
||||||
for (let i = 0; i < 4; i++) spawn.starter(1900, -500)
|
// for (let i = 0; i < 4; i++) spawn.starter(1900, -500)
|
||||||
// spawn.pulsar(1900, -500)
|
// spawn.pulsar(1900, -500)
|
||||||
// spawn.shield(mob[mob.length - 1], 1900, -500, 1);
|
// spawn.shield(mob[mob.length - 1], 1900, -500, 1);
|
||||||
// mob[mob.length - 1].isShielded = true
|
// mob[mob.length - 1].isShielded = true
|
||||||
|
|||||||
@@ -1365,7 +1365,7 @@ const mobs = {
|
|||||||
mob.splice(i, 1);
|
mob.splice(i, 1);
|
||||||
if (tech.isMobBlockFling) {
|
if (tech.isMobBlockFling) {
|
||||||
const who = body[body.length - 1]
|
const who = body[body.length - 1]
|
||||||
b.targetedBlock(who, true)
|
b.targetedBlock(who)
|
||||||
Matter.Body.setAngularVelocity(who, (0.5 + 0.2 * Math.random()) * (Math.random() < 0.5 ? -1 : 1));
|
Matter.Body.setAngularVelocity(who, (0.5 + 0.2 * Math.random()) * (Math.random() < 0.5 ? -1 : 1));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -3218,10 +3218,10 @@ const m = {
|
|||||||
{
|
{
|
||||||
name: "wormhole",
|
name: "wormhole",
|
||||||
//<strong class='color-worm'>wormholes</strong> attract <strong class='color-block'>blocks</strong> and power ups<br>
|
//<strong class='color-worm'>wormholes</strong> attract <strong class='color-block'>blocks</strong> and power ups<br>
|
||||||
description: "use <strong class='color-f'>energy</strong> to <strong>tunnel</strong> through a <strong class='color-worm'>wormhole</strong><br><strong>5%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second", //<br>bullets may also traverse <strong class='color-worm'>wormholes</strong>
|
description: "use <strong class='color-f'>energy</strong> to <strong>tunnel</strong> through a <strong class='color-worm'>wormhole</strong><br><strong>4%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>generate <strong>6</strong> <strong class='color-f'>energy</strong>/second", //<br>bullets may also traverse <strong class='color-worm'>wormholes</strong>
|
||||||
drain: 0,
|
drain: 0,
|
||||||
effect: function() {
|
effect: function() {
|
||||||
m.duplicateChance = 0.05
|
m.duplicateChance = 0.04
|
||||||
m.fieldRange = 0
|
m.fieldRange = 0
|
||||||
powerUps.setDupChance(); //needed after adjusting duplication chance
|
powerUps.setDupChance(); //needed after adjusting duplication chance
|
||||||
|
|
||||||
|
|||||||
71
js/tech.js
71
js/tech.js
@@ -5078,7 +5078,7 @@ const tech = {
|
|||||||
{
|
{
|
||||||
name: "tinsellated flagella",
|
name: "tinsellated flagella",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Zoospore#Flagella_types' class="link">tinsellated flagella</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Zoospore#Flagella_types' class="link">tinsellated flagella</a>`,
|
||||||
description: "<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> release <strong>2</strong> more <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> accelerate <strong>40% faster</strong>",
|
description: "<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> release <strong>2</strong> more <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> accelerate <strong>50% faster</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -5481,9 +5481,9 @@ const tech = {
|
|||||||
isBot: true,
|
isBot: true,
|
||||||
isBotTech: true,
|
isBotTech: true,
|
||||||
isNonRefundable: true,
|
isNonRefundable: true,
|
||||||
requires: "at least 3 guns, foam gun, NOT EXPERIMENT MODE, bot upgrades, fractionation, quantum foam, capacitor",
|
requires: "at least 2 guns, foam gun, NOT EXPERIMENT MODE, bot upgrades, fractionation, pressure vessel",
|
||||||
allowed() {
|
allowed() {
|
||||||
return b.inventory.length > 2 && tech.haveGunCheck("foam", false) && !b.hasBotUpgrade() && !tech.isAmmoFoamSize && !tech.foamFutureFire && !tech.isCapacitor
|
return b.inventory.length > 1 && tech.haveGunCheck("foam", false) && !b.hasBotUpgrade() && !tech.isAmmoFoamSize && !tech.isFoamPressure
|
||||||
},
|
},
|
||||||
effect() {
|
effect() {
|
||||||
tech.giveTech("foam-bot upgrade")
|
tech.giveTech("foam-bot upgrade")
|
||||||
@@ -5532,7 +5532,7 @@ const tech = {
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (!tech.isFoamAttract && (tech.haveGunCheck("foam") || tech.foamBotCount > 1 || tech.isFoamShot || tech.isFoamBall)) || (tech.haveGunCheck("matter wave") && !tech.isLongitudinal)
|
return (!tech.isFoamAttract && (tech.haveGunCheck("foam") || tech.foamBotCount > 1 || tech.isFoamShot || tech.isFoamBall)) || (tech.haveGunCheck("matter wave") && !tech.isLongitudinal)
|
||||||
},
|
},
|
||||||
requires: "foam, not electrostatic induction, matter wave, not phonon",
|
requires: "foam, matter wave, not electrostatic induction, not phonon",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isBulletTeleport = true
|
tech.isBulletTeleport = true
|
||||||
},
|
},
|
||||||
@@ -5581,22 +5581,22 @@ const tech = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "quantum foam",
|
name: "surface tension",
|
||||||
description: "<strong>foam</strong> gun fires <strong>0.25</strong> seconds into the <strong>future</strong><br>increase <strong>foam</strong> gun <strong class='color-d'>damage</strong> by <strong>66%</strong>",
|
description: "<strong>foam</strong> bubbles have improved adhesion which<br>does <strong>41%</strong> more <strong class='color-d'>damage</strong> per second",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("foam")
|
return tech.haveGunCheck("foam") || tech.foamBotCount > 1 || tech.isFoamShot || tech.isFoamBall
|
||||||
},
|
},
|
||||||
requires: "foam",
|
requires: "foam",
|
||||||
effect() {
|
effect() {
|
||||||
tech.foamFutureFire++
|
tech.foamDamage += 0.011 * 0.41
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.foamFutureFire = 0;
|
tech.foamDamage = 0.011;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -5618,6 +5618,37 @@ const tech = {
|
|||||||
tech.isAmmoFoamSize = false;
|
tech.isAmmoFoamSize = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "pressure vessel",
|
||||||
|
description: "the <strong>foam</strong> gun builds up pressure as you fire<br>that discharges <strong>foam</strong> after firing",
|
||||||
|
isGunTech: true,
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 2,
|
||||||
|
frequencyDefault: 2,
|
||||||
|
allowed() {
|
||||||
|
return tech.haveGunCheck("foam")
|
||||||
|
},
|
||||||
|
requires: "foam",
|
||||||
|
effect() {
|
||||||
|
tech.isFoamPressure = true;
|
||||||
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
|
if (b.guns[i].name === "foam") {
|
||||||
|
b.guns[i].chooseFireMethod()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
tech.isFoamPressure = false;
|
||||||
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
|
if (b.guns[i].name === "foam") {
|
||||||
|
b.guns[i].chooseFireMethod()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "capacitor bank",
|
name: "capacitor bank",
|
||||||
// description: "<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, foam, railgun, pulse, tokamak</em>",
|
// description: "<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, foam, railgun, pulse, tokamak</em>",
|
||||||
@@ -5628,26 +5659,14 @@ const tech = {
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.blockDamage > 0.075 || tech.isRailGun || tech.haveGunCheck("foam") || tech.isTokamak || tech.isPulseLaser || tech.isPlasmaBall
|
return tech.blockDamage > 0.075 || tech.isRailGun || (tech.haveGunCheck("foam") && tech.isFoamPressure) || tech.isTokamak || tech.isPulseLaser || tech.isPlasmaBall
|
||||||
},
|
},
|
||||||
requires: "throwing blocks, railgun, foam, pulse, tokamak, plasma ball",
|
requires: "throwing blocks, railgun, foam, pulse, tokamak, plasma ball",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isCapacitor = true;
|
tech.isCapacitor = true;
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
|
||||||
if (b.guns[i].name === "foam") {
|
|
||||||
b.guns[i].chooseFireMethod()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.isCapacitor = false;
|
tech.isCapacitor = false;
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
|
||||||
if (b.guns[i].name === "foam") {
|
|
||||||
b.guns[i].chooseFireMethod()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -5909,7 +5928,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.isHarpoonPowerUp = false
|
tech.isHarpoonPowerUp = false
|
||||||
tech.harpoonDensity = 0.005
|
tech.harpoonDensity = 0.004
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -9802,7 +9821,6 @@ const tech = {
|
|||||||
is111Duplicate: null,
|
is111Duplicate: null,
|
||||||
isDynamoBotUpgrade: null,
|
isDynamoBotUpgrade: null,
|
||||||
isBlockPowerUps: null,
|
isBlockPowerUps: null,
|
||||||
foamFutureFire: null,
|
|
||||||
isDamageAfterKillNoRegen: null,
|
isDamageAfterKillNoRegen: null,
|
||||||
isHarmReduceNoKill: null,
|
isHarmReduceNoKill: null,
|
||||||
isSwitchReality: null,
|
isSwitchReality: null,
|
||||||
@@ -9891,7 +9909,6 @@ const tech = {
|
|||||||
isFreeWormHole: null,
|
isFreeWormHole: null,
|
||||||
isRewindField: null,
|
isRewindField: null,
|
||||||
isCrouchRegen: null,
|
isCrouchRegen: null,
|
||||||
isDarts: null,
|
|
||||||
OccamDamage: null,
|
OccamDamage: null,
|
||||||
isAxion: null,
|
isAxion: null,
|
||||||
isWormholeMapIgnore: null,
|
isWormholeMapIgnore: null,
|
||||||
@@ -9918,5 +9935,7 @@ const tech = {
|
|||||||
missileFireCD: null,
|
missileFireCD: null,
|
||||||
isBotField: null,
|
isBotField: null,
|
||||||
isFoamBall: null,
|
isFoamBall: null,
|
||||||
isNoDraftPause: null
|
isNoDraftPause: null,
|
||||||
|
isFoamPressure: null,
|
||||||
|
foamDamage: null
|
||||||
}
|
}
|
||||||
41
todo.txt
41
todo.txt
@@ -1,41 +1,48 @@
|
|||||||
******************************************************** NEXT PATCH **************************************************
|
******************************************************** NEXT PATCH **************************************************
|
||||||
|
|
||||||
time dilation field rework
|
default foam gun fires a stream
|
||||||
2x energy regen, but pausing time now uses much more energy
|
tech: pressure vessel - in addition to the stream, foam gun builds up charges.
|
||||||
you are immune to harm while time is paused
|
charges release after you stop firing
|
||||||
but this stops energy regen
|
capacitor tech doubles pressure vessel effect
|
||||||
tech timelike is removed
|
tech: syntactic foam - foam does 41% more damage per second
|
||||||
|
quantum foam removed
|
||||||
|
|
||||||
eternalism gives 50% damage instead of ammo
|
spore gun has 25% more ammo and fires 25% more often
|
||||||
also disables the pause button, and other pause effects
|
spores and worms move 25% faster
|
||||||
|
|
||||||
tech: polyurethane foam - super balls turn into foam after hitting a mob
|
nail gun has 5% more ammo
|
||||||
supertemporal renamed autocannon
|
all versions of nail gun have a much higher fire rate
|
||||||
now gives +1 ball, and has a shorter delay between balls
|
|
||||||
|
|
||||||
harpoon and grapple no longer lose ammo when you run out of energy
|
harpoon/grapple density reduced by 20%
|
||||||
they just trigger a 2 second fire CD
|
this also lowers damage about 10%
|
||||||
slashBoss doesn't slash as often at higher difficulty levels
|
harpoon/grapple properly follow conservation of momentum
|
||||||
field descriptions rewritten
|
(a small jerk when it retracts)
|
||||||
|
|
||||||
bug fixes
|
bug fixes
|
||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** TODO ********************************************************
|
||||||
|
|
||||||
|
gunIndex section at the end seems pointless
|
||||||
|
merge with the choosing functions?
|
||||||
|
|
||||||
|
add foam tech that makes foam stronger vs. shields
|
||||||
|
|
||||||
tech: eternalism - don't pause time during draft
|
tech: eternalism - don't pause time during draft
|
||||||
bugs
|
bugs?
|
||||||
requirements change after draft is generated
|
requirements change after draft is generated
|
||||||
check for requirements onclick and give random tech if not met?
|
check for requirements onclick and give random tech if not met?
|
||||||
|
|
||||||
tech expansion: should also make other fields do things
|
tech expansion: should also make other fields do things
|
||||||
|
how to make the description work
|
||||||
|
change description based on your current field?
|
||||||
perfect diamagnetism moves forward when you hold down the shield
|
perfect diamagnetism moves forward when you hold down the shield
|
||||||
maybe only with crouch?
|
maybe only with crouch?
|
||||||
time dilation drains 1/2 as much energy when paused
|
time dilation drains 1/2 as much energy when paused
|
||||||
grow plasma torch as you hold it down
|
grow plasma torch as you hold it down
|
||||||
negative mass effects much more space
|
negative mass effects much more space
|
||||||
needs more benefit
|
needs more benefit?
|
||||||
reduces the cloaking vision effect?
|
reduces the cloaking vision effect?
|
||||||
needs more benefit
|
needs more benefit?
|
||||||
|
|
||||||
nonrefundable tech don't display, this is confusing
|
nonrefundable tech don't display, this is confusing
|
||||||
maybe they can show up but greyed out or something
|
maybe they can show up but greyed out or something
|
||||||
|
|||||||
Reference in New Issue
Block a user