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:
landgreen
2021-05-19 06:08:09 -07:00
parent cdf98c804a
commit f6a0eb38ee
10 changed files with 209 additions and 91 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -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;

View File

@@ -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);

View File

@@ -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

View File

@@ -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))

View File

@@ -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);

View File

@@ -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)
} }
} }

View File

@@ -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;

View File

@@ -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
} }

View File

@@ -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