From 36541986bab631c8ee6cbb370d5ce791f1903f72 Mon Sep 17 00:00:00 2001 From: landgreen Date: Mon, 6 Mar 2023 17:58:00 -0800 Subject: [PATCH] wave base wave gun rework damage per hit 1.55 -> 0.33, -15% range, +20% ammo no pause between wave packets wave bullets can hit about once every 10 game cycles (1/6 of a second) time between hits is reduced by fire rate wave tech frequency has -25% damage no longer reduces fire rate +10% phonon damage and ammo JUNK tech: universal healthcare - your damage heals mobs bug fixes --- js/bullet.js | 74 +++++++++++++++++++++++++++------------------------- js/level.js | 62 ++++++++++++++++++++----------------------- js/tech.js | 64 +++++++++++++++++++++++++++------------------ style.css | 13 ++++----- todo.txt | 24 +++++++---------- 5 files changed, 123 insertions(+), 114 deletions(-) diff --git a/js/bullet.js b/js/bullet.js index 7b7719a..89ad934 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -171,7 +171,6 @@ const b = { b.activeGun = b.inventory[0] //if no active gun switch to new gun if (b.guns[b.activeGun].charge) b.guns[b.activeGun].charge = 0; //set foam charge to zero if foam is a new gun } - // if (tech.infiniteWaveAmmo === 2) b.guns[3].ammo = Infinity } simulation.makeGunHUD(); simulation.switchGun(); @@ -6367,8 +6366,8 @@ const b = { name: "wave", //3 description: "emit a wave packet of oscillating particles
that propagates through solids", ammo: 0, - ammoPack: 115, - defaultAmmoPack: 115, + ammoPack: 135, + defaultAmmoPack: 135, have: false, wavePacketCycle: 0, delay: 40, @@ -6397,7 +6396,7 @@ const b = { ctx.lineWidth = 2 * tech.wavePacketDamage ctx.beginPath(); const end = 700 * Math.sqrt(tech.isBulletsLastLonger) * Math.pow(0.93, tech.waveReflections) // / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1060 - const damage = 1.9 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.43 : 1) * (tech.isPhaseVelocity ? 1.25 : 1) //damage is lower for large radius mobs, since they feel the waves longer + const damage = 2.1 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.43 : 1) * (tech.isInfiniteWaveAmmo ? 0.75 : 1) //damage is lower for large radius mobs, since they feel the waves longer for (let i = this.waves.length - 1; i > -1; i--) { //draw wave @@ -6489,7 +6488,7 @@ const b = { } }, fire360Longitudinal() { - m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 4 : 8) * b.fireCDscale * tech.infiniteWaveAmmo); // cool down + m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 4 : 8) * b.fireCDscale); // cool down this.waves.push({ position: { x: m.pos.x, @@ -6508,7 +6507,7 @@ const b = { ctx.beginPath(); // const end = 1100 * tech.isBulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5) //should equal about 1767 const end = 1100 * tech.isBulletsLastLonger * Math.pow(0.93, tech.waveReflections) //should equal about 1767 - const damage = 1.9 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.4 : 1) * (tech.isPhaseVelocity ? 1.25 : 1) //damage is lower for large radius mobs, since they feel the waves longer + const damage = 2.1 * m.dmgScale * tech.wavePacketDamage * tech.waveBeamDamage * (tech.isBulletTeleport ? 1.4 : 1) * (tech.isInfiniteWaveAmmo ? 0.75 : 1) //damage is lower for large radius mobs, since they feel the waves longer for (let i = this.waves.length - 1; i > -1; i--) { const v1 = Vector.add(this.waves[i].position, Vector.mult(this.waves[i].unit1, this.waves[i].radius)) const v2 = Vector.add(this.waves[i].position, Vector.mult(this.waves[i].unit2, this.waves[i].radius)) @@ -6615,7 +6614,7 @@ const b = { } }, fireLongitudinal() { - m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 4 : 8) * b.fireCDscale * tech.infiniteWaveAmmo); // cool down + m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 4 : 8) * b.fireCDscale); // cool down const halfArc = (m.crouch ? 0.0785 : 0.275) * (tech.isBulletTeleport ? 0.66 + (Math.random() - 0.5) : 1) //6.28 is a full circle, but these arcs needs to stay small because we are using small angle linear approximation, for collisions // if (tech.isBulletTeleport && Math.random() < 0.04) { // const scale = 400 * Math.random() @@ -6644,13 +6643,13 @@ const b = { }) }, doTransverse() { - if (this.wavePacketCycle && !input.fire) { - this.wavePacketCycle = 0; - m.fireCDcycle = m.cycle + Math.floor(this.delay * b.fireCDscale); // cool down - } + // if (this.wavePacketCycle && !input.fire) { + // this.wavePacketCycle = 0; + // m.fireCDcycle = m.cycle + Math.floor(this.delay * b.fireCDscale); // cool down + // } }, fireTransverse() { - totalCycles = Math.floor(4.3 * 35 * tech.waveReflections * tech.isBulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5)) + totalCycles = Math.floor((3.5) * 35 * tech.waveReflections * tech.isBulletsLastLonger / Math.sqrt(tech.waveReflections * 0.5)) const me = bullet.length; bullet[me] = Bodies.polygon(m.pos.x + 25 * Math.cos(m.angle), m.pos.y + 25 * Math.sin(m.angle), 5, 4, { angle: m.angle, @@ -6659,9 +6658,11 @@ const b = { inertia: Infinity, frictionAir: 0, slow: 0, - amplitude: (m.crouch ? 5 : 10) * ((this.wavePacketCycle % 2) ? -1 : 1) * Math.sin((this.wavePacketCycle + 1) * 0.088), //0.0968 //0.1012 //0.11 //0.088 //shorten wave packet + // amplitude: (m.crouch ? 5 : 10) * ((this.wavePacketCycle % 2) ? -1 : 1) * Math.sin((this.wavePacketCycle + 1) * 0.088), //0.0968 //0.1012 //0.11 //0.088 //shorten wave packet + amplitude: (m.crouch ? 6 : 12) * ((this.wavePacketCycle % 2) ? -1 : 1) * Math.sin(this.wavePacketCycle * 0.088) * Math.sin(this.wavePacketCycle * 0.04), //0.0968 //0.1012 //0.11 //0.088 //shorten wave packet minDmgSpeed: 0, - dmg: m.dmgScale * tech.waveBeamDamage * tech.wavePacketDamage * (tech.isBulletTeleport ? 1.43 : 1), //also control damage when you divide by mob.mass + dmg: m.dmgScale * tech.waveBeamDamage * tech.wavePacketDamage * (tech.isBulletTeleport ? 1.43 : 1) * (tech.isInfiniteWaveAmmo ? 0.75 : 1), //also control damage when you divide by mob.mass + dmgCoolDown: 0, classType: "bullet", collisionFilter: { category: 0, @@ -6685,23 +6686,31 @@ const b = { this.slow = slowCheck Matter.Body.setVelocity(this, Vector.mult(Vector.normalise(this.velocity), tech.waveBeamSpeed * slowCheck)); } - q = Matter.Query.point(mob, this.position) // check if inside a mob - for (let i = 0; i < q.length; i++) { - let dmg = this.dmg // / Math.min(10, q[i].mass) - q[i].damage(dmg); - if (q[i].alive) q[i].foundPlayer(); - Matter.Body.setVelocity(q[i], Vector.mult(q[i].velocity, 0.9)) - this.endCycle = 0; //bullet ends cycle after doing damage - if (q[i].damageReduction) { - simulation.drawList.push({ //add dmg to draw queue - x: this.position.x, - y: this.position.y, - radius: Math.log(dmg + 1.1) * 40 * q[i].damageReduction + 3, - color: 'rgba(0,0,0,0.4)', - time: simulation.drawTime - }); + if (this.dmgCoolDown < 1) { + q = Matter.Query.point(mob, this.position) // check if inside a mob + for (let i = 0; i < q.length; i++) { + this.dmgCoolDown = 5 + Math.floor(11 * Math.random() * Math.sqrt(b.fireCDscale)); + let dmg = this.dmg + q[i].damage(dmg); + if (q[i].alive) { + q[i].foundPlayer(); + Matter.Body.setVelocity(q[i], Vector.mult(q[i].velocity, 0.9)) + } + + // this.endCycle = 0; //bullet ends cycle after doing damage + if (q[i].damageReduction) { + simulation.drawList.push({ //add dmg to draw queue + x: this.position.x, + y: this.position.y, + radius: Math.log(dmg + 1.1) * 40 * q[i].damageReduction + 3, + color: 'rgba(0,0,0,0.4)', + time: simulation.drawTime + }); + } } + } else { + this.dmgCoolDown-- } }, wiggle() { @@ -6736,7 +6745,7 @@ const b = { if (tech.isPhaseVelocity) { waveSpeedMap = 3.5 waveSpeedBody = 2 - bullet[me].dmg *= 1.35 + bullet[me].dmg *= 1.4 } if (tech.waveReflections) { bullet[me].reflectCycle = totalCycles / tech.waveReflections //tech.waveLengthRange @@ -6761,12 +6770,7 @@ const b = { y: tech.waveBeamSpeed * Math.sin(m.angle) }); const transverse = Vector.normalise(Vector.perp(bullet[me].velocity)) - //fire a packet of bullets then delay for a while this.wavePacketCycle++ - if (this.wavePacketCycle > 35) { - m.fireCDcycle = m.cycle + Math.floor(this.delay * b.fireCDscale * tech.infiniteWaveAmmo); // cool down - this.wavePacketCycle = 0; - } }, fire() {} }, diff --git a/js/level.js b/js/level.js index e0264dc..f2efab9 100644 --- a/js/level.js +++ b/js/level.js @@ -8,8 +8,8 @@ const level = { onLevel: -1, levelsCleared: 0, // playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"], - //see level.populateLevels: (intro, ... , reservoir, reactor, ... , gauntlet, final) added later - playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock", "factory"], + //see level.populateLevels: (intro, ... , reservoir or factory, reactor, ... , gauntlet, final) added later + playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock"], communityLevels: ["stronghold", "basement", "crossfire", "vats", "run", "n-gon", "house", "perplex", "coliseum", "tunnel", "islands", "temple", "dripp", "biohazard", "stereoMadness", "yingYang", "staircase", "fortress"], trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon"], levels: [], @@ -18,7 +18,7 @@ const level = { // simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode // simulation.isHorizontalFlipped = true // tech.giveTech("performance") - // level.difficultyIncrease(3 * 4) //30 is near max on hard //60 is near max on why + // level.difficultyIncrease(9 * 4) //30 is near max on hard //60 is near max on why // spawn.setSpawnList(); // spawn.setSpawnList(); // m.maxHealth = m.health = 100 @@ -27,24 +27,24 @@ const level = { // m.immuneCycle = Infinity //you can't take damage // tech.tech[297].frequency = 100 // m.couplingChange(5) - // m.setField("metamaterial cloaking") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch + // m.setField("time dilation") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch // simulation.molecularMode = 2 // m.damage(0.1); // b.giveGuns("nail gun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser // b.giveGuns("wave") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser - // b.guns[8].ammo = 10000 - // tech.giveTech("inductive charging") - // tech.giveTech("laser-bot") - // for (let i = 0; i < 1; ++i) tech.giveTech("mass-energy equivalence") - // for (let i = 0; i < 1; ++i) tech.giveTech("Zectron") - // for (let i = 0; i < 1; i++) tech.giveTech("CPT symmetry") - // for (let i = 0; i < 1; i++) tech.giveTech("elasticity") + // b.guns[3].ammo = 100000000 + // tech.giveTech("propagation") + // tech.giveTech("amplitude") + // for (let i = 0; i < 1; ++i) tech.giveTech("bound state") + // for (let i = 0; i < 1; ++i) tech.giveTech("Higgs mechanism") + // for (let i = 0; i < 1; i++) tech.giveTech("frequency") + // for (let i = 0; i < 1; i++) tech.giveTech("phonon") // for (let i = 0; i < 3; i++) powerUps.directSpawn(450, -50, "tech"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "boost"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "coupling"); // level.factory(); // level.testing(); - // spawn.nodeGroup(1200, 0, "starter") + // spawn.nodeGroup(1200, -300, "starter") // spawn.mantisBoss(1900, -500) // spawn.sneakBoss(1900, -500) // spawn.starter(1900, -500, 200) @@ -164,7 +164,7 @@ const level = { var gun = b.guns[b.inventory[tech.buffedGun]].name simulation.makeTextLog(`pigeonhole principle: +${(31 * Math.max(0, b.inventory.length)).toFixed(0)}% damage for ${gun}`, 600); } - if (tech.isSwitchReality) { + if (tech.isSwitchReality && level.levelsCleared !== 0) { simulation.makeTextLog(`simulation.amplitude = ${Math.random()}`); m.switchWorlds() simulation.trails() @@ -194,8 +194,8 @@ const level = { m.dmgScale = 1; //damage done by player decreases each level simulation.accelScale = 1 //mob acceleration increases each level simulation.CDScale = 1 //mob CD time decreases each level - simulation.dmgScale = Math.max(0.1, 0.32 * simulation.difficulty) //damage done by mobs scales with total levels - simulation.healScale = 1 / (1 + simulation.difficulty * 0.05) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale; + simulation.dmgScale = Math.max(0.1, 0.31 * simulation.difficulty) //damage done by mobs scales with total levels + simulation.healScale = 1 / (1 + simulation.difficulty * 0.047) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale; }, difficultyIncrease(num = 1) { for (let i = 0; i < num; i++) { @@ -204,8 +204,8 @@ const level = { if (simulation.accelScale < 6) simulation.accelScale *= 1.024 //mob acceleration increases each level if (simulation.CDScale > 0.15) simulation.CDScale *= 0.964 //mob CD time decreases each level } - simulation.dmgScale = Math.max(0.1, 0.32 * simulation.difficulty) //damage done by mobs scales with total levels - simulation.healScale = 1 / (1 + simulation.difficulty * 0.05) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale; + simulation.dmgScale = Math.max(0.1, 0.31 * simulation.difficulty) //damage done by mobs scales with total levels + simulation.healScale = 1 / (1 + simulation.difficulty * 0.047) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale; // console.log(`CD = ${simulation.CDScale}`) }, difficultyDecrease(num = 1) { //used in easy mode for simulation.reset() @@ -216,8 +216,8 @@ const level = { if (simulation.CDScale < 1) simulation.CDScale /= 0.964 //mob CD time decreases each level } if (simulation.difficulty < 1) simulation.difficulty = 0; - simulation.dmgScale = Math.max(0.1, 0.32 * simulation.difficulty) //damage done by mobs scales with total levels - simulation.healScale = 1 / (1 + simulation.difficulty * 0.05) + simulation.dmgScale = Math.max(0.1, 0.31 * simulation.difficulty) //damage done by mobs scales with total levels + simulation.healScale = 1 / (1 + simulation.difficulty * 0.047) }, difficultyText() { if (simulation.difficultyMode === 1) { @@ -326,7 +326,7 @@ const level = { } level.levels = shuffle(level.levels); //shuffles order of maps with seeded random level.levels.length = 9 //remove any extra levels past 9 - level.levels.splice(Math.floor(Math.seededRandom(level.levels.length * 0.6, level.levels.length)), 0, "reservoir"); //add level to the back half of the randomized levels list + level.levels.splice(Math.floor(Math.seededRandom(level.levels.length * 0.6, level.levels.length)), 0, Math.random() < 0.5 ? "factory" : "reservoir"); //add level to the back half of the randomized levels list level.levels.splice(Math.floor(Math.seededRandom(level.levels.length * 0.6, level.levels.length)), 0, "reactor"); //add level to the back half of the randomized levels list if (!build.isExperimentSelection || (build.hasExperimentalMode && !simulation.isCheating)) { //experimental mode is endless, unless you only have an experiment Tech level.levels.unshift("intro"); //add level to the start of the randomized levels list @@ -3008,19 +3008,19 @@ const level = { }, testing() { - const mover = level.mover(800, -300, 3000, 25); //x,y,width.height,VxGoal,force + const mover = level.mover(2800, -300, 1000, 25); //x,y,width.height,VxGoal,force - const train = level.transport(600, -500, 500, 25, 8); //x,y,width.height,VxGoal,force + const train = level.transport(2900, -500, 500, 25, 8); //x,y,width.height,VxGoal,force spawn.bodyRect(1900, -550, 50, 50); - const button = level.button(350, -400) - spawn.bodyRect(250, -450, 50, 50); //block on button + const button = level.button(2535, -200) + // spawn.bodyRect(250, -450, 50, 50); //block on button level.custom = () => { //oscillate back and forth - if (train.position.x < 800) { + if (train.position.x < 2000) { train.changeDirection(true) //go right - } else if (train.position.x > 2000) { + } else if (train.position.x > 4000) { train.changeDirection(false) //go left } if (!button.isUp) train.move(); @@ -3035,7 +3035,7 @@ const level = { level.enter.draw(); }; level.customTopLayer = () => { - train.draw() + // train.draw() mover.draw(); // hazard.opticalQuery(); button.query(); @@ -3470,7 +3470,7 @@ const level = { movers[2].force = 0 spawnBlock(2730, -1600); //3315, -1600); if ((simulation.cycle % (rate * 3)) === 0) { - if (bonusAmmoCount < 6 && Math.random() < 0.6) { //some extra ammo because of all the extra mobs that don't drop ammo + if (bonusAmmoCount < 3 && Math.random() < 0.5) { //some extra ammo because of all the extra mobs that don't drop ammo bonusAmmoCount++ powerUps.spawn(2760, -1550, Math.random() < 0.5 ? "heal" : "ammo", false); } @@ -3595,7 +3595,6 @@ const level = { spawn.mapRect(-1550, -3050, 6525, 1400); spawn.mapRect(3000, -1700, 1975, 675); //ceiling center - spawn.mapRect(3800, -4000, 5650, 950); spawn.mapRect(3800, -4000, 1175, 2975); spawn.mapRect(8175, -4000, 1275, 3685); //right wall @@ -3618,7 +3617,6 @@ const level = { spawn.mapRect(5400, -3100, 50, 250); //exit spawn.mapRect(4875, -2675, 675, 50); //exit - spawn.mapRect(1925, -1325, 550, 50); //entrance spawn.mapRect(2050, -1675, 50, 175); //entrance spawn.mapRect(1700, -200, 750, 275); //button shelf @@ -3632,9 +3630,7 @@ const level = { spawn.mapRect(75, -775, 400, 50); spawn.mapRect(1700, -760, 75, 35); spawn.mapRect(-200, -425, 150, 35); - } - spawn.mapRect(2400, -600, 125, 675); spawn.mapRect(2400, -1750, 125, 1050); spawn.mapRect(2700, -1700, 125, 85); @@ -3643,12 +3639,10 @@ const level = { spawn.randomMob(875, -375, 0.5); spawn.randomMob(1250, -575, 0.5); spawn.randomMob(1550, -600, 0.5); - spawn.randomSmallMob(1250, -175); spawn.randomSmallMob(1500, -229); spawn.randomSmallMob(1850, -300); powerUps.spawn(5200, -1300, "ammo"); - }, final() { // color.map = "rgba(0,0,0,0.8)" diff --git a/js/tech.js b/js/tech.js index 1934ce4..fb70ce1 100644 --- a/js/tech.js +++ b/js/tech.js @@ -235,7 +235,7 @@ const tech = { if (m.coupling && (m.fieldMode === 0 || m.fieldMode === 5)) dmg *= 1 + 0.15 * m.coupling if (m.isSneakAttack && m.sneakAttackCycle + Math.min(120, 0.5 * (m.cycle - m.enterCloakCycle)) > m.cycle) dmg *= 4.33 * (1 + 0.33 * m.coupling) if (tech.deathSkipTime) dmg *= 1 + 0.6 * tech.deathSkipTime - if (tech.isTechDebt) dmg *= Math.min(Math.pow(0.85, tech.totalCount - 20), 4 - 0.15 * tech.totalCount) + if (tech.isTechDebt) dmg *= tech.totalCount > 2 ? Math.pow(0.85, tech.totalCount - 20) : 4 - 0.15 * tech.totalCount // if (tech.isTechDebt) dmg *= Math.min(Math.pow(0.85, tech.totalCount - 20), 4 - 0.15 * tech.totalCount) if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599 if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance()) @@ -4969,16 +4969,16 @@ const tech = { }, { name: "phase velocity", - description: "wave particles propagate faster as solids
+35% wave damage", + description: "wave particles propagate faster as solids
+40% wave damage", isGunTech: true, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("wave") + return tech.haveGunCheck("wave") && !tech.isLongitudinal }, - requires: "wave", + requires: "wave, not phonon", effect() { tech.isPhaseVelocity = true; }, @@ -5009,7 +5009,7 @@ const tech = { }, { name: "propagation", - description: "–25% wave packet propagation speed
+37% wave damage", + description: "–25% wave packet propagation speed
+41% wave damage", isGunTech: true, maxCount: 9, count: 0, @@ -5020,17 +5020,17 @@ const tech = { }, requires: "wave", effect() { - tech.waveBeamSpeed *= 0.8; - tech.waveBeamDamage += 1.55 * 0.37 //this sets base wave damage + tech.waveBeamSpeed *= 0.75; + tech.waveBeamDamage += 0.33 * 0.41 //this sets base wave damage }, remove() { - tech.waveBeamSpeed = 12; - tech.waveBeamDamage = 1.55 //this sets base wave damage + tech.waveBeamSpeed = 11; + tech.waveBeamDamage = 0.33 //this sets base wave damage } }, { name: "bound state", - description: "wave packets reflect backwards 2 times
–20% range", + description: "wave packets reflect backwards 2 times
–33% range", isGunTech: true, maxCount: 9, count: 0, @@ -5049,7 +5049,7 @@ const tech = { }, { name: "frequency", - description: `wave has unlimited ammo
-50% wave fire rate`, + description: `wave has unlimited ammo
-25% wave damage`, isGunTech: true, maxCount: 1, count: 0, @@ -5058,13 +5058,13 @@ const tech = { allowed: () => tech.haveGunCheck("wave"), requires: "wave", effect() { - tech.infiniteWaveAmmo = 2 + tech.isInfiniteWaveAmmo = true b.guns[3].savedAmmo = b.guns[3].ammo b.guns[3].ammo = Infinity simulation.updateGunHUD(); }, remove() { - tech.infiniteWaveAmmo = 1 + tech.isInfiniteWaveAmmo = false if (this.count > 0 && b.guns[3].savedAmmo !== undefined) { b.guns[3].ammo = b.guns[3].savedAmmo simulation.updateGunHUD(); @@ -5082,18 +5082,18 @@ const tech = { frequency: 3, frequencyDefault: 3, allowed() { - return tech.haveGunCheck("wave") + return tech.haveGunCheck("wave") && !tech.isPhaseVelocity }, - requires: "wave", - ammoScale: 11, + requires: "wave, not phase velocity", + ammoScale: 10, effect() { tech.isLongitudinal = true; b.guns[3].chooseFireMethod() b.guns[3].ammoPack = b.guns[3].defaultAmmoPack / this.ammoScale - if (tech.infiniteWaveAmmo === 1) { - b.guns[3].ammo = Math.ceil(b.guns[3].ammo / this.ammoScale); - } else { + if (tech.isInfiniteWaveAmmo) { b.guns[3].savedAmmo = Math.ceil(b.guns[3].savedAmmo / this.ammoScale); //used with low frequency + } else { + b.guns[3].ammo = Math.ceil(b.guns[3].ammo / this.ammoScale); } simulation.updateGunHUD(); }, @@ -5102,10 +5102,10 @@ const tech = { tech.isLongitudinal = false; b.guns[3].chooseFireMethod() b.guns[3].ammoPack = b.guns[3].defaultAmmoPack - if (tech.infiniteWaveAmmo === 1) { - b.guns[3].ammo = Math.ceil(b.guns[3].ammo * this.ammoScale); - } else { + if (tech.isInfiniteWaveAmmo) { b.guns[3].savedAmmo = Math.ceil(b.guns[3].savedAmmo * this.ammoScale); //used with low frequency + } else { + b.guns[3].ammo = Math.ceil(b.guns[3].ammo * this.ammoScale); } simulation.updateGunHUD(); } @@ -6348,7 +6348,7 @@ const tech = { isBot: true, isBotTech: true, isNonRefundable: true, - requires: "foam gun, bot upgrades, fractionation, pressure vessel", + requires: "foam gun, not bot upgrades, fractionation, pressure vessel", allowed() { return tech.haveGunCheck("foam", false) && !b.hasBotUpgrade() && !tech.isAmmoFoamSize && !tech.isFoamPressure && (build.isExperimentSelection || powerUps.research.count > 1) }, @@ -6776,7 +6776,7 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return ((tech.haveGunCheck("wave") && tech.infiniteWaveAmmo !== 1) || tech.haveGunCheck("laser") || (tech.haveGunCheck("harpoon") && !tech.isRailGun)) && !tech.isEnergyNoAmmo + return ((tech.haveGunCheck("wave") && !tech.isInfiniteWaveAmmo) || tech.haveGunCheck("laser") || (tech.haveGunCheck("harpoon") && !tech.isRailGun)) && !tech.isEnergyNoAmmo }, requires: "harpoon, laser, wave, frequency, not railgun, non-renewables", effect() { @@ -8724,6 +8724,20 @@ const tech = { }, remove() {} }, + { + name: "universal healthcare", + description: "make your damage negative", + maxCount: 1, + count: 0, + frequency: 0, + isJunk: true, + allowed: () => true, + requires: "", + effect() { + tech.damage *= -1 + }, + remove() {} + }, // { // name: "synchrotron", // descriptionFunction() { @@ -11377,7 +11391,7 @@ const tech = { isBoostPowerUps: null, isBoostReplaceAmmo: null, isFlipFlopCoupling: null, - infiniteWaveAmmo: null, + isInfiniteWaveAmmo: null, isJunkDNA: null, buffedGun: 0, isGunChoice: null, diff --git a/style.css b/style.css index aade00f..66f4a86 100644 --- a/style.css +++ b/style.css @@ -567,13 +567,14 @@ summary { #guns { position: absolute; - top: 40px; + top: 82px; left: 15px; z-index: 2; font-size: 23px; color: #222; - background-color: rgba(255, 255, 255, 0.4); - line-height: 120%; + /* background-color: rgba(255, 255, 255, 0.4); */ + background-color: rgba(255, 255, 255, 0.2); + line-height: 120%; user-select: none; pointer-events: none; padding: 0px 5px 0px 5px; @@ -583,8 +584,8 @@ summary { #field { position: absolute; - top: 15px; - right: 15px; + top: 45px; + left: 15px; z-index: 2; font-size: 23px; color: #000; @@ -601,7 +602,7 @@ summary { #tech { position: absolute; - top: 60px; + top: 15px; right: 15px; z-index: 2; font-size: 20px; diff --git a/todo.txt b/todo.txt index c801b61..f83a624 100644 --- a/todo.txt +++ b/todo.txt @@ -1,29 +1,25 @@ ******************************************************** NEXT PATCH ************************************************** -map: factory - this is completely unbalanced, so let me know if what rough edges need to be sanded - found on seed 47086 level 6 -tech: ternary - +40 damage if any gun has ammo divisible by 3 +base wave gun rework + damage per hit 1.55 -> 0.33, -15% range, +20% ammo + no pause between wave packets + wave bullets can hit about once every 10 game cycles (1/6 of a second) + time between hits is reduced by fire rate + wave tech frequency has -25% damage no longer reduces fire rate + +10% phonon damage and ammo -level element: transport - horizontal moving platforms -level element: mover - stationary platform that pushes the player horizontally - to see examples of transport and mover look in level.testing() +JUNK tech: universal healthcare - your damage heals mobs + +bug fixes *********************************************************** TODO ***************************************************** level element - mover, transport test effect of changing m.Vx on things like: shooting bullets? - add mobs? extend the recentered friction zero to other things like blocks the player stands on? maybe zero on the horizontal velocity of whatever the player is standing on -remove the pause on wave between wave packets - maybe don't do packets, do sine wave beats instead? - wave tech don't end wave bullets on hitting mob, instead add a short cooldown, 1/4 of a second between hurting mobs - maybe fire rate could lower the frequency that wave bullets damage mobs as they pass through them - add a graphic to show the time when doing damage - extend uncertainty to superballs maybe make aiming them more random?