inflation
tech: inflation - thrown blocks expand, and throwing charges faster fermions applies to thrown blocks as well junk tech: posture - stand tall junk tech: rhythm - you oscillate up and down shieldingBoss no longer shields other bosses mine damage is about 25% better final boss leave a body several minor bug fixes
This commit is contained in:
46
js/bullet.js
46
js/bullet.js
@@ -511,6 +511,7 @@ const b = {
|
|||||||
const newDist = Vector.magnitude(Vector.sub(path[0], mob[i].position))
|
const newDist = Vector.magnitude(Vector.sub(path[0], mob[i].position))
|
||||||
if (explosionRadius < newDist &&
|
if (explosionRadius < newDist &&
|
||||||
newDist < dist &&
|
newDist < dist &&
|
||||||
|
!mob[i].isBadTarget &&
|
||||||
Matter.Query.ray(map, path[0], mob[i].position).length === 0 &&
|
Matter.Query.ray(map, path[0], mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, path[0], mob[i].position).length === 0) {
|
Matter.Query.ray(body, path[0], mob[i].position).length === 0) {
|
||||||
dist = newDist
|
dist = newDist
|
||||||
@@ -1115,7 +1116,7 @@ const b = {
|
|||||||
// const futurePos = this.lockedOn ? :Vector.add(this.position, Vector.mult(this.velocity, 50))
|
// const futurePos = this.lockedOn ? :Vector.add(this.position, Vector.mult(this.velocity, 50))
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (
|
if (
|
||||||
mob[i].alive && mob[i].isDropPowerUp &&
|
mob[i].alive && !mob[i].isBadTarget && !mob[i].isBadTarget &&
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0
|
||||||
// && Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
// && Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
||||||
) {
|
) {
|
||||||
@@ -1578,7 +1579,7 @@ const b = {
|
|||||||
dmg: 0, // 0.14 //damage done in addition to the damage from momentum
|
dmg: 0, // 0.14 //damage done in addition to the damage from momentum
|
||||||
minDmgSpeed: 2,
|
minDmgSpeed: 2,
|
||||||
lookFrequency: 60 + Math.floor(7 * Math.random()),
|
lookFrequency: 60 + Math.floor(7 * Math.random()),
|
||||||
drain: tech.isLaserDiode * tech.laserFieldDrain,
|
drain: 0.7 * tech.isLaserDiode * tech.laserFieldDrain,
|
||||||
isArmed: false,
|
isArmed: false,
|
||||||
torqueMagnitude: 0.000003 * (Math.round(Math.random()) ? 1 : -1),
|
torqueMagnitude: 0.000003 * (Math.round(Math.random()) ? 1 : -1),
|
||||||
range: 1500,
|
range: 1500,
|
||||||
@@ -1605,7 +1606,7 @@ const b = {
|
|||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (
|
if (
|
||||||
Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 2000000 &&
|
Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 2000000 &&
|
||||||
mob[i].isDropPowerUp &&
|
!mob[i].isBadTarget &&
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
||||||
) {
|
) {
|
||||||
@@ -1727,15 +1728,15 @@ const b = {
|
|||||||
sentry() {
|
sentry() {
|
||||||
this.collisionFilter.mask = cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield | cat.bullet //can now collide with other bullets
|
this.collisionFilter.mask = cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield | cat.bullet //can now collide with other bullets
|
||||||
this.lookFrequency = simulation.cycle + 60
|
this.lookFrequency = simulation.cycle + 60
|
||||||
this.endCycle = simulation.cycle + 1140
|
this.endCycle = simulation.cycle + 1260
|
||||||
this.do = function() { //overwrite the do method for this bullet
|
this.do = function() { //overwrite the do method for this bullet
|
||||||
this.force.y += this.mass * 0.002; //extra gravity
|
this.force.y += this.mass * 0.002; //extra gravity
|
||||||
if (simulation.cycle > this.lookFrequency) {
|
if (simulation.cycle > this.lookFrequency) {
|
||||||
this.lookFrequency = 10 + Math.floor(3 * Math.random())
|
this.lookFrequency = 8 + Math.floor(3 * Math.random())
|
||||||
this.do = function() { //overwrite the do method for this bullet
|
this.do = function() { //overwrite the do method for this bullet
|
||||||
this.force.y += this.mass * 0.002; //extra gravity
|
this.force.y += this.mass * 0.002; //extra gravity
|
||||||
if (!(simulation.cycle % this.lookFrequency) && !m.isBodiesAsleep) { //find mob targets
|
if (!(simulation.cycle % this.lookFrequency) && !m.isBodiesAsleep) { //find mob targets
|
||||||
this.endCycle -= 10
|
this.endCycle -= 8
|
||||||
b.targetedNail(this.position, 1, 45 + 5 * Math.random(), 1100, false)
|
b.targetedNail(this.position, 1, 45 + 5 * Math.random(), 1100, false)
|
||||||
if (!(simulation.cycle % (this.lookFrequency * 6))) {
|
if (!(simulation.cycle % (this.lookFrequency * 6))) {
|
||||||
simulation.drawList.push({
|
simulation.drawList.push({
|
||||||
@@ -1771,7 +1772,7 @@ const b = {
|
|||||||
if (!(simulation.cycle % this.lookFrequency)) { //find mob targets
|
if (!(simulation.cycle % this.lookFrequency)) { //find mob targets
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 500000 &&
|
if (Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 500000 &&
|
||||||
mob[i].isDropPowerUp &&
|
!mob[i].isBadTarget &&
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
|
||||||
this.endCycle = 0 //end life if mob is near and visible
|
this.endCycle = 0 //end life if mob is near and visible
|
||||||
@@ -1785,9 +1786,9 @@ const b = {
|
|||||||
},
|
},
|
||||||
onEnd() {
|
onEnd() {
|
||||||
if (this.isArmed) {
|
if (this.isArmed) {
|
||||||
b.targetedNail(this.position, 15)
|
b.targetedNail(this.position, 18)
|
||||||
}
|
}
|
||||||
if (isAmmoBack) { //get ammo back from tech.isMineAmmoBack
|
if (tech.isMineAmmoBack && (!this.isArmed || Math.random() < 0.2)) { //get ammo back from tech.isMineAmmoBack
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
if (b.guns[i].name === "mine") {
|
if (b.guns[i].name === "mine") {
|
||||||
b.guns[i].ammo++
|
b.guns[i].ammo++
|
||||||
@@ -1796,6 +1797,15 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// if (isAmmoBack) { //get ammo back from tech.isMineAmmoBack
|
||||||
|
// for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
|
// if (b.guns[i].name === "mine") {
|
||||||
|
// b.guns[i].ammo++
|
||||||
|
// simulation.updateGunHUD();
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
bullet[bIndex].torque += bullet[bIndex].inertia * 0.0002 * (0.5 - Math.random())
|
bullet[bIndex].torque += bullet[bIndex].inertia * 0.0002 * (0.5 - Math.random())
|
||||||
@@ -1847,7 +1857,7 @@ const b = {
|
|||||||
this.lockedOn = null;
|
this.lockedOn = null;
|
||||||
let closeDist = Infinity;
|
let closeDist = Infinity;
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (mob[i].isDropPowerUp && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
|
if (!mob[i].isBadTarget && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
|
||||||
const targetVector = Vector.sub(this.position, mob[i].position)
|
const targetVector = Vector.sub(this.position, mob[i].position)
|
||||||
const dist = Vector.magnitude(targetVector) * (Math.random() + 0.5);
|
const dist = Vector.magnitude(targetVector) * (Math.random() + 0.5);
|
||||||
if (dist < closeDist) {
|
if (dist < closeDist) {
|
||||||
@@ -1967,7 +1977,7 @@ const b = {
|
|||||||
let closeDist = Infinity;
|
let closeDist = Infinity;
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (
|
if (
|
||||||
mob[i].isDropPowerUp &&
|
!mob[i].isBadTarget &&
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
||||||
) {
|
) {
|
||||||
@@ -2069,7 +2079,7 @@ const b = {
|
|||||||
let closeDist = Infinity;
|
let closeDist = Infinity;
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (
|
if (
|
||||||
mob[i].isDropPowerUp &&
|
!mob[i].isBadTarget &&
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
||||||
) {
|
) {
|
||||||
@@ -2282,7 +2292,7 @@ const b = {
|
|||||||
|
|
||||||
if (tech.isFoamAttract) {
|
if (tech.isFoamAttract) {
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
if (mob[i].isDropPowerUp && Vector.magnitude(Vector.sub(mob[i].position, this.position)) < 375 && mob[i].alive && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
|
if (!mob[i].isBadTarget && Vector.magnitude(Vector.sub(mob[i].position, this.position)) < 375 && mob[i].alive && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
|
||||||
this.force = Vector.mult(Vector.normalise(Vector.sub(mob[i].position, this.position)), this.mass * 0.004)
|
this.force = Vector.mult(Vector.normalise(Vector.sub(mob[i].position, this.position)), this.mass * 0.004)
|
||||||
const slow = 0.9
|
const slow = 0.9
|
||||||
Matter.Body.setVelocity(this, {
|
Matter.Body.setVelocity(this, {
|
||||||
@@ -2701,7 +2711,7 @@ const b = {
|
|||||||
let target
|
let target
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
||||||
if (dist2 < 1000000 && mob[i].isDropPowerUp && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
|
if (dist2 < 1000000 && !mob[i].isBadTarget && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
|
||||||
this.cd = simulation.cycle + this.delay;
|
this.cd = simulation.cycle + this.delay;
|
||||||
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60))
|
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60))
|
||||||
const radius = 6 + 7 * Math.random()
|
const radius = 6 + 7 * Math.random()
|
||||||
@@ -2868,7 +2878,7 @@ const b = {
|
|||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius;
|
const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius;
|
||||||
if (DIST < closeDist &&
|
if (DIST < closeDist &&
|
||||||
mob[i].isDropPowerUp &&
|
!mob[i].isBadTarget &&
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
|
||||||
closeDist = DIST;
|
closeDist = DIST;
|
||||||
@@ -2933,7 +2943,7 @@ const b = {
|
|||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius;
|
const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius;
|
||||||
if (DIST < closeDist &&
|
if (DIST < closeDist &&
|
||||||
mob[i].isDropPowerUp &&
|
!mob[i].isBadTarget &&
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
|
||||||
closeDist = DIST;
|
closeDist = DIST;
|
||||||
@@ -4113,7 +4123,7 @@ const b = {
|
|||||||
name: "rail gun",
|
name: "rail gun",
|
||||||
description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire",
|
description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 2.5,
|
ammoPack: 3,
|
||||||
have: false,
|
have: false,
|
||||||
do() {},
|
do() {},
|
||||||
fire() {
|
fire() {
|
||||||
@@ -4164,7 +4174,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tech.isCapacitor) {
|
if (tech.isCapacitor) {
|
||||||
if ((m.energy > 0.16 || tech.isRailEnergyGain) && m.immuneCycle < m.cycle) {
|
if ((m.energy > 0.16 || tech.isRailEnergyGain)) { //&& m.immuneCycle < m.cycle
|
||||||
m.energy += 0.16 * (tech.isRailEnergyGain ? 6 : -1)
|
m.energy += 0.16 * (tech.isRailEnergyGain ? 6 : -1)
|
||||||
m.fireCDcycle = m.cycle + Math.floor(30 * b.fireCD);
|
m.fireCDcycle = m.cycle + Math.floor(30 * b.fireCD);
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ function collisionChecks(event) {
|
|||||||
let type = tech.isEnergyNoAmmo ? "heal" : "ammo"
|
let type = tech.isEnergyNoAmmo ? "heal" : "ammo"
|
||||||
if (Math.random() < 0.4) {
|
if (Math.random() < 0.4) {
|
||||||
type = "heal"
|
type = "heal"
|
||||||
} else if (Math.random() < 0.23 && !tech.isSuperDeterminism) {
|
} else if (Math.random() < 0.4 && !tech.isSuperDeterminism) {
|
||||||
type = "research"
|
type = "research"
|
||||||
}
|
}
|
||||||
powerUps.spawn(mob[k].position.x, mob[k].position.y, type);
|
powerUps.spawn(mob[k].position.x, mob[k].position.y, type);
|
||||||
|
|||||||
@@ -16,10 +16,9 @@ const level = {
|
|||||||
// simulation.zoomScale = 1000;
|
// simulation.zoomScale = 1000;
|
||||||
// simulation.setZoom();
|
// simulation.setZoom();
|
||||||
// m.setField("pilot wave")
|
// m.setField("pilot wave")
|
||||||
// b.giveGuns("wave beam")
|
|
||||||
// b.giveGuns("laser")
|
// b.giveGuns("laser")
|
||||||
// tech.isExplodeRadio = true
|
// tech.isExplodeRadio = true
|
||||||
// tech.giveTech("pulse")
|
// tech.giveTech("fermions")
|
||||||
// tech.giveTech("potential well")
|
// tech.giveTech("potential well")
|
||||||
// for (let i = 0; i < 3; i++) tech.giveTech("packet length")
|
// for (let i = 0; i < 3; i++) tech.giveTech("packet length")
|
||||||
// for (let i = 0; i < 3; i++) tech.giveTech("propagation")
|
// for (let i = 0; i < 3; i++) tech.giveTech("propagation")
|
||||||
@@ -27,6 +26,7 @@ const level = {
|
|||||||
// for (let i = 0; i < 9; i++) tech.giveTech("WIMPs")
|
// for (let i = 0; i < 9; i++) tech.giveTech("WIMPs")
|
||||||
// tech.giveTech("metastability")
|
// tech.giveTech("metastability")
|
||||||
|
|
||||||
|
|
||||||
level.intro(); //starting level
|
level.intro(); //starting level
|
||||||
// level.testing(); //not in rotation
|
// level.testing(); //not in rotation
|
||||||
// level.final() //final boss level
|
// level.final() //final boss level
|
||||||
@@ -1091,7 +1091,9 @@ const level = {
|
|||||||
spawn.bodyRect(x + 5, y - 260 + i * blockSize, 30, blockSize);
|
spawn.bodyRect(x + 5, y - 260 + i * blockSize, 30, blockSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
blockDoor(710, -710);
|
// blockDoor(710, -710);
|
||||||
|
// for (let i = 0; i < 30; i++) powerUps.directSpawn(710, -710, "tech");
|
||||||
|
|
||||||
spawn.mapRect(2500, -1200, 200, 750); //right wall
|
spawn.mapRect(2500, -1200, 200, 750); //right wall
|
||||||
blockDoor(2585, -210)
|
blockDoor(2585, -210)
|
||||||
spawn.mapRect(2500, -200, 200, 300); //right wall
|
spawn.mapRect(2500, -200, 200, 300); //right wall
|
||||||
|
|||||||
@@ -1047,11 +1047,9 @@ const mobs = {
|
|||||||
this.alive = false; //triggers mob removal in mob[i].replace(i)
|
this.alive = false; //triggers mob removal in mob[i].replace(i)
|
||||||
|
|
||||||
if (this.isDropPowerUp) {
|
if (this.isDropPowerUp) {
|
||||||
|
if (tech.iceIXOnDeath && this.isSlowed) {
|
||||||
if (tech.iceIXOnDeath && this.isSlowed && Math.random() > 0.5) {
|
for (let i = 0, len = 2 * Math.sqrt(Math.min(this.mass, 25)) * tech.iceIXOnDeath; i < len; i++) b.iceIX(3, Math.random() * 2 * Math.PI, this.position)
|
||||||
for (let i = 0, len = 3 * Math.sqrt(this.mass) * tech.iceIXOnDeath; i < len; i++) b.iceIX(3, Math.random() * 2 * Math.PI, this.position)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tech.deathSpawnsFromBoss || (tech.deathSpawns && this.isDropPowerUp)) {
|
if (tech.deathSpawnsFromBoss || (tech.deathSpawns && this.isDropPowerUp)) {
|
||||||
const spawns = tech.deathSpawns + tech.deathSpawnsFromBoss
|
const spawns = tech.deathSpawns + tech.deathSpawnsFromBoss
|
||||||
const len = Math.min(12, spawns * Math.ceil(Math.random() * simulation.difficulty * spawns))
|
const len = Math.min(12, spawns * Math.ceil(Math.random() * simulation.difficulty * spawns))
|
||||||
|
|||||||
25
js/player.js
25
js/player.js
@@ -152,7 +152,6 @@ const m = {
|
|||||||
m.Vy = player.velocity.y;
|
m.Vy = player.velocity.y;
|
||||||
|
|
||||||
//tracks the last 10s of player information
|
//tracks the last 10s of player information
|
||||||
// console.log(m.history)
|
|
||||||
m.history.splice(m.cycle % 600, 1, {
|
m.history.splice(m.cycle % 600, 1, {
|
||||||
position: {
|
position: {
|
||||||
x: player.position.x,
|
x: player.position.x,
|
||||||
@@ -1120,7 +1119,7 @@ const m = {
|
|||||||
if (m.energy > 0.001) {
|
if (m.energy > 0.001) {
|
||||||
if (m.fireCDcycle < m.cycle) m.fireCDcycle = m.cycle
|
if (m.fireCDcycle < m.cycle) m.fireCDcycle = m.cycle
|
||||||
m.energy -= 0.001 / tech.throwChargeRate;
|
m.energy -= 0.001 / tech.throwChargeRate;
|
||||||
m.throwCharge += 0.5 * tech.throwChargeRate / m.holdingTarget.mass
|
m.throwCharge += 0.5 * (tech.throwChargeRate + 2 * tech.isAddBlockMass) / m.holdingTarget.mass
|
||||||
//draw charge
|
//draw charge
|
||||||
const x = m.pos.x + 15 * Math.cos(m.angle);
|
const x = m.pos.x + 15 * Math.cos(m.angle);
|
||||||
const y = m.pos.y + 15 * Math.sin(m.angle);
|
const y = m.pos.y + 15 * Math.sin(m.angle);
|
||||||
@@ -1150,14 +1149,14 @@ const m = {
|
|||||||
m.fieldCDcycle = m.cycle + 15;
|
m.fieldCDcycle = m.cycle + 15;
|
||||||
m.isHolding = false;
|
m.isHolding = false;
|
||||||
//bullet-like collisions
|
//bullet-like collisions
|
||||||
m.holdingTarget.collisionFilter.category = cat.body;
|
m.holdingTarget.collisionFilter.category = tech.isBlockBullets ? cat.bullet : cat.body;
|
||||||
m.holdingTarget.collisionFilter.mask = cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield;
|
m.holdingTarget.collisionFilter.mask = cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield;
|
||||||
//check every second to see if player is away from thrown body, and make solid
|
//check every second to see if player is away from thrown body, and make solid
|
||||||
const solid = function(that) {
|
const solid = function(that) {
|
||||||
const dx = that.position.x - player.position.x;
|
const dx = that.position.x - player.position.x;
|
||||||
const dy = that.position.y - player.position.y;
|
const dy = that.position.y - player.position.y;
|
||||||
if (that.speed < 3 && dx * dx + dy * dy > 10000 && that !== m.holdingTarget) {
|
if (that.speed < 3 && dx * dx + dy * dy > 10000 && that !== m.holdingTarget) {
|
||||||
// that.collisionFilter.category = cat.body; //make solid
|
that.collisionFilter.category = cat.body; //make solid
|
||||||
that.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet; //can hit player now
|
that.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet; //can hit player now
|
||||||
} else {
|
} else {
|
||||||
setTimeout(solid, 40, that);
|
setTimeout(solid, 40, that);
|
||||||
@@ -1188,6 +1187,19 @@ const m = {
|
|||||||
y: player.velocity.y - Math.sin(m.angle) * speed / 30 * Math.sqrt(m.holdingTarget.mass)
|
y: player.velocity.y - Math.sin(m.angle) * speed / 30 * Math.sqrt(m.holdingTarget.mass)
|
||||||
});
|
});
|
||||||
m.definePlayerMass() //return to normal player mass
|
m.definePlayerMass() //return to normal player mass
|
||||||
|
|
||||||
|
if (tech.isAddBlockMass) {
|
||||||
|
const expand = function(that, massLimit) {
|
||||||
|
if (that.mass < massLimit) {
|
||||||
|
const scale = 1.05;
|
||||||
|
Matter.Body.scale(that, scale, scale);
|
||||||
|
setTimeout(expand, 20, that, massLimit);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
expand(m.holdingTarget, Math.min(20, m.holdingTarget.mass * 3))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m.isHolding = false
|
m.isHolding = false
|
||||||
@@ -1537,7 +1549,7 @@ const m = {
|
|||||||
{
|
{
|
||||||
name: "perfect diamagnetism",
|
name: "perfect diamagnetism",
|
||||||
// description: "gain <strong class='color-f'>energy</strong> when <strong>blocking</strong><br>no <strong>recoil</strong> when <strong>blocking</strong>",
|
// description: "gain <strong class='color-f'>energy</strong> when <strong>blocking</strong><br>no <strong>recoil</strong> when <strong>blocking</strong>",
|
||||||
description: "<strong>blocking</strong> does not drain <strong class='color-f'>energy</strong><br><strong>blocking</strong> has less <strong>recoil</strong><br><strong>attract</strong> power ups from <strong>far away</strong>",
|
description: "<strong>attract</strong> power ups from <strong>far away</strong><br><strong>blocking</strong> does not drain <strong class='color-f'>energy</strong><br><strong>blocking</strong> has <strong>90%</strong> less <strong>recoil</strong>",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
m.fieldShieldingScale = 0;
|
m.fieldShieldingScale = 0;
|
||||||
m.fieldBlockCD = 4;
|
m.fieldBlockCD = 4;
|
||||||
@@ -1906,6 +1918,7 @@ const m = {
|
|||||||
m.walk_cycle += m.flipLegs * m.Vx;
|
m.walk_cycle += m.flipLegs * m.Vx;
|
||||||
// m.hold();
|
// m.hold();
|
||||||
// m.energy += DRAIN; // 1 to undo the energy drain from time speed up, 0.5 to cut energy drain in half
|
// m.energy += DRAIN; // 1 to undo the energy drain from time speed up, 0.5 to cut energy drain in half
|
||||||
|
|
||||||
b.fire();
|
b.fire();
|
||||||
// b.bulletRemove();
|
// b.bulletRemove();
|
||||||
b.bulletDo();
|
b.bulletDo();
|
||||||
@@ -3010,7 +3023,7 @@ const m = {
|
|||||||
let type = tech.isEnergyNoAmmo ? "heal" : "ammo"
|
let type = tech.isEnergyNoAmmo ? "heal" : "ammo"
|
||||||
if (Math.random() < 0.4) {
|
if (Math.random() < 0.4) {
|
||||||
type = "heal"
|
type = "heal"
|
||||||
} else if (Math.random() < 0.23 && !tech.isSuperDeterminism) {
|
} else if (Math.random() < 0.4 && !tech.isSuperDeterminism) {
|
||||||
type = "research"
|
type = "research"
|
||||||
}
|
}
|
||||||
powerUps.spawn(mob[k].position.x, mob[k].position.y, type);
|
powerUps.spawn(mob[k].position.x, mob[k].position.y, type);
|
||||||
|
|||||||
@@ -801,7 +801,7 @@ const simulation = {
|
|||||||
}
|
}
|
||||||
if (tech.relayIce && tech.isFlipFlopOn) {
|
if (tech.relayIce && tech.isFlipFlopOn) {
|
||||||
for (let j = 0; j < tech.relayIce; j++) {
|
for (let j = 0; j < tech.relayIce; j++) {
|
||||||
for (let i = 0, len = Math.ceil(3 * Math.random()); i < len; i++) b.iceIX(2)
|
for (let i = 0, len = Math.ceil(5 * Math.random()); i < len; i++) b.iceIX(2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
46
js/spawn.js
46
js/spawn.js
@@ -96,6 +96,7 @@ const spawn = {
|
|||||||
me.stroke = "transparent"
|
me.stroke = "transparent"
|
||||||
me.isShielded = true; //makes it immune to damage
|
me.isShielded = true; //makes it immune to damage
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
me.collisionFilter.mask = 0; //cat.player //| cat.body
|
me.collisionFilter.mask = 0; //cat.player //| cat.body
|
||||||
@@ -178,6 +179,24 @@ const spawn = {
|
|||||||
// spawn.shield(me, x, y, 1);
|
// spawn.shield(me, x, y, 1);
|
||||||
me.onDeath = function() {
|
me.onDeath = function() {
|
||||||
|
|
||||||
|
//make a block body to replace this one
|
||||||
|
//this body is too big to leave behind in the normal way mobs.replace()
|
||||||
|
const len = body.length;
|
||||||
|
const v = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //might help with vertex collision issue, not sure
|
||||||
|
body[len] = Matter.Bodies.fromVertices(this.position.x, this.position.y, v);
|
||||||
|
Matter.Body.setVelocity(body[len], { x: 0, y: -3 });
|
||||||
|
Matter.Body.setAngularVelocity(body[len], this.angularVelocity);
|
||||||
|
body[len].collisionFilter.category = cat.body;
|
||||||
|
body[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet;
|
||||||
|
body[len].classType = "body";
|
||||||
|
World.add(engine.world, body[len]); //add to world
|
||||||
|
const expand = function(that, massLimit) {
|
||||||
|
const scale = 1.05;
|
||||||
|
Matter.Body.scale(that, scale, scale);
|
||||||
|
if (that.mass < massLimit) setTimeout(expand, 20, that, massLimit);
|
||||||
|
};
|
||||||
|
expand(body[len], 200)
|
||||||
|
|
||||||
function unlockExit() {
|
function unlockExit() {
|
||||||
level.exit.x = 5500;
|
level.exit.x = 5500;
|
||||||
level.exit.y = -330;
|
level.exit.y = -330;
|
||||||
@@ -2460,6 +2479,7 @@ const spawn = {
|
|||||||
me.restitution = 0.8;
|
me.restitution = 0.8;
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
|
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
me.collisionFilter.category = cat.mobBullet;
|
me.collisionFilter.category = cat.mobBullet;
|
||||||
@@ -2511,6 +2531,7 @@ const spawn = {
|
|||||||
me.restitution = 1;
|
me.restitution = 1;
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
me.collisionFilter.category = cat.mobBullet;
|
me.collisionFilter.category = cat.mobBullet;
|
||||||
me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet;
|
me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet;
|
||||||
@@ -2649,6 +2670,7 @@ const spawn = {
|
|||||||
me.restitution = 0;
|
me.restitution = 0;
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
me.collisionFilter.category = cat.mobBullet;
|
me.collisionFilter.category = cat.mobBullet;
|
||||||
me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet;
|
me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet;
|
||||||
@@ -2771,12 +2793,13 @@ const spawn = {
|
|||||||
this.cycle = 0
|
this.cycle = 0
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
for (let i = 0; i < mob.length; i++) {
|
for (let i = 0; i < mob.length; i++) {
|
||||||
if (!mob[i].isShielded && !mob[i].shield && mob[i].isDropPowerUp && mob[i].alive) {
|
if (!mob[i].isShielded && !mob[i].shield && mob[i].isDropPowerUp && mob[i].alive && !mob[i].isBoss) {
|
||||||
ctx.moveTo(this.position.x, this.position.y)
|
ctx.moveTo(this.position.x, this.position.y)
|
||||||
ctx.lineTo(mob[i].position.x, mob[i].position.y)
|
ctx.lineTo(mob[i].position.x, mob[i].position.y)
|
||||||
spawn.shield(mob[i], mob[i].position.x, mob[i].position.y, 1, true);
|
spawn.shield(mob[i], mob[i].position.x, mob[i].position.y, 1, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!this.isShielded && this.alive) spawn.shield(this, this.position.x, this.position.y, 1, true);
|
||||||
ctx.lineWidth = 20
|
ctx.lineWidth = 20
|
||||||
// ctx.lineCap = "round";
|
// ctx.lineCap = "round";
|
||||||
ctx.strokeStyle = "rgba(200,200,255,0.9)"
|
ctx.strokeStyle = "rgba(200,200,255,0.9)"
|
||||||
@@ -2919,8 +2942,7 @@ const spawn = {
|
|||||||
spawns(x, y, radius = 15) {
|
spawns(x, y, radius = 15) {
|
||||||
mobs.spawn(x, y, 4, radius, "rgb(255,0,0)");
|
mobs.spawn(x, y, 4, radius, "rgb(255,0,0)");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
me.onHit = function() {
|
me.onHit = function() { //run this function on hitting player
|
||||||
//run this function on hitting player
|
|
||||||
this.explode();
|
this.explode();
|
||||||
};
|
};
|
||||||
// me.stroke = "transparent"
|
// me.stroke = "transparent"
|
||||||
@@ -2930,8 +2952,8 @@ const spawn = {
|
|||||||
me.g = 0.00002; //required if using 'gravity'
|
me.g = 0.00002; //required if using 'gravity'
|
||||||
me.accelMag = 0.00012 * simulation.accelScale;
|
me.accelMag = 0.00012 * simulation.accelScale;
|
||||||
// me.memory = 30;
|
// me.memory = 30;
|
||||||
|
me.isDropPowerUp = false
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
me.isDropPowerUp = false;
|
|
||||||
me.seePlayerFreq = Math.round((80 + 50 * Math.random()) * simulation.lookFreqScale);
|
me.seePlayerFreq = Math.round((80 + 50 * Math.random()) * simulation.lookFreqScale);
|
||||||
me.frictionAir = 0.004;
|
me.frictionAir = 0.004;
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
@@ -3223,6 +3245,7 @@ const spawn = {
|
|||||||
Matter.Body.setDensity(me, 0.1); //normal is 0.001
|
Matter.Body.setDensity(me, 0.1); //normal is 0.001
|
||||||
me.leaveBody = false;
|
me.leaveBody = false;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
// me.isShielded = true
|
// me.isShielded = true
|
||||||
me.collisionFilter.category = cat.mobBullet;
|
me.collisionFilter.category = cat.mobBullet;
|
||||||
@@ -3243,7 +3266,15 @@ const spawn = {
|
|||||||
//damage player
|
//damage player
|
||||||
if (Matter.Query.collides(this, [player]).length > 0 && !(m.isCloak && tech.isIntangible) && m.immuneCycle < m.cycle) {
|
if (Matter.Query.collides(this, [player]).length > 0 && !(m.isCloak && tech.isIntangible) && m.immuneCycle < m.cycle) {
|
||||||
m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
|
m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
|
||||||
m.damage(0.035 * simulation.dmgScale);
|
const dmg = 0.035 * simulation.dmgScale
|
||||||
|
m.damage(dmg);
|
||||||
|
simulation.drawList.push({ //add dmg to draw queue
|
||||||
|
x: this.position.x,
|
||||||
|
y: this.position.y,
|
||||||
|
radius: dmg * 500,
|
||||||
|
color: simulation.mobDmgColor,
|
||||||
|
time: simulation.drawTime
|
||||||
|
});
|
||||||
this.death();
|
this.death();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -3441,6 +3472,7 @@ const spawn = {
|
|||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
|
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
let wireX = -50;
|
let wireX = -50;
|
||||||
@@ -3508,6 +3540,7 @@ const spawn = {
|
|||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
|
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
let wireX = -50 - 20;
|
let wireX = -50 - 20;
|
||||||
@@ -3558,6 +3591,7 @@ const spawn = {
|
|||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
|
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
let wireX = -50 - 35;
|
let wireX = -50 - 35;
|
||||||
@@ -3607,6 +3641,7 @@ const spawn = {
|
|||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
|
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
let wireX = -50 + 16;
|
let wireX = -50 + 16;
|
||||||
@@ -3656,6 +3691,7 @@ const spawn = {
|
|||||||
me.frictionAir = 0.01;
|
me.frictionAir = 0.01;
|
||||||
me.isDropPowerUp = false;
|
me.isDropPowerUp = false;
|
||||||
me.showHealthBar = false;
|
me.showHealthBar = false;
|
||||||
|
me.isBadTarget = true;
|
||||||
|
|
||||||
me.do = function() {
|
me.do = function() {
|
||||||
let wireX = -50 + 26;
|
let wireX = -50 + 26;
|
||||||
|
|||||||
148
js/tech.js
148
js/tech.js
@@ -1481,31 +1481,13 @@
|
|||||||
tech.throwChargeRate = 1
|
tech.throwChargeRate = 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "restitution",
|
|
||||||
description: "if a <strong>block</strong> you threw kills a mob<br>spawn a <strong class='color-h'>heal</strong>, <strong class='color-g'>ammo</strong>, or <strong class='color-r'>research</strong>",
|
|
||||||
maxCount: 1,
|
|
||||||
count: 0,
|
|
||||||
frequency: 4,
|
|
||||||
frequencyDefault: 4,
|
|
||||||
allowed() {
|
|
||||||
return tech.throwChargeRate > 1 && !tech.isNoHeals && m.fieldUpgrades[m.fieldMode].name !== "pilot wave"
|
|
||||||
},
|
|
||||||
requires: "mass driver, not ergodicity, pilot wave",
|
|
||||||
effect() {
|
|
||||||
tech.isBlockPowerUps = true
|
|
||||||
},
|
|
||||||
remove() {
|
|
||||||
tech.isBlockPowerUps = false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "flywheel",
|
name: "flywheel",
|
||||||
description: "after a mob <strong>dies</strong> its body is <strong>spun</strong> and <strong>flung</strong><br>in the general direction of a nearby mob",
|
description: "after a mob <strong>dies</strong> its body is <strong>spun</strong> and <strong>flung</strong><br>in the general direction of a nearby mob",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 4,
|
frequency: 3,
|
||||||
frequencyDefault: 4,
|
frequencyDefault: 3,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.throwChargeRate > 1 && !tech.nailsDeathMob && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.iceIXOnDeath
|
return tech.throwChargeRate > 1 && !tech.nailsDeathMob && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.iceIXOnDeath
|
||||||
},
|
},
|
||||||
@@ -1517,13 +1499,66 @@
|
|||||||
tech.isMobBlockFling = false
|
tech.isMobBlockFling = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "fermions",
|
||||||
|
description: "<strong>blocks</strong> thrown by you or <strong>pilot wave</strong> will<br><strong>collide</strong> with <strong>intangible</strong> mobs, but not you",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 2,
|
||||||
|
allowed() {
|
||||||
|
return tech.throwChargeRate > 1
|
||||||
|
},
|
||||||
|
requires: "mass driver",
|
||||||
|
effect() {
|
||||||
|
tech.isBlockBullets = true
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
tech.isBlockBullets = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "inflation",
|
||||||
|
description: "<strong>throwing</strong> a <strong>block</strong> expands it by <strong>300%</strong><br>increase <strong>throw</strong> charge rate by <strong>200%</strong>",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 3,
|
||||||
|
frequencyDefault: 3,
|
||||||
|
allowed() {
|
||||||
|
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave"
|
||||||
|
},
|
||||||
|
requires: "mass driver, not ergodicity, pilot wave",
|
||||||
|
effect() {
|
||||||
|
tech.isAddBlockMass = true
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
tech.isAddBlockMass = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "restitution",
|
||||||
|
description: "if a <strong>block</strong> you threw kills a mob<br>spawn a <strong class='color-h'>heal</strong>, <strong class='color-g'>ammo</strong>, or <strong class='color-r'>research</strong>",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 3,
|
||||||
|
frequencyDefault: 3,
|
||||||
|
allowed() {
|
||||||
|
return tech.throwChargeRate > 1 && !tech.isNoHeals && m.fieldUpgrades[m.fieldMode].name !== "pilot wave"
|
||||||
|
},
|
||||||
|
requires: "mass driver, not ergodicity, pilot wave",
|
||||||
|
effect() {
|
||||||
|
tech.isBlockPowerUps = true
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
tech.isBlockPowerUps = false
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "inelastic collision",
|
name: "inelastic collision",
|
||||||
description: "while you are <strong>holding</strong> a <strong>block</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>85%</strong>",
|
description: "while you are <strong>holding</strong> a <strong>block</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>85%</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 4,
|
frequency: 3,
|
||||||
frequencyDefault: 4,
|
frequencyDefault: 3,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isEnergyHealth
|
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isEnergyHealth
|
||||||
},
|
},
|
||||||
@@ -1664,7 +1699,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "thermocouple",
|
name: "thermocouple",
|
||||||
description: "if <strong>relay switch</strong> is in the <strong class='color-flop'>ON</strong> state<br>condense <strong>1-3</strong> <strong class='color-s'>ice IX</strong> crystals every second",
|
description: "if <strong>relay switch</strong> is in the <strong class='color-flop'>ON</strong> state<br>condense <strong>1-5</strong> <strong class='color-s'>ice IX</strong> crystals every second",
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 4,
|
frequency: 4,
|
||||||
@@ -1736,7 +1771,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "crystallizer",
|
name: "crystallizer",
|
||||||
description: "after <strong class='color-s'>frozen</strong> mobs <strong>die</strong><br>they have a chance shatter into <strong class='color-s'>ice IX</strong> crystals",
|
description: "after <strong class='color-s'>frozen</strong> mobs <strong>die</strong> they<br>shatter into <strong class='color-s'>ice IX</strong> crystals",
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -5118,24 +5153,6 @@
|
|||||||
tech.pilotForce = 0.00002
|
tech.pilotForce = 0.00002
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "fermions",
|
|
||||||
description: "after a <strong>block</strong> is affected by <strong>pilot wave</strong> it<br><strong>collides</strong> with <strong>intangible</strong> mobs, but not you",
|
|
||||||
isFieldTech: true,
|
|
||||||
maxCount: 1,
|
|
||||||
count: 0,
|
|
||||||
frequency: 2,
|
|
||||||
allowed() {
|
|
||||||
return m.fieldUpgrades[m.fieldMode].name === "pilot wave"
|
|
||||||
},
|
|
||||||
requires: "pilot wave",
|
|
||||||
effect() {
|
|
||||||
tech.isBlockBullets = true
|
|
||||||
},
|
|
||||||
remove() {
|
|
||||||
tech.isBlockBullets = false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "cosmic string",
|
name: "cosmic string",
|
||||||
description: "<strong>stun</strong> and do <strong class='color-p'>radioactive</strong> <strong class='color-d'>damage</strong> to <strong>mobs</strong><br>if you tunnel through them with a <strong class='color-worm'>wormhole</strong>",
|
description: "<strong>stun</strong> and do <strong class='color-p'>radioactive</strong> <strong class='color-d'>damage</strong> to <strong>mobs</strong><br>if you tunnel through them with a <strong class='color-worm'>wormhole</strong>",
|
||||||
@@ -5404,6 +5421,46 @@
|
|||||||
// tech.wimpExperiment = 0
|
// tech.wimpExperiment = 0
|
||||||
// }
|
// }
|
||||||
// },
|
// },
|
||||||
|
{
|
||||||
|
name: "posture",
|
||||||
|
description: "stand a bit taller",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 0,
|
||||||
|
isExperimentHide: true,
|
||||||
|
isJunk: true,
|
||||||
|
allowed() {
|
||||||
|
return !m.isShipMode
|
||||||
|
},
|
||||||
|
requires: "",
|
||||||
|
effect() {
|
||||||
|
m.yOffWhen.stand = 70
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
m.yOffWhen.stand = 49
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "rhythm",
|
||||||
|
description: "you oscillate up and down",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 0,
|
||||||
|
isExperimentHide: true,
|
||||||
|
isJunk: true,
|
||||||
|
isNonRefundable: true,
|
||||||
|
allowed() {
|
||||||
|
return !m.isShipMode
|
||||||
|
},
|
||||||
|
requires: "",
|
||||||
|
effect() {
|
||||||
|
setInterval(() => {
|
||||||
|
m.yOffWhen.stand = 53 + 28 * Math.sin(simulation.cycle * 0.2)
|
||||||
|
if (m.onGround && !m.crouch) m.yOffGoal = m.yOffWhen.stand
|
||||||
|
}, 100);
|
||||||
|
},
|
||||||
|
remove() {}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "spinor",
|
name: "spinor",
|
||||||
description: "the direction you aim is determined by your position",
|
description: "the direction you aim is determined by your position",
|
||||||
@@ -6464,7 +6521,9 @@
|
|||||||
}, 1);
|
}, 1);
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
this.maxCount = lore.techGoal
|
lore.techCount = 0;
|
||||||
|
this.maxCount = lore.techGoal;
|
||||||
|
this.description = `<strong class="lore-text">this</strong>`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -6735,5 +6794,6 @@
|
|||||||
isCollisionRealitySwitch: null,
|
isCollisionRealitySwitch: null,
|
||||||
iceIXOnDeath: null,
|
iceIXOnDeath: null,
|
||||||
wimpCount: null,
|
wimpCount: null,
|
||||||
isBlockBullets: null
|
isBlockBullets: null,
|
||||||
|
isAddBlockMass: null
|
||||||
}
|
}
|
||||||
17
todo.txt
17
todo.txt
@@ -1,14 +1,9 @@
|
|||||||
******************************************************** NEXT PATCH ********************************************************
|
******************************************************** NEXT PATCH ********************************************************
|
||||||
|
|
||||||
fermions: after a block is affected by pilot wave it collides with intangible mobs, but not you
|
|
||||||
|
|
||||||
******************************************************** BUGS ********************************************************
|
******************************************************** BUGS ********************************************************
|
||||||
|
|
||||||
mine reclamation is giving mine ammo back after you fire, not after explode
|
|
||||||
|
|
||||||
undefined count did not seem to reset between games
|
|
||||||
only display not reset
|
|
||||||
|
|
||||||
Why does micro-extruder lag so much anyway
|
Why does micro-extruder lag so much anyway
|
||||||
|
|
||||||
blue triangle boss can move backwards and aim away from you if set up properly
|
blue triangle boss can move backwards and aim away from you if set up properly
|
||||||
@@ -51,15 +46,19 @@ is there a way to check if the player is stuck inside the map or block
|
|||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** TODO ********************************************************
|
||||||
|
|
||||||
|
tech: pilot wave is projected from the player, not the mouse
|
||||||
|
maybe also make field move slower? (adjust smoothing function)
|
||||||
|
less energy drain?
|
||||||
|
does damage to mobs caught in field?
|
||||||
|
|
||||||
|
tech: wormhole through walls
|
||||||
|
|
||||||
pause should show the last in game console message
|
pause should show the last in game console message
|
||||||
|
|
||||||
Make ice crystal + rivet gun/needle gun launch freezing rivets/needles with increased energy drain
|
Make ice crystal + rivet gun/needle gun launch freezing rivets/needles with increased energy drain
|
||||||
|
|
||||||
WIMPS are cool, but the 2-3 research isn't enough incentive?
|
WIMPS are cool, but the 2-3 research isn't enough incentive?
|
||||||
|
|
||||||
tech: pilot wave is projected from the player, not the mouse
|
|
||||||
give pilot wave a buff?
|
|
||||||
|
|
||||||
tech: MACHO - spawn a mob like WIMP that follows you and gives you a bonus
|
tech: MACHO - spawn a mob like WIMP that follows you and gives you a bonus
|
||||||
if it touches WIMP they explode
|
if it touches WIMP they explode
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user