diff --git a/.DS_Store b/.DS_Store index 27c00d9..16a5f3c 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index c43e8e9..59925a2 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1112,18 +1112,20 @@ const b = { b.guns[gunIndex].do = function() {} } else { if (gunIndex) b.guns[gunIndex].do = function() { - const cycles = 80 - const speed = input.down ? 35 : 20 //input.down ? 43 : 32 - const g = input.down ? 0.137 : 0.135 - const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } - ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map - ctx.lineWidth = 2 - ctx.beginPath() - for (let i = 1, len = 19; i < len + 1; i++) { - const time = cycles * i / len - ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + g * time * time) + if (!input.field) { + const cycles = 80 + const speed = input.down ? 35 : 20 //input.down ? 43 : 32 + const g = input.down ? 0.137 : 0.135 + const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } + ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map + ctx.lineWidth = 2 + ctx.beginPath() + for (let i = 1, len = 19; i < len + 1; i++) { + const time = cycles * i / len + ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + g * time * time) + } + ctx.stroke() } - ctx.stroke() } } } else if (tech.isRPG) { @@ -1136,32 +1138,36 @@ const b = { } else if (tech.isVacuumBomb) { b.grenade = grenadeVacuum if (gunIndex) b.guns[gunIndex].do = function() { - const cycles = Math.floor(input.down ? 50 : 30) //30 - const speed = input.down ? 44 : 35 - const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } - ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map - ctx.lineWidth = 2 - ctx.beginPath() - for (let i = 1.6, len = 19; i < len + 1; i++) { - const time = cycles * i / len - ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time) + if (!input.field) { + const cycles = Math.floor(input.down ? 50 : 30) //30 + const speed = input.down ? 44 : 35 + const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } + ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map + ctx.lineWidth = 2 + ctx.beginPath() + for (let i = 1.6, len = 19; i < len + 1; i++) { + const time = cycles * i / len + ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time) + } + ctx.stroke() } - ctx.stroke() } } else { b.grenade = grenadeDefault if (gunIndex) b.guns[gunIndex].do = function() { - const cycles = Math.floor(input.down ? 120 : 80) //30 - const speed = input.down ? 43 : 32 - const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky - ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map - ctx.lineWidth = 2 - ctx.beginPath() - for (let i = 0.5, len = 19; i < len + 1; i++) { - const time = cycles * i / len - ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time) + if (!input.field) { + const cycles = Math.floor(input.down ? 120 : 80) //30 + const speed = input.down ? 43 : 32 + const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky + ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map + ctx.lineWidth = 2 + ctx.beginPath() + for (let i = 0.5, len = 19; i < len + 1; i++) { + const time = cycles * i / len + ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time) + } + ctx.stroke() } - ctx.stroke() } } }, @@ -2481,7 +2487,7 @@ const b = { //total 0.24 + 0.3 average dmg: 0.34 + 0.12 * tech.isDroneTeleport + 0.15 * tech.isDroneFastLook, //damage done in addition to the damage from momentum lookFrequency: (tech.isDroneFastLook ? 20 : 70) + Math.floor(17 * Math.random()), - endCycle: simulation.cycle + Math.floor((950 + 420 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 140 + RADIUS * 5, + endCycle: simulation.cycle + Math.floor((950 + 400 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 5 * RADIUS + Math.max(0, 150 - b.length), classType: "bullet", collisionFilter: { category: cat.bullet, @@ -2686,7 +2692,7 @@ const b = { restitution: 0.4 + 0.199 * Math.random(), dmg: 0, //0.24 damage done in addition to the damage from momentum and radiation lookFrequency: 120 + Math.floor(23 * Math.random()), - endCycle: simulation.cycle + Math.floor((900 + 120 * Math.random()) * tech.isBulletsLastLonger / tech.droneRadioDamage) + 140 + RADIUS * 5, + endCycle: simulation.cycle + Math.floor((900 + 110 * Math.random()) * tech.isBulletsLastLonger / tech.droneRadioDamage) + 5 * RADIUS + Math.max(0, 150 - 2 * b.length), classType: "bullet", collisionFilter: { category: cat.bullet, @@ -2700,7 +2706,7 @@ const b = { isImproved: false, radioRadius: 0, maxRadioRadius: 300 + Math.floor(100 * Math.random()), - beforeDmg(who) { + beforeDmg() { // const unit = Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), -20) //move away from target after hitting // Matter.Body.setVelocity(this, { // x: unit.x, @@ -3361,11 +3367,11 @@ const b = { if (Vector.magnitude(Vector.sub(this.position, player.position)) < 250 && m.immuneCycle < m.cycle) { //give energy Matter.Body.setAngularVelocity(this, this.spin) if (this.isUpgraded) { - m.energy += 0.08 + m.energy += 0.1 simulation.drawList.push({ //add dmg to draw queue x: this.position.x, y: this.position.y, - radius: 8, + radius: 10, color: m.fieldMeterColor, time: simulation.drawTime }); @@ -3464,10 +3470,16 @@ const b = { Matter.Query.ray(body, this.position, mob[i].position).length === 0 && !mob[i].isShielded ) { - const SPEED = 35 const unit = Vector.normalise(Vector.sub(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60)), this.position)) - b.nail(this.position, Vector.mult(unit, SPEED)) - this.force = Vector.mult(unit, -0.01 * this.mass) + if (this.isUpgraded) { + const SPEED = 50 + b.nail(this.position, Vector.mult(unit, SPEED)) + this.force = Vector.mult(unit, -0.018 * this.mass) + } else { + const SPEED = 35 + b.nail(this.position, Vector.mult(unit, SPEED)) + this.force = Vector.mult(unit, -0.01 * this.mass) + } break; } } @@ -3565,7 +3577,7 @@ const b = { restitution: 0.6 * (1 + 0.5 * Math.random()), dmg: 0, // 0.14 //damage done in addition to the damage from momentum minDmgSpeed: 2, - lookFrequency: 60 + Math.floor(17 * Math.random()) - 35 * tech.isFoamBotUpgrade, + lookFrequency: 60 + Math.floor(17 * Math.random()) - 40 * tech.isFoamBotUpgrade, cd: 0, delay: 100, acceleration: 0.005 * (1 + 0.5 * Math.random()), @@ -3593,7 +3605,7 @@ const b = { 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() - const SPEED = 29 - radius * 0.5; //(input.down ? 32 : 20) - radius * 0.7; + const SPEED = 29 - radius * 0.4; //(input.down ? 32 : 20) - radius * 0.7; const velocity = Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED) b.foam(this.position, velocity, radius + 7 * this.isUpgraded) break; @@ -3627,10 +3639,10 @@ const b = { dmg: 0, //damage done in addition to the damage from momentum minDmgSpeed: 2, lookFrequency: 40 + Math.floor(7 * Math.random()) - 10 * tech.isLaserBotUpgrade, - range: (700 + 400 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()), + range: (700 + 450 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()), drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4, - drain: (0.5 - 0.42 * tech.isLaserBotUpgrade) * tech.laserFieldDrain * tech.isLaserDiode, - laserDamage: 0.85 + 0.65 * tech.isLaserBotUpgrade, + drain: (0.5 - 0.43 * tech.isLaserBotUpgrade) * tech.laserFieldDrain * tech.isLaserDiode, + laserDamage: 0.85 + 0.7 * tech.isLaserBotUpgrade, endCycle: Infinity, classType: "bullet", collisionFilter: { @@ -3739,7 +3751,7 @@ const b = { lookFrequency: 43 + Math.floor(7 * Math.random()) - 10 * tech.isBoomBotUpgrade, acceleration: 0.005 * (1 + 0.5 * Math.random()), attackAcceleration: 0.012 + 0.005 * tech.isBoomBotUpgrade, - range: 500 * (1 + 0.1 * Math.random()) + 300 * tech.isBoomBotUpgrade, + range: 500 * (1 + 0.1 * Math.random()) + 320 * tech.isBoomBotUpgrade, endCycle: Infinity, classType: "bullet", collisionFilter: { @@ -3750,7 +3762,7 @@ const b = { explode: 0, beforeDmg() { if (this.lockedOn) { - const explosionRadius = Math.min(136 + 180 * this.isUpgraded, Vector.magnitude(Vector.sub(this.position, m.pos)) - 30) + const explosionRadius = Math.min(136 + 200 * this.isUpgraded, Vector.magnitude(Vector.sub(this.position, m.pos)) - 30) if (explosionRadius > 60) { this.explode = explosionRadius // @@ -4025,7 +4037,7 @@ const b = { } } }, - range: 190 + 100 * tech.isOrbitBotUpgrade, //range is set in bot upgrade too! //150 + (80 + 100 * tech.isOrbitBotUpgrade) * Math.random(), // + 5 * tech.orbitBotCount, + range: 190 + 120 * tech.isOrbitBotUpgrade, //range is set in bot upgrade too! orbitalSpeed: 0, phase: 2 * Math.PI * Math.random(), do() { @@ -4038,7 +4050,7 @@ const b = { for (let i = 0; i < q.length; i++) { if (!q[i].isShielded) { mobs.statusStun(q[i], 180) - const dmg = 0.4 * b.dmgScale * (this.isUpgraded ? 3.5 : 1) * (tech.isCrit ? 4 : 1) + const dmg = 0.4 * b.dmgScale * (this.isUpgraded ? 4 : 1) * (tech.isCrit ? 4 : 1) q[i].damage(dmg); if (q[i].alive) q[i].foundPlayer(); simulation.drawList.push({ //add dmg to draw queue @@ -5091,7 +5103,7 @@ const b = { ammo: 0, ammoPack: 5, have: false, - do() {}, + do() {}, //do is set in b.setGrenadeMode() fire() { const countReduction = Math.pow(0.93, tech.missileCount) m.fireCDcycle = m.cycle + Math.floor((input.down ? 40 : 30) * b.fireCDscale / countReduction); // cool down @@ -5109,7 +5121,21 @@ const b = { ammo: 0, ammoPack: 1.25, have: false, - do() {}, + do() { + if (!input.field && input.down && !tech.isLaserMine) { + const cycles = 60 //30 + const speed = 40 + const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky + ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map + ctx.lineWidth = 2 + ctx.beginPath() + for (let i = 1.5, len = 19; i < len + 1; i++) { + const time = cycles * i / len + ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time) + } + ctx.stroke() + } + }, fire() { if (input.down) { if (tech.isLaserMine) { @@ -5145,7 +5171,7 @@ const b = { bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 20, 4.5, b.fireAttributes(dir, false)); b.fireProps(input.down ? 45 : 25, input.down ? 30 : 16, dir, me); //cd , speed Matter.Body.setDensity(bullet[me], 0.000001); - bullet[me].endCycle = simulation.cycle + 600; + bullet[me].endCycle = simulation.cycle + 480 + Math.max(0, 120 - 2 * b.length); bullet[me].frictionAir = 0; bullet[me].friction = 0.5; bullet[me].radius = 4.5; @@ -5899,7 +5925,7 @@ const b = { ctx.moveTo(history.position.x, history.position.y - off); ctx.ellipse(history.position.x, history.position.y - off, mag, mag * 0.65, history.angle, 0, 2 * Math.PI) } - ctx.fillStyle = `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})`; + ctx.fillStyle = tech.isLaserDiode === 1 ? `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})` : `rgba(0,0,255,${0.09 * Math.sqrt(this.charge)})`; ctx.fill(); //fire if (!input.fire) { @@ -5921,7 +5947,8 @@ const b = { //draw charge level ctx.beginPath(); ctx.arc(m.pos.x, m.pos.y, 4.2 * Math.sqrt(this.charge), 0, 2 * Math.PI); - ctx.fillStyle = `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})`; + // ctx.fillStyle = `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})`; + ctx.fillStyle = tech.isLaserDiode === 1 ? `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})` : `rgba(0,0,255,${0.09 * Math.sqrt(this.charge)})`; ctx.fill(); //fire if (!input.fire) { diff --git a/js/level.js b/js/level.js index 52eb2d3..2c0629c 100644 --- a/js/level.js +++ b/js/level.js @@ -16,9 +16,9 @@ const level = { // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why // simulation.isHorizontalFlipped = true // m.setField("metamaterial cloaking") - b.giveGuns("laser") + // b.giveGuns("mine") // tech.giveTech("spherical harmonics") - tech.giveTech("relative permittivity") + // tech.giveTech("relative permittivity") // tech.giveTech("causality bombs") // for (let i = 0; i < 2; i++) tech.giveTech("refractory metal") // tech.giveTech("antiscience") @@ -26,11 +26,6 @@ const level = { // for (let i = 0; i < 2; i++) tech.giveTech("laser-bot") // tech.isCancelDuplication = true - - - - - level.intro(); //starting level // level.testing(); //not in rotation, used for testing // level.template(); //not in rotation, blank start new map development @@ -2316,9 +2311,9 @@ const level = { spawn.mapRect(4850, -275, 50, 175); // level.difficultyIncrease(40) //30 is near max on hard //60 is near max on why // spawn.starter(1900, -500, 200) //big boy - // spawn.blockGroup(1900, -500) + spawn.historyBoss(1700, -500) + spawn.shooterBoss(3200, -500) // for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40); - // spawn.laserBombingBoss(1900, -500) // for (let i = 0; i < 5; i++) spawn.focuser(1900, -500) // spawn.slashBoss(1900, -500) // spawn.sucker(1900, -500) @@ -2337,7 +2332,7 @@ const level = { // spawn.nodeGroup(1200, -500, "grenadier") // spawn.nodeGroup(1800, -500, "grenadier") // spawn.nodeGroup(1200, 0, "grenadier") - spawn.blinkBoss(1200, -500) + // spawn.blinkBoss(1200, -500) // spawn.suckerBoss(2900, -500) // spawn.randomMob(1600, -500) }, diff --git a/js/player.js b/js/player.js index ed03a72..9dd5773 100644 --- a/js/player.js +++ b/js/player.js @@ -1157,6 +1157,19 @@ const m = { ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y); ctx.fill(); } + //trajectory path prediction + const cycles = 30 + const charge = Math.min(m.throwCharge / 5, 1) + const speed = 80 * charge * Math.min(0.85, 0.8 / Math.pow(m.holdingTarget.mass, 0.25)); + const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky + ctx.beginPath() + for (let i = 1, len = 10; i < len + 1; i++) { + const time = cycles * i / len + ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time) + } + ctx.strokeStyle = "rgba(68, 68, 68, 0.15)" //color.map + ctx.lineWidth = 2 + ctx.stroke() } else { m.drop() } @@ -1203,21 +1216,16 @@ const m = { const charge = Math.min(m.throwCharge / 5, 1) //***** scale throw speed with the first number, 80 ***** let speed = 80 * charge * Math.min(0.85, 0.8 / Math.pow(m.holdingTarget.mass, 0.25)); - if (Matter.Query.collides(m.holdingTarget, map).length !== 0) { speed *= 0.7 //drop speed by 30% if touching map if (Matter.Query.ray(map, m.holdingTarget.position, m.pos).length !== 0) speed = 0 //drop to zero if the center of the block can't see the center of the player through the map - //|| Matter.Query.ray(body, m.holdingTarget.position, m.pos).length > 1 } - m.throwCharge = 0; m.throwCycle = m.cycle + 180 //used to detect if a block was thrown in the last 3 seconds Matter.Body.setVelocity(m.holdingTarget, { x: player.velocity.x * 0.5 + Math.cos(m.angle) * speed, y: player.velocity.y * 0.5 + Math.sin(m.angle) * speed }); - //player recoil //stronger in x-dir to prevent jump hacking - Matter.Body.setVelocity(player, { x: player.velocity.x - Math.cos(m.angle) * speed / (m.crouch ? 30 : 10) * Math.sqrt(m.holdingTarget.mass), y: player.velocity.y - Math.sin(m.angle) * speed / 30 * Math.sqrt(m.holdingTarget.mass) @@ -1958,7 +1966,7 @@ const m = { // m.fieldMeterColor = "#0c5" // m.eyeFillColor = m.fieldMeterColor m.hold = function() { - if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 150 && (m.cycle % 2)) { + if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 200 && (m.cycle % 2)) { if (tech.isSporeField) { if (tech.isSporeWorm) { if (m.energy > 0.16) { diff --git a/js/tech.js b/js/tech.js index 2300bf3..9db6c7d 100644 --- a/js/tech.js +++ b/js/tech.js @@ -535,26 +535,30 @@ { name: "desublimated ammunition", link: `desublimated ammunition`, - description: "every other crouched shot uses no ammo
+6% JUNK to the potential tech pool", + description: `use ${powerUps.orb.research(1)} to produce bullets from air molecules
every other crouched shot uses no ammo`, maxCount: 1, count: 0, frequency: 1, frequencyDefault: 1, allowed() { - return true + return build.isExperimentSelection || powerUps.research.count > 0 }, requires: "", effect() { tech.isCrouchAmmo = true - this.refundAmount += tech.addJunkTechToPool(0.06) + for (let i = 0; i < 1; i++) { + if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) + } + // this.refundAmount += tech.addJunkTechToPool(0.06) }, - refundAmount: 0, + // refundAmount: 0, remove() { tech.isExtraChoice = false; - if (this.count > 0 && this.refundAmount > 0) { - tech.removeJunkTechFromPool(this.refundAmount) - this.refundAmount = 0 - } + if (this.count > 0) powerUps.research.changeRerolls(1) + // if (this.count > 0 && this.refundAmount > 0) { + // tech.removeJunkTechFromPool(this.refundAmount) + // this.refundAmount = 0 + // } } }, { @@ -567,7 +571,7 @@ allowed() { return (tech.isCrouchAmmo && !tech.isEnergyHealth) || tech.isCrouchRegen }, - requires: "relative permittivity, desublimated ammunition, not mass-energy", + requires: "inductive coupling, desublimated ammunition, not mass-energy", effect() { tech.isTurret = true }, @@ -1184,7 +1188,7 @@ { name: "nail-bot upgrade", link: `nail-bot upgrade`, - description: "convert all your bots to nail-bots
500% increased nail-bot fire rate", + description: "convert your current bots to nail-bots
+500% fire rate and +40% nail velocity", maxCount: 1, count: 0, frequency: 3, @@ -1193,7 +1197,7 @@ allowed() { return tech.nailBotCount > 1 && !b.hasBotUpgrade() }, - requires: "2 or more nail bots and only 1 bot upgrade", + requires: "2 or more nail bots and no other bot upgrade", effect() { tech.isNailBotUpgrade = true b.convertBotsTo("nail-bot") @@ -1242,7 +1246,7 @@ { name: "foam-bot upgrade", link: `foam-bot upgrade`, - description: "convert all your bots to foam-bots
250% increased foam size and fire rate", + description: "convert your current bots to foam-bots
300% increased foam size and fire rate", maxCount: 1, count: 0, frequency: 3, @@ -1251,7 +1255,7 @@ allowed() { return tech.foamBotCount > 1 && !b.hasBotUpgrade() }, - requires: "2 or more foam bots and only 1 bot upgrade", + requires: "2 or more foam bots and no other bot upgrade", effect() { tech.isFoamBotUpgrade = true b.convertBotsTo("foam-bot") @@ -1299,8 +1303,8 @@ }, { name: "boom-bot upgrade", - link: `boom-bot upgrade-bot`, - description: "convert all your bots to boom-bots
250% increased explosion damage and size", + link: `boom-bot upgrade`, + description: "convert your current bots to boom-bots
300% increased explosion damage and size", maxCount: 1, count: 0, frequency: 3, @@ -1309,7 +1313,7 @@ allowed() { return tech.boomBotCount > 1 && !b.hasBotUpgrade() }, - requires: "2 or more boom bots and only 1 bot upgrade", + requires: "2 or more boom bots and no other bot upgrade", effect() { tech.isBoomBotUpgrade = true b.convertBotsTo("boom-bot") @@ -1358,7 +1362,7 @@ { name: "laser-bot upgrade", link: `laser-bot upgrade`, - description: "convert all your bots to laser-bots
75% improved damage, efficiency, and range", // 400% increased laser-bot laser damage", + description: "convert your current bots to laser-bots
100% improved damage, efficiency, and range", // 400% increased laser-bot laser damage", maxCount: 1, count: 0, frequency: 3, @@ -1367,7 +1371,7 @@ allowed() { return tech.laserBotCount > 1 && !b.hasBotUpgrade() }, - requires: "2 or more laser bots and only 1 bot upgrade", + requires: "2 or more laser bots and no other bot upgrade", effect() { tech.isLaserBotUpgrade = true b.convertBotsTo("laser-bot") @@ -1416,7 +1420,7 @@ { name: "orbital-bot upgrade", link: `orbital-bot upgrade`, - description: "convert all your bots to orbital-bots
increase damage by 250% and radius by 40%", + description: "convert your current bots to orbital-bots
increase damage by 300% and radius by 50%", maxCount: 1, count: 0, frequency: 3, @@ -1425,11 +1429,11 @@ allowed() { return tech.orbitBotCount > 1 && !b.hasBotUpgrade() }, - requires: "2 or more orbital bots and only 1 bot upgrade", + requires: "2 or more orbital bots and no other bot upgrade", effect() { tech.isOrbitBotUpgrade = true b.convertBotsTo("orbital-bot") - const range = 190 + 100 * tech.isOrbitBotUpgrade + const range = 190 + 120 * tech.isOrbitBotUpgrade for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType === 'orbit') { bullet[i].isUpgraded = true @@ -1483,7 +1487,7 @@ { name: "dynamo-bot upgrade", link: `dynamo-bot upgrade`, - description: "convert your bots to dynamo-bots
increase regen to 16 energy per second", + description: "convert your current bots to dynamo-bots
increase regen to 19 energy per second", maxCount: 1, count: 0, frequency: 3, @@ -1492,7 +1496,7 @@ allowed() { return tech.dynamoBotCount > 1 && !b.hasBotUpgrade() }, - requires: "2 or more dynamo bots and only 1 bot upgrade", + requires: "2 or more dynamo bots and no other bot upgrade", effect() { tech.isDynamoBotUpgrade = true b.convertBotsTo("dynamo-bot") @@ -1692,7 +1696,7 @@ allowed() { return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isTokamak }, - requires: "mass driver, not pilot wave, tokamak", + requires: "mass driver, not pilot wave, tokamak, wormhole", effect() { tech.isAddBlockMass = true }, @@ -1710,7 +1714,7 @@ allowed() { return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isTokamak }, - requires: "mass driver, not pilot wave not tokamak", + requires: "mass driver, not pilot wave not tokamak, wormhole", effect() { tech.isBlockRestitution = true }, @@ -1782,7 +1786,7 @@ allowed() { return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && !tech.isTokamak }, - requires: "mass driver, not pilot wave not tokamak", + requires: "mass driver, not pilot wave, tokamak", effect() { tech.isBlockPowerUps = true }, @@ -2210,7 +2214,7 @@ allowed() { //&& (m.fieldUpgrades[m.fieldMode].name !== "molecular assembler" || m.maxEnergy > 1) return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isEnergyHealth && !tech.isRewindField //&& !tech.isRewindGun }, - requires: "not standing wave, mass-energy, max energy reduction, CPT gun", + requires: "not standing wave, mass-energy, max energy reduction", effect() { tech.isRewindAvoidDeath = true; }, @@ -2284,7 +2288,7 @@ frequency: 2, frequencyDefault: 2, allowed() { - return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isTokamak) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth + return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isTokamak) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth && !tech.isCrouchRegen }, requires: "a way to regen extra energy, not time crystals", effect: () => { @@ -2331,7 +2335,7 @@ { name: "1st ionization energy", link: `1st ionization energy`, - description: `each ${powerUps.orb.heal()} you collect
increases your maximum energy by 7`, + description: `each ${powerUps.orb.heal()} you collect
increases your maximum energy by 8`, maxCount: 1, count: 0, frequency: 2, @@ -2357,8 +2361,8 @@ } }, { - name: "permittivity", - description: "each unused power up at the end of a level
adds 4 maximum energy", // (up to 51 health per level)", + name: "weak interaction", + description: "each unused power up at the end of a level
adds 5 maximum energy", // (up to 51 health per level)", maxCount: 1, count: 0, frequency: 1, @@ -2366,7 +2370,7 @@ allowed() { return !tech.isDroneGrab }, - requires: "not drone harvester", + requires: "not delivery drone", effect() { tech.isExtraMaxEnergy = true; //tracked by tech.extraMaxHealth }, @@ -2375,7 +2379,7 @@ } }, { - name: "transceiver", + name: "electroweak interaction", description: "unused power ups at the end of each level
are still activated (selections are random)", maxCount: 1, count: 0, @@ -2384,7 +2388,7 @@ allowed() { return tech.isExtraMaxEnergy }, - requires: "permittivity", + requires: "weak interaction", effect() { tech.isEndLevelPowerUp = true; }, @@ -2956,7 +2960,7 @@ { name: "Ψ(t) collapse", link: `Ψ(t) collapse`, - description: `enter an alternate reality after you research
spawn ${powerUps.orb.research(16)}`, + description: `enter an alternate reality after you research
spawn ${powerUps.orb.research(21)}`, maxCount: 1, count: 0, frequency: 1, @@ -3062,9 +3066,9 @@ frequency: 2, frequencyDefault: 2, allowed() { - return powerUps.research.count > 4 || build.isExperimentSelection + return powerUps.research.count > 3 || build.isExperimentSelection }, - requires: "at least 5 research", + requires: "at least 4 research", effect() { tech.isRerollDamage = true; }, @@ -3330,7 +3334,7 @@ allowed() { return tech.duplicationChance() > 0.99 }, - requires: "duplication chance above 33%", + requires: "duplication chance above 99%", effect() { tech.is111Duplicate = true; tech.maxDuplicationEvent() @@ -3769,7 +3773,7 @@ frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isIceCrystals && !tech.isRivets && !tech.nailRecoil && !tech.nailRecoil + return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isIceCrystals && !tech.isRivets && !tech.nailRecoil }, requires: "nail gun, not ice crystal, rivets, rotary cannon, or pneumatic actuator", effect() { @@ -4847,7 +4851,7 @@ allowed() { return tech.haveGunCheck("drones", false) || tech.isForeverDrones }, - requires: "drone gun", + requires: "drone gun or fault tolerance", effect() { const num = 8 tech.isForeverDrones += num @@ -5181,7 +5185,7 @@ isBot: true, isBotTech: true, isNonRefundable: true, - requires: "NOT EXPERIMENT MODE, foam gun", + requires: "NOT EXPERIMENT MODE, foam gun, no other bot upgrades", allowed() { return tech.haveGunCheck("foam", false) && !b.hasBotUpgrade() }, @@ -5377,7 +5381,7 @@ }, { name: "laser diode", - description: "all lasers drain 30% less energy
affects laser-gun, laser-bot, and laser-mines", + description: "all lasers drain 30% less energy
affects laser-gun, laser-bot, laser-mines, pulse", isGunTech: true, maxCount: 1, count: 0, @@ -5824,9 +5828,9 @@ frequency: 2, frequencyDefault: 2, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "negative mass" && !tech.isEnergyHealth && !tech.isFreeWormHole + return m.fieldUpgrades[m.fieldMode].name === "negative mass" && !tech.isEnergyHealth }, - requires: "wormhole or negative mass, not mass-energy, charmed baryon", + requires: "negative mass, not mass-energy", effect() { tech.isNeutronium = true tech.baseFx *= 0.66 @@ -6152,7 +6156,7 @@ allowed() { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" }, - requires: "plasma torch", + requires: "plasma torch or molecular assembler", effect() { tech.isTokamak = true; }, @@ -6368,7 +6372,7 @@ allowed() { return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && tech.energyRegen !== 0 }, - requires: "time dilation, not ground state", + requires: "time dilation or pilot wave, not ground state", effect: () => { tech.energyRegen = 0.004; m.fieldRegen = tech.energyRegen; @@ -6389,7 +6393,7 @@ allowed() { return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking") }, - requires: "cloaking, wormhole or time dilation and below 100% duplication chance", + requires: "cloaking, time dilation, or pilot wave", effect() { tech.cloakDuplication = 0.4 powerUps.setDupChance(); //needed after adjusting duplication chance @@ -6411,7 +6415,7 @@ allowed() { return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "time dilation" }, - requires: "metamaterial cloaking", + requires: "cloaking or time dilation", effect() { tech.isAddRemoveMaxHealth = true }, @@ -6536,7 +6540,7 @@ allowed() { return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && (build.isExperimentSelection || powerUps.research.count > 1) }, - requires: "metamaterial cloaking pilot wave or plasma torch", + requires: "cloaking, pilot wave, or plasma torch", effect() { tech.isCloakingDamage = true for (let i = 0; i < 2; i++) { @@ -6559,7 +6563,7 @@ allowed() { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" }, - requires: "metamaterial cloaking, plasma torch or pilot wave", + requires: "metamaterial cloaking, molecular assembler, plasma torch or pilot wave", effect() { tech.aimDamage = 1.40 b.setFireCD(); @@ -6599,7 +6603,7 @@ allowed() { return m.fieldUpgrades[m.fieldMode].name === "wormhole" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, - requires: "wormhole", + requires: "wormhole or pilot wave", effect: () => { tech.wimpCount++ spawn.WIMP() @@ -6730,9 +6734,9 @@ frequency: 2, frequencyDefault: 2, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "wormhole" && !tech.isNeutronium + return m.fieldUpgrades[m.fieldMode].name === "wormhole" }, - requires: "wormhole, not neutronium", + requires: "wormhole", effect() { tech.isFreeWormHole = true tech.baseFx *= 0.66 diff --git a/todo.txt b/todo.txt index 4271e35..5ef1d5c 100644 --- a/todo.txt +++ b/todo.txt @@ -1,38 +1,32 @@ ******************************************************** NEXT PATCH ************************************************** -tech: inductive coupling - regen is increased by 500%, but you only regen when crouched +block throwing and mines when crouched now have trajectory prediction, like grenades -tech gun turret gives 55% -> 60% harm reduction - also I fixed a bug where it was giving 45% not 55% +all bot upgrades are about 20% better +Ψ(t) collapse gives 16->21 research +spores and drones have up to 20% shorter life span when the number of active bullets is high -old tech inductive coupling is renamed: permittivity -permittivity gives 3 -> 4 max energy per unused power up -1st ionization energy gives 6 -> 7 max energy per heal - -tech expansion - no longer costs energy to expand standing wave field - -JUNK tech planetesimals now can spawn tech in n-gon - or kill the player in n-gon +1st ionization energy gives 7 -> 8 max energy per heal +permittivity renamed weak interaction +weak interaction gives 4 -> 5 max energy per unused power up +transceiver renamed electroweak interaction +fixed about 70 different requirement text situations ******************************************************** TODO ******************************************************** +need a mine tech that mines there be fewer mines + disables booby trap + makes mines do more damage + +tech: after bullets hit a mob, the mob takes 1% more damage + this.damageReduction *= 1.01 + tech: open a new tab for n-gon, spawn things in the original game based on events in new game if you die in new die in original? new is n-gon classic? make a JUNK tech? if you die in original open a tab with a new n-gon that starts on a random level with a random load out. if you clear the level you come back to life in the original? - -give all duplicated power ups a half life that scales with the duplication chance - metastability reduces the half life - how to communicate the half-life? - -tech: after bullets hit a mob, the mob takes 1% more damage - this.damageReduction *= 1.01 - -make CPT gun a tech for time dilation field - tech: CPT - time dilation field rewinds your health velocity and position - bug - death while paused crashes game? tech: aerodynamic heating - railgun rods super heat the air around it doing AoE damage