diff --git a/.DS_Store b/.DS_Store
index a18c0cc..28a3b89 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index add0550..8559c37 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -1365,7 +1365,7 @@ const b = {
},
minDmgSpeed: 4,
lookFrequency: Math.floor(7 + Math.random() * 3),
- density: tech.harpoonDensity, //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed
+ density: tech.harpoonDensity, //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
drain: 0.004,
beforeDmg(who) {
if (tech.isShieldPierce && who.isShielded) { //disable shields
@@ -1398,7 +1398,7 @@ const b = {
this.caughtPowerUp.effect();
Matter.Composite.remove(engine.world, this.caughtPowerUp);
powerUp.splice(index, 1);
- if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.006 * 6 //0.006 is normal
+ if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.005 * 6 //0.005 is normal
} else {
this.dropCaughtPowerUp()
}
@@ -1629,7 +1629,7 @@ const b = {
},
minDmgSpeed: 4,
lookFrequency: Math.floor(7 + Math.random() * 3),
- density: tech.harpoonDensity, //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed
+ density: tech.harpoonDensity, //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
beforeDmg(who) {
if (tech.isShieldPierce && who.isShielded) { //disable shields
who.isShielded = false
@@ -1671,7 +1671,7 @@ const b = {
this.caughtPowerUp.effect();
Matter.Composite.remove(engine.world, this.caughtPowerUp);
powerUp.splice(index, 1);
- if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.006 * 6 //0.006 is normal
+ if (tech.isHarpoonPowerUp) tech.harpoonDensity = 0.005 * 6 //0.006 is normal
} else {
this.dropCaughtPowerUp()
}
@@ -6153,7 +6153,7 @@ const b = {
}
//fire
if ((!input.fire && this.charge > 0.6)) {
- tech.harpoonDensity = 0.009 //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed
+ tech.harpoonDensity = 0.008 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
const where = {
x: m.pos.x + 30 * Math.cos(m.angle),
y: m.pos.y + 30 * Math.sin(m.angle)
@@ -6208,7 +6208,8 @@ const b = {
const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.03 : 0.06)
player.force.x -= recoil.x
player.force.y -= recoil.y
- tech.harpoonDensity = 0.01 //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed
+ tech.harpoonDensity = 0.008 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
+
const harpoonSize = tech.isLargeHarpoon ? 1 + 0.1 * Math.sqrt(this.ammo) : 1
if (tech.extraHarpoons) {
let targetCount = 0
@@ -6412,7 +6413,7 @@ const b = {
const recoil = Vector.mult(Vector.normalise(Vector.sub(where, m.pos)), input.down ? 0.015 : 0.035)
player.force.x -= recoil.x
player.force.y -= recoil.y
- tech.harpoonDensity = 0.006 //0.001 is normal for blocks, 0.006 is normal for harpoon, 0.006*6 when buffed
+ tech.harpoonDensity = 0.005 //0.001 is normal for blocks, 0.005 is normal for harpoon, 0.005*6 when buffed
},
// railGun2() {
// const where = {
diff --git a/js/level.js b/js/level.js
index da8a2f1..67d8451 100644
--- a/js/level.js
+++ b/js/level.js
@@ -18,7 +18,7 @@ const level = {
// m.setField("metamaterial cloaking")
// b.giveGuns("harpoon")
// tech.giveTech("grappling hook")
- // tech.giveTech("bulk modulus")
+ // tech.giveTech("capacitor bank")
// for (let i = 0; i < 2; i++) powerUps.directSpawn(0, 0, "tech");
// for (let i = 0; i < 9; i++) tech.giveTech("dynamo-bot")
// for (let i = 10; i < tech.tech.length; i++) { tech.tech[i].isBanished = true }
@@ -32,7 +32,7 @@ const level = {
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
// simulation.enableConstructMode() //used to build maps in testing mode
// level.reactor();
- // level.pavilion(); //not in rotation, used for testing
+ // level.testing(); //not in rotation, used for testing
if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************
// powerUps.research.changeRerolls(3000)
// for (let i = 0; i < 30; i++) powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "tech", false);
@@ -113,9 +113,7 @@ const level = {
for (let i = 0; i < 2; i++) powerUps.spawn(level.exit.x + 10 * (Math.random() - 0.5), level.exit.y - 100 + 10 * (Math.random() - 0.5), "tech", false) //exit
// for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 90 * (Math.random() - 0.5), player.position.y + 90 * (Math.random() - 0.5), "tech", false); //start
}
- if (m.plasmaBall) {
- m.plasmaBall.isOn = false
- }
+ if (m.plasmaBall) m.plasmaBall.isOn = false
},
trainingText(say) {
simulation.lastLogTime = 0; //clear previous messages
@@ -2543,11 +2541,11 @@ const level = {
spawn.mapRect(4850, -275, 50, 175);
//???
- level.difficultyIncrease(5) //30 is near max on hard //60 is near max on why
+ level.difficultyIncrease(15) //30 is near max on hard //60 is near max on why
m.addHealth(Infinity)
- // spawn.starter(1900, -500, 200) //big boy
- for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500)
+ spawn.starter(1900, -500, 200) //big boy
+ // for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500)
// spawn.slashBoss(1900, -500)
// spawn.launcherBoss(3200, -500)
// spawn.laserTargetingBoss(1700, -500)
diff --git a/js/player.js b/js/player.js
index ca03267..a32db1a 100644
--- a/js/player.js
+++ b/js/player.js
@@ -2103,16 +2103,12 @@ const m = {
mask: 0 //cat.body | cat.map | cat.mob | cat.mobBullet | cat.mobShield
},
frictionAir: 0,
- // radius: 1,
- // friction: 0,
- // frictionStatic: 0,
- // restitution: 0,
alpha: 0.6,
isAttached: false,
isOn: false,
- drain: 0.0012,
+ drain: 0.0015,
radiusLimit: 10,
- damage: 0.18,
+ damage: 0.4,
setPositionToNose() {
const nose = { x: m.pos.x + 10 * Math.cos(m.angle), y: m.pos.y + 10 * Math.sin(m.angle) }
Matter.Body.setPosition(this, Vector.add(nose, Vector.mult(Vector.normalise(Vector.sub(nose, m.pos)), this.circleRadius)));
@@ -2120,38 +2116,94 @@ const m = {
fire() {
this.isAttached = false;
const speed = 4 //scale with mass?
+ // Matter.Body.setVelocity(this, {
+ // x: speed * Math.cos(m.angle),
+ // y: speed * Math.sin(m.angle)
+ // });
Matter.Body.setVelocity(this, {
- x: 0.4 * player.velocity.x + speed * Math.cos(m.angle),
- y: 0.2 * player.velocity.y + speed * Math.sin(m.angle)
+ x: player.velocity.x * 0.5 + speed * Math.cos(m.angle),
+ y: player.velocity.y * 0.2 + speed * Math.sin(m.angle)
});
+ m.plasmaBall.setPositionToNose()
+ },
+ scale(scale) {
+ Matter.Body.scale(m.plasmaBall, scale, scale); //shrink fast
+ if (this.circleRadius < this.radiusLimit) this.isOn = false
},
do() {
if (this.isOn) {
//collisions with map
if (Matter.Query.collides(this, map).length > 0) {
- const scale = Math.max(0.7, 0.99 - 1 / m.plasmaBall.circleRadius)
- Matter.Body.scale(m.plasmaBall, scale, scale); //shrink fast
- if (m.plasmaBall.circleRadius < m.plasmaBall.radiusLimit) this.isOn = false
+ this.scale(Math.max(0.9, 0.98 - 0.05 / m.plasmaBall.circleRadius))
+ if (this.speed > 2.5) {
+ const scale = 0.96
+ Matter.Body.setVelocity(this, {
+ x: scale * this.velocity.x,
+ y: scale * this.velocity.y
+ });
+ }
}
//collisions with mobs
const whom = Matter.Query.collides(this, mob)
const dmg = this.damage * m.dmgScale
for (let i = 0, len = whom.length; i < len; i++) {
- if (whom[i].bodyA.alive) whom[i].bodyA.damage(dmg);
- if (whom[i].bodyB.alive) whom[i].bodyB.damage(dmg);
+ if (whom[i].bodyA.alive) {
+ whom[i].bodyA.damage(dmg);
+ if (whom[i].bodyA.shield) this.scale(Math.max(0.9, 0.99 - 0.5 / m.plasmaBall.circleRadius))
+ }
+ if (whom[i].bodyB.alive) {
+ whom[i].bodyB.damage(dmg);
+ if (whom[i].bodyB.shield) this.scale(Math.max(0.9, 0.99 - 0.5 / m.plasmaBall.circleRadius))
+ }
+ }
+ //slowly slow down if too fast
+ if (this.speed > 6) {
+ const scale = 0.997
+ Matter.Body.setVelocity(this, {
+ x: scale * this.velocity.x,
+ y: scale * this.velocity.y
+ });
}
-
-
//graphics
- var gradient = ctx.createRadialGradient(this.position.x, this.position.y, 0, this.position.x, this.position.y, this.circleRadius);
+ const radius = this.circleRadius * (0.99 + 0.02 * Math.random()) + 3 * Math.random()
+ const gradient = ctx.createRadialGradient(this.position.x, this.position.y, 0, this.position.x, this.position.y, radius);
+ this.alpha = 0.5 + 0.1 * Math.random()
gradient.addColorStop(0, `rgba(255,255,255,${this.alpha})`);
- gradient.addColorStop(0.2, `rgba(255,200,255,${this.alpha})`);
- gradient.addColorStop(1, `rgba(255,0,255,${this.alpha})`);
+ gradient.addColorStop(0.18 + 0.1 * Math.random(), `rgba(255,150,255,${this.alpha})`);
+ gradient.addColorStop(0.95, `rgba(255,0,255,${this.alpha})`);
+ // gradient.addColorStop(1, `rgba(255,150,255,${this.alpha})`);
ctx.fillStyle = gradient
ctx.beginPath();
- ctx.arc(this.position.x, this.position.y, this.circleRadius, 0, 2 * Math.PI);
+ ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI);
ctx.fill();
+ //draw arcs
+ const unit = Vector.rotate({ x: 1, y: 0 }, Math.random() * 6.28)
+ let len = 8
+ const step = this.circleRadius / len
+ let x = this.position.x
+ let y = this.position.y
+ ctx.beginPath();
+ if (Math.random() < 0.5) {
+ x += step * (unit.x + 6 * (Math.random() - 0.5))
+ y += step * (unit.y + 6 * (Math.random() - 0.5))
+ len -= 2
+ }
+ if (Math.random() < 0.5) {
+ x += step * (unit.x + 6 * (Math.random() - 0.5))
+ y += step * (unit.y + 6 * (Math.random() - 0.5))
+ len -= 2
+ }
+ ctx.moveTo(x, y);
+
+ for (let i = 0; i < len; i++) {
+ x += step * (unit.x + 1.9 * (Math.random() - 0.5))
+ y += step * (unit.y + 1.9 * (Math.random() - 0.5))
+ ctx.lineTo(x, y);
+ }
+ ctx.strokeStyle = "#88f";
+ ctx.lineWidth = 2 * Math.random();
+ ctx.stroke();
}
},
});
@@ -2176,20 +2228,32 @@ const m = {
m.plasmaBall.setPositionToNose()
}
} else if (m.energy > m.plasmaBall.drain) { //charge up when attached
- m.energy -= m.plasmaBall.drain;
- const scale = 1 + 5 * Math.pow(Math.max(1, m.plasmaBall.circleRadius), -1.5)
- Matter.Body.scale(m.plasmaBall, scale, scale); //grow
+
+
+ if (tech.isCapacitor) {
+ m.energy -= m.plasmaBall.drain * 4;
+ const scale = 1 + 5 * 16 * Math.pow(Math.max(1, m.plasmaBall.circleRadius), -1.8)
+ Matter.Body.scale(m.plasmaBall, scale, scale); //grow
+
+ } else {
+ m.energy -= m.plasmaBall.drain;
+ const scale = 1 + 16 * Math.pow(Math.max(1, m.plasmaBall.circleRadius), -1.8)
+ Matter.Body.scale(m.plasmaBall, scale, scale); //grow
+ }
m.plasmaBall.setPositionToNose()
//add friction for player when holding ball, maybe more friction in vertical
-
} else {
m.fieldCDcycle = m.cycle + 90;
m.plasmaBall.fire()
}
} else if (m.holdingTarget && m.fieldCDcycle < m.cycle) { //holding, but field button is released
m.pickUp();
+ if (m.plasmaBall.isAttached) {
+ m.fieldCDcycle = m.cycle + 30;
+ m.plasmaBall.fire()
+ }
} else {
m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
if (m.plasmaBall.isAttached) {
@@ -2200,6 +2264,7 @@ const m = {
m.drawFieldMeter("rgba(0, 0, 0, 0.2)")
m.plasmaBall.do()
+ console.log(m.plasmaBall.isAttached)
}
@@ -2903,7 +2968,7 @@ const m = {
for (let i = 0, len = body.length; i < len; ++i) {
if (Vector.magnitude(Vector.sub(body[i].position, m.fieldPosition)) < m.fieldRadius && !body[i].isNotHoldable) {
- const DRAIN = speed * body[i].mass * 0.000005 // * (1 + m.energy * m.energy) //drain more energy when you have more energy
+ const DRAIN = speed * body[i].mass * 0.0000035 // * (1 + m.energy * m.energy) //drain more energy when you have more energy
if (m.energy > DRAIN) {
m.energy -= DRAIN;
Matter.Body.setVelocity(body[i], velocity); //give block mouse velocity
@@ -2988,10 +3053,10 @@ const m = {
},
{
name: "wormhole",
- description: "use energy to tunnel through a wormhole
wormholes attract blocks and power ups
7% chance to duplicate spawned power ups", //
bullets may also traverse wormholes
+ description: "use energy to tunnel through a wormhole
wormholes attract blocks and power ups
5% chance to duplicate spawned power ups", //
bullets may also traverse wormholes
drain: 0,
effect: function() {
- m.duplicateChance = 0.07
+ m.duplicateChance = 0.05
m.fieldRange = 0
powerUps.setDupChance(); //needed after adjusting duplication chance
diff --git a/js/powerup.js b/js/powerup.js
index fd272a0..48fd73b 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -1045,7 +1045,7 @@ const powerUps = {
},
pauseEjectTech(index) {
if (tech.isPauseEjectTech || simulation.testing) {
- if (Math.random() < 0.04 || tech.tech[index].isFromAppliedScience) {
+ if (Math.random() < 0.1 || tech.tech[index].isFromAppliedScience) {
tech.removeTech(index)
powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), "research", false);
} else {
diff --git a/js/tech.js b/js/tech.js
index 7bd62cd..5750bf4 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -3070,7 +3070,7 @@ const tech = {
},
{
name: "paradigm shift",
- description: `clicking tech while paused ejects them
4% chance to convert that tech into ${powerUps.orb.research(1)}`,
+ description: `clicking tech while paused ejects them
10% chance to convert that tech into ${powerUps.orb.research(1)}`,
maxCount: 1,
count: 0,
frequency: 1,
@@ -3859,7 +3859,7 @@ const tech = {
},
{
name: "pneumatic actuator",
- description: "nail gun takes no time to ramp up
to it's shortest delay after firing",
+ description: "nail gun takes no time to ramp up
to its shortest delay after firing",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5430,16 +5430,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, ${tech.haveGunCheck("foam", false) ? "foam" : "foam"}, ${tech.isPlasmaBall ? "plasma ball" : "plasma ball"}, ${tech.isRailGun ? "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.isRailGun || tech.haveGunCheck("foam") || tech.isTokamak || tech.isPulseLaser
+ return tech.blockDamage > 0.075 || tech.isRailGun || tech.haveGunCheck("foam") || tech.isTokamak || tech.isPulseLaser || tech.isPlasmaBall
},
- requires: "throwing blocks, railgun, foam, pulse, tokamak",
+ requires: "throwing blocks, railgun, foam, pulse, tokamak, plasma ball",
effect() {
tech.isCapacitor = true;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
@@ -5717,7 +5717,7 @@ const tech = {
},
remove() {
tech.isHarpoonPowerUp = false
- tech.harpoonDensity = 0.006
+ tech.harpoonDensity = 0.005
}
},
{
@@ -6654,7 +6654,7 @@ const tech = {
},
remove() {
tech.isPlasmaBall = false;
- if (this.count) m.fieldUpgrades[m.fieldMode].set()
+ if (this.count && m.fieldUpgrades[m.fieldMode].name === "plasma torch") m.fieldUpgrades[m.fieldMode].set()
}
},
{
@@ -6675,7 +6675,7 @@ const tech = {
},
remove() {
tech.isExtruder = false;
- if (this.count) m.fieldUpgrades[m.fieldMode].set()
+ if (this.count && m.fieldUpgrades[m.fieldMode].name === "plasma torch") m.fieldUpgrades[m.fieldMode].set()
}
},
{
diff --git a/todo.txt b/todo.txt
index 71b40e8..18f947b 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,25 +1,46 @@
******************************************************** NEXT PATCH **************************************************
+plasma ball
+ much more damage
+ new graphics
+ fast decay in mob shields
+ works with capacitor
+ some bug fixes
-plasma ball is now live, but it's still in beta
- still needs
- new graphics
- damage balancing
- fast decay in mob shields
- player angle rotation speed while firing adds to fire speed
- tech upgrade to get electrical arcs that randomly damage nearby mobs
- current tech synergy
- capacitor bank,plasma jet(range?)
-
-reservoir level is less crowded, so you can dodge mobs easier
- horizontal flipped version is so reenabled
-pure science renamed paradigm shift
-difficulty scaling for heal and mob damage reduced 2%
-
-some possible bug fixes, I don't know...
-
+paradigm shift: 4->10% chance to give research instead of tech
+harpoon density: 0.006->0.005 (lower damage and knock back to mobs)
+wormhole: 7->5% duplication chance
+pilot wave uses less energy
******************************************************** TODO ********************************************************
+plasma ball
+ maybe grow faster when you have more energy
+ or excess energy
+ change size/alpha when touching mobs
+ explode when touching mobs like spirit bomb?
+ player angle rotation speed while firing adds to fire speed
+ tech upgrade to get electrical arcs that randomly damage nearby mobs
+ use plasma jet tech?
+ tech: black hole: gives the plasma ball gravity
+ plasma orb increases in size and power as it eats enemies
+ maybe does damage to player to grow faster?
+ tech that makes it explode when it expires
+
+bug: often game puts player position at NaN
+ try:
+ cloaking/harpoon grapple on normal, continue past beating the final boss
+ clues:
+ maybe with vanish or other special blocks and grapple hook
+ very high level for tech, duplication
+ maybe not about JUNK though
+ maybe on tons of bullets
+ maybe grappling hook, Bulk modulus
+ solution: just kill the player if they go NaN
+ vanish elements shouldn't collide with mobs
+ maybe they don't return if mobs are in the way?
+ maybe they kill mobs in the way
+ maybe they should go non-collide with mobs
+
bug: harpoon attack gave a mob really high levels of health
recent events:
had 3 harpoons at a time
@@ -34,17 +55,6 @@ bug: maybe I can put in an event listener to reset inputs to false when you tab
enemies stuck with foam receive upward force over time
only form aerogel tech?
-bug: often game puts player position at NaN
- try:
- cloaking/harpoon grapple on normal, continue past beating the final boss
- clues:
- maybe with vanish or other special blocks and grapple hook
- very high level for tech, duplication
- maybe not about JUNK though
- maybe on tons of bullets
- maybe grappling hook, Bulk modulus
- solution: just kill the player if they go NaN
-
Tech: superglue
Requires: foam + another gun or plasma torch or molecular assembler
Foam bubbles decay 50% slower
@@ -53,9 +63,10 @@ Requires: foam + another gun or plasma torch or molecular assembler
Enemies stuck with foam take 25% more damage
should foam bots gets this also or is that too strong
-
-buff pilot wave damage or lower energy drain
-lower base harpoon density
+tech: harpoons stick into enemies
+ detonate after a short delay
+ attaches mob to wall if possible
+ firing while harpoon is stuck into an enemy rips it out of them, inflicting damage and stun and pulling them towards you
const ctx = canvas.getContext('2d', {‘willReadFrequently': true});