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
This commit is contained in:
50
js/bullet.js
50
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 <strong>wave packet</strong> of oscillating particles<br>that propagates through <strong>solids</strong>",
|
||||
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,14 +6686,19 @@ const b = {
|
||||
this.slow = slowCheck
|
||||
Matter.Body.setVelocity(this, Vector.mult(Vector.normalise(this.velocity), tech.waveBeamSpeed * slowCheck));
|
||||
}
|
||||
|
||||
if (this.dmgCoolDown < 1) {
|
||||
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)
|
||||
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();
|
||||
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
|
||||
// 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,
|
||||
@@ -6703,6 +6709,9 @@ const b = {
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.dmgCoolDown--
|
||||
}
|
||||
},
|
||||
wiggle() {
|
||||
this.cycle++
|
||||
@@ -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() {}
|
||||
},
|
||||
|
||||
62
js/level.js
62
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: <strong>+${(31 * Math.max(0, b.inventory.length)).toFixed(0)}%</strong> <strong class='color-d'>damage</strong> for <strong class="highlight">${gun}</strong>`, 600);
|
||||
}
|
||||
if (tech.isSwitchReality) {
|
||||
if (tech.isSwitchReality && level.levelsCleared !== 0) {
|
||||
simulation.makeTextLog(`simulation.amplitude <span class='color-symbol'>=</span> ${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)"
|
||||
|
||||
64
js/tech.js
64
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 <strong>propagate</strong> faster as <strong>solids</strong><br><strong>+35%</strong> wave <strong class='color-d'>damage</strong>",
|
||||
description: "wave particles <strong>propagate</strong> faster as <strong>solids</strong><br><strong>+40%</strong> wave <strong class='color-d'>damage</strong>",
|
||||
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: "<strong>–25%</strong> wave packet propagation <strong>speed</strong><br><strong>+37%</strong> wave <strong class='color-d'>damage</strong>",
|
||||
description: "<strong>–25%</strong> wave packet propagation <strong>speed</strong><br><strong>+41%</strong> wave <strong class='color-d'>damage</strong>",
|
||||
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 <strong>reflect</strong> backwards <strong>2</strong> times<br><strong>–20%</strong> <strong>range</strong>",
|
||||
description: "wave packets <strong>reflect</strong> backwards <strong>2</strong> times<br><strong>–33%</strong> <strong>range</strong>",
|
||||
isGunTech: true,
|
||||
maxCount: 9,
|
||||
count: 0,
|
||||
@@ -5049,7 +5049,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "frequency",
|
||||
description: `<strong>wave</strong> has unlimited <strong class='color-ammo'>ammo</strong><br><strong>-50%</strong> wave <strong><em>fire rate</em></strong>`,
|
||||
description: `<strong>wave</strong> has unlimited <strong class='color-ammo'>ammo</strong><br><strong>-25%</strong> wave <strong class='color-d'>damage</strong>`,
|
||||
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 <strong class='color-d'>damage</strong> 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,
|
||||
|
||||
11
style.css
11
style.css
@@ -567,12 +567,13 @@ 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);
|
||||
/* 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;
|
||||
@@ -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;
|
||||
|
||||
24
todo.txt
24
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?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user