diff --git a/.DS_Store b/.DS_Store index 305f838..0a677dc 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index b2ed575..91b1c29 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -511,6 +511,7 @@ const b = { const newDist = Vector.magnitude(Vector.sub(path[0], mob[i].position)) if (explosionRadius < newDist && newDist < dist && + !mob[i].isBadTarget && Matter.Query.ray(map, path[0], mob[i].position).length === 0 && Matter.Query.ray(body, path[0], mob[i].position).length === 0) { dist = newDist @@ -1115,7 +1116,7 @@ const b = { // const futurePos = this.lockedOn ? :Vector.add(this.position, Vector.mult(this.velocity, 50)) for (let i = 0, len = mob.length; i < len; ++i) { 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(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 minDmgSpeed: 2, lookFrequency: 60 + Math.floor(7 * Math.random()), - drain: tech.isLaserDiode * tech.laserFieldDrain, + drain: 0.7 * tech.isLaserDiode * tech.laserFieldDrain, isArmed: false, torqueMagnitude: 0.000003 * (Math.round(Math.random()) ? 1 : -1), range: 1500, @@ -1605,7 +1606,7 @@ const b = { for (let i = 0, len = mob.length; i < len; ++i) { if ( 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(body, this.position, mob[i].position).length === 0 ) { @@ -1727,15 +1728,15 @@ const b = { sentry() { 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.endCycle = simulation.cycle + 1140 + this.endCycle = simulation.cycle + 1260 this.do = function() { //overwrite the do method for this bullet this.force.y += this.mass * 0.002; //extra gravity 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.force.y += this.mass * 0.002; //extra gravity 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) if (!(simulation.cycle % (this.lookFrequency * 6))) { simulation.drawList.push({ @@ -1771,7 +1772,7 @@ const b = { if (!(simulation.cycle % this.lookFrequency)) { //find mob targets for (let i = 0, len = mob.length; i < len; ++i) { 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(body, this.position, mob[i].position).length === 0) { this.endCycle = 0 //end life if mob is near and visible @@ -1785,9 +1786,9 @@ const b = { }, onEnd() { 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 if (b.guns[i].name === "mine") { 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()) @@ -1847,7 +1857,7 @@ const b = { this.lockedOn = null; let closeDist = Infinity; 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 dist = Vector.magnitude(targetVector) * (Math.random() + 0.5); if (dist < closeDist) { @@ -1967,7 +1977,7 @@ const b = { let closeDist = Infinity; for (let i = 0, len = mob.length; i < len; ++i) { if ( - mob[i].isDropPowerUp && + !mob[i].isBadTarget && Matter.Query.ray(map, 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; for (let i = 0, len = mob.length; i < len; ++i) { if ( - mob[i].isDropPowerUp && + !mob[i].isBadTarget && Matter.Query.ray(map, 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) { 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) const slow = 0.9 Matter.Body.setVelocity(this, { @@ -2701,7 +2711,7 @@ const b = { let target for (let i = 0, len = mob.length; i < len; i++) { 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; target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60)) const radius = 6 + 7 * Math.random() @@ -2868,7 +2878,7 @@ const b = { for (let i = 0, len = mob.length; i < len; ++i) { const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius; if (DIST < closeDist && - mob[i].isDropPowerUp && + !mob[i].isBadTarget && Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(body, this.position, mob[i].position).length === 0) { closeDist = DIST; @@ -2933,7 +2943,7 @@ const b = { for (let i = 0, len = mob.length; i < len; ++i) { const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius; if (DIST < closeDist && - mob[i].isDropPowerUp && + !mob[i].isBadTarget && Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(body, this.position, mob[i].position).length === 0) { closeDist = DIST; @@ -4113,7 +4123,7 @@ const b = { name: "rail gun", description: "use energy to launch a high-speed dense rod
hold left mouse to charge, release to fire", ammo: 0, - ammoPack: 2.5, + ammoPack: 3, have: false, do() {}, fire() { @@ -4164,7 +4174,7 @@ const b = { } 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.fireCDcycle = m.cycle + Math.floor(30 * b.fireCD); const me = bullet.length; diff --git a/js/engine.js b/js/engine.js index a1993d4..a5c5275 100644 --- a/js/engine.js +++ b/js/engine.js @@ -194,7 +194,7 @@ function collisionChecks(event) { let type = tech.isEnergyNoAmmo ? "heal" : "ammo" if (Math.random() < 0.4) { type = "heal" - } else if (Math.random() < 0.23 && !tech.isSuperDeterminism) { + } else if (Math.random() < 0.4 && !tech.isSuperDeterminism) { type = "research" } powerUps.spawn(mob[k].position.x, mob[k].position.y, type); diff --git a/js/level.js b/js/level.js index b0a5c05..6837e25 100644 --- a/js/level.js +++ b/js/level.js @@ -16,10 +16,9 @@ const level = { // simulation.zoomScale = 1000; // simulation.setZoom(); // m.setField("pilot wave") - // b.giveGuns("wave beam") // b.giveGuns("laser") // tech.isExplodeRadio = true - // tech.giveTech("pulse") + // tech.giveTech("fermions") // tech.giveTech("potential well") // for (let i = 0; i < 3; i++) tech.giveTech("packet length") // 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") // tech.giveTech("metastability") + level.intro(); //starting level // level.testing(); //not in rotation // level.final() //final boss level @@ -1091,7 +1091,9 @@ const level = { 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 blockDoor(2585, -210) spawn.mapRect(2500, -200, 200, 300); //right wall diff --git a/js/mob.js b/js/mob.js index 38889a1..b7d6eb6 100644 --- a/js/mob.js +++ b/js/mob.js @@ -1047,11 +1047,9 @@ const mobs = { this.alive = false; //triggers mob removal in mob[i].replace(i) if (this.isDropPowerUp) { - - if (tech.iceIXOnDeath && this.isSlowed && Math.random() > 0.5) { - 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.iceIXOnDeath && this.isSlowed) { + 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) } - if (tech.deathSpawnsFromBoss || (tech.deathSpawns && this.isDropPowerUp)) { const spawns = tech.deathSpawns + tech.deathSpawnsFromBoss const len = Math.min(12, spawns * Math.ceil(Math.random() * simulation.difficulty * spawns)) diff --git a/js/player.js b/js/player.js index f845447..94e6ba0 100644 --- a/js/player.js +++ b/js/player.js @@ -152,7 +152,6 @@ const m = { m.Vy = player.velocity.y; //tracks the last 10s of player information - // console.log(m.history) m.history.splice(m.cycle % 600, 1, { position: { x: player.position.x, @@ -1120,7 +1119,7 @@ const m = { if (m.energy > 0.001) { if (m.fireCDcycle < m.cycle) m.fireCDcycle = m.cycle 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 const x = m.pos.x + 15 * Math.cos(m.angle); const y = m.pos.y + 15 * Math.sin(m.angle); @@ -1150,14 +1149,14 @@ const m = { m.fieldCDcycle = m.cycle + 15; m.isHolding = false; //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; //check every second to see if player is away from thrown body, and make solid const solid = function(that) { const dx = that.position.x - player.position.x; const dy = that.position.y - player.position.y; 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 } else { 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) }); 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 { m.isHolding = false @@ -1537,7 +1549,7 @@ const m = { { name: "perfect diamagnetism", // description: "gain energy when blocking
no recoil when blocking", - description: "blocking does not drain energy
blocking has less recoil
attract power ups from far away", + description: "attract power ups from far away
blocking does not drain energy
blocking has 90% less recoil", effect: () => { m.fieldShieldingScale = 0; m.fieldBlockCD = 4; @@ -1906,6 +1918,7 @@ const m = { m.walk_cycle += m.flipLegs * m.Vx; // m.hold(); // m.energy += DRAIN; // 1 to undo the energy drain from time speed up, 0.5 to cut energy drain in half + b.fire(); // b.bulletRemove(); b.bulletDo(); @@ -3010,7 +3023,7 @@ const m = { let type = tech.isEnergyNoAmmo ? "heal" : "ammo" if (Math.random() < 0.4) { type = "heal" - } else if (Math.random() < 0.23 && !tech.isSuperDeterminism) { + } else if (Math.random() < 0.4 && !tech.isSuperDeterminism) { type = "research" } powerUps.spawn(mob[k].position.x, mob[k].position.y, type); diff --git a/js/simulation.js b/js/simulation.js index 5f91368..4414782 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -801,7 +801,7 @@ const simulation = { } if (tech.relayIce && tech.isFlipFlopOn) { 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) } } diff --git a/js/spawn.js b/js/spawn.js index 3c98b28..054a845 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -96,6 +96,7 @@ const spawn = { me.stroke = "transparent" me.isShielded = true; //makes it immune to damage me.leaveBody = false; + me.isBadTarget = true; me.isDropPowerUp = false; me.showHealthBar = false; me.collisionFilter.mask = 0; //cat.player //| cat.body @@ -178,6 +179,24 @@ const spawn = { // spawn.shield(me, x, y, 1); 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() { level.exit.x = 5500; level.exit.y = -330; @@ -2460,6 +2479,7 @@ const spawn = { me.restitution = 0.8; me.leaveBody = false; me.isDropPowerUp = false; + me.isBadTarget = true; me.showHealthBar = false; me.collisionFilter.category = cat.mobBullet; @@ -2511,6 +2531,7 @@ const spawn = { me.restitution = 1; me.leaveBody = false; me.isDropPowerUp = false; + me.isBadTarget = true; me.showHealthBar = false; me.collisionFilter.category = cat.mobBullet; me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet; @@ -2649,6 +2670,7 @@ const spawn = { me.restitution = 0; me.leaveBody = false; me.isDropPowerUp = false; + me.isBadTarget = true; me.showHealthBar = false; me.collisionFilter.category = cat.mobBullet; me.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet; @@ -2771,12 +2793,13 @@ const spawn = { this.cycle = 0 ctx.beginPath(); 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.lineTo(mob[i].position.x, mob[i].position.y) 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.lineCap = "round"; ctx.strokeStyle = "rgba(200,200,255,0.9)" @@ -2919,8 +2942,7 @@ const spawn = { spawns(x, y, radius = 15) { mobs.spawn(x, y, 4, radius, "rgb(255,0,0)"); let me = mob[mob.length - 1]; - me.onHit = function() { - //run this function on hitting player + me.onHit = function() { //run this function on hitting player this.explode(); }; // me.stroke = "transparent" @@ -2930,8 +2952,8 @@ const spawn = { me.g = 0.00002; //required if using 'gravity' me.accelMag = 0.00012 * simulation.accelScale; // me.memory = 30; + me.isDropPowerUp = false me.leaveBody = false; - me.isDropPowerUp = false; me.seePlayerFreq = Math.round((80 + 50 * Math.random()) * simulation.lookFreqScale); me.frictionAir = 0.004; me.do = function() { @@ -3223,6 +3245,7 @@ const spawn = { Matter.Body.setDensity(me, 0.1); //normal is 0.001 me.leaveBody = false; me.isDropPowerUp = false; + me.isBadTarget = true; me.showHealthBar = false; // me.isShielded = true me.collisionFilter.category = cat.mobBullet; @@ -3243,7 +3266,15 @@ const spawn = { //damage player 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.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(); } }; @@ -3441,6 +3472,7 @@ const spawn = { me.frictionAir = 0.01; me.isDropPowerUp = false; me.showHealthBar = false; + me.isBadTarget = true; me.do = function() { let wireX = -50; @@ -3508,6 +3540,7 @@ const spawn = { me.frictionAir = 0.01; me.isDropPowerUp = false; me.showHealthBar = false; + me.isBadTarget = true; me.do = function() { let wireX = -50 - 20; @@ -3558,6 +3591,7 @@ const spawn = { me.frictionAir = 0.01; me.isDropPowerUp = false; me.showHealthBar = false; + me.isBadTarget = true; me.do = function() { let wireX = -50 - 35; @@ -3607,6 +3641,7 @@ const spawn = { me.frictionAir = 0.01; me.isDropPowerUp = false; me.showHealthBar = false; + me.isBadTarget = true; me.do = function() { let wireX = -50 + 16; @@ -3656,6 +3691,7 @@ const spawn = { me.frictionAir = 0.01; me.isDropPowerUp = false; me.showHealthBar = false; + me.isBadTarget = true; me.do = function() { let wireX = -50 + 26; diff --git a/js/tech.js b/js/tech.js index cfc6b6b..4deb46a 100644 --- a/js/tech.js +++ b/js/tech.js @@ -1481,31 +1481,13 @@ tech.throwChargeRate = 1 } }, - { - name: "restitution", - description: "if a block you threw kills a mob
spawn a heal, ammo, or research", - 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", description: "after a mob dies its body is spun and flung
in the general direction of a nearby mob", maxCount: 1, count: 0, - frequency: 4, - frequencyDefault: 4, + frequency: 3, + frequencyDefault: 3, allowed() { return tech.throwChargeRate > 1 && !tech.nailsDeathMob && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.iceIXOnDeath }, @@ -1517,13 +1499,66 @@ tech.isMobBlockFling = false } }, + { + name: "fermions", + description: "blocks thrown by you or pilot wave will
collide with intangible 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: "throwing a block expands it by 300%
increase throw charge rate by 200%", + 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 block you threw kills a mob
spawn a heal, ammo, or research", + 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", description: "while you are holding a block
reduce harm by 85%", maxCount: 1, count: 0, - frequency: 4, - frequencyDefault: 4, + frequency: 3, + frequencyDefault: 3, allowed() { 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", - description: "if relay switch is in the ON state
condense 1-3 ice IX crystals every second", + description: "if relay switch is in the ON state
condense 1-5 ice IX crystals every second", maxCount: 9, count: 0, frequency: 4, @@ -1736,7 +1771,7 @@ }, { name: "crystallizer", - description: "after frozen mobs die
they have a chance shatter into ice IX crystals", + description: "after frozen mobs die they
shatter into ice IX crystals", maxCount: 9, count: 0, frequency: 2, @@ -5118,24 +5153,6 @@ tech.pilotForce = 0.00002 } }, - { - name: "fermions", - description: "after a block is affected by pilot wave it
collides with intangible 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", description: "stun and do radioactive damage to mobs
if you tunnel through them with a wormhole", @@ -5404,6 +5421,46 @@ // 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", description: "the direction you aim is determined by your position", @@ -6464,7 +6521,9 @@ }, 1); }, remove() { - this.maxCount = lore.techGoal + lore.techCount = 0; + this.maxCount = lore.techGoal; + this.description = `this` } } ], @@ -6735,5 +6794,6 @@ isCollisionRealitySwitch: null, iceIXOnDeath: null, wimpCount: null, - isBlockBullets: null + isBlockBullets: null, + isAddBlockMass: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index 2768939..8b0a66f 100644 --- a/todo.txt +++ b/todo.txt @@ -1,14 +1,9 @@ ******************************************************** NEXT PATCH ******************************************************** -fermions: after a block is affected by pilot wave it collides with intangible mobs, but not you + ******************************************************** 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 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 ******************************************************** +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 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? -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 if it touches WIMP they explode