diff --git a/js/index.js b/js/index.js
index 4be212f..cec2bc3 100644
--- a/js/index.js
+++ b/js/index.js
@@ -1236,9 +1236,13 @@ if (localSettings.isAllowed && !localSettings.isEmpty) {
simulation.isCommunityMaps = localSettings.isCommunityMaps
document.getElementById("community-maps").checked = localSettings.isCommunityMaps
+
+ if (localSettings.difficultyMode === undefined) localSettings.difficultyMode = "2"
simulation.difficultyMode = localSettings.difficultyMode
lore.setTechGoal()
document.getElementById("difficulty-select").value = localSettings.difficultyMode
+
+ if (localSettings.fpsCapDefault === undefined) localSettings.fpsCapDefault = 'max'
if (localSettings.fpsCapDefault === 'max') {
simulation.fpsCapDefault = 999999999;
} else {
diff --git a/js/level.js b/js/level.js
index 5fac585..edb3e50 100644
--- a/js/level.js
+++ b/js/level.js
@@ -20,16 +20,17 @@ const level = {
// tech.giveTech("grappling hook")
// 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("overcharge")
+ // for (let i = 0; i < 2; i++) tech.giveTech("corona discharge")
// for (let i = 10; i < tech.tech.length; i++) { tech.tech[i].isBanished = true }
// powerUps.research.changeRerolls(100000)
- // for (let i = 0; i < 2; i++) tech.giveTech("undefined")
+ // for (let i = 0; i < 5; i++) tech.giveTech("corona discharge")
// tech.tech[297].frequency = 100
// m.setField("plasma torch")
// tech.giveTech("plasma ball")
+ // tech.giveTech("extruder")
// m.immuneCycle = Infinity //you can't take damage
- // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
+ // level.difficultyIncrease(10) //30 is near max on hard //60 is near max on why
// simulation.enableConstructMode() //used to build maps in testing mode
// level.islands();
// level.testing(); //not in rotation, used for testing
@@ -113,7 +114,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) this.reset()
+ if (m.plasmaBall) m.plasmaBall.reset()
},
trainingText(say) {
simulation.lastLogTime = 0; //clear previous messages
@@ -2544,8 +2545,8 @@ const level = {
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)
@@ -8974,6 +8975,7 @@ const level = {
ctx.fillStyle = `rgba(68, 68, 68, ${Math.max(0.3,Math.min((-17650 - m.pos.y) / 100, 0.99))})`;
ctx.fillRect(58390, -17655, 1490, 740);
};
+ document.body.style.backgroundColor = "hsl(138, 3%, 74%)";
level.setPosToSpawn(57680, -18330);
level.exit.x = 76343;
level.exit.y = -18020;
@@ -8981,7 +8983,6 @@ const level = {
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 30);
level.defaultZoom = 2000;
simulation.zoomTransition(level.defaultZoom);
- document.body.style.backgroundColor = "#00000";
// spawn.setSpawnList = [
// "hopper",
// "slasher",
@@ -9224,7 +9225,6 @@ const level = {
spawn.randomMob(75825, -18150, Infinity);
spawn.randomMob(75575, -18150, Infinity);
spawn.randomGroup(75575, -18150, 0);
- // powerUps.spawn(59352, -17115, "tech");
level.chain(67250, -19325, 0, true, 14, 20);
spawn.mapRect(58725, -18300, 125, 100);
spawn.mapRect(61100, -18300, 175, 100);
@@ -9255,20 +9255,21 @@ const level = {
let i = 0, len = Math.min(simulation.difficulty / 20, 6); i < len;
++i
)
- spawn.bounceBoss(59025, -17325, 50, true);
+ spawn.bounceBoss(59025, -17325, 50, false);
} else if (Math.random() < 0.5) {
for (
let i = 0, len = Math.min(simulation.difficulty / 9, 8); i < len;
++i
)
- spawn.sprayBoss(59025, -17325, 50, true);
+ spawn.sprayBoss(59025, -17325, 50, false);
} else {
for (
let i = 0, len = Math.min(simulation.difficulty / 6, 10); i < len;
++i
)
- spawn.mineBoss(59025, -17325, 50, true);
+ spawn.mineBoss(59025, -17325, 50, false);
}
+ powerUps.spawn(59352, -17115, "tech");
// for (let i = 0, len = 3 + simulation.difficulty / 20; i < len; ++i) spawn.mantisBoss(1487 + 300 * i, -1525, 35, false)
}
simulation.fallHeight = -15000;
diff --git a/js/player.js b/js/player.js
index c94ebd6..fbc912c 100644
--- a/js/player.js
+++ b/js/player.js
@@ -2086,7 +2086,7 @@ const m = {
set() {
b.isExtruderOn = false
if (m.plasmaBall) {
- m.plasmaBall.isOn = false
+ m.plasmaBall.reset()
Matter.Composite.remove(engine.world, m.plasmaBall);
}
if (tech.isPlasmaBall) {
@@ -2112,15 +2112,12 @@ const m = {
fire() {
this.isAttached = false;
const speed = 6 //scale with mass?
- // Matter.Body.setVelocity(this, {
- // x: speed * Math.cos(m.angle),
- // y: speed * Math.sin(m.angle)
- // });
Matter.Body.setVelocity(this, {
- x: player.velocity.x * 0.5 + speed * Math.cos(m.angle),
- y: player.velocity.y * 0.1 + speed * Math.sin(m.angle)
+ x: player.velocity.x * 0.4 + speed * Math.cos(m.angle),
+ y: speed * Math.sin(m.angle)
});
m.plasmaBall.setPositionToNose()
+ if (this.circleRadius < 10) this.isPopping = true
},
scale(scale) {
Matter.Body.scale(m.plasmaBall, scale, scale); //shrink fast
@@ -2188,11 +2185,11 @@ const m = {
//damage nearby mobs
const dmg = this.damage * m.dmgScale
const arcList = []
+ const dischargeRange = 150 + 1600 * tech.plasmaDischarge + 1.3 * this.circleRadius
for (let i = 0, len = mob.length; i < len; i++) {
- const sub = Vector.magnitude(Vector.sub(this.position, mob[i].position))
- if (sub < this.circleRadius + mob[i].radius) {
-
- if (mob[i].alive) {
+ if (!mob[i].isBadTarget && mob[i].alive) {
+ const sub = Vector.magnitude(Vector.sub(this.position, mob[i].position))
+ if (sub < this.circleRadius + mob[i].radius) {
if (!this.isAttached && !mob[i].isMobBullet) this.isPopping = true
mob[i].damage(dmg);
if (mob[i].speed > 5) {
@@ -2206,42 +2203,46 @@ const m = {
y: mob[i].velocity.y * 0.93
});
}
+ } else if (sub < dischargeRange + mob[i].radius && Matter.Query.ray(map, mob[i].position, this.position).length === 0) {
+ arcList.push(mob[i]) //populate electrical arc list
}
- } else if (sub < 150 + 1.3 * this.circleRadius + mob[i].radius && !(m.cycle % 20)) { //populate electrical arc list
- arcList.push(mob[i])
- // mob[i].damage(dmg * 0.1);
}
-
}
- //
- if (arcList.length) {
- const who = arcList[Math.floor(Math.random() * arcList.length)]
- who.damage(dmg * 5);
-
- //draw arcs
- // const unit = Vector.rotate({ x: 1, y: 0 }, Math.random() * 6.28)
- const sub = Vector.sub(who.position, this.position)
- const unit = Vector.normalise(sub)
- let len = 12
- const step = Vector.magnitude(sub) / (len + 2)
- let x = this.position.x
- let y = this.position.y
- ctx.beginPath();
- ctx.moveTo(x, y);
- for (let i = 0; i < len; i++) {
- x += step * (unit.x + 1 * (Math.random() - 0.5))
- y += step * (unit.y + 1 * (Math.random() - 0.5))
- ctx.lineTo(x, y);
+ for (let i = 0; i < arcList.length; i++) {
+ if (tech.plasmaDischarge > Math.random()) {
+ const who = arcList[Math.floor(Math.random() * arcList.length)]
+ who.damage(dmg * 4);
+ //draw arcs
+ const sub = Vector.sub(who.position, this.position)
+ const unit = Vector.normalise(sub)
+ let len = 12
+ const step = Vector.magnitude(sub) / (len + 2)
+ let x = this.position.x
+ let y = this.position.y
+ ctx.beginPath();
+ ctx.moveTo(x, y);
+ for (let i = 0; i < len; i++) {
+ x += step * (unit.x + (Math.random() - 0.5))
+ y += step * (unit.y + (Math.random() - 0.5))
+ ctx.lineTo(x, y);
+ }
+ ctx.lineTo(who.position.x, who.position.y);
+ ctx.strokeStyle = "#88f";
+ ctx.lineWidth = 4 + 3 * Math.random();
+ ctx.stroke();
+ if (who.damageReduction) {
+ simulation.drawList.push({
+ x: who.position.x,
+ y: who.position.y,
+ radius: 15,
+ color: "rgba(150,150,255,0.4)",
+ time: 15
+ });
+ }
}
- ctx.lineTo(who.position.x, who.position.y);
- ctx.strokeStyle = "#88f";
- ctx.lineWidth = 4 + Math.random();
- ctx.stroke();
}
-
-
//slowly slow down if too fast
if (this.speed > 8) {
const scale = 0.997
@@ -2254,7 +2255,7 @@ const m = {
//graphics
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);
- const alpha = this.alpha + 0.15 * Math.random()
+ const alpha = this.alpha + 0.1 * Math.random()
gradient.addColorStop(0, `rgba(255,255,255,${alpha})`);
gradient.addColorStop(0.35 + 0.1 * Math.random(), `rgba(255,150,255,${alpha})`);
gradient.addColorStop(1, `rgba(255,0,255,${alpha})`);
@@ -2315,7 +2316,11 @@ const m = {
} else {
m.plasmaBall.isAttached = true
m.plasmaBall.isOn = true
+ m.plasmaBall.isPopping = false
+ m.plasmaBall.alpha = 0.7
m.plasmaBall.setPositionToNose()
+ // m.plasmaBall.reset()
+
}
// const scale = 0.7
// Matter.Body.scale(m.plasmaBall, scale, scale); //shrink fast
diff --git a/js/tech.js b/js/tech.js
index 823fda6..2106404 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -6637,27 +6637,6 @@ const tech = {
if (this.count > 0) powerUps.research.changeRerolls(this.count * 2)
}
},
- {
- name: "plasma ball",
- description: "grow an expanding ball of plasma
increases damage and energy drain",
- isFieldTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- frequencyDefault: 2,
- allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isExtruder && tech.isPlasmaRange === 1
- },
- requires: "plasma torch, not extruder, plasma jet",
- effect() {
- tech.isPlasmaBall = true;
- m.fieldUpgrades[m.fieldMode].set()
- },
- remove() {
- tech.isPlasmaBall = false;
- if (this.count && m.fieldUpgrades[m.fieldMode].name === "plasma torch") m.fieldUpgrades[m.fieldMode].set()
- }
- },
{
name: "extruder",
description: "extrude a thin hot wire of plasma
increases damage and energy drain",
@@ -6692,37 +6671,52 @@ const tech = {
},
requires: "extruder",
effect() {
- tech.extruderRange += 50
+ tech.extruderRange += 60
},
remove() {
tech.extruderRange = 15
}
},
- // {
- // name: "CPT gun",
- // link: `CPT gun`,
- // description: `adds the CPT gun to your inventory
it rewinds your health, velocity, and position`,
- // isGunTech: true,
- // maxCount: 1,
- // count: 0,
- // frequency: 2,
- // frequencyDefault: 2,
- // allowed() {
- // return (b.totalBots() > 3 || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection ||
- // },
- // requires: "bots > 3, plasma torch, assembler, pilot wave, not mass-energy equivalence, CPT",
- // effect() {
- // tech.isRewindGun = true
- // b.guns.push(b.gunRewind)
- // b.giveGuns("CPT gun");
- // },
- // remove() {
- // if (tech.isRewindGun) {
- // b.removeGun("CPT gun", true)
- // tech.isRewindGun = false
- // }
- // }
- // },
+ {
+ name: "plasma ball",
+ description: "grow an expanding ball of plasma
increases damage and energy drain",
+ isFieldTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isExtruder && tech.isPlasmaRange === 1
+ },
+ requires: "plasma torch, not extruder, plasma jet",
+ effect() {
+ tech.isPlasmaBall = true;
+ m.fieldUpgrades[m.fieldMode].set()
+ },
+ remove() {
+ tech.isPlasmaBall = false;
+ if (this.count && m.fieldUpgrades[m.fieldMode].name === "plasma torch") m.fieldUpgrades[m.fieldMode].set()
+ }
+ },
+ {
+ name: "corona discharge",
+ description: "increase the range and frequency
of plasma ball's electric arc ",
+ isFieldTech: true,
+ maxCount: 9,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isExtruder && tech.isPlasmaRange === 1
+ },
+ requires: "plasma torch, not extruder, plasma jet",
+ effect() {
+ tech.plasmaDischarge += 0.03
+ },
+ remove() {
+ tech.plasmaDischarge = 0.01 //default chance per cycle of a discharge
+ }
+ },
{
name: "retrocausality",
description: "time dilation uses energy to rewind your
health, velocity, and position up to 10 s",
@@ -9561,5 +9555,6 @@ const tech = {
isImmuneGrapple: null,
isDronesTravel: null,
isTechDebt: null,
- isPlasmaBall: null
+ isPlasmaBall: null,
+ plasmaDischarge: null
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 5d17455..4cb61bc 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,16 +1,19 @@
******************************************************** NEXT PATCH **************************************************
+new community map! - islands by Richard0820
+ enable community maps in settings
+
plasma ball
- once released explodes on mobs or map
- slows mobs
- grows at 2x rate if you have energy above max
- player is slowed when holding plasma ball
- every 20 cycles damage a nearby mob
- next patch plasma ball tech
+ tech: corona discharge - increase frequency and range of electric discharges
+ several bug fixes
+
+bug fix for some people that can't store settings between reloads
******************************************************** TODO ********************************************************
plasma ball
+ gently scale damage with circleRadius
+ balance corona discharge
delay on returning to player is annoying
scale float effect with ball size
tech upgrades