From dc94bf871d463960b9ec7648e18412d28b37d16b Mon Sep 17 00:00:00 2001 From: landgreen Date: Sun, 7 Feb 2021 06:20:58 -0800 Subject: [PATCH] replication tech change: commodities exchange 6 -> 8 power ups on cancel tech change: MIRV - doesn't reduce the missile size as much, has a better missile spread, and a very short fire delay tech: replication - gain 8% duplication, but add in 10 junk tech to the pool added several new junk tech (18 possible junk tech now) --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 67 ++++++++--- js/level.js | 2 +- js/player.js | 4 +- js/powerup.js | 2 +- js/simulation.js | 6 +- js/spawn.js | 2 +- js/tech.js | 295 +++++++++++++++++++++++++++++++++++++++++------ style.css | 2 +- todo.txt | 31 +++-- 10 files changed, 336 insertions(+), 75 deletions(-) diff --git a/.DS_Store b/.DS_Store index e8e965fcec6b2d812489726ac1c02ac483e37d99..392d3dcc375524f62639cea6020752ba9cf168ea 100644 GIT binary patch delta 21 ccmZoMXffEJ#mpq-GFgY&kFj8LHFKv307AtD^#A|> delta 21 ccmZoMXffEJ#mvN^H(7_-k1=6$HFKv306=pEy#N3J diff --git a/js/bullet.js b/js/bullet.js index ed1ac9b..98bdbf8 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -3519,33 +3519,62 @@ const b = { if (m.crouch) { m.fireCDcycle = m.cycle + 10 * b.fireCD / countReduction; // cool down - const size = countReduction * (tech.missileSize ? 1.32 : 0.88) - const where = { - x: m.pos.x, - y: m.pos.y - 40 - } - for (let i = 0; i < tech.missileCount; i++) { - b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, size) - bullet[bullet.length - 1].force.x += 0.004 * size * (i - (tech.missileCount - 1) / 2); + // for (let i = 0; i < tech.missileCount; i++) { + // b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction)) + // bullet[bullet.length - 1].force.x += 0.004 * countReduction * (i - (tech.missileCount - 1) / 2); + // } + + if (tech.missileCount > 1) { + for (let i = 0; i < tech.missileCount; i++) { + setTimeout(() => { + const where = { + x: m.pos.x, + y: m.pos.y - 40 + } + b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction)) + bullet[bullet.length - 1].force.x += 0.025 * countReduction * (i - (tech.missileCount - 1) / 2); + }, 20 * tech.missileCount * Math.random()); + } + } else { + const where = { + x: m.pos.x, + y: m.pos.y - 40 + } + b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5), -2) } } else { m.fireCDcycle = m.cycle + 50 * b.fireCD / countReduction; // cool down - - const size = countReduction * (tech.missileSize ? 1.5 : 1) const direction = { x: Math.cos(m.angle), y: Math.sin(m.angle) } - const push = Vector.mult(Vector.perp(direction), 0.02 * size / Math.sqrt(tech.missileCount)) - const where = { - x: m.pos.x + 40 * direction.x, - y: m.pos.y + 40 * direction.y - } - for (let i = 0; i < tech.missileCount; i++) { - b.missile(where, m.angle, 0, size) - bullet[bullet.length - 1].force.x += push.x * (i - (tech.missileCount - 1) / 2); - bullet[bullet.length - 1].force.y += push.y * (i - (tech.missileCount - 1) / 2); + const push = Vector.mult(Vector.perp(direction), 0.08 * countReduction / Math.sqrt(tech.missileCount)) + if (tech.missileCount > 1) { + for (let i = 0; i < tech.missileCount; i++) { + setTimeout(() => { + const where = { + x: m.pos.x + 40 * direction.x, + y: m.pos.y + 40 * direction.y + } + b.missile(where, m.angle, 0, Math.sqrt(countReduction)) + bullet[bullet.length - 1].force.x += push.x * (i - (tech.missileCount - 1) / 2); + bullet[bullet.length - 1].force.y += push.y * (i - (tech.missileCount - 1) / 2); + }, 40 * tech.missileCount * Math.random()); + } + } else { + const where = { + x: m.pos.x + 40 * direction.x, + y: m.pos.y + 40 * direction.y + } + b.missile(where, m.angle, 0) } + // for (let i = 0; i < tech.missileCount; i++) { + // setTimeout(() => { + // b.missile(where, m.angle, 0, size) + // bullet[bullet.length - 1].force.x += push.x * (i - (tech.missileCount - 1) / 2); + // bullet[bullet.length - 1].force.y += push.y * (i - (tech.missileCount - 1) / 2); + // }, i * 50); + // } } diff --git a/js/level.js b/js/level.js index 32fcdec..c8f2a79 100644 --- a/js/level.js +++ b/js/level.js @@ -97,7 +97,7 @@ const level = { powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal", false); } if (tech.isPerpetualStun) { - for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 600) + for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 780) } if (tech.isGunCycle) { b.inventoryGun++; diff --git a/js/player.js b/js/player.js index a168577..5568105 100644 --- a/js/player.js +++ b/js/player.js @@ -502,7 +502,7 @@ const m = { if (tech.isSlowFPS) dmg *= 0.8 if (tech.isPiezo) dmg *= 0.85 if (tech.isHarmReduce && m.fieldUpgrades[m.fieldMode].name === "negative mass field" && m.isFieldActive) dmg *= 0.6 - if (tech.isBotArmor) dmg *= 0.97 ** tech.totalBots() + if (tech.isBotArmor) dmg *= 0.96 ** tech.totalBots() if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.6 if (tech.energyRegen === 0) dmg *= 0.4 @@ -605,7 +605,7 @@ const m = { simulation.fpsInterval = 1000 / simulation.fpsCap; m.defaultFPSCycle = m.cycle if (tech.isRewindBot) { - const len = steps * 0.042 * tech.isRewindBot + const len = steps * 0.052 * tech.isRewindBot for (let i = 0; i < len; i++) { const where = m.history[Math.abs(m.cycle - i * 40) % 600].position //spread out spawn locations along past history b.randomBot({ diff --git a/js/powerup.js b/js/powerup.js index ac81a12..7e9e878 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -38,7 +38,7 @@ const powerUps = { if (isCanceled) { if (tech.isCancelDuplication) tech.cancelCount++ if (tech.isCancelRerolls) { - for (let i = 0; i < 6; i++) { + for (let i = 0; i < 8; i++) { let spawnType = (m.health < 0.25 || tech.isEnergyNoAmmo) ? "heal" : "ammo" if (Math.random() < 0.33) { spawnType = "heal" diff --git a/js/simulation.js b/js/simulation.js index 15aaf9d..5074ef6 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -324,7 +324,7 @@ const simulation = { // --> // SVGleftMouse: ' ', // SVGrightMouse: ' ', - makeTextLog(text, time = 120) { + makeTextLog(text, time = 180) { if (simulation.isTextLogOpen && !build.isExperimentSelection) { if (simulation.lastLogTime > m.cycle) { //if there is an older message document.getElementById("text-log").innerHTML = document.getElementById("text-log").innerHTML + '
' + text; @@ -359,9 +359,9 @@ const simulation = { }, switchGun() { if (tech.isGunSwitchField) { - const energy = m.energy + // const energy = m.energy + // m.energy = energy //field swap sets energy to max, this undoes that m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field - m.energy = energy //field swap sets energy to max, this undoes that //update text to show next field for (let i = tech.tech.length - 1; i > 0; i--) { diff --git a/js/spawn.js b/js/spawn.js index faff7a6..a6ac7dd 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -232,7 +232,7 @@ const spawn = { this.eventHorizon = 750 this.spawnInterval = 600 this.rotateVelocity = 0.001 * (player.position.x > this.position.x ? 1 : -1) //rotate so that the player can get away - if (!this.isShielded) spawn.shield(this, x, y, 1); //regen shield here ? + // if (!this.isShielded) spawn.shield(this, x, y, 1); //regen shield here ? this.modeDo = this.modeAll } // } diff --git a/js/tech.js b/js/tech.js index eaca70b..df07070 100644 --- a/js/tech.js +++ b/js/tech.js @@ -24,6 +24,23 @@ const tech = { if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1) } }, + addJunkTechToPool(num = 1) { + for (let i = 0; i < num; i++) { + // find an index that doesn't have dups first + let index = null + for (let i = 0; i < tech.junk.length; i++) { + if (tech.junk[i].numberInPool === 0) { + index = i + break + } + } + if (index === null) index = Math.floor(Math.random() * tech.junk.length) //or just pick a random junk tech to add + + tech.junk[index].numberInPool++ + tech.tech.push(Object.assign({}, tech.junk[index])) // push a "clone" of the tech.junk into the pool + if (tech.junk[index].numberInPool > 1) tech.tech[tech.tech.length - 1].name += `(${tech.junk[index].numberInPool})` //give it a unique name so it can be found + } + }, removeJunkTechFromPool() { for (let i = tech.tech.length - 1; i > 0; i--) { if (tech.tech[i].isJunk && tech.tech[i].count === 0) tech.tech.splice(i, 1) @@ -89,7 +106,7 @@ const tech = { if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5 if (tech.isMaxEnergyTech) dmg *= 1.4 if (tech.isEnergyNoAmmo) dmg *= 1.5 - if (tech.isDamageForGuns) dmg *= 1 + 0.13 * b.inventory.length + if (tech.isDamageForGuns) dmg *= 1 + 0.15 * b.inventory.length if (tech.isLowHealthDmg) dmg *= 1 + 0.6 * Math.max(0, 1 - m.health) if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3; if (tech.isEnergyLoss) dmg *= 1.5; @@ -101,7 +118,7 @@ const tech = { if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25 if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 1.66 if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.4, player.speed * 0.013) - if (tech.isBotDamage) dmg *= 1 + 0.02 * tech.totalBots() + if (tech.isBotDamage) dmg *= 1 + 0.04 * tech.totalBots() return dmg * tech.slowFire * tech.aimDamage }, duplicationChance() { @@ -162,7 +179,7 @@ const tech = { }, { name: "arsenal", - description: "increase damage by 13%
for each gun in your inventory", + description: "increase damage by 15%
for each gun in your inventory", maxCount: 1, count: 0, allowed() { @@ -981,7 +998,7 @@ const tech = { }, { name: "perimeter defense", - description: "reduce harm by 3%
for each of your permanent bots", + description: "reduce harm by 4%
for each of your permanent bots", maxCount: 1, count: 0, allowed() { @@ -996,7 +1013,7 @@ const tech = { } }, { name: "network effect", - description: "increase damage by 2%
for each of your permanent bots", + description: "increase damage by 4%
for each of your permanent bots", maxCount: 1, count: 0, allowed() { @@ -1074,7 +1091,7 @@ const tech = { }, { name: "perpetual stun", - description: "stun all mobs for up to 10 seconds
at the start of each level", + description: "stun all mobs for up to 12 seconds
at the start of each level", maxCount: 1, count: 0, allowed() { @@ -1763,31 +1780,32 @@ const tech = { if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal } }, - // { - // name: "stimulated emission", - // description: "6% chance to duplicate spawned power ups
duplication chance can't exceed 100%", - // maxCount: 9, - // count: 0, - // allowed() { - // return tech.duplicationChance() < 1 - // }, - // requires: "below 100% duplication chance", - // effect() { - // tech.duplicateChance += 0.06 - // simulation.draw.powerUp = simulation.draw.powerUpBonus //change power up draw - // }, - // remove() { - // tech.duplicateChance = 0 - // if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal - // } - // }, + { + name: "replication", + description: "8% chance to duplicate spawned power ups
add 10 junk tech to the potential pool", + maxCount: 9, + count: 0, + allowed() { + return tech.duplicationChance() < 1 + }, + requires: "below 100% duplication chance", + effect() { + tech.duplicateChance += 0.08 + simulation.draw.powerUp = simulation.draw.powerUpBonus //change power up draw + tech.addJunkTechToPool(10) + }, + remove() { + tech.duplicateChance = 0 + if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal + } + }, { name: "futures exchange", description: "clicking × to cancel a field, tech, or gun
adds 4.5% power up duplication chance", maxCount: 1, count: 0, allowed() { - return tech.duplicationChance() < 1 && !tech.isDeterminism + return tech.duplicationChance() < 1 && !tech.isDeterminism && (level.levelsCleared < 5 || Math.random() < 0.5) }, requires: "below 100% duplication chance, not determinism", effect() { @@ -1803,7 +1821,7 @@ const tech = { }, { name: "commodities exchange", - description: "clicking × to cancel a field, tech, or gun
spawns 6 heals, ammo, and research", + description: "clicking × to cancel a field, tech, or gun
spawns 8 heals, ammo, and research", maxCount: 1, count: 0, allowed() { @@ -1897,9 +1915,7 @@ const tech = { } const choose = have[Math.floor(Math.random() * have.length)] simulation.makeTextLog(`tech.remove("${tech.tech[choose].name}")`) - for (let i = 0; i < tech.tech[choose].count; i++) { - powerUps.spawn(m.pos.x, m.pos.y, "tech"); - } + for (let i = 0; i < tech.tech[choose].count; i++) powerUps.spawn(m.pos.x, m.pos.y, "tech"); powerUps.spawn(m.pos.x, m.pos.y, "tech"); tech.tech[choose].count = 0; tech.tech[choose].remove(); // remove a random tech form the list of tech you have @@ -1924,7 +1940,7 @@ const tech = { simulation.makeTextLog(`m.research -= 2
${powerUps.research.count}`) const chanceStore = tech.duplicateChance - tech.duplicateChance = (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.04 + m.duplicateChance + tech.duplicateChance * 2 //increase duplication chance to simulate doubling all 3 sources of duplication chance + tech.duplicateChance = (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.045 + m.duplicateChance + tech.duplicateChance * 2 //increase duplication chance to simulate doubling all 3 sources of duplication chance powerUps.spawn(m.pos.x, m.pos.y, "tech"); tech.duplicateChance = chanceStore }, @@ -1981,7 +1997,7 @@ const tech = { }, { name: "dark patterns", - description: "reduce combat difficulty by 1 level
add several junk tech to the potential pool", + description: "reduce combat difficulty by 1 level
add 16 junk tech to the potential pool", maxCount: 1, isNonRefundable: true, isCustomHide: true, @@ -1992,7 +2008,9 @@ const tech = { requires: "no research, and in the first 5 levels", effect() { level.difficultyDecrease(simulation.difficultyMode) - for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i]) + simulation.makeTextLog(`simulation.difficultyMode--`) + tech.addJunkTechToPool(16) + // for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i]) }, remove() {} }, @@ -2966,7 +2984,7 @@ const tech = { maxCount: 1, count: 0, allowed() { - return (tech.haveGunCheck("mine") && !tech.isMineAmmoBack && !tech.isLaserMine) || tech.isMineDrop + return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineAmmoBack && !tech.isLaserMine }, requires: "mines, not mine reclamation, laser-mines", effect() { @@ -3280,12 +3298,12 @@ const tech = { effect() { tech.laserReflections++; tech.laserDamage += 0.08; //base is 0.12 - tech.laserFieldDrain += 0.0008 //base is 0.002 + tech.laserFieldDrain += 0.0009 //base is 0.002 }, remove() { tech.laserReflections = 2; tech.laserDamage = 0.16; - tech.laserFieldDrain = 0.0016; + tech.laserFieldDrain = 0.0018; } }, { @@ -4166,6 +4184,7 @@ const tech = { // description: "", // maxCount: 9, // count: 0, + // numberInPool: 0, // isNonRefundable: true, // isCustomHide: true, // isJunk: true, @@ -4178,11 +4197,159 @@ const tech = { // }, // remove() {} // }, + { + name: "energy to mass conversion", + description: "convert your energy into blocks", + maxCount: 9, + count: 0, + numberInPool: 0, + isNonRefundable: true, + isCustomHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + for (let i = 0, len = Math.floor(m.energy * 40); i < len; i++) { + setTimeout(() => { + m.energy -= 1 / len + const index = body.length + where = Vector.add(m.pos, { x: 400 * (Math.random() - 0.5), y: 400 * (Math.random() - 0.5) }) + spawn.bodyRect(where.x, where.y, Math.floor(15 + 100 * Math.random()), Math.floor(15 + 100 * Math.random())); + body[index].collisionFilter.category = cat.body; + body[index].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet + body[index].classType = "body"; + World.add(engine.world, body[index]); //add to world + }, i * 100); + } + + }, + remove() {} + }, + { + name: "level.nextLevel()", + description: "teleport to the start of the next level", + maxCount: 9, + count: 0, + numberInPool: 0, + isNonRefundable: true, + isCustomHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + simulation.clearTimeouts(); + level.nextLevel(); + }, + remove() {} + }, + { + name: "expert system", + description: "spawn a tech power up
add 64 junk tech to the potential pool", + maxCount: 9, + count: 0, + numberInPool: 0, + isNonRefundable: true, + isCustomHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + powerUps.spawn(m.pos.x, m.pos.y, "tech"); + tech.addJunkTechToPool(64) + }, + remove() {} + }, + { + name: "energy investment", + description: "every 10 seconds drain your energy and return it doubled 10 seconds later
lasts 180 seconds", + maxCount: 9, + count: 0, + numberInPool: 0, + isNonRefundable: true, + isCustomHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + for (let i = 0; i < 18; i++) { + setTimeout(() => { //drain energy + const energy = m.energy + m.energy = 0 + setTimeout(() => { //return energy + m.energy += 2 * energy + }, 5000); + }, i * 10000); + } + }, + remove() {} + }, + { + name: "missile Launching System", + description: "fire missiles for the next 60 seconds", + maxCount: 9, + count: 0, + numberInPool: 0, + isNonRefundable: true, + isCustomHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + for (let i = 0; i < 60; i++) { + setTimeout(() => { + const where = { + x: m.pos.x, + y: m.pos.y - 40 + } + b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2) + }, i * 1000); + } + }, + remove() {} + }, + { + name: "grenade production", + description: "drop grenades for the next 120 seconds", + maxCount: 9, + count: 0, + numberInPool: 0, + isNonRefundable: true, + isCustomHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + for (let i = 0; i < 120; i++) { + setTimeout(() => { + b.grenade(Vector.add(m.pos, { x: 10 * (Math.random() - 0.5), y: 10 * (Math.random() - 0.5) }), -Math.PI / 2) //fire different angles for each grenade + const who = bullet[bullet.length - 1] + Matter.Body.setVelocity(who, { + x: who.velocity.x * 0.1, + y: who.velocity.y * 0.1 + }); + }, i * 1000); + } + }, + remove() {} + }, { name: "inverted input", description: "left input becomes right and up input becomes down", maxCount: 9, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4206,6 +4373,7 @@ const tech = { description: "grow more legs", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4249,11 +4417,56 @@ const tech = { }, remove() {} }, + { + name: "diegesis", + description: "indicate gun fire delay through a rotation of your head", + maxCount: 1, + count: 0, + numberInPool: 0, + isNonRefundable: true, + isCustomHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + m.draw = function() { + ctx.fillStyle = m.fillColor; + m.walk_cycle += m.flipLegs * m.Vx; + + ctx.save(); + ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5 + ctx.translate(m.pos.x, m.pos.y); + m.calcLeg(Math.PI, -3); + m.drawLeg("#4a4a4a"); + m.calcLeg(0, 0); + m.drawLeg("#333"); + ctx.rotate(m.angle - (m.fireCDcycle != Infinity ? m.flipLegs * 0.25 * Math.pow(Math.max(m.fireCDcycle - m.cycle, 0), 0.5) : 0)); + + ctx.beginPath(); + ctx.arc(0, 0, 30, 0, 2 * Math.PI); + let grd = ctx.createLinearGradient(-30, 0, 30, 0); + grd.addColorStop(0, m.fillColorDark); + grd.addColorStop(1, m.fillColor); + ctx.fillStyle = grd; + ctx.fill(); + ctx.arc(15, 0, 4, 0, 2 * Math.PI); + ctx.strokeStyle = "#333"; + ctx.lineWidth = 2; + ctx.stroke(); + ctx.restore(); + m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal + } + }, + remove() {} + }, { name: "pareidolia", description: "don't", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4325,6 +4538,7 @@ const tech = { description: "you cycle through different colors", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4350,6 +4564,7 @@ const tech = { description: "all your bots are converted to the same random model", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4407,6 +4622,7 @@ const tech = { description: "increase combat difficulty by 1 level", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4421,9 +4637,10 @@ const tech = { }, { name: "stun", - description: "stun all mobs for up to 10 seconds", + description: "stun all mobs for up to 8 seconds", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4432,7 +4649,7 @@ const tech = { }, requires: "", effect() { - for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 600) + for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 480) }, remove() {} }, @@ -4441,6 +4658,7 @@ const tech = { description: "eject all your guns", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4468,6 +4686,7 @@ const tech = { description: "eject all your research", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4486,6 +4705,7 @@ const tech = { description: "use all your energy to spawn inside the event horizon of a huge black hole", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, @@ -4504,6 +4724,7 @@ const tech = { description: "spawn 2 research
spawn 40 nearby black holes", maxCount: 1, count: 0, + numberInPool: 0, isNonRefundable: true, isCustomHide: true, isJunk: true, diff --git a/style.css b/style.css index b14932e..8ff6cf7 100644 --- a/style.css +++ b/style.css @@ -451,7 +451,7 @@ summary { font-size: 1.15em; color: #555; background-color: rgba(255, 255, 255, 0.5); - transition: opacity 0.5s; + transition: opacity 0.25s; pointer-events: none; user-select: none; } diff --git a/todo.txt b/todo.txt index 6fba6fe..42d0f7e 100644 --- a/todo.txt +++ b/todo.txt @@ -1,18 +1,14 @@ ******************************************************** NEXT PATCH ******************************************************** -blocking uses 33% less energy -tech: stimulated emission removed -tech: Bayesian statistics renamed stimulated emission -tech: futures exchange gives 4.5% per cancel (up from 4%) +tech change: commodities exchange 6 -> 8 power ups on cancel +tech change: MIRV - doesn't reduce the missile size as much, has a better missile spread, and a very short fire delay -new level boss: follows you like the dynamo-bot, but is not friend - will not spawn if you have a dynamo-bot - (probably will be rebalanced in next patch) +tech: replication - gain 8% duplication, but add in 10 junk tech to the pool +added several new junk tech (18 possible junk tech now) ******************************************************** BUGS ******************************************************** -make mobs that spawn other mobs limit spawns to line of sight - orange mobs +use the floor of portal sensor on the player? to unstuck player (only once on my computer) once every 7 second check isn't running code power ups don't teleport to exit @@ -37,6 +33,22 @@ make mobs that spawn other mobs limit spawns to line of sight (repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping ******************************************************** TODO ******************************************************** + +tech fire gun in the future + laser doesn't work because of draw, needs to be a bullet + foam? shotgun? + const where = { + x: m.pos.x + 20 * Math.cos(m.angle), + y: m.pos.y + 20 * Math.sin(m.angle) + } + setTimeout(() => { + }, 1000); + + +historyBoss needs legs? + +unified field theory is too weak + fill energy make immune to damage on swap? tech: when you switch guns switch a random bot to a different bot. If the bot you had was upgraded the new one will be too. or switch all bots @@ -45,7 +57,6 @@ tech: buff block throwing require +100% damage for blocks works with pilot wave? - lore: a tutorial / lore intro needs to be optional so it doesn't slow experienced players put something on the intro map