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:
41
js/bullet.js
41
js/bullet.js
@@ -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
|
||||||
|
|||||||
10
js/level.js
10
js/level.js
@@ -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")
|
||||||
|
|||||||
46
js/mob.js
46
js/mob.js
@@ -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() {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
18
js/spawn.js
18
js/spawn.js
@@ -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;
|
||||||
|
|||||||
92
js/tech.js
92
js/tech.js
@@ -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,
|
||||||
|
|||||||
19
todo.txt
19
todo.txt
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user