From 50314c21e92cd3a74753baac1474b966ac6acf13 Mon Sep 17 00:00:00 2001 From: landgreen Date: Thu, 11 Nov 2021 06:28:28 -0800 Subject: [PATCH] applied science MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tech: applied science - gives a random gun tech and a research for each gun in your inventory JUNK tech - motion sickness - disable camera smoothing JUNK tech - palantír - see far away foam-bot, nail-bot, missile-bot: are now affected by fire delay tech this gives some options for late game bot scaling timelike now allows some energy regen while immune to harm in double time Tokamak now overrides the trajectory throw graphics with its own --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 7 ++- js/level.js | 25 ++++++-- js/player.js | 119 ++++++++++++++++++++++------------- js/spawn.js | 6 +- js/tech.js | 172 +++++++++++++++++++++++++++++++++++++++------------ todo.txt | 21 +++---- 7 files changed, 244 insertions(+), 106 deletions(-) diff --git a/.DS_Store b/.DS_Store index 16a5f3c361bbc080d8da7073b45a1d13c2374163..f4b94a6aa62f3bd854578b09629f4ea5adb833e9 100644 GIT binary patch delta 22 dcmZoMXffEJ#muxbZ?X=vFO%GY&DG4EA^=lC2MhoJ delta 22 dcmZoMXffEJ#mqGO-(($TUnW_B&DG4EA^=r}2JHX< diff --git a/js/bullet.js b/js/bullet.js index 59925a2..de42369 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -3443,6 +3443,7 @@ const b = { minDmgSpeed: 2, // lookFrequency: 56 + Math.floor(17 * Math.random()) - isUpgraded * 20, lastLookCycle: simulation.cycle + 60 * Math.random(), + delay: Math.floor((tech.isNailBotUpgrade ? 21 : 110) * b.fireCDscale), acceleration: 0.005 * (1 + 0.5 * Math.random()), range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(), endCycle: Infinity, @@ -3460,7 +3461,7 @@ const b = { } else { //close to player Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity if (this.lastLookCycle < simulation.cycle && !m.isCloak) { - this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 21 : 110) + this.lastLookCycle = simulation.cycle + this.delay for (let i = 0, len = mob.length; i < len; i++) { const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)); if ( @@ -3503,7 +3504,7 @@ const b = { minDmgSpeed: 2, lookFrequency: 27 + Math.ceil(6 * Math.random()), cd: 0, - delay: 70, + delay: Math.floor(65 * b.fireCDscale), range: 70 + 3 * b.totalBots(), endCycle: Infinity, classType: "bullet", @@ -3579,7 +3580,7 @@ const b = { minDmgSpeed: 2, lookFrequency: 60 + Math.floor(17 * Math.random()) - 40 * tech.isFoamBotUpgrade, cd: 0, - delay: 100, + delay: Math.floor(105 * b.fireCDscale), acceleration: 0.005 * (1 + 0.5 * Math.random()), range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(), endCycle: Infinity, diff --git a/js/level.js b/js/level.js index 2c0629c..d6fdce2 100644 --- a/js/level.js +++ b/js/level.js @@ -16,10 +16,10 @@ 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("mine") - // tech.giveTech("spherical harmonics") + // b.giveGuns("laser") + // tech.giveTech("tokamak") // tech.giveTech("relative permittivity") - // tech.giveTech("causality bombs") + // tech.giveTech("palantír") // for (let i = 0; i < 2; i++) tech.giveTech("refractory metal") // tech.giveTech("antiscience") // for (let i = 0; i < 1; i++) tech.giveTech("reticulum") @@ -2311,8 +2311,23 @@ 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.historyBoss(1700, -500) - spawn.shooterBoss(3200, -500) + + // spawn.spiderBoss(1700, -500) + // spawn.launcherBoss(3200, -500) + spawn.laserTargetingBoss(1700, -500) + spawn.powerUpBoss(3200, -500) + // spawn.snakeBoss(1700, -500) + // spawn.streamBoss(3200, -500) + // spawn.pulsarBoss(1700, -500) + // spawn.spawnerBossCulture(3200, -500) + // spawn.grenadierBoss(1700, -500) + // spawn.growBossCulture(3200, -500) + // spawn.blinkBoss(1700, -500) + // spawn.snakeSpitBoss(3200, -500) + // spawn.laserBombingBoss(1700, -500) + // spawn.launcherBoss(3200, -500) + // spawn.blockBoss(1700, -500) + // spawn.slashBoss(3200, -500) // for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40); // for (let i = 0; i < 5; i++) spawn.focuser(1900, -500) // spawn.slashBoss(1900, -500) diff --git a/js/player.js b/js/player.js index 9dd5773..1e7b386 100644 --- a/js/player.js +++ b/js/player.js @@ -299,7 +299,17 @@ const m = { }, alive: false, switchWorlds() { - const totalGuns = b.inventory.length //- tech.isRewindGun //count guns, but not CPT gun + const totalGuns = b.inventory.length + //track ammo/ ammoPack count + let ammoCount = 0 + for (let i = 0, len = b.inventory.length; i < len; i++) { + if (b.guns[b.inventory[i]].ammo !== Infinity) { + ammoCount += b.guns[b.inventory[i]].ammo / b.guns[b.inventory[i]].ammoPack + } else { + ammoCount += 5 + } + } + simulation.isTextLogOpen = false; //prevent console spam //remove all tech and count current tech total let totalTech = 0; @@ -345,15 +355,7 @@ const m = { //randomize field m.setField(Math.ceil(Math.random() * (m.fieldUpgrades.length - 1))) - //track ammo/ ammoPack count - let ammoCount = 0 - for (let i = 0, len = b.inventory.length; i < len; i++) { - if (b.guns[b.inventory[i]].ammo !== Infinity) { - ammoCount += b.guns[b.inventory[i]].ammo / b.guns[b.inventory[i]].ammoPack - } else { - ammoCount += 5 - } - } + //removes guns and ammo b.inventory = []; b.activeGun = null; @@ -367,7 +369,7 @@ const m = { //randomize ammo based on ammo/ammoPack count for (let i = 0, len = b.inventory.length; i < len; i++) { - if (b.guns[b.inventory[i]].ammo !== Infinity) b.guns[b.inventory[i]].ammo = Math.max(0, Math.floor(ammoCount / b.inventory.length * b.guns[b.inventory[i]].ammoPack * (1.05 + 0.5 * (Math.random() - 0.5)))) + if (b.guns[b.inventory[i]].ammo !== Infinity) b.guns[b.inventory[i]].ammo = Math.max(0, Math.floor(ammoCount / b.inventory.length * b.guns[b.inventory[i]].ammoPack * (1.05 + 0.3 * (Math.random() - 0.5)))) } //randomize tech @@ -1136,40 +1138,66 @@ const m = { if (m.fireCDcycle < m.cycle) m.fireCDcycle = m.cycle m.throwCharge += 0.5 * (tech.throwChargeRate / b.fireCDscale + 2 * tech.isAddBlockMass) / m.holdingTarget.mass if (m.throwCharge < 6) m.energy -= 0.001 / tech.throwChargeRate / b.fireCDscale; // m.throwCharge caps at 5 - //draw charge - const x = m.pos.x + 15 * Math.cos(m.angle); - const y = m.pos.y + 15 * Math.sin(m.angle); - const len = m.holdingTarget.vertices.length - 1; - const edge = m.throwCharge * m.throwCharge * m.throwCharge; - const grd = ctx.createRadialGradient(x, y, edge, x, y, edge + 5); - grd.addColorStop(0, "rgba(255,50,150,0.3)"); - grd.addColorStop(1, "transparent"); - ctx.fillStyle = grd; - ctx.beginPath(); - ctx.moveTo(x, y); - ctx.lineTo(m.holdingTarget.vertices[len].x, m.holdingTarget.vertices[len].y); - ctx.lineTo(m.holdingTarget.vertices[0].x, m.holdingTarget.vertices[0].y); - ctx.fill(); - for (let i = 0; i < len; i++) { + + //trajectory path prediction + if (tech.isTokamak) { + //draw charge + if (m.throwCharge > 4) { + + const x = m.pos.x + 15 * Math.cos(m.angle); + const y = m.pos.y + 15 * Math.sin(m.angle); + const len = m.holdingTarget.vertices.length - 1; + ctx.fillStyle = "rgba(200,0,255,0.3)"; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(m.holdingTarget.vertices[len].x, m.holdingTarget.vertices[len].y); + ctx.lineTo(m.holdingTarget.vertices[0].x, m.holdingTarget.vertices[0].y); + ctx.fill(); + for (let i = 0; i < len; i++) { + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(m.holdingTarget.vertices[i].x, m.holdingTarget.vertices[i].y); + ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y); + ctx.fill(); + } + + } + } else { + //draw charge + const x = m.pos.x + 15 * Math.cos(m.angle); + const y = m.pos.y + 15 * Math.sin(m.angle); + const len = m.holdingTarget.vertices.length - 1; + const edge = m.throwCharge * m.throwCharge * m.throwCharge; + const grd = ctx.createRadialGradient(x, y, edge, x, y, edge + 5); + grd.addColorStop(0, "rgba(255,50,150,0.3)"); + grd.addColorStop(1, "transparent"); + ctx.fillStyle = grd; ctx.beginPath(); ctx.moveTo(x, y); - ctx.lineTo(m.holdingTarget.vertices[i].x, m.holdingTarget.vertices[i].y); - ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y); + ctx.lineTo(m.holdingTarget.vertices[len].x, m.holdingTarget.vertices[len].y); + ctx.lineTo(m.holdingTarget.vertices[0].x, m.holdingTarget.vertices[0].y); ctx.fill(); + for (let i = 0; i < len; i++) { + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(m.holdingTarget.vertices[i].x, m.holdingTarget.vertices[i].y); + ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y); + ctx.fill(); + } + //trajectory 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() } - //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() } @@ -1178,7 +1206,7 @@ const m = { m.fieldCDcycle = m.cycle + 15; m.isHolding = false; - if (tech.isTokamak && m.throwCharge > 3) { //remove the block body and pulse in the direction you are facing + if (tech.isTokamak && m.throwCharge > 4) { //remove the block body and pulse in the direction you are facing //m.throwCharge > 5 seems to be when the field full colors in a block you are holding m.throwCycle = m.cycle + 180 //used to detect if a block was thrown in the last 3 seconds if (m.immuneCycle < m.cycle) m.energy += 0.25 * Math.sqrt(m.holdingTarget.mass) * Math.min(5, m.throwCharge) @@ -2339,7 +2367,7 @@ const m = { m.grabPowerUp(); m.lookForPickUp(); - m.drain += 0.0000025 + m.drain += 0.0000025 //also increases inside tech.isTimeSkip if (m.energy > m.drain) { m.energy -= m.drain; if (m.energy < m.drain) { @@ -2370,7 +2398,10 @@ const m = { simulation.cycle--; //pause all functions that depend on game cycle increasing if (tech.isTimeSkip) { - if (m.immuneCycle < m.cycle + 10) m.immuneCycle = m.cycle + 10; + m.immuneCycle = 0; + m.drain += 0.0000025 + m.regenEnergy(); //immunity disables normal regen, so turn off immunity for just this function + m.immuneCycle = m.cycle + 10; simulation.isTimeSkipping = true; m.cycle++; simulation.gravity(); diff --git a/js/spawn.js b/js/spawn.js index d1c36f6..4c5d60d 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -922,7 +922,7 @@ const spawn = { Matter.Body.setDensity(me, 0.00035) // normal density is 0.001 // this reduces life by half and decreases knockback const k = 642 //k=r^2/m me.split = function() { - Matter.Body.scale(this, 0.4, 0.4); + Matter.Body.scale(this, 0.45, 0.45); this.radius = Math.sqrt(this.mass * k / Math.PI) spawn.cellBoss(this.position.x, this.position.y, this.radius, this.cellID); mob[mob.length - 1].health = this.health @@ -932,9 +932,9 @@ const spawn = { this.split(); }; me.onDamage = function(dmg) { - if (Math.random() < 0.33 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split(); + if (Math.random() < 0.34 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split(); } - me.damageReduction = 0.18 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1); //me.damageReductionGoal + me.damageReduction = 0.17 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1); //me.damageReductionGoal me.do = function() { // // this.armor(); if (!m.isBodiesAsleep) { diff --git a/js/tech.js b/js/tech.js index 9db6c7d..9ee4e32 100644 --- a/js/tech.js +++ b/js/tech.js @@ -450,6 +450,38 @@ }, remove() {} }, + { + name: "applied science", + description: `spawn ${powerUps.orb.research(1)} and get a random tech
for each gun in your inventory`, + maxCount: 9, + count: 0, + isNonRefundable: true, + frequency: 2, + frequencyDefault: 2, + allowed() { + return b.inventory.length > 1 + }, + requires: "NOT EXPERIMENT MODE, at least 2 guns", + effect() { + for (let i = 0; i < b.inventory.length; i++) { + //spawn a research for each gun + powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false); + //find a gun tech for this gun + const gunTechPool = [] + for (let j = 0; j < tech.tech.length; j++) { + if (tech.tech[j].isGunTech && tech.tech[j].allowed && !tech.tech[j].isJunk && !tech.tech[j].isBadRandomOption && tech.tech[j].count < tech.tech[j].maxCount) { + const regex = tech.tech[j].requires.search(b.guns[b.inventory[i]].name) //get string index of gun name + const not = tech.tech[j].requires.search(' not ') //get string index of ' not ' + //look for the gun name in the requirements, but the gun name needs to show up before the word ' not ' + if (regex !== -1 && (not === -1 || not > regex)) gunTechPool.push(j) + // console.log(gunName, regex, not, tech.tech[j].name) + } + } + if (gunTechPool.length) tech.giveTech(gunTechPool[Math.floor(Math.random() * gunTechPool.length)]) // choose from the gun pool + } + }, + remove() {} + }, { name: "logistics", description: `${powerUps.orb.ammo()} give 80% more ammo, but
it's only added to your current gun`, @@ -3737,7 +3769,7 @@ allowed() { return tech.isNeedles || tech.isNeedleShot }, - requires: "needle gun, needle-shot", + requires: "nail gun, needle gun, needle-shot", effect() { tech.isNeedleIce = true }, @@ -3756,7 +3788,7 @@ allowed() { return tech.haveGunCheck("harpoon") || (tech.isNeedles || tech.isNeedleShot) }, - requires: "needle gun, needle-shot, harpoon", + requires: "nail gun, needle gun, needle-shot, harpoon", effect() { tech.isNeedleShieldPierce = true }, @@ -3847,7 +3879,7 @@ allowed() { return tech.isRivets }, - requires: "rivet gun", + requires: "nail gun, rivet gun", effect() { tech.rivetSize += 0.2 }, @@ -3959,7 +3991,7 @@ allowed() { return (tech.isNailShot || tech.isNeedleShot || tech.nailBotCount > 1 || tech.haveGunCheck("nail gun")) }, - requires: "nails", + requires: "nail gun, nails", effect() { tech.isNailCrit = true }, @@ -3979,7 +4011,7 @@ allowed() { return tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce) + tech.isNeedleShot + tech.isNailShot) * 2 > 1 }, - requires: "nails, rivets, not ceramic needles", + requires: "nail gun, nails, rivets, not ceramic needles", effect() { tech.isNailRadiation = true; }, @@ -4098,7 +4130,7 @@ allowed() { return (tech.haveGunCheck("shotgun") || tech.haveGunCheck("railgun")) && !tech.isShotgunRecoil }, - requires: "shotgun or railgun, not Newton's 3rd law", + requires: "shotgun, railgun, not Newton's 3rd law", effect() { tech.isShotgunReversed = true; }, @@ -4386,8 +4418,8 @@ isGunTech: true, maxCount: 1, count: 0, - frequency: 4, - frequencyDefault: 4, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.haveGunCheck("matter wave") && !tech.isPhaseVelocity && !tech.isBulletTeleport }, @@ -4426,12 +4458,12 @@ isGunTech: true, maxCount: 1, count: 0, - frequency: 4, - frequencyDefault: 4, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isLongitudinal }, - requires: "phonon", + requires: "matter wave, phonon", effect() { tech.is360Longitudinal = true; for (i = 0, len = b.guns.length; i < len; i++) { //find which gun @@ -4477,14 +4509,14 @@ isGunTech: true, maxCount: 1, count: 0, - frequency: 3, - frequencyDefault: 3, + frequency: 2, + frequencyDefault: 2, isBot: true, isBotTech: true, allowed() { return tech.haveGunCheck("missiles", false) }, - requires: "missile gun", + requires: "missiles", effect() { tech.missileBotCount++; b.missileBot(); @@ -4566,12 +4598,12 @@ isGunTech: true, maxCount: 1, count: 0, - frequency: 1, - frequencyDefault: 1, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isVacuumBomb && !tech.isExplodeRadio }, - requires: "vacuum bomb, not iridium-192", + requires: "grenades, vacuum bomb, not iridium-192", effect() { tech.isBlockExplode = true; //chain reaction }, @@ -4611,7 +4643,7 @@ allowed() { return tech.isNeutronBomb }, - requires: "neutron bomb", + requires: "grenades, neutron bomb", effect() { tech.isNeutronSlow = true }, @@ -4736,7 +4768,7 @@ allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField }, - requires: "spores", + requires: "spore gun, spores", effect() { tech.isFastSpores = true }, @@ -4756,7 +4788,7 @@ allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormShot }, - requires: "spores or worms", + requires: "spore gun, spores or worms", effect() { tech.isSporeFreeze = true }, @@ -4775,7 +4807,7 @@ allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormShot }, - requires: "spores or worms", + requires: "spore gun, spores or worms", effect() { tech.isSporeFollow = true }, @@ -4794,7 +4826,7 @@ allowed() { return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField) && !tech.isEnergyHealth || tech.isWormShot }, - requires: "spores, worms, not mass-energy", + requires: "spore gun, spores, worms, not mass-energy", effect() { tech.isMutualism = true }, @@ -4813,7 +4845,7 @@ allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormholeSpores }, - requires: "spores", + requires: "spore gun, spores", effect() { tech.isSporeWorm = true }, @@ -4832,7 +4864,7 @@ allowed() { return tech.isSporeWorm || tech.isWormShot }, - requires: "worms", + requires: "spore gun, worms", effect() { tech.wormSurviveDmg = true }, @@ -4851,7 +4883,7 @@ allowed() { return tech.haveGunCheck("drones", false) || tech.isForeverDrones }, - requires: "drone gun or fault tolerance", + requires: "drones, fault tolerance", effect() { const num = 8 tech.isForeverDrones += num @@ -4937,7 +4969,7 @@ allowed() { return tech.haveGunCheck("drones") }, - requires: "drone gun", + requires: "drones", effect() { tech.isDroneRespawn = true }, @@ -4956,7 +4988,7 @@ allowed() { return (tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) && !tech.isDroneRadioactive && !tech.isIncendiary }, - requires: "drone gun, molecular assembler, not irradiated drones, incendiary", + requires: "drones, molecular assembler, not irradiated drones, incendiary", effect() { tech.isDroneTeleport = true }, @@ -4975,7 +5007,7 @@ allowed() { return tech.isDroneTeleport }, - requires: "brushless motor", + requires: "drones, brushless motor", effect() { tech.isDroneFastLook = true }, @@ -5030,7 +5062,7 @@ allowed() { return tech.isDroneRadioactive }, - requires: "irradiated drones", + requires: "drones irradiated drones", effect() { tech.droneRadioDamage = 2 }, @@ -5050,7 +5082,7 @@ allowed() { return tech.isDroneRadioactive }, - requires: "irradiated drones", + requires: "drones, irradiated drones", effect() { tech.isFastDrones = true }, @@ -5147,7 +5179,7 @@ allowed() { return tech.haveGunCheck("foam") }, - requires: "foam gun", + requires: "foam", effect() { tech.foamFutureFire++ }, @@ -5166,7 +5198,7 @@ allowed() { return tech.haveGunCheck("foam") }, - requires: "foam gun", + requires: "foam", effect() { tech.isAmmoFoamSize = true }, @@ -5185,7 +5217,7 @@ isBot: true, isBotTech: true, isNonRefundable: true, - requires: "NOT EXPERIMENT MODE, foam gun, no other bot upgrades", + requires: "foam gun, not bot upgrades NOT EXPERIMENT MODE,", allowed() { return tech.haveGunCheck("foam", false) && !b.hasBotUpgrade() }, @@ -5533,7 +5565,7 @@ allowed() { return tech.isWideLaser }, - requires: "diffuse beam", + requires: "laser gun, diffuse beam", effect() { tech.wideLaser += 2 for (i = 0, len = b.guns.length; i < len; i++) { //find which gun @@ -5618,7 +5650,7 @@ allowed() { return tech.isPulseLaser && !tech.beamSplitter }, - requires: "pulse, not diffraction grating", + requires: "laser gun, pulse, not diffraction grating", effect() { tech.isPulseAim = true; }, @@ -6315,7 +6347,7 @@ }, { name: "timelike", - description: "time dilation doubles your relative time rate
and makes you immune to harm", + description: "time dilation doubles your relative time rate
and makes you immune to harm", isFieldTech: true, maxCount: 1, count: 0, @@ -6327,11 +6359,9 @@ requires: "time dilation, not retrocausality", effect() { tech.isTimeSkip = true; - b.setFireCD(); }, remove() { tech.isTimeSkip = false; - b.setFireCD(); } }, { @@ -6980,6 +7010,72 @@ // }, // remove() {} // }, + { + name: "palantír", + description: `see far away lands`, + maxCount: 1, + count: 0, + frequency: 0, + isNonRefundable: true, + isExperimentHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + m.look = () => { + //always on mouse look + m.angle = Math.atan2( + simulation.mouseInGame.y - m.pos.y, + simulation.mouseInGame.x - m.pos.x + ); + //smoothed mouse look translations + const scale = 2; + m.transSmoothX = canvas.width2 - m.pos.x - (simulation.mouse.x - canvas.width2) * scale; + m.transSmoothY = canvas.height2 - m.pos.y - (simulation.mouse.y - canvas.height2) * scale; + m.transX += (m.transSmoothX - m.transX) * m.lookSmoothing; + m.transY += (m.transSmoothY - m.transY) * m.lookSmoothing; + } + }, + remove() { + if (this.count) m.look = m.lookDefault + } + }, + { + name: "motion sickness", + description: `disable camera smoothing`, + maxCount: 1, + count: 0, + frequency: 0, + isNonRefundable: true, + isExperimentHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + m.look = () => { + //always on mouse look + m.angle = Math.atan2( + simulation.mouseInGame.y - m.pos.y, + simulation.mouseInGame.x - m.pos.x + ); + //smoothed mouse look translations + const scale = 1.2; + m.transSmoothX = canvas.width2 - m.pos.x - (simulation.mouse.x - canvas.width2) * scale; + m.transSmoothY = canvas.height2 - m.pos.y - (simulation.mouse.y - canvas.height2) * scale; + m.transX = canvas.width2 - m.pos.x - (simulation.mouse.x - canvas.width2) * scale; + m.transY = canvas.height2 - m.pos.y - (simulation.mouse.y - canvas.height2) * scale; + // m.transX += (m.transSmoothX - m.transX) * m.lookSmoothing; + // m.transY += (m.transSmoothY - m.transY) * m.lookSmoothing; + } + }, + remove() { + if (this.count) m.look = m.lookDefault + } + }, { name: "planetesimals", description: `play planetesimals
(an annoying asteroids game with Newtonian physics)
clearing a level in planetesimals spawns a tech in n-gon
but, if you die in planetesimals you die in n-gon`, diff --git a/todo.txt b/todo.txt index 5ef1d5c..915524a 100644 --- a/todo.txt +++ b/todo.txt @@ -1,23 +1,18 @@ ******************************************************** NEXT PATCH ************************************************** -block throwing and mines when crouched now have trajectory prediction, like grenades +tech: applied science - gives a random gun tech and a research for each gun in your inventory -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 +JUNK tech - motion sickness - disable camera smoothing +JUNK tech - palantír - see far away -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 +foam-bot, nail-bot, missile-bot: are now affected by fire delay tech + this gives some options for late game bot scaling + +timelike now allows some energy regen while immune to harm in double time +Tokamak now overrides the trajectory throw graphics with its own ******************************************************** 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