railgun default harpoon

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
This commit is contained in:
landgreen
2022-02-08 05:51:06 -08:00
parent d51a9d6dd8
commit 67a6ee29d1
7 changed files with 257 additions and 256 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1406,7 +1406,7 @@ const b = {
this.caughtPowerUp.effect(); this.caughtPowerUp.effect();
Matter.Composite.remove(engine.world, this.caughtPowerUp); Matter.Composite.remove(engine.world, this.caughtPowerUp);
powerUp.splice(index, 1); 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 { } else {
this.dropCaughtPowerUp() this.dropCaughtPowerUp()
} }
@@ -1468,7 +1468,7 @@ const b = {
} }
} }
} else { } 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 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 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) const returnForce = Vector.mult(Vector.normalise(sub), rangeScale * this.thrustMag * this.mass)
@@ -5597,9 +5597,8 @@ 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 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 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) const totalCycles = 7 * (tech.isFilament ? 1 + 0.01 * Math.min(110, this.ammo) : 1) * Math.sqrt(harpoonSize)
if (input.down) { if (input.down) { //railgun
// if (true) {
if (tech.isRailGun) {
function pushAway(range) { //push away blocks when firing function pushAway(range) { //push away blocks when firing
for (let i = 0, len = mob.length; i < len; ++i) { for (let i = 0, len = mob.length; i < len; ++i) {
const SUB = Vector.sub(mob[i].position, m.pos) const SUB = Vector.sub(mob[i].position, m.pos)
@@ -5624,9 +5623,8 @@ const b = {
} }
const me = bullet.length; 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 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 }], 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 density: 0.03, //0.001 is normal
restitution: 0, restitution: 0,
frictionAir: 0, frictionAir: 0,
@@ -5812,31 +5810,31 @@ const b = {
} }
} }
} }
} 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 { // } else {
for (let i = 0, len = mob.length; i < len; ++i) { // // if (true) { //grappling hook, not working really
if (mob[i].alive && !mob[i].isBadTarget && Matter.Query.ray(map, m.pos, mob[i].position).length === 0) { // // if (m.immuneCycle < m.cycle + 60) m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
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 // // b.harpoon(where, closest.target, m.angle, harpoonSize, false, 15)
const dist = Vector.magnitude(Vector.sub(where, mob[i].position)) // // m.fireCDcycle = m.cycle + 50 * b.fireCDscale; // cool down
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 // // const speed = 50
closest.distance = dist // // const velocity = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }
closest.target = mob[i] // // Matter.Body.setVelocity(player, velocity);
}
} // // } else {
}
b.harpoon(where, closest.target, m.angle, harpoonSize, false, 15) // for (let i = 0, len = mob.length; i < len; ++i) {
m.fireCDcycle = m.cycle + 50 * b.fireCDscale; // cool down // 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) { } else if (tech.extraHarpoons) {
const range = 450 * (tech.isFilament ? 1 + 0.005 * Math.min(110, this.ammo) : 1) const range = 450 * (tech.isFilament ? 1 + 0.005 * Math.min(110, this.ammo) : 1)
let targetCount = 0 let targetCount = 0

View File

