missile-bot

missile-bot tech now removes your missile gun, but missile bot fires much faster
  missile-bot now benefits from all missile tech

rail gun has a bit less ammo and fires a bit faster
  in between how it is was in the last two patches
rail gun gets less energy from half-wave rectifier
This commit is contained in:
landgreen
2021-08-07 06:42:48 -07:00
parent aea9276cb2
commit c3b96f749e
8 changed files with 125 additions and 111 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1117,6 +1117,7 @@ const b = {
} }
}, },
missile(where, angle, speed, size = 1) { missile(where, angle, speed, size = 1) {
if (tech.missileSize) size *= 1.5
const me = bullet.length; const me = bullet.length;
bullet[me] = Bodies.rectangle(where.x, where.y, 30 * size, 4 * size, { bullet[me] = Bodies.rectangle(where.x, where.y, 30 * size, 4 * size, {
angle: angle, angle: angle,
@@ -1131,7 +1132,7 @@ const b = {
}, },
minDmgSpeed: 10, minDmgSpeed: 10,
lookFrequency: Math.floor(10 + Math.random() * 3), lookFrequency: Math.floor(10 + Math.random() * 3),
explodeRad: 180 + 60 * Math.random(), explodeRad: 180 * (tech.missileSize ? 1.5 : 1) + 60 * Math.random(),
density: 0.02, //0.001 is normal density: 0.02, //0.001 is normal
beforeDmg() { beforeDmg() {
Matter.Body.setDensity(this, 0.0001); //reduce density to normal Matter.Body.setDensity(this, 0.0001); //reduce density to normal
@@ -3106,7 +3107,7 @@ const b = {
restitution: 0.7, restitution: 0.7,
dmg: 0, // 0.14 //damage done in addition to the damage from momentum dmg: 0, // 0.14 //damage done in addition to the damage from momentum
minDmgSpeed: 2, minDmgSpeed: 2,
lookFrequency: 70, lookFrequency: 27 + Math.ceil(6 * Math.random()),
cd: 0, cd: 0,
delay: 80, delay: 80,
range: 70 + 3 * b.totalBots(), range: 70 + 3 * b.totalBots(),
@@ -3135,7 +3136,25 @@ const b = {
// Matter.Body.setAngularVelocity(this, 0.025) // Matter.Body.setAngularVelocity(this, 0.025)
this.torque += this.inertia * 0.00004 * (Math.round(Math.random()) ? 1 : -1) this.torque += this.inertia * 0.00004 * (Math.round(Math.random()) ? 1 : -1)
this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, mob[i].position)), this.mass * 0.02) this.force = Vector.mult(Vector.normalise(Vector.sub(this.position, mob[i].position)), this.mass * 0.02)
b.missile(this.position, angle, -8, 0.7 * (tech.missileSize ? 1.5 : 1))
if (tech.missileCount > 1) {
const countReduction = Math.pow(0.93, tech.missileCount)
const size = 0.9 * Math.sqrt(countReduction)
const direction = {
x: Math.cos(angle),
y: Math.sin(angle)
}
const push = Vector.mult(Vector.perp(direction), 0.015 * countReduction / Math.sqrt(tech.missileCount))
for (let i = 0; i < tech.missileCount; i++) {
setTimeout(() => {
b.missile(this.position, angle, -8, size)
bullet[bullet.length - 1].force.x += push.x * (i - (tech.missileCount - 1) / 2);
bullet[bullet.length - 1].force.y += push.y * (i - (tech.missileCount - 1) / 2);
}, 40 * tech.missileCount * Math.random());
}
} else {
b.missile(this.position, angle, -8, 0.9)
}
break; break;
} }
} }
@@ -4466,7 +4485,7 @@ const b = {
x: m.pos.x, x: m.pos.x,
y: m.pos.y - 40 y: m.pos.y - 40
} }
b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction)) b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction) * (tech.missileSize ? 1.5 : 1))
bullet[bullet.length - 1].force.x += 0.025 * countReduction * (i - (tech.missileCount - 1) / 2); bullet[bullet.length - 1].force.x += 0.025 * countReduction * (i - (tech.missileCount - 1) / 2);
}, 20 * tech.missileCount * Math.random()); }, 20 * tech.missileCount * Math.random());
} }
@@ -4846,7 +4865,7 @@ const b = {
name: "rail gun", name: "rail gun",
description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire", description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire",
ammo: 0, ammo: 0,
ammoPack: 5, ammoPack: 4.1,
have: false, have: false,
do() {}, do() {},
fire() { fire() {
@@ -4898,7 +4917,7 @@ const b = {
if (tech.isCapacitor) { if (tech.isCapacitor) {
if ((m.energy > 0.16 || tech.isRailEnergyGain)) { //&& m.immuneCycle < m.cycle if ((m.energy > 0.16 || tech.isRailEnergyGain)) { //&& m.immuneCycle < m.cycle
m.energy += 0.16 * (tech.isRailEnergyGain ? 4.5 : -1) m.energy += 0.16 * (tech.isRailEnergyGain ? 2.5 : -1)
m.fireCDcycle = m.cycle + Math.floor(40 * b.fireCDscale); m.fireCDcycle = m.cycle + Math.floor(40 * b.fireCDscale);
const me = bullet.length; const me = bullet.length;
bullet[me] = Bodies.rectangle(m.pos.x + 50 * Math.cos(m.angle), m.pos.y + 50 * Math.sin(m.angle), 60, 14, { bullet[me] = Bodies.rectangle(m.pos.x + 50 * Math.cos(m.angle), m.pos.y + 50 * Math.sin(m.angle), 60, 14, {
@@ -5070,13 +5089,9 @@ const b = {
m.fireCDcycle = Infinity //can't fire until mouse is released m.fireCDcycle = Infinity //can't fire until mouse is released
const previousCharge = this.charge const previousCharge = this.charge
let smoothRate = (m.crouch ? 0.98 : 0.99) * (0.98 + 0.02 * b.fireCDscale) //small b.fireCDscale = faster shots, b.fireCDscale=1 = normal shot, big b.fireCDscale = slower chot let smoothRate = (m.crouch ? 0.98 : 0.985) * (0.98 + 0.02 * b.fireCDscale) //small b.fireCDscale = faster shots, b.fireCDscale=1 = normal shot, big b.fireCDscale = slower chot
this.charge = this.charge * smoothRate + 1 * (1 - smoothRate) this.charge = this.charge * smoothRate + 1 - smoothRate
if (tech.isRailEnergyGain) { m.energy -= (this.charge - previousCharge) * (tech.isRailEnergyGain ? 1 : 0.33) //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen
m.energy += (this.charge - previousCharge) * 1.5 //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen
} else {
m.energy -= (this.charge - previousCharge) * 0.33 //energy drain is proportional to charge gained, but doesn't stop normal m.fieldRegen
}
//draw targeting //draw targeting
let best; let best;
let range = 3000 let range = 3000

View File

@@ -18,10 +18,12 @@ const level = {
// tech.isFieldFree = true // tech.isFieldFree = true
// m.setField("time dilation") // m.setField("time dilation")
// b.giveGuns("rail gun") // b.giveGuns("rail gun")
// tech.missileBotCount++;
// b.missileBot();
// tech.giveTech("half-wave rectifier") // tech.giveTech("half-wave rectifier")
// b.giveGuns("wave beam") // b.giveGuns("nail gun")
// tech.giveTech("Lenz's law") // tech.giveTech("Lenz's law")
// for (let i = 0; i < 3; i++) tech.giveTech("packet length") // for (let i = 0; i < 9; i++) tech.giveTech("MIRV")
// for (let i = 0; i < 4; i++) tech.giveTech() // for (let i = 0; i < 4; i++) tech.giveTech()
level.intro(); //starting level level.intro(); //starting level
@@ -2286,8 +2288,8 @@ const level = {
// spawn.streamBoss(1600, -500) // spawn.streamBoss(1600, -500)
// spawn.powerUpBoss(1600, -500) // spawn.powerUpBoss(1600, -500)
// spawn.cellBossCulture(1600, -500) // spawn.cellBossCulture(1600, -500)
spawn.shieldingBoss(1600, -500) // spawn.laserTargetingBoss(1600, -500)
// spawn.grenadier(1200, -500) spawn.grenadierBoss(1200, -500)
// spawn.shield(mob[mob.length - 1], 1800, -120, 1); // spawn.shield(mob[mob.length - 1], 1800, -120, 1);
// spawn.nodeGroup(1200, -500, "grenadier") // spawn.nodeGroup(1200, -500, "grenadier")

View File

@@ -1041,10 +1041,11 @@ const mobs = {
if (tech.isFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500 if (tech.isFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500
// if (this.shield) dmg *= 0.075 // if (this.shield) dmg *= 0.075
// if (this.isBoss) dmg *= 0.25 // if (this.isBoss) dmg *= 0.25
if (this.damageReduction < 1) { //only used for bosses with this.armor() or shields // if (this.damageReduction < 1) { //only used for bosses with this.armor() or shields
this.damageReductionGoal += dmg * this.damageReductionScale //reduce damageReductionGoal // this.damageReductionGoal += dmg * this.damageReductionScale //reduce damageReductionGoal
// dmg *= this.damageReduction
// }
dmg *= this.damageReduction dmg *= this.damageReduction
}
//energy and heal drain should be calculated after damage boosts //energy and heal drain should be calculated after damage boosts
if (tech.energySiphon && dmg !== Infinity && this.isDropPowerUp && m.immuneCycle < m.cycle) m.energy += Math.min(this.health, dmg) * tech.energySiphon if (tech.energySiphon && dmg !== Infinity && this.isDropPowerUp && m.immuneCycle < m.cycle) m.energy += Math.min(this.health, dmg) * tech.energySiphon
if (tech.healthDrain && dmg !== Infinity && this.isDropPowerUp) { if (tech.healthDrain && dmg !== Infinity && this.isDropPowerUp) {
@@ -1069,19 +1070,32 @@ const mobs = {
// to use declare custom method in mob spawn // to use declare custom method in mob spawn
}, },
damageReduction: 1, damageReduction: 1,
damageReductionGoal: 0.001, //must add this to boss set up: me.damageReduction = me.damageReductionGoal // damageReductionGoal: 0.001, //must add this to boss set up: me.damageReduction = 0.25
damageReductionScale: 0.004, //for bosses in this.onDamage determines the impact of dmg on damageReductionGoal // damageReductionScale: 0.004, //for bosses in this.onDamage determines the impact of dmg on damageReductionGoal
armor() { //slowly reduce damage reduction, for bosses // armor() { //slowly reduce damage reduction, for bosses
if (this.seePlayer.recall) { // if (this.seePlayer.recall) {
if (this.damageReductionGoal > 0.24) { // if (this.damageReductionGoal > 0.24) {
this.damageReductionGoal = 0.25 // this.damageReductionGoal = 0.25
} else { // } else {
this.damageReductionGoal = this.damageReductionGoal * 0.999 + 0.001 * 0.25 //smooth the goal towards 0.25 damage reduction // this.damageReductionGoal = this.damageReductionGoal * 0.999 + 0.001 * 0.25 //smooth the goal towards 0.25 damage reduction
} // }
this.damageReduction = this.damageReduction * 0.995 + 0.005 * this.damageReductionGoal //smooth damage reduction towards the goal // this.damageReduction = this.damageReduction * 0.995 + 0.005 * this.damageReductionGoal //smooth damage reduction towards the goal
// console.log(`damageReduction = ${this.damageReduction.toFixed(4)}`, `damageReductionGoal = ${this.damageReductionGoal.toFixed(4)}`) // // console.log(`damageReduction = ${this.damageReduction.toFixed(4)}`, `damageReductionGoal = ${this.damageReductionGoal.toFixed(4)}`)
} // }
}, // //draw armor
// //draw body
// ctx.beginPath();
// const vertices = this.vertices;
// ctx.moveTo(vertices[0].x, vertices[0].y);
// for (let j = 1, len = vertices.length; j < len; ++j) {
// ctx.lineTo(vertices[j].x, vertices[j].y);
// }
// ctx.lineTo(vertices[0].x, vertices[0].y);
// console.log(this.damageReduction, this.damageReductionGoal)
// ctx.lineWidth = 3 //60 * (0.25 - this.damageReductionGoal)
// ctx.strokeStyle = `rgba(255,255,255,${4.1*(0.25 - this.damageReductionGoal)})` //"rgba(150,150,225,0.5)";
// ctx.stroke();
// },
leaveBody: true, leaveBody: true,
isDropPowerUp: true, isDropPowerUp: true,
death() { death() {

View File

@@ -1123,7 +1123,7 @@ const m = {
m.fieldCDcycle = m.cycle + 15; m.fieldCDcycle = m.cycle + 15;
m.isHolding = false; m.isHolding = false;
if (tech.isBlockExplosion && m.throwCharge > 5) { //remove the block body and pulse in the direction you are facing if (tech.isTokamak && m.throwCharge > 5) { //remove the block body and pulse in the direction you are facing
//m.throwCharge > 5 seems to be when the field full colors in a block you are holding //m.throwCharge > 5 seems to be when the field full colors in a block you are holding
m.throwCharge = 0; m.throwCharge = 0;
m.throwCycle = m.cycle + 180 //used to detect if a block was thrown in the last 3 seconds m.throwCycle = m.cycle + 180 //used to detect if a block was thrown in the last 3 seconds

View File

@@ -754,9 +754,9 @@ const spawn = {
me.onDamage = function(dmg) { me.onDamage = function(dmg) {
if (Math.random() < 0.33 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split(); if (Math.random() < 0.33 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split();
} }
me.damageReduction = 0.25 me.damageReduction = 0.2 //me.damageReductionGoal
me.do = function() { me.do = function() {
// this.armor(); // // this.armor();
if (!m.isBodiesAsleep) { if (!m.isBodiesAsleep) {
this.seePlayerByDistOrLOS(); this.seePlayerByDistOrLOS();
this.checkStatus(); this.checkStatus();
@@ -1488,12 +1488,12 @@ const spawn = {
let targets = [] //track who is in the node boss, for shields let targets = [] //track who is in the node boss, for shields
mobs.spawn(x, y, 6, radius, "#b386e8"); mobs.spawn(x, y, 6, radius, "#b386e8");
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
Matter.Body.setDensity(me, 0.0035); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.0032); //extra dense //normal is 0.001 //makes effective life much larger
me.isBoss = true; me.isBoss = true;
targets.push(me.id) //add to shield protection targets.push(me.id) //add to shield protection
me.friction = 0; me.friction = 0;
me.frictionAir = 0.0065; me.frictionAir = 0.0067;
me.lookTorque = 0.0000008; //controls spin while looking for player me.lookTorque = 0.0000008; //controls spin while looking for player
me.g = 0.0002; //required if using 'gravity' me.g = 0.0002; //required if using 'gravity'
me.seePlayerFreq = Math.round((30 + 20 * Math.random()) * simulation.lookFreqScale); me.seePlayerFreq = Math.round((30 + 20 * Math.random()) * simulation.lookFreqScale);
@@ -1679,7 +1679,7 @@ const spawn = {
} }
mobs.spawn(x, y, 0, radius, "transparent"); mobs.spawn(x, y, 0, radius, "transparent");
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
Matter.Body.setDensity(me, 0.20); //extra dense //normal is 0.001 Matter.Body.setDensity(me, 0.21); //extra dense //normal is 0.001
me.laserRange = 300; me.laserRange = 300;
me.seeAtDistance2 = 2000000; me.seeAtDistance2 = 2000000;
me.isBoss = true; me.isBoss = true;
@@ -1693,7 +1693,7 @@ const spawn = {
me.onDeath = function() { me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y) powerUps.spawnBossPowerUp(this.position.x, this.position.y)
}; };
me.damageReduction = 0.25 me.damageReduction = 0.25 // me.damageReductionGoal
me.awake = function() { me.awake = function() {
// this.armor(); // this.armor();
this.checkStatus(); this.checkStatus();
@@ -3138,7 +3138,7 @@ const spawn = {
} }
}; };
}, },
launcherBoss(x, y, radius = 85) { launcherBoss(x, y, radius = 90) {
mobs.spawn(x, y, 6, radius, "rgb(150,150,255)"); mobs.spawn(x, y, 6, radius, "rgb(150,150,255)");
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.isBoss = true; me.isBoss = true;
@@ -3153,7 +3153,7 @@ const spawn = {
spawn.shield(me, x, y, 1); spawn.shield(me, x, y, 1);
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random()) spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
Matter.Body.setDensity(me, 0.002 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.0022 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.onDeath = function() { me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y) powerUps.spawnBossPowerUp(this.position.x, this.position.y)
// this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed // this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed
@@ -3925,7 +3925,7 @@ const spawn = {
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.isBoss = true; me.isBoss = true;
Matter.Body.setDensity(me, 0.002 + 0.00025 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.0017 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.stroke = "transparent"; //used for drawGhost me.stroke = "transparent"; //used for drawGhost
me.seeAtDistance2 = 2000000; me.seeAtDistance2 = 2000000;

View File

@@ -162,6 +162,9 @@
return b.inventory.length > 0 && b.guns[b.activeGun].name === name return b.inventory.length > 0 && b.guns[b.activeGun].name === name
} }
}, },
hasExplosiveDamageCheck() {
return tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount > 0 || tech.boomBotCount > 1 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)
},
damageFromTech() { damageFromTech() {
let dmg = 1 //m.fieldDamage let dmg = 1 //m.fieldDamage
if (tech.isCloakingDamage) dmg *= 1.35 if (tech.isCloakingDamage) dmg *= 1.35
@@ -658,24 +661,7 @@
b.setFireCD(); b.setFireCD();
} }
}, },
// if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ...
// {
// name: "1-body problem",
// description: "if there is exactly <strong>1</strong> active <strong>bullet</strong><br>increase <strong class='color-d'>damage</strong> by <strong>100%</strong>",
// maxCount: 1,
// count: 0,
// frequency: 2,
// allowed() {
// return !tech.foamBotCount && !tech.nailBotCount && m.fieldUpgrades[m.fieldMode].name !== "nano-scale manufacturing" && ((tech.haveGunCheck("missiles") && tech.missileCount === 1) || tech.haveGunCheck("rail gun") || tech.haveGunCheck("grenades") || tech.isRivets || tech.isSlugShot || tech.oneSuperBall)
// },
// requires: "missiles, rail gun, grenades, rivets, slugs, super ball, no foam/nail bots, nano-scale",
// effect() {
// tech.isOneBullet = true
// },
// remove() {
// tech.isOneBullet = false
// }
// },
{ {
name: "fracture analysis", name: "fracture analysis",
description: "bullet impacts do <strong>400%</strong> <strong class='color-d'>damage</strong><br>to <strong>stunned</strong> mobs", description: "bullet impacts do <strong>400%</strong> <strong class='color-d'>damage</strong><br>to <strong>stunned</strong> mobs",
@@ -775,7 +761,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return !tech.isBlockExplode && tech.explosiveRadius === 1 && !tech.isSmallExplosion && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) return tech.explosiveRadius === 1 && !tech.isSmallExplosion && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isTokamak)
}, },
requires: "an explosive damage source, not ammonium nitrate or nitroglycerin", requires: "an explosive damage source, not ammonium nitrate or nitroglycerin",
effect: () => { effect: () => {
@@ -793,7 +779,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
}, },
requires: "an explosive damage source, not iridium-192", requires: "an explosive damage source, not iridium-192",
effect: () => { effect: () => {
@@ -811,7 +797,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
}, },
requires: "an explosive damage source, not iridium-192", requires: "an explosive damage source, not iridium-192",
effect: () => { effect: () => {
@@ -829,9 +815,9 @@
frequency: 2, frequency: 2,
isBadRandomOption: true, isBadRandomOption: true,
allowed() { allowed() {
return !tech.isRewindGrenade && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.isBlockExplosion) return tech.hasExplosiveDamageCheck()
}, },
requires: "an explosive damage source, not causality bombs", requires: "an explosive damage source",
effect: () => { effect: () => {
tech.isExplosionHarm = true; tech.isExplosionHarm = true;
}, },
@@ -848,7 +834,7 @@
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
}, },
requires: "an explosive damage source, not iridium-192", requires: "an explosive damage source, not iridium-192",
effect() { effect() {
@@ -867,7 +853,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isMissileField || tech.isExplodeMob || tech.isPulseLaser || tech.isBlockExplosion) return !tech.isExplodeRadio && tech.hasExplosiveDamageCheck()
}, },
requires: "an explosive damage source, not iridium-192", requires: "an explosive damage source, not iridium-192",
effect: () => { effect: () => {
@@ -903,7 +889,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.haveGunCheck("rail gun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1 return (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.missileBotCount || tech.haveGunCheck("rail gun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1
}, },
requires: "grenades, missiles, rail gun, shotgun slugs, or mass driver", requires: "grenades, missiles, rail gun, shotgun slugs, or mass driver",
effect() { effect() {
@@ -915,15 +901,15 @@
}, },
{ {
name: "thermal runaway", name: "thermal runaway",
description: "mobs <strong class='color-e'>explode</strong> when they <strong>die</strong><br><em>be careful</em>", description: "mobs <strong class='color-e'>explode</strong> when they <strong>die</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath return !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
}, },
requires: "an explosive damage source, no other mob death tech", requires: "no other mob death tech",
effect: () => { effect: () => {
tech.isExplodeMob = true; tech.isExplodeMob = true;
}, },
@@ -936,8 +922,8 @@
description: "mobs release a <strong>nail</strong> when they <strong>die</strong><br><em>nails target nearby mobs</em>", description: "mobs release a <strong>nail</strong> when they <strong>die</strong><br><em>nails target nearby mobs</em>",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
}, },
@@ -954,8 +940,8 @@
description: "mobs produce <strong class='color-p' style='letter-spacing: 2px;'>spores</strong> when they <strong>die</strong><br><strong>11%</strong> chance", description: "mobs produce <strong class='color-p' style='letter-spacing: 2px;'>spores</strong> when they <strong>die</strong><br><strong>11%</strong> chance",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
}, },
@@ -978,8 +964,8 @@
description: "mobs spawn with <strong>11%</strong> less <strong>health</strong>", description: "mobs spawn with <strong>11%</strong> less <strong>health</strong>",
maxCount: 3, maxCount: 3,
count: 0, count: 0,
frequency: 2, frequency: 1,
frequencyDefault: 2, frequencyDefault: 1,
allowed() { allowed() {
return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling || tech.iceIXOnDeath return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling || tech.iceIXOnDeath
}, },
@@ -1586,7 +1572,7 @@
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isBlockExplosion return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isTokamak
}, },
requires: "mass driver, not pilot wave not tokamak", requires: "mass driver, not pilot wave not tokamak",
effect() { effect() {
@@ -1604,7 +1590,7 @@
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isBlockExplosion return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isTokamak
}, },
requires: "mass driver, not pilot wave not tokamak", requires: "mass driver, not pilot wave not tokamak",
effect() { effect() {
@@ -1640,7 +1626,7 @@
// frequency: 2, // frequency: 2,
// frequencyDefault: 2, // frequencyDefault: 2,
// allowed() { // allowed() {
// return (tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isBlockExplosion // return (tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isTokamak
// }, // },
// requires: "mass driver or pilot wave, not tokamak", // requires: "mass driver or pilot wave, not tokamak",
// effect() { // effect() {
@@ -1676,7 +1662,7 @@
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isBlockExplosion return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isTokamak
}, },
requires: "mass driver, not pilot wave not tokamak", requires: "mass driver, not pilot wave not tokamak",
effect() { effect() {
@@ -2158,7 +2144,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isBlockExplosion) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isTokamak) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth
}, },
requires: "a way to regen extra energy, not time crystals", requires: "a way to regen extra energy, not time crystals",
effect: () => { effect: () => {
@@ -2387,7 +2373,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isRailEnergyGain || tech.isWormholeEnergy || tech.iceEnergy > 0 || tech.isMassEnergy || tech.isBlockExplosion return tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isRailEnergyGain || tech.isWormholeEnergy || tech.iceEnergy > 0 || tech.isMassEnergy || tech.isTokamak
}, },
requires: "a source of overfilled energy", requires: "a source of overfilled energy",
effect() { effect() {
@@ -4240,7 +4226,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("missiles") || tech.isMissileField return tech.haveGunCheck("missiles") || tech.isMissileField || tech.missileBotCount
}, },
requires: "missiles", requires: "missiles",
effect() { effect() {
@@ -4259,7 +4245,7 @@
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("missiles") return tech.haveGunCheck("missiles") || tech.missileBotCount
}, },
requires: "missiles", requires: "missiles",
effect() { effect() {
@@ -4271,12 +4257,12 @@
}, },
{ {
name: "missile-bot", name: "missile-bot",
description: "a <strong class='color-bot'>bot</strong> fires <strong>missiles</strong> at far away mobs", description: "remove your <strong>missile gun</strong><br>gain a <strong class='color-bot'>bot</strong> that fires <strong>missiles</strong> at mobs",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 3,
frequencyDefault: 2, frequencyDefault: 3,
isBot: true, isBot: true,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
@@ -4286,11 +4272,15 @@
effect() { effect() {
tech.missileBotCount++; tech.missileBotCount++;
b.missileBot(); b.missileBot();
if (tech.haveGunCheck("missiles")) b.removeGun("missiles") //remove your last gun
}, },
remove() { remove() {
if (this.count) {
tech.missileBotCount = 0; tech.missileBotCount = 0;
b.clearPermanentBots(); b.clearPermanentBots();
b.respawnBots(); b.respawnBots();
if (!tech.haveGunCheck("missiles")) b.giveGuns("missiles")
}
} }
}, },
{ {
@@ -5726,10 +5716,10 @@
}, },
requires: "plasma torch", requires: "plasma torch",
effect() { effect() {
tech.isBlockExplosion = true; tech.isTokamak = true;
}, },
remove() { remove() {
tech.isBlockExplosion = false; tech.isTokamak = false;
} }
}, },
{ {
@@ -7773,7 +7763,7 @@
isFallingDamage: null, isFallingDamage: null,
harmonics: null, harmonics: null,
isStandingWaveExpand: null, isStandingWaveExpand: null,
isBlockExplosion: null, isTokamak: null,
superBallDelay: null, superBallDelay: null,
isBlockExplode: null, isBlockExplode: null,
isOverHeal: null, isOverHeal: null,

View File

@@ -1,19 +1,11 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
Matter.World has been replaced with Matter.Composite missile-bot tech now removes your missile gun, but missile bot fires much faster
matter.js deprecated World missile-bot now benefits from all missile tech
could cause problems merging your old code
(replace World with Composite in your code)
tech: many worlds - now costs 1 research at the start of each level to activate rail gun has a bit less ammo and fires a bit faster
a nerf, but also a buff because if you like a build you can freeze it by not getting research in between how it is was in the last two patches
rail gun gets less energy from half-wave rectifier
mine gun has 25% less ammo and 33% more damage
railgun now gets 50% more ammo, but it fires slower
fixed rail gun ammo drain on misfire bug
fixed experiment gun display bug
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
@@ -48,6 +40,7 @@ make non moving bosses not move after getting hit
shooter, shielding, shooter, shielding,
buff missiles? buff missiles?
do more with the missile bot
maybe they can release grenades after they explode, like CPT grenades? maybe they can release grenades after they explode, like CPT grenades?
make the crouch rapid fire a tech, and make the missiles fire faster, and use less ammo? make the crouch rapid fire a tech, and make the missiles fire faster, and use less ammo?
buff railgun buff railgun