diff --git a/js/bullet.js b/js/bullet.js
index 5d639a2..ae7ecdc 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -1324,7 +1324,7 @@ const b = {
restitution: 0.6 * (1 + 0.5 * Math.random()),
dmg: 0, // 0.14 //damage done in addition to the damage from momentum
minDmgSpeed: 2,
- lookFrequency: 60 + Math.floor(17 * Math.random()) - 10 * mod.isFoamBotUpgrade,
+ lookFrequency: 60 + Math.floor(17 * Math.random()) - 20 * mod.isFoamBotUpgrade,
cd: 0,
delay: 100,
acceleration: 0.005 * (1 + 0.5 * Math.random()),
@@ -1383,7 +1383,7 @@ const b = {
lookFrequency: 40 + Math.floor(7 * Math.random()),
drainThreshold: mod.isEnergyHealth ? 0.5 : 0.15,
acceleration: 0.0015 * (1 + 0.3 * Math.random()),
- range: 700 * (1 + 0.1 * Math.random()) + 250 * mod.isLaserBotUpgrade,
+ range: 700 * (1 + 0.1 * Math.random()) + 300 * mod.isLaserBotUpgrade,
followRange: 150 + Math.floor(30 * Math.random()),
offPlayer: {
x: 0,
@@ -1437,7 +1437,7 @@ const b = {
//hit target with laser
if (this.lockedOn && this.lockedOn.alive && mech.energy > this.drainThreshold) {
mech.energy -= 0.0012 * mod.isLaserDiode
- b.laser(this.vertices[0], this.lockedOn.position, b.dmgScale * (0.06 + 0.1 * this.isUpgraded))
+ b.laser(this.vertices[0], this.lockedOn.position, b.dmgScale * (0.06 + 0.15 * this.isUpgraded))
}
}
})
@@ -1459,7 +1459,7 @@ const b = {
minDmgSpeed: 0,
lookFrequency: 43 + Math.floor(7 * Math.random()),
acceleration: 0.005 * (1 + 0.5 * Math.random()),
- range: 500 * (1 + 0.1 * Math.random()) + 250 * mod.isBoomBotUpgrade,
+ range: 500 * (1 + 0.1 * Math.random()) + 350 * mod.isBoomBotUpgrade,
endCycle: Infinity,
classType: "bullet",
collisionFilter: {
@@ -1470,7 +1470,7 @@ const b = {
explode: 0,
beforeDmg() {
if (this.lockedOn) {
- const explosionRadius = Math.min(170 + 170 * this.isUpgraded, Vector.magnitude(Vector.sub(this.position, mech.pos)) - 30)
+ const explosionRadius = Math.min(170 + 200 * this.isUpgraded, Vector.magnitude(Vector.sub(this.position, mech.pos)) - 30)
if (explosionRadius > 60) {
this.explode = explosionRadius
//
@@ -1760,7 +1760,7 @@ const b = {
})
for (let i = 0; i < q.length; i++) {
mobs.statusStun(q[i], 180)
- const dmg = 0.5 * b.dmgScale * (this.isUpgraded ? 2 : 1) * (mod.isCrit ? 4 : 1)
+ const dmg = 0.5 * b.dmgScale * (this.isUpgraded ? 2.5 : 1) * (mod.isCrit ? 4 : 1)
q[i].damage(dmg);
q[i].foundPlayer();
game.drawList.push({ //add dmg to draw queue
@@ -1927,7 +1927,7 @@ const b = {
},
{
name: "shotgun",
- description: "fire a burst of short range bullets
crouch to reduce recoil",
+ description: "fire a burst of short range bullets",
ammo: 0,
ammoPack: 5.5,
defaultAmmoPack: 5.5,
@@ -2218,7 +2218,7 @@ const b = {
},
{
name: "wave beam",
- description: "emit a sine wave of oscillating particles
that can propagate through solids",
+ description: "emit a sine wave of oscillating particles
propagates through walls",
ammo: 0,
ammoPack: 70,
have: false,
diff --git a/js/index.js b/js/index.js
index fb95772..6ef4f43 100644
--- a/js/index.js
+++ b/js/index.js
@@ -179,11 +179,12 @@ const build = {
pauseGrid() {
let text = ""
if (!game.isChoosing) text += `
damage increase: ${((mod.damageFromMods()-1)*100).toFixed(0)}%
harm reduction: ${((1-mech.harmReduction())*100).toFixed(0)}%
fire delay decrease: ${((1-b.fireCD)*100).toFixed(0)}%
+
duplication chance: ${(Math.min(1,mod.duplicationChance())*100).toFixed(0)}%
rerolls: ${powerUps.reroll.rerolls}
health: (${(mech.health*100).toFixed(0)} / ${(mech.maxHealth*100).toFixed(0)})
energy: (${(mech.energy*100).toFixed(0)} / ${(mech.maxEnergy*100).toFixed(0)})
@@ -798,6 +799,7 @@ window.addEventListener("keydown", function(event) {
mod.giveMod()
break
case "r":
+ mech.resetHistory();
Matter.Body.setPosition(player, game.mouseInGame);
Matter.Body.setVelocity(player, {
x: 0,
diff --git a/js/level.js b/js/level.js
index 3d5af7e..1c128ac 100644
--- a/js/level.js
+++ b/js/level.js
@@ -19,7 +19,7 @@ const level = {
// mech.setField("wormhole")
// b.giveGuns("laser")
// mod.is3Missiles = true
- // mod.giveMod("CPT reversal")
+ // mod.giveMod("reallocation")
// mod.giveMod("diffuse beam")
level.intro(); //starting level
@@ -56,21 +56,7 @@ const level = {
level.addToWorld(); //add bodies to game engine
game.draw.setPaths();
b.respawnBots();
- for (let i = 0; i < 300; i++) { //reset history
- mech.history[i] = {
- position: {
- x: mech.pos.x,
- y: mech.pos.y,
- },
- velocity: {
- x: player.velocity.x,
- y: player.velocity.y
- },
- angle: mech.angle,
- health: mech.health,
- energy: mech.energy,
- }
- }
+ mech.resetHistory();
if (mod.isArmorFromPowerUps) {
mod.armorFromPowerUps += 0.05 * powerUps.totalPowerUps
mech.setMaxHealth();
diff --git a/js/mods.js b/js/mods.js
index 80741c5..ee9f3f5 100644
--- a/js/mods.js
+++ b/js/mods.js
@@ -1,10 +1,14 @@
const mod = {
totalCount: null,
- setupAllMods() {
+ setupAllMods(isLost = false) {
for (let i = 0, len = mod.mods.length; i < len; i++) {
mod.mods[i].remove();
+ if (isLost) {
+ mod.mods[i].isLost = false;
+ } else if (mod.mods[i].count > 0) {
+ mod.mods[i].isLost = true
+ }
mod.mods[i].count = 0
- if (mod.mods[i].isLost) mod.mods[i].isLost = false;
}
mod.armorFromPowerUps = 0;
mod.totalCount = 0;
@@ -98,6 +102,9 @@ const mod = {
if (mod.isSpeedDamage) dmg *= 1 + Math.min(0.33, player.speed * 0.011)
return dmg * mod.slowFire * mod.aimDamage
},
+ duplicationChance() {
+ return (mod.isBayesian ? 0.16 : 0) + mod.cancelCount * 0.04 + mod.duplicateChance
+ },
totalBots() {
return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount + mod.boomBotCount + mod.plasmaBotCount + mod.orbitBotCount
},
@@ -559,7 +566,7 @@ const mod = {
},
{
name: "foam-bot upgrade",
- description: "
150% increased
foam sizeapplies to all current and future foam-bots",
+ description: "
200% increased
foam size and
fire rateapplies to all current and future foam-bots",
maxCount: 1,
count: 0,
allowed() {
@@ -598,7 +605,7 @@ const mod = {
},
{
name: "boom-bot upgrade",
- description: "
200% increased
explosion damage and size
applies to all current and future boom-bots",
+ description: "
250% increased
explosion damage and size
applies to all current and future boom-bots",
maxCount: 1,
count: 0,
allowed() {
@@ -637,7 +644,7 @@ const mod = {
},
{
name: "laser-bot upgrade",
- description: "
200% increased laser
damageapplies to all current and future laser-bots",
+ description: "
350% increased laser
damageapplies to all current and future laser-bots",
maxCount: 1,
count: 0,
allowed() {
@@ -676,7 +683,7 @@ const mod = {
},
{
name: "orbital-bot upgrade",
- description: "increase
damage by
100% and
radius by
30%applies to all current and future orbit-bots",
+ description: "increase
damage by
150% and
radius by
30%applies to all current and future orbit-bots",
maxCount: 1,
count: 0,
allowed() {
@@ -708,7 +715,7 @@ const mod = {
},
{
name: "perimeter defense",
- description: "reduce
harm by
4%for each of your permanent
bots",
+ description: "reduce
harm by
5%for each of your permanent
bots",
maxCount: 1,
count: 0,
allowed() {
@@ -1292,17 +1299,11 @@ const mod = {
requires: "",
effect: () => {
mod.isBayesian = true
- mod.duplicateChance += 0.16
game.draw.powerUp = game.draw.powerUpBonus //change power up draw
-
},
remove() {
- if (mod.isBayesian) {
- mod.duplicateChance -= 0.16
- if (mod.duplicateChance < 0) mod.duplicateChance = 0
- }
mod.isBayesian = false
- if (mod.duplicateChance === 0) game.draw.powerUp = game.draw.powerUpNormal
+ if (mod.duplicationChance() === 0) game.draw.powerUp = game.draw.powerUpNormal
}
},
{
@@ -1317,14 +1318,110 @@ const mod = {
effect() {
mod.duplicateChance += 0.07
game.draw.powerUp = game.draw.powerUpBonus //change power up draw
- // this.description = `
8% chance to
duplicate spawned
power upschance to duplicate = ${mod.duplicateChance}`
},
remove() {
- mod.duplicateChance -= 0.08 * this.count
- if (mod.duplicateChance === 0) game.draw.powerUp = game.draw.powerUpNormal
- // this.description = `
8% chance to
duplicate spawned
power upschance to duplicate = ${mod.duplicateChance}`
+ mod.duplicateChance = 0
+ if (mod.duplicationChance() === 0) game.draw.powerUp = game.draw.powerUpNormal
}
},
+ {
+ name: "futures exchange",
+ description: "clicking
X to cancel a
mod,
field, or
gunincreases power up
duplication chance by
4%",
+ maxCount: 1,
+ count: 0,
+ allowed() {
+ return !mod.isDeterminism
+ },
+ requires: "not determinism",
+ effect() {
+ mod.isCancelDuplication = true
+ mod.cancelCount = 0
+ game.draw.powerUp = game.draw.powerUpBonus //change power up draw
+ },
+ remove() {
+ mod.isCancelDuplication = false
+ mod.cancelCount = 0
+ if (mod.duplicationChance() === 0) game.draw.powerUp = game.draw.powerUpNormal
+ }
+ },
+ {
+ name: "reallocation",
+ description: "convert
1 random
mod into
3 new
gunsrecursive mods lose all stacks",
+ maxCount: 1,
+ count: 0,
+ isNonRefundable: true,
+ isCustomHide: true,
+ allowed() {
+ return (mod.totalCount > 0) && !mod.isSuperDeterminism && mod.duplicationChance() > 0
+ },
+ requires: "at least 1 mod, a chance to duplicate power ups",
+ effect: () => {
+ const have = [] //find which mods you have
+ for (let i = 0; i < mod.mods.length; i++) {
+ if (mod.mods[i].count > 0) have.push(i)
+ }
+ const choose = have[Math.floor(Math.random() * have.length)]
+ game.makeTextLog(`
${mod.mods[choose].name} removed by reallocation`, 300)
+ for (let i = 0; i < mod.mods[choose].count; i++) {
+ powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
+ }
+ powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
+ powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
+ mod.mods[choose].count = 0;
+ mod.mods[choose].remove(); // remove a random mod form the list of mods you have
+ mod.mods[choose].isLost = true
+ game.updateModHUD();
+ },
+ remove() {}
+ },
+ {
+ name: "monte carlo experiment",
+ description: "spawn
2 mods50% chance to remove
1 random
mod",
+ maxCount: 1,
+ count: 0,
+ isNonRefundable: true,
+ isCustomHide: true,
+ allowed() {
+ return (mod.totalCount > 0) && !mod.isSuperDeterminism && mod.duplicationChance() > 0
+ },
+ requires: "at least 1 mod, a chance to duplicate power ups",
+ effect: () => {
+ const have = [] //find which mods you have
+ for (let i = 0; i < mod.mods.length; i++) {
+ if (mod.mods[i].count > 0) have.push(i)
+ }
+ const choose = have[Math.floor(Math.random() * have.length)]
+ game.makeTextLog(`
${mod.mods[choose].name} removed by reallocation`, 300)
+ for (let i = 0; i < mod.mods[choose].count; i++) {
+ powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
+ }
+ powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
+ mod.mods[choose].count = 0;
+ mod.mods[choose].remove(); // remove a random mod form the list of mods you have
+ mod.mods[choose].isLost = true
+ game.updateModHUD();
+ },
+ remove() {}
+ },
+ {
+ name: "exchange symmetry",
+ description: `spawn
1 modwith
double your normal chance for power up
duplication`,
+ maxCount: 1,
+ count: 0,
+ isNonRefundable: true,
+ isCustomHide: true,
+ allowed() {
+ return !mod.isSuperDeterminism && mod.duplicationChance() > 0
+ },
+ requires: "at least 1 mod, a chance to duplicate power ups",
+ effect: () => {
+ const chanceStore = mod.duplicateChance
+ mod.duplicateChance = (mod.isBayesian ? 0.16 : 0) + mod.cancelCount * 0.04 + mod.duplicateChance * 2 //increase duplication chance to simulate doubling all 3 sources of duplication chance
+ powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
+ mod.duplicateChance = chanceStore
+ },
+ remove() {}
+ },
{
name: "entanglement",
nameInfo: "
",
@@ -1507,7 +1604,7 @@ const mod = {
},
{
name: "superdeterminism",
- description: "spawn
3 modsrerolls,
guns, and
fields no longer
spawn",
+ description: "spawn
6 modsrerolls,
guns, and
fields no longer
spawn",
maxCount: 1,
count: 0,
isNonRefundable: true,
@@ -1517,7 +1614,7 @@ const mod = {
requires: "determinism",
effect: () => {
mod.isSuperDeterminism = true;
- for (let i = 0; i < 3; i++) { //if you change the six also change it in Born rule
+ for (let i = 0; i < 6; i++) { //if you change the six also change it in Born rule
powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
}
},
@@ -1543,7 +1640,7 @@ const mod = {
},
{
name: "renormalization",
- description: "consuming a
reroll for
any purpose
has a
37% chance to spawn a
reroll",
+ description: "consuming a
reroll for
any purpose
has a
42% chance to spawn a
reroll",
maxCount: 1,
count: 0,
allowed() {
@@ -1568,8 +1665,9 @@ const mod = {
requires: "at least 2 rerolls",
effect() {
mod.isImmortal = true;
- powerUps.spawn(mech.pos.x, mech.pos.y, "reroll", false);
- for (let i = 0; i < 4; i++) {}
+ for (let i = 0; i < 4; i++) {
+ powerUps.spawn(mech.pos.x, mech.pos.y, "reroll", false);
+ }
},
remove() {
mod.isImmortal = false;
@@ -1598,7 +1696,7 @@ const mod = {
if (mod.isDeterminism) count -= 3 //remove the bonus mods
if (mod.isSuperDeterminism) count -= 2 //remove the bonus mods
- mod.setupAllMods(); // remove all mods
+ mod.setupAllMods(false); // remove all mods
for (let i = 0; i < count; i++) { // spawn new mods power ups
powerUps.spawn(mech.pos.x, mech.pos.y, "mod");
}
@@ -1606,37 +1704,9 @@ const mod = {
},
remove() {}
},
- {
- name: "reallocation",
- description: "convert
1 random
mod into
2 new
gunsrecursive mods lose all stacks",
- maxCount: 1,
- count: 0,
- isNonRefundable: true,
- isCustomHide: true,
- allowed() {
- return (mod.totalCount > 0) && !mod.isSuperDeterminism
- },
- requires: "at least 1 mod",
- effect: () => {
- const have = [] //find which mods you have
- for (let i = 0; i < mod.mods.length; i++) {
- if (mod.mods[i].count > 0) have.push(i)
- }
- const choose = have[Math.floor(Math.random() * have.length)]
- game.makeTextLog(`
${mod.mods[choose].name} removed by reallocation`, 300)
- for (let i = 0; i < 2 * mod.mods[choose].count; i++) {
- powerUps.spawn(mech.pos.x, mech.pos.y, "gun");
- }
- mod.mods[choose].count = 0;
- mod.mods[choose].remove(); // remove a random mod form the list of mods you have
- mod.mods[choose].isLost = true
- game.updateModHUD();
- },
- remove() {}
- },
{
name: "perpetual rerolls",
- description: "find
1 reroll power up
at the start of each
level",
+ description: "find
1 reroll at the start of each
level",
maxCount: 1,
count: 0,
allowed() {
@@ -1652,7 +1722,7 @@ const mod = {
},
{
name: "perpetual heals",
- description: "find
2 heal power ups
at the start of each
level",
+ description: "find
2 heals at the start of each
level",
maxCount: 1,
count: 0,
allowed() {
@@ -1668,7 +1738,7 @@ const mod = {
},
{
name: "perpetual ammo",
- description: "find
2 ammo power ups
at the start of each
level",
+ description: "find
2 ammo at the start of each
level",
maxCount: 1,
count: 0,
allowed() {
@@ -1772,15 +1842,17 @@ const mod = {
}
},
remove() {
- mod.isIceCrystals = false;
- for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
- if (b.guns[i].name === "nail gun") {
- b.guns[i].ammoPack = b.guns[i].defaultAmmoPack;
- b.guns[i].ammo = b.guns[i].recordedAmmo
- game.updateGunHUD();
- break;
+ if (mod.isIceCrystals) {
+ for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
+ if (b.guns[i].name === "nail gun") {
+ b.guns[i].ammoPack = b.guns[i].defaultAmmoPack;
+ if (b.guns[i].recordedAmmo) b.guns[i].ammo = b.guns[i].recordedAmmo
+ game.updateGunHUD();
+ break;
+ }
}
}
+ mod.isIceCrystals = false;
}
},
{
@@ -1962,23 +2034,37 @@ const mod = {
mod.isFlechetteMultiShot = true;
//cut current ammo by 1/3
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
- if (b.guns[i].name === "flechettes") b.guns[i].ammo = Math.ceil(b.guns[i].ammo / 3);
+ if (b.guns[i].name === "flechettes") {
+ b.guns[i].ammo = Math.ceil(b.guns[i].ammo / 3);
+ break
+ }
}
//cut ammo packs by 1/3
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
- if (b.guns[i].name === "flechettes") b.guns[i].ammoPack = Math.ceil(b.guns[i].defaultAmmoPack / 3);
+ if (b.guns[i].name === "flechettes") {
+ b.guns[i].ammoPack = Math.ceil(b.guns[i].defaultAmmoPack / 3);
+ break
+ }
}
game.updateGunHUD();
},
remove() {
+ if (mod.isFlechetteMultiShot) {
+ for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
+ if (b.guns[i].name === "flechettes") {
+ b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 3);
+ break
+ }
+ }
+ for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
+ if (b.guns[i].name === "flechettes") {
+ b.guns[i].ammoPack = b.guns[i].defaultAmmoPack;
+ break
+ }
+ game.updateGunHUD();
+ }
+ }
mod.isFlechetteMultiShot = false;
- for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
- if (b.guns[i].name === "flechettes") b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 3);
- }
- for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
- if (b.guns[i].name === "flechettes") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack;
- }
- game.updateGunHUD();
}
},
{
@@ -2727,7 +2813,6 @@ const mod = {
requires: "laser, not specular reflection
not diffraction grating",
effect() {
this.description = `add 10 more
laser beams into into your past`
- //`
8% chance to
duplicate spawned
power upschance to duplicate = ${mod.duplicateChance}`
mod.historyLaser++
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
@@ -3202,7 +3287,7 @@ const mod = {
},
{
name: "traversable geodesics",
- description: "your
bullets can traverse
wormholesspawn a
gun and
ammo power up",
+ description: "your
bullets can traverse
wormholesspawn a
gun and
ammo",
maxCount: 1,
count: 0,
allowed() {
@@ -3220,7 +3305,7 @@ const mod = {
},
{
name: "heals",
- description: "spawn
6 heal power ups",
+ description: "spawn
6 heals",
maxCount: 9,
count: 0,
isNonRefundable: true,
@@ -3239,7 +3324,7 @@ const mod = {
},
{
name: "ammo",
- description: "spawn
6 ammo power ups",
+ description: "spawn
6 ammo",
maxCount: 9,
count: 0,
isNonRefundable: true,
@@ -3258,7 +3343,7 @@ const mod = {
},
{
name: "rerolls",
- description: "spawn
4 reroll power ups",
+ description: "spawn
4 rerolls",
maxCount: 9,
count: 0,
isNonRefundable: true,
@@ -3277,7 +3362,7 @@ const mod = {
},
{
name: "gun",
- description: "spawn a
gun power up",
+ description: "spawn a
gun",
maxCount: 9,
count: 0,
isNonRefundable: true,
@@ -3294,7 +3379,7 @@ const mod = {
},
{
name: "field",
- description: "spawn a
field power up",
+ description: "spawn a
field",
maxCount: 9,
count: 0,
isNonRefundable: true,
@@ -3477,5 +3562,7 @@ const mod = {
isPerpetualReroll: null,
isPerpetualAmmo: null,
isPerpetualHeal: null,
- isPerpetualStun: null
+ isPerpetualStun: null,
+ isCancelDuplication: null,
+ cancelCount: null
}
\ No newline at end of file
diff --git a/js/player.js b/js/player.js
index 644f378..861316a 100644
--- a/js/player.js
+++ b/js/player.js
@@ -134,6 +134,23 @@ const mech = {
transX: 0,
transY: 0,
history: [], //tracks the last second of player position
+ resetHistory() {
+ for (let i = 0; i < 300; i++) { //reset history
+ mech.history[i] = {
+ position: {
+ x: mech.pos.x,
+ y: mech.pos.y,
+ },
+ velocity: {
+ x: player.velocity.x,
+ y: player.velocity.y
+ },
+ angle: mech.angle,
+ health: mech.health,
+ energy: mech.energy,
+ }
+ }
+ },
move() {
mech.pos.x = player.position.x;
mech.pos.y = playerBody.position.y - mech.yOff;
@@ -480,6 +497,20 @@ const mech = {
let history = mech.history[(mech.cycle - steps) % 300]
Matter.Body.setPosition(player, history.position);
Matter.Body.setVelocity(player, { x: history.velocity.x, y: history.velocity.y });
+ // move bots to follow player
+ for (let i = 0; i < bullet.length; i++) {
+ if (bullet[i].botType) {
+ Matter.Body.setPosition(bullet[i], Vector.add(player.position, {
+ x: 250 * (Math.random() - 0.5),
+ y: 250 * (Math.random() - 0.5)
+ }));
+ Matter.Body.setVelocity(bullet[i], {
+ x: 0,
+ y: 0
+ });
+ }
+ }
+
mech.energy = Math.max(mech.energy - steps, 0.01)
mech.immuneCycle = mech.cycle + mod.collisionImmuneCycles; //player is immune to collision damage for 30 cycles
@@ -504,6 +535,7 @@ const mech = {
mech.draw();
}
ctx.restore();
+ mech.resetHistory()
}
}
};
diff --git a/js/powerup.js b/js/powerup.js
index c40d7f2..6712a03 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -36,6 +36,7 @@ const powerUps = {
build.pauseGrid(true)
},
endDraft() {
+ if (mod.isCancelDuplication) mod.cancelCount++
if (mod.manyWorlds && powerUps.reroll.rerolls < 1) {
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
}
@@ -70,7 +71,7 @@ const powerUps = {
b.randomBot()
if (mod.renormalization) {
for (let i = 0; i < limit; i++) {
- if (Math.random() < 0.37) {
+ if (Math.random() < 0.42) {
mech.fieldCDcycle = mech.cycle + 30;
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
}
@@ -81,7 +82,7 @@ const powerUps = {
if (mod.isDeathAvoid && document.getElementById("mod-anthropic")) {
document.getElementById("mod-anthropic").innerHTML = `-${powerUps.reroll.rerolls}`
}
- if (mod.renormalization && Math.random() < 0.37 && amount < 0) {
+ if (mod.renormalization && Math.random() < 0.42 && amount < 0) {
powerUps.spawn(mech.pos.x, mech.pos.y, "reroll");
}
if (mod.isRerollHaste) {
@@ -602,7 +603,7 @@ const powerUps = {
(!game.isNoPowerUps || (target === 'reroll' || target === 'heal' || target === 'ammo'))
) {
powerUps.directSpawn(x, y, target, moving, mode, size)
- if (mod.duplicateChance && Math.random() < mod.duplicateChance) {
+ if (Math.random() < mod.duplicationChance()) {
powerUps.directSpawn(x, y, target, moving, mode)
powerUp[powerUp.length - 1].isBonus = true
}
diff --git a/todo.txt b/todo.txt
index d9d8195..75b5ca7 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,7 +1,14 @@
*********** NEXT PATCH ***********
-4 new mods: perpetual ammo/rerolls/heals - get that power up at the start of each level
- also perpetual stun: stuns all mobs for 8 seconds at the start
+all bot upgrade mods are improved by about 33%
+mod superdeterminism - spawns 6 mods (was 3)
+
+mod: futures exchange - canceling power ups increases duplication chance by 4%
+mod: monte carlo experiment - spawn 2 mods, but you have a 50% chance to lose a random mod
+ requires duplication mods, not available in custom
+mod: exchange symmetry - spawn 1 mod with double your normal duplication chance
+ requires duplication mods, not available in custom
+
************** BUGS **************
@@ -23,8 +30,15 @@
************** TODO **************
+mod: canceling a mod gun or field increases your duplication chance for all power up by 4%
+
+in custom make a top bar that is fixed
+ use media rules to make the layout look nice
+
bot that follows the players history
1st bot is at 5s, 2nd is at 4.5s, ...
+ bots don't get too close to player
+ run smoothing on position update, don't update if close to player, based on ordering
effect:
give player energy overfill
damage mobs on contact
@@ -36,15 +50,15 @@ mob vision: look at player history
if mobs can't see player, they could check to see if they can find player in the past
https://abitawake.com/news/articles/enemy-ai-chasing-a-player-without-navigation2d-or-a-star-pathfinding
-mod negative mass field - mobs caught in the field take damage that increases with the relative velocity between the player and mob
-
wormhole - make it clear when the wormhole can and can't teleport to a location before the player clicks
time dilation - slow down the game engine by 1/2, but run an extra player cycle to simulate slow motion
flavor - your bullets destroy blocks
this isn't really a bonus, so maybe just add this as flavor to another mod/field/gun
- a chance for destroyed blocks to drop ammo?
+ a chance for destroyed blocks to drop stuff
+ power ups
+ spores
mod plasma : plasma length increases then decreases as you hold down the field button (like stabbing with a spear)
grows to 1.5 longer after 0.3 seconds, then returns to normal length over 1 second, until field is pressed again