diff --git a/.DS_Store b/.DS_Store index 129443b..91b905c 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index 58a1d4e..2d85fd0 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1406,7 +1406,7 @@ const b = { this.caughtPowerUp.effect(); Matter.Composite.remove(engine.world, this.caughtPowerUp); powerUp.splice(index, 1); - if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.008 * 8 //0.006 is normal + if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.008 * 6 //0.006 is normal } else { this.dropCaughtPowerUp() } @@ -1468,7 +1468,7 @@ const b = { } } } else { - if (m.energy > 0.005) m.energy -= 0.005 + if (!tech.isRailEnergyGain && m.energy > 0.005) m.energy -= 0.005 const sub = Vector.sub(this.position, m.pos) const rangeScale = 1 + 0.000001 * Vector.magnitude(sub) * Vector.magnitude(sub) //return faster when far from player const returnForce = Vector.mult(Vector.normalise(sub), rangeScale * this.thrustMag * this.mass) @@ -5597,160 +5597,141 @@ const b = { const dir = { x: Math.cos(m.angle), y: Math.sin(m.angle) }; //make a vector for the player's direction of length 1; used in dot product const harpoonSize = tech.isLargeHarpoon ? 1 + 0.1 * Math.sqrt(this.ammo) : 1 const totalCycles = 7 * (tech.isFilament ? 1 + 0.01 * Math.min(110, this.ammo) : 1) * Math.sqrt(harpoonSize) - if (input.down) { - - if (tech.isRailGun) { - function pushAway(range) { //push away blocks when firing - for (let i = 0, len = mob.length; i < len; ++i) { - const SUB = Vector.sub(mob[i].position, m.pos) - const DISTANCE = Vector.magnitude(SUB) - if (DISTANCE < range) { - const DEPTH = Math.min(range - DISTANCE, 1500) - const FORCE = Vector.mult(Vector.normalise(SUB), 0.001 * Math.sqrt(DEPTH) * mob[i].mass) - mob[i].force.x += FORCE.x; - mob[i].force.y += FORCE.y; - } - } - for (let i = 0, len = body.length; i < len; ++i) { - const SUB = Vector.sub(body[i].position, m.pos) - const DISTANCE = Vector.magnitude(SUB) - if (DISTANCE < range) { - const DEPTH = Math.min(range - DISTANCE, 500) - const FORCE = Vector.mult(Vector.normalise(SUB), 0.002 * Math.sqrt(DEPTH) * body[i].mass) - body[i].force.x += FORCE.x; - body[i].force.y += FORCE.y - body[i].mass * simulation.g * 1.5; //kick up a bit to give them some arc - } + if (input.down) { //railgun + // if (true) { + function pushAway(range) { //push away blocks when firing + for (let i = 0, len = mob.length; i < len; ++i) { + const SUB = Vector.sub(mob[i].position, m.pos) + const DISTANCE = Vector.magnitude(SUB) + if (DISTANCE < range) { + const DEPTH = Math.min(range - DISTANCE, 1500) + const FORCE = Vector.mult(Vector.normalise(SUB), 0.001 * Math.sqrt(DEPTH) * mob[i].mass) + mob[i].force.x += FORCE.x; + mob[i].force.y += FORCE.y; } } + for (let i = 0, len = body.length; i < len; ++i) { + const SUB = Vector.sub(body[i].position, m.pos) + const DISTANCE = Vector.magnitude(SUB) + if (DISTANCE < range) { + const DEPTH = Math.min(range - DISTANCE, 500) + const FORCE = Vector.mult(Vector.normalise(SUB), 0.002 * Math.sqrt(DEPTH) * body[i].mass) + body[i].force.x += FORCE.x; + body[i].force.y += FORCE.y - body[i].mass * simulation.g * 1.5; //kick up a bit to give them some arc + } + } + } - const me = bullet.length; - const size = 3 + tech.isLargeHarpoon * 0.1 * Math.sqrt(this.ammo) - bullet[me] = Bodies.rectangle(0, 0, 0.015, 0.0015, { //start as a small shape that can't even be seen - vertexGoal: [{ x: -40 * size, y: 2 * size, index: 0, isInternal: false }, { x: -40 * size, y: -2 * size, index: 1, isInternal: false }, { x: 50 * size, y: -3 * size, index: 3, isInternal: false }, { x: 30 * size, y: 2 * size, index: 4, isInternal: false }], - density: 0.03, //0.001 is normal - restitution: 0, - frictionAir: 0, - dmg: 0, //damage done in addition to the damage from momentum - classType: "bullet", - collisionFilter: { - category: 0, - mask: cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield - }, - minDmgSpeed: 5, - beforeDmg(who) { - if (tech.isShieldPierce && who.isShielded) { //disable shields - who.isShielded = false - requestAnimationFrame(() => { who.isShielded = true }); - } - if (who.shield && !tech.isShieldPierce) { - for (let i = 0, len = mob.length; i < len; i++) { - if (mob[i].id === who.shieldTargetID) { //apply some knock back to shield mob before shield breaks - Matter.Body.setVelocity(mob[i], Vector.mult(Vector.normalise(this.velocity), 10)); - break - } - } - Matter.Body.setVelocity(this, { x: -0.4 * this.velocity.x, y: -0.4 * this.velocity.y }); - } else { - if (tech.fragments && this.speed > 10) { - b.targetedNail(this.position, tech.fragments * 17) - this.endCycle = 0 //triggers despawn + const me = bullet.length; + bullet[me] = Bodies.rectangle(0, 0, 0.015, 0.0015, { //start as a small shape that can't even be seen + vertexGoal: [{ x: -40 * harpoonSize, y: 2 * harpoonSize, index: 0, isInternal: false }, { x: -40 * harpoonSize, y: -2 * harpoonSize, index: 1, isInternal: false }, { x: 50 * harpoonSize, y: -3 * harpoonSize, index: 3, isInternal: false }, { x: 30 * harpoonSize, y: 2 * harpoonSize, index: 4, isInternal: false }], + density: 0.03, //0.001 is normal + restitution: 0, + frictionAir: 0, + dmg: 0, //damage done in addition to the damage from momentum + classType: "bullet", + collisionFilter: { + category: 0, + mask: cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield + }, + minDmgSpeed: 5, + beforeDmg(who) { + if (tech.isShieldPierce && who.isShielded) { //disable shields + who.isShielded = false + requestAnimationFrame(() => { who.isShielded = true }); + } + if (who.shield && !tech.isShieldPierce) { + for (let i = 0, len = mob.length; i < len; i++) { + if (mob[i].id === who.shieldTargetID) { //apply some knock back to shield mob before shield breaks + Matter.Body.setVelocity(mob[i], Vector.mult(Vector.normalise(this.velocity), 10)); + break } } - }, - onEnd() {} - }); - m.fireCDcycle = Infinity; // cool down - Composite.add(engine.world, bullet[me]); //add bullet to world - bullet[me].endCycle = Infinity - bullet[me].charge = 0; - bullet[me].do = function() { - if (m.energy < 0.005 && !tech.isRailEnergyGain) { - m.energy += 0.05 + this.charge * 0.2 - m.fireCDcycle = m.cycle + 120; // cool down if out of energy - this.endCycle = 0; - b.refundAmmo() - return + Matter.Body.setVelocity(this, { x: -0.4 * this.velocity.x, y: -0.4 * this.velocity.y }); + } else { + if (tech.fragments && this.speed > 10) { + b.targetedNail(this.position, tech.fragments * 17) + this.endCycle = 0 //triggers despawn + } + } + }, + onEnd() {} + }); + m.fireCDcycle = Infinity; // cool down + Composite.add(engine.world, bullet[me]); //add bullet to world + bullet[me].endCycle = Infinity + bullet[me].charge = 0; + bullet[me].do = function() { + if (m.energy < 0.005 && !tech.isRailEnergyGain) { + m.energy += 0.05 + this.charge * 0.2 + m.fireCDcycle = m.cycle + 120; // cool down if out of energy + this.endCycle = 0; + b.refundAmmo() + return + } + + if ((!input.fire && this.charge > 0.6)) { //fire on mouse release or on low energy + // if (tech.isDarts) { + // for (let i = 0; i < 5; i++) { + // b.dart(where, m.angle + 0.1 * i) + // b.dart(where, m.angle - 0.1 * i) + // } + // } + Matter.Body.setVertices(this, this.vertexGoal) //take on harpoon shape + m.fireCDcycle = m.cycle + 2; // set fire cool down + //normal bullet behavior occurs after firing, overwrites this function + this.endCycle = simulation.cycle + 140 + this.collisionFilter.category = cat.bullet + Matter.Body.setPosition(this, { x: m.pos.x, y: m.pos.y }) + Matter.Body.setAngle(this, m.angle) + const speed = 120 + Matter.Body.setVelocity(this, { + x: m.Vx / 2 + speed * this.charge * Math.cos(m.angle), + y: m.Vy / 2 + speed * this.charge * Math.sin(m.angle) + }); + this.do = function() { + this.force.y += this.mass * 0.0003 / this.charge; // low gravity that scales with charge + } + const KNOCK = ((input.down) ? 0.1 : 0.5) * this.charge * this.charge + player.force.x -= KNOCK * Math.cos(m.angle) + player.force.y -= KNOCK * Math.sin(m.angle) * 0.35 //reduce knock back in vertical direction to stop super jumps + pushAway(1200 * this.charge) + } else { // charging on mouse down + if (tech.isFireMoveLock) { + Matter.Body.setVelocity(player, { + x: 0, + y: -55 * player.mass * simulation.g //undo gravity before it is added + }); + player.force.x = 0 + player.force.y = 0 } - if ((!input.fire && this.charge > 0.6)) { //fire on mouse release or on low energy - // if (tech.isDarts) { - // for (let i = 0; i < 5; i++) { - // b.dart(where, m.angle + 0.1 * i) - // b.dart(where, m.angle - 0.1 * i) - // } - // } - Matter.Body.setVertices(this, this.vertexGoal) //take on harpoon shape - m.fireCDcycle = m.cycle + 2; // set fire cool down - //normal bullet behavior occurs after firing, overwrites this function - this.endCycle = simulation.cycle + 140 - this.collisionFilter.category = cat.bullet - Matter.Body.setPosition(this, { x: m.pos.x, y: m.pos.y }) - Matter.Body.setAngle(this, m.angle) - const speed = 120 - Matter.Body.setVelocity(this, { - x: m.Vx / 2 + speed * this.charge * Math.cos(m.angle), - y: m.Vy / 2 + speed * this.charge * Math.sin(m.angle) - }); - this.do = function() { - this.force.y += this.mass * 0.0003 / this.charge; // low gravity that scales with charge - } - const KNOCK = ((input.down) ? 0.1 : 0.5) * this.charge * this.charge - player.force.x -= KNOCK * Math.cos(m.angle) - player.force.y -= KNOCK * Math.sin(m.angle) * 0.35 //reduce knock back in vertical direction to stop super jumps - pushAway(1200 * this.charge) - } else { // charging on mouse down - if (tech.isFireMoveLock) { - Matter.Body.setVelocity(player, { - x: 0, - y: -55 * player.mass * simulation.g //undo gravity before it is added - }); - player.force.x = 0 - player.force.y = 0 - } + m.fireCDcycle = Infinity //can't fire until mouse is released + const previousCharge = this.charge + //small b.fireCDscale = faster shots, b.fireCDscale=1 = normal shot, big b.fireCDscale = slower chot + let smoothRate = tech.isCapacitor ? 0.93 : Math.min(0.998, 0.985 * (0.98 + 0.02 * b.fireCDscale)) - m.fireCDcycle = Infinity //can't fire until mouse is released - const previousCharge = this.charge - //small b.fireCDscale = faster shots, b.fireCDscale=1 = normal shot, big b.fireCDscale = slower chot - let smoothRate = tech.isCapacitor ? 0.93 : Math.min(0.998, 0.985 * (0.98 + 0.02 * b.fireCDscale)) - - this.charge = this.charge * smoothRate + 1 - smoothRate - m.energy += (this.charge - previousCharge) * (tech.isRailEnergyGain ? 10 : -0.5) //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen - //draw targeting - let best; - let range = 3000 - const dir = m.angle - const path = [{ - x: m.pos.x + 20 * Math.cos(dir), - y: m.pos.y + 20 * Math.sin(dir) - }, - { - x: m.pos.x + range * Math.cos(dir), - y: m.pos.y + range * Math.sin(dir) - } - ]; - const vertexCollision = function(v1, v1End, domain) { - for (let i = 0; i < domain.length; ++i) { - let vertices = domain[i].vertices; - const len = vertices.length - 1; - for (let j = 0; j < len; j++) { - results = simulation.checkLineIntersection(v1, v1End, vertices[j], vertices[j + 1]); - if (results.onLine1 && results.onLine2) { - const dx = v1.x - results.x; - const dy = v1.y - results.y; - const dist2 = dx * dx + dy * dy; - if (dist2 < best.dist2) { - best = { - x: results.x, - y: results.y, - dist2: dist2, - who: domain[i], - v1: vertices[j], - v2: vertices[j + 1] - }; - } - } - } - results = simulation.checkLineIntersection(v1, v1End, vertices[0], vertices[len]); + this.charge = this.charge * smoothRate + 1 - smoothRate + m.energy += (this.charge - previousCharge) * (tech.isRailEnergyGain ? 10 : -0.5) //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen + //draw targeting + let best; + let range = 3000 + const dir = m.angle + const path = [{ + x: m.pos.x + 20 * Math.cos(dir), + y: m.pos.y + 20 * Math.sin(dir) + }, + { + x: m.pos.x + range * Math.cos(dir), + y: m.pos.y + range * Math.sin(dir) + } + ]; + const vertexCollision = function(v1, v1End, domain) { + for (let i = 0; i < domain.length; ++i) { + let vertices = domain[i].vertices; + const len = vertices.length - 1; + for (let j = 0; j < len; j++) { + results = simulation.checkLineIntersection(v1, v1End, vertices[j], vertices[j + 1]); if (results.onLine1 && results.onLine2) { const dx = v1.x - results.x; const dy = v1.y - results.y; @@ -5761,82 +5742,99 @@ const b = { y: results.y, dist2: dist2, who: domain[i], - v1: vertices[0], - v2: vertices[len] + v1: vertices[j], + v2: vertices[j + 1] }; } } } - }; + results = simulation.checkLineIntersection(v1, v1End, vertices[0], vertices[len]); + if (results.onLine1 && results.onLine2) { + const dx = v1.x - results.x; + const dy = v1.y - results.y; + const dist2 = dx * dx + dy * dy; + if (dist2 < best.dist2) { + best = { + x: results.x, + y: results.y, + dist2: dist2, + who: domain[i], + v1: vertices[0], + v2: vertices[len] + }; + } + } + } + }; - //check for collisions - best = { x: null, y: null, dist2: Infinity, who: null, v1: null, v2: null }; - vertexCollision(path[0], path[1], mob); - vertexCollision(path[0], path[1], map); - vertexCollision(path[0], path[1], body); - if (best.dist2 != Infinity) path[path.length - 1] = { x: best.x, y: best.y }; //if hitting something - //draw beam + //check for collisions + best = { x: null, y: null, dist2: Infinity, who: null, v1: null, v2: null }; + vertexCollision(path[0], path[1], mob); + vertexCollision(path[0], path[1], map); + vertexCollision(path[0], path[1], body); + if (best.dist2 != Infinity) path[path.length - 1] = { x: best.x, y: best.y }; //if hitting something + //draw beam + ctx.beginPath(); + ctx.moveTo(path[0].x, path[0].y); + ctx.lineTo(path[1].x, path[1].y); + ctx.strokeStyle = `rgba(100,0,180,0.7)`; + ctx.lineWidth = this.charge * 1 + ctx.setLineDash([10, 20]); + ctx.stroke(); + ctx.setLineDash([]); + //draw magnetic field + const X = m.pos.x + const Y = m.pos.y + const unitVector = { x: Math.cos(m.angle), y: Math.sin(m.angle) } + const unitVectorPerp = Vector.perp(unitVector) + + function magField(mag, arc) { + ctx.moveTo(X, Y); + ctx.bezierCurveTo( + X + unitVector.x * mag, Y + unitVector.y * mag, + X + unitVector.x * mag + unitVectorPerp.x * arc, Y + unitVector.y * mag + unitVectorPerp.y * arc, + X + unitVectorPerp.x * arc, Y + unitVectorPerp.y * arc) + ctx.bezierCurveTo( + X - unitVector.x * mag + unitVectorPerp.x * arc, Y - unitVector.y * mag + unitVectorPerp.y * arc, + X - unitVector.x * mag, Y - unitVector.y * mag, + X, Y) + } + ctx.fillStyle = `rgba(50,0,100,0.05)`; + for (let i = 3; i < 7; i++) { + const MAG = 8 * i * i * this.charge * (0.93 + 0.07 * Math.random()) + const ARC = 6 * i * i * this.charge * (0.93 + 0.07 * Math.random()) ctx.beginPath(); - ctx.moveTo(path[0].x, path[0].y); - ctx.lineTo(path[1].x, path[1].y); - ctx.strokeStyle = `rgba(100,0,180,0.7)`; - ctx.lineWidth = this.charge * 1 - ctx.setLineDash([10, 20]); - ctx.stroke(); - ctx.setLineDash([]); - //draw magnetic field - const X = m.pos.x - const Y = m.pos.y - const unitVector = { x: Math.cos(m.angle), y: Math.sin(m.angle) } - const unitVectorPerp = Vector.perp(unitVector) - - function magField(mag, arc) { - ctx.moveTo(X, Y); - ctx.bezierCurveTo( - X + unitVector.x * mag, Y + unitVector.y * mag, - X + unitVector.x * mag + unitVectorPerp.x * arc, Y + unitVector.y * mag + unitVectorPerp.y * arc, - X + unitVectorPerp.x * arc, Y + unitVectorPerp.y * arc) - ctx.bezierCurveTo( - X - unitVector.x * mag + unitVectorPerp.x * arc, Y - unitVector.y * mag + unitVectorPerp.y * arc, - X - unitVector.x * mag, Y - unitVector.y * mag, - X, Y) - } - ctx.fillStyle = `rgba(50,0,100,0.05)`; - for (let i = 3; i < 7; i++) { - const MAG = 8 * i * i * this.charge * (0.93 + 0.07 * Math.random()) - const ARC = 6 * i * i * this.charge * (0.93 + 0.07 * Math.random()) - ctx.beginPath(); - magField(MAG, ARC) - magField(MAG, -ARC) - ctx.fill(); - } + magField(MAG, ARC) + magField(MAG, -ARC) + ctx.fill(); } } - } else { - - // if (true) { //grappling hook, not working really - // if (m.immuneCycle < m.cycle + 60) m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles - // b.harpoon(where, closest.target, m.angle, harpoonSize, false, 15) - // m.fireCDcycle = m.cycle + 50 * b.fireCDscale; // cool down - // const speed = 50 - // const velocity = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } - // Matter.Body.setVelocity(player, velocity); - - // } else { - - for (let i = 0, len = mob.length; i < len; ++i) { - if (mob[i].alive && !mob[i].isBadTarget && Matter.Query.ray(map, m.pos, mob[i].position).length === 0) { - const dot = Vector.dot(dir, Vector.normalise(Vector.sub(mob[i].position, m.pos))) //the dot product of diff and dir will return how much over lap between the vectors - const dist = Vector.magnitude(Vector.sub(where, mob[i].position)) - if (dist < closest.distance && dot > 0.95 && dist * dot * dot * dot * dot > 880) { //target closest mob that player is looking at and isn't too close to target - closest.distance = dist - closest.target = mob[i] - } - } - } - b.harpoon(where, closest.target, m.angle, harpoonSize, false, 15) - m.fireCDcycle = m.cycle + 50 * b.fireCDscale; // cool down } + // } else { + + // // if (true) { //grappling hook, not working really + // // if (m.immuneCycle < m.cycle + 60) m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles + // // b.harpoon(where, closest.target, m.angle, harpoonSize, false, 15) + // // m.fireCDcycle = m.cycle + 50 * b.fireCDscale; // cool down + // // const speed = 50 + // // const velocity = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } + // // Matter.Body.setVelocity(player, velocity); + + // // } else { + + // for (let i = 0, len = mob.length; i < len; ++i) { + // if (mob[i].alive && !mob[i].isBadTarget && Matter.Query.ray(map, m.pos, mob[i].position).length === 0) { + // const dot = Vector.dot(dir, Vector.normalise(Vector.sub(mob[i].position, m.pos))) //the dot product of diff and dir will return how much over lap between the vectors + // const dist = Vector.magnitude(Vector.sub(where, mob[i].position)) + // if (dist < closest.distance && dot > 0.95 && dist * dot * dot * dot * dot > 880) { //target closest mob that player is looking at and isn't too close to target + // closest.distance = dist + // closest.target = mob[i] + // } + // } + // } + // b.harpoon(where, closest.target, m.angle, harpoonSize, false, 15) + // m.fireCDcycle = m.cycle + 50 * b.fireCDscale; // cool down + // } } else if (tech.extraHarpoons) { const range = 450 * (tech.isFilament ? 1 + 0.005 * Math.min(110, this.ammo) : 1) let targetCount = 0 diff --git a/js/level.js b/js/level.js index c1d1504..238bb2d 100644 --- a/js/level.js +++ b/js/level.js @@ -19,9 +19,9 @@ const level = { // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why // simulation.isHorizontalFlipped = true // m.setField("standing wave") - // b.giveGuns("laser") + // b.giveGuns("harpoon") // for (let i = 0; i < 100; i++) tech.giveTech("slow light") - // tech.giveTech("eject") + // tech.giveTech("recycling") // for (let i = 0; i < 2; i++) powerUps.directSpawn(0, 0, "tech"); // tech.giveTech("tinsellated flagella") // for (let i = 0; i < 3; i++) tech.giveTech("undefined") @@ -2374,8 +2374,8 @@ const level = { }, null() { level.levels.pop(); //remove lore level from rotation - level.onLevel-- - console.log(level.onLevel, level.levels) + // level.onLevel-- + // console.log(level.onLevel, level.levels) //start a conversation based on the number of conversations seen if (localSettings.loreCount < lore.conversation.length && !simulation.isCheating) { lore.testSpeechAPI() //see if speech is working diff --git a/js/player.js b/js/player.js index 2bc8faa..ce1975f 100644 --- a/js/player.js +++ b/js/player.js @@ -1723,8 +1723,8 @@ const m = { } m.hold = function() { const wave = Math.sin(m.cycle * 0.022); - m.fieldRange = 160 + 12 * wave + 100 * tech.isBigField - m.fieldArc = 0.34 + 0.04 * wave + 0.065 * tech.isBigField //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) + m.fieldRange = 180 + 12 * wave + 100 * tech.isBigField + m.fieldArc = 0.35 + 0.045 * wave + 0.065 * tech.isBigField //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) m.calculateFieldThreshold(); if (m.isHolding) { m.drawHold(m.holdingTarget); diff --git a/js/simulation.js b/js/simulation.js index 741e4ab..53ed42f 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -888,7 +888,7 @@ const simulation = { // } // }, checks() { - if (!(simulation.cycle % 60)) { //once a second + if (!(m.cycle % 60)) { //once a second //energy overfill if (m.energy > m.maxEnergy) m.energy = m.maxEnergy + (m.energy - m.maxEnergy) * tech.overfillDrain //every second energy above max energy loses 25% if (tech.isFlipFlopEnergy && m.immuneCycle < m.cycle) { @@ -942,12 +942,13 @@ const simulation = { // } // } - if (m.lastKillCycle + 300 > simulation.cycle) { //effects active for 5 seconds after killing a mob + if (m.lastKillCycle + 300 > m.cycle) { //effects active for 5 seconds after killing a mob if (tech.isEnergyRecovery && m.immuneCycle < m.cycle) m.energy += m.maxEnergy * 0.05 + console.log(`lastKill = ${m.lastKillCycle}, cycle = ${m.cycle}, health = ${m.health}, maxHealth = ${m.maxHealth}`) if (tech.isHealthRecovery) m.addHealth(0.01 * m.maxHealth) } - if (!(simulation.cycle % 420)) { //once every 7 seconds + if (!(m.cycle % 420)) { //once every 7 seconds if (tech.isZeno) { m.health *= 0.9167 //remove 1/12 m.displayHealth(); diff --git a/js/tech.js b/js/tech.js index 6ca5363..c8356f3 100644 --- a/js/tech.js +++ b/js/tech.js @@ -5330,16 +5330,16 @@ const tech = { { name: "capacitor bank", // description: "charge effects build up almost instantly
throwing blocks, foam, railgun, pulse, tokamak", - descriptionFunction() { return `charge effects build up almost instantly
throwing blocks, ${tech.haveGunCheck("foam", false) ? "foam" : "foam"}, ${tech.isRailGun ? "railgun" : "railgun"}, ${tech.isPulseLaser ? "pulse" : "pulse"}, ${tech.isTokamak ? "tokamak" : "tokamak"}` }, + descriptionFunction() { return `charge effects build up almost instantly
throwing blocks, ${tech.haveGunCheck("foam", false) ? "foam" : "foam"}, ${tech.haveGunCheck("harpoon", false) ? "railgun" : "railgun"}, ${tech.isPulseLaser ? "pulse" : "pulse"}, ${tech.isTokamak ? "tokamak" : "tokamak"}` }, isGunTech: true, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return tech.blockDamage > 0.075 || tech.haveGunCheck("foam") || tech.isRailGun || tech.isTokamak || tech.isPulseLaser + return tech.blockDamage > 0.075 || tech.haveGunCheck("foam") || tech.isTokamak || tech.isPulseLaser }, - requires: "throwing blocks, foam, railgun, pulse, tokamak", + requires: "throwing blocks, foam, pulse, tokamak", effect() { tech.isCapacitor = true; }, @@ -5537,7 +5537,7 @@ const tech = { }, { name: "toggling harpoon", - description: "increase the damage of your next harpoon
by 800% after using it to collect a power up", + description: "increase the damage of your next harpoon
by 600% after using it to collect a power up", isGunTech: true, maxCount: 1, count: 0, @@ -5574,9 +5574,28 @@ const tech = { tech.extraHarpoons = 0; } }, + // { + // name: "railgun", + // description: "firing the harpoon while crouched launches
a rod that is faster, larger, and more dense", + // isGunTech: true, + // maxCount: 1, + // count: 0, + // frequency: 2, + // frequencyDefault: 2, + // allowed() { + // return tech.haveGunCheck("harpoon") + // }, + // requires: "railgun", + // effect() { + // tech.isRailGun = true; + // }, + // remove() { + // tech.isRailGun = false; + // } + // }, { - name: "railgun", - description: "firing the harpoon while crouched launches
a rod that is faster, larger, and more dense", + name: "half-wave rectifier", + description: "harpoons drain no energy as they retract
crouch firing harpoon generates energy", isGunTech: true, maxCount: 1, count: 0, @@ -5586,25 +5605,6 @@ const tech = { return tech.haveGunCheck("harpoon") }, requires: "railgun", - effect() { - tech.isRailGun = true; - }, - remove() { - tech.isRailGun = false; - } - }, - { - name: "half-wave rectifier", - description: "charging the railgun gives you energy
instead of draining it", - isGunTech: true, - maxCount: 1, - count: 0, - frequency: 2, - frequencyDefault: 2, - allowed() { - return tech.isRailGun - }, - requires: "harpoon, railgun", effect() { tech.isRailEnergyGain = true; }, diff --git a/todo.txt b/todo.txt index ac47cde..585502c 100644 --- a/todo.txt +++ b/todo.txt @@ -1,15 +1,17 @@ ******************************************************** NEXT PATCH ************************************************** -seeds are displayed in pause menu and intro map -seeds from your previous run is displayed in settings after you die -fixed some minor seed inconsistency +harpoon's crouch is now a harpoon sized railgun +tech: halfwave rectifier now gives energy on harpoon/railgun charge and also stops harpoon from draining energy when it retracts +toggling harpoon does 800 -> 600% more damage + +perfect diamagnetism default field is a bit larger + +bug fix with several periodic checks running off simulation time + they now run on player time and will be active during time dilation +fixed a bug where lore wasn't working ******************************************************** TODO ******************************************************** -make railgun default fire mode for crouch harpoon? - -buff perfect diamagnetism - make a seed/hash system that controls only the tech/guns/fields shown URL sharing could include a seed seed will control: