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?