@@ -19,9 +19,9 @@ const level = {
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
// simulation.isHorizontalFlipped = true // simulation.isHorizontalFlipped = true
// m.setField("standing wave") // m.setField("standing wave")
// b.giveGuns("laser") // b.giveGuns("harpoon")
// for (let i = 0; i < 100; i++) tech.giveTech("slow light") // 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"); // for (let i = 0; i < 2; i++) powerUps.directSpawn(0, 0, "tech");
// tech.giveTech("tinsellated flagella") // tech.giveTech("tinsellated flagella")
// for (let i = 0; i < 3; i++) tech.giveTech("undefined") // for (let i = 0; i < 3; i++) tech.giveTech("undefined")
@@ -2374,8 +2374,8 @@ const level = {
}, },
null() { null() {
level.levels.pop(); //remove lore level from rotation level.levels.pop(); //remove lore level from rotation
level.onLevel-- // level.onLevel--
console.log(level.onLevel, level.levels) // console.log(level.onLevel, level.levels)
//start a conversation based on the number of conversations seen //start a conversation based on the number of conversations seen
if (localSettings.loreCount < lore.conversation.length && !simulation.isCheating) { if (localSettings.loreCount < lore.conversation.length && !simulation.isCheating) {
lore.testSpeechAPI() //see if speech is working lore.testSpeechAPI() //see if speech is working

View File

@@ -1723,8 +1723,8 @@ const m = {
} }
m.hold = function() { m.hold = function() {
const wave = Math.sin(m.cycle * 0.022); const wave = Math.sin(m.cycle * 0.022);
m.fieldRange = 160 + 12 * wave + 100 * tech.isBigField m.fieldRange = 180 + 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.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(); m.calculateFieldThreshold();
if (m.isHolding) { if (m.isHolding) {
m.drawHold(m.holdingTarget); m.drawHold(m.holdingTarget);

View File

@@ -888,7 +888,7 @@ const simulation = {
// } // }
// }, // },
checks() { checks() {
if (!(simulation.cycle % 60)) { //once a second if (!(m.cycle % 60)) { //once a second
//energy overfill //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 (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) { 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 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 (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) { if (tech.isZeno) {
m.health *= 0.9167 //remove 1/12 m.health *= 0.9167 //remove 1/12
m.displayHealth(); m.displayHealth();

View File

@@ -5330,16 +5330,16 @@ const tech = {
{ {
name: "capacitor bank", name: "capacitor bank",
// description: "<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, foam, railgun, pulse, tokamak</em>", // description: "<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, foam, railgun, pulse, tokamak</em>",
descriptionFunction() { return `<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, ${tech.haveGunCheck("foam", false) ? "<strong>foam</strong>" : "foam"}, ${tech.isRailGun ? "<strong>railgun</strong>" : "railgun"}, ${tech.isPulseLaser ? "<strong>pulse</strong>" : "pulse"}, ${tech.isTokamak ? "<strong>tokamak</strong>" : "tokamak"}</em>` }, descriptionFunction() { return `<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, ${tech.haveGunCheck("foam", false) ? "<strong>foam</strong>" : "foam"}, ${tech.haveGunCheck("harpoon", false) ? "<strong>railgun</strong>" : "railgun"}, ${tech.isPulseLaser ? "<strong>pulse</strong>" : "pulse"}, ${tech.isTokamak ? "<strong>tokamak</strong>" : "tokamak"}</em>` },
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { 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() { effect() {
tech.isCapacitor = true; tech.isCapacitor = true;
}, },
@@ -5537,7 +5537,7 @@ const tech = {
}, },
{ {
name: "toggling harpoon", name: "toggling harpoon",
description: "increase the <strong class='color-d'>damage</strong> of your next <strong>harpoon</strong><br>by <strong>800%</strong> after using it to collect a <strong>power up</strong>", description: "increase the <strong class='color-d'>damage</strong> of your next <strong>harpoon</strong><br>by <strong>600%</strong> after using it to collect a <strong>power up</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5574,9 +5574,28 @@ const tech = {
tech.extraHarpoons = 0; tech.extraHarpoons = 0;
} }
}, },
// {
// name: "railgun",
// description: "firing the <strong>harpoon</strong> while crouched launches<br>a rod that is <strong>faster</strong>, <strong>larger</strong>, and more <strong>dense</strong>",
// 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", name: "half-wave rectifier",
description: "firing the <strong>harpoon</strong> while crouched launches<br>a rod that is <strong>faster</strong>, <strong>larger</strong>, and more <strong>dense</strong>", description: "<strong>harpoons</strong> drain no <strong class='color-f'>energy</strong> as they <strong>retract</strong><br><strong>crouch</strong> firing <strong>harpoon</strong> generates <strong class='color-f'>energy</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5586,25 +5605,6 @@ const tech = {
return tech.haveGunCheck("harpoon") return tech.haveGunCheck("harpoon")
}, },
requires: "railgun", requires: "railgun",
effect() {
tech.isRailGun = true;
},
remove() {
tech.isRailGun = false;
}
},
{
name: "half-wave rectifier",
description: "charging the <strong>railgun</strong> gives you <strong class='color-f'>energy</strong><br><em>instead of draining it</em>",
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.isRailGun
},
requires: "harpoon, railgun",
effect() { effect() {
tech.isRailEnergyGain = true; tech.isRailEnergyGain = true;
}, },

View File

@@ -1,15 +1,17 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
seeds are displayed in pause menu and intro map harpoon's crouch is now a harpoon sized railgun
seeds from your previous run is displayed in settings after you die tech: halfwave rectifier now gives energy on harpoon/railgun charge and also stops harpoon from draining energy when it retracts
fixed some minor seed inconsistency 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 ******************************************************** ******************************************************** 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 make a seed/hash system that controls only the tech/guns/fields shown
URL sharing could include a seed URL sharing could include a seed
seed will control: seed will control: