missile rework
fixed some math on laser tech: diffraction grating and slow light propagation they were giving too much damage flechettes are slightly improved in: ammo, damage, fire rate tech - MIRV can now stack up to 9 bonus missiles removed tech - recursive missiles tech: cruise missile - 50% larger size, but travels 50% slower tech: missileBot - requires gun: missiles
This commit is contained in:
@@ -362,7 +362,7 @@
|
|||||||
</g> -->
|
</g> -->
|
||||||
<!-- mouse -->
|
<!-- mouse -->
|
||||||
<g class="draw-lines3" transform="translate(290,430) scale(0.28)" stroke-linecap="round" stroke-linejoin="round" stroke-width="10px" stroke="#222" fill="none">
|
<g class="draw-lines3" transform="translate(290,430) scale(0.28)" stroke-linecap="round" stroke-linejoin="round" stroke-width="10px" stroke="#222" fill="none">
|
||||||
<path class="fade-in" d="M832.41,106.64 V323.55 H651.57 V256.64 c0-82.5,67.5-150,150-150 Z" fill="rgb(0, 200, 255)" stroke="none" />
|
<path class="fade-in" d="M832.41,106.64 V322 H651.57 V255 c0-82,67.5-148,150-148 Z" fill="rgb(0, 200, 255)" stroke="none" />
|
||||||
<!-- <path class="fade-in" d="M832.41,106.64 V323.55 H651.57 V256.64 c0-82.5,67.5-150,150-150 Z" fill="#789" stroke="none" />
|
<!-- <path class="fade-in" d="M832.41,106.64 V323.55 H651.57 V256.64 c0-82.5,67.5-150,150-150 Z" fill="#789" stroke="none" />
|
||||||
<path class="fade-in" d="M827,112 h30 a140,140,0,0,1,140,140 v68 h-167 z" fill="#7ce" stroke="none" /> -->
|
<path class="fade-in" d="M827,112 h30 a140,140,0,0,1,140,140 v68 h-167 z" fill="#7ce" stroke="none" /> -->
|
||||||
<path d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" />
|
<path d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" />
|
||||||
@@ -371,7 +371,7 @@
|
|||||||
</g>
|
</g>
|
||||||
<!-- keys -->
|
<!-- keys -->
|
||||||
<g transform="translate(195,480) scale(0.8)">
|
<g transform="translate(195,480) scale(0.8)">
|
||||||
<g fill='none' stroke='#222' stroke-width="3.5" stroke-linejoin="round">
|
<g fill='none' stroke='#222' stroke-width="3.5" stroke-linejoin="round" stroke-linecap="round">
|
||||||
<path d="M0 60 h60 v-60 h-60 v60" class="draw-lines-box-1" />
|
<path d="M0 60 h60 v-60 h-60 v60" class="draw-lines-box-1" />
|
||||||
<path d="M70 60 h60 v-60 h-60 v60" class="draw-lines-box-2" />
|
<path d="M70 60 h60 v-60 h-60 v60" class="draw-lines-box-2" />
|
||||||
<path d="M140 60 h60 v-60 h-60 v60" class="draw-lines-box-3" />
|
<path d="M140 60 h60 v-60 h-60 v60" class="draw-lines-box-3" />
|
||||||
|
|||||||
326
js/bullet.js
326
js/bullet.js
@@ -29,7 +29,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
simulation.makeTextLog(`${b.guns[b.activeGun].name}.<span class='color-gun'>ammo</span> <span class='color-symbol'>=</span> 0`);
|
simulation.makeTextLog(`${b.guns[b.activeGun].name}.<span class='color-gun'>ammo</span><span class='color-symbol'>:</span> 0`);
|
||||||
}
|
}
|
||||||
mech.fireCDcycle = mech.cycle + 30; //fire cooldown
|
mech.fireCDcycle = mech.cycle + 30; //fire cooldown
|
||||||
}
|
}
|
||||||
@@ -796,7 +796,7 @@ const b = {
|
|||||||
b.grenade = grenadeDefault
|
b.grenade = grenadeDefault
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
missile(where, angle, speed, size = 1, spawn = 0) {
|
missile(where, angle, speed, size = 1) {
|
||||||
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,
|
||||||
@@ -821,14 +821,6 @@ const b = {
|
|||||||
onEnd() {
|
onEnd() {
|
||||||
b.explosion(this.position, this.explodeRad * size); //makes bullet do explosive damage at end
|
b.explosion(this.position, this.explodeRad * size); //makes bullet do explosive damage at end
|
||||||
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 5)
|
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 5)
|
||||||
if (spawn) {
|
|
||||||
for (let i = 0; i < tech.recursiveMissiles; i++) {
|
|
||||||
if (0.2 - 0.02 * i > Math.random()) {
|
|
||||||
b.missile(this.position, this.angle + Math.PI + 0.5 * (Math.random() - 0.5), 0, 0.33 + size, tech.recursiveMissiles)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
lockedOn: null,
|
lockedOn: null,
|
||||||
tryToLockOn() {
|
tryToLockOn() {
|
||||||
@@ -901,7 +893,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const thrust = 0.0065 * bullet[me].mass;
|
const thrust = 0.0066 * bullet[me].mass * (tech.missileSize ? 0.6 : 1);
|
||||||
Matter.Body.setVelocity(bullet[me], {
|
Matter.Body.setVelocity(bullet[me], {
|
||||||
x: mech.Vx / 2 + speed * Math.cos(angle),
|
x: mech.Vx / 2 + speed * Math.cos(angle),
|
||||||
y: mech.Vy / 2 + speed * Math.sin(angle)
|
y: mech.Vy / 2 + speed * Math.sin(angle)
|
||||||
@@ -1594,7 +1586,7 @@ const b = {
|
|||||||
if (tech.iceEnergy && !who.shield && !who.isShielded && who.dropPowerUp && who.alive) {
|
if (tech.iceEnergy && !who.shield && !who.isShielded && who.dropPowerUp && who.alive) {
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
if (!who.alive) {
|
if (!who.alive) {
|
||||||
mech.energy += tech.iceEnergy
|
mech.energy += tech.iceEnergy * 0.8
|
||||||
mech.addHealth(tech.iceEnergy * 0.04)
|
mech.addHealth(tech.iceEnergy * 0.04)
|
||||||
}
|
}
|
||||||
}, 10);
|
}, 10);
|
||||||
@@ -1971,8 +1963,9 @@ const b = {
|
|||||||
for (let i = 0; i < tech.nailBotCount; i++) b.nailBot()
|
for (let i = 0; i < tech.nailBotCount; i++) b.nailBot()
|
||||||
for (let i = 0; i < tech.foamBotCount; i++) b.foamBot()
|
for (let i = 0; i < tech.foamBotCount; i++) b.foamBot()
|
||||||
for (let i = 0; i < tech.boomBotCount; i++) b.boomBot()
|
for (let i = 0; i < tech.boomBotCount; i++) b.boomBot()
|
||||||
for (let i = 0; i < tech.plasmaBotCount; i++) b.plasmaBot()
|
|
||||||
for (let i = 0; i < tech.orbitBotCount; i++) b.orbitBot()
|
for (let i = 0; i < tech.orbitBotCount; i++) b.orbitBot()
|
||||||
|
for (let i = 0; i < tech.plasmaBotCount; i++) b.plasmaBot()
|
||||||
|
for (let i = 0; i < tech.missileBotCount; i++) b.missileBot()
|
||||||
if (tech.isIntangible && mech.isCloak) {
|
if (tech.isIntangible && mech.isCloak) {
|
||||||
for (let i = 0; i < bullet.length; i++) {
|
for (let i = 0; i < bullet.length; i++) {
|
||||||
if (bullet[i].botType) bullet[i].collisionFilter.mask = cat.map | cat.bullet | cat.mobBullet | cat.mobShield
|
if (bullet[i].botType) bullet[i].collisionFilter.mask = cat.map | cat.bullet | cat.mobBullet | cat.mobShield
|
||||||
@@ -2022,32 +2015,82 @@ const b = {
|
|||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
|
mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
|
||||||
},
|
},
|
||||||
lockedOn: null,
|
beforeDmg() {},
|
||||||
beforeDmg() {
|
|
||||||
this.lockedOn = null
|
|
||||||
},
|
|
||||||
onEnd() {},
|
onEnd() {},
|
||||||
do() {
|
do() {
|
||||||
if (this.lastLookCycle < simulation.cycle && !mech.isCloak) {
|
|
||||||
this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 15 : 80)
|
|
||||||
let target
|
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
|
||||||
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
|
||||||
if (dist < 3000000 && //1400*1400
|
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
|
|
||||||
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60))
|
|
||||||
const SPEED = 50
|
|
||||||
b.nail(this.position, Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED), 0.4)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, mech.pos))
|
const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, mech.pos))
|
||||||
if (distanceToPlayer > this.range) { //if far away move towards player
|
if (distanceToPlayer > this.range) { //if far away move towards player
|
||||||
this.force = Vector.mult(Vector.normalise(Vector.sub(mech.pos, this.position)), this.mass * this.acceleration)
|
this.force = Vector.mult(Vector.normalise(Vector.sub(mech.pos, this.position)), this.mass * this.acceleration)
|
||||||
} else { //close to player
|
} else { //close to player
|
||||||
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
|
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
|
||||||
|
|
||||||
|
if (this.lastLookCycle < simulation.cycle && !mech.isCloak) {
|
||||||
|
this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 15 : 80)
|
||||||
|
let target
|
||||||
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
|
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
||||||
|
if (dist < 3000000 && //1400*1400
|
||||||
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
|
||||||
|
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60))
|
||||||
|
const SPEED = 50
|
||||||
|
const unit = Vector.normalise(Vector.sub(target, this.position))
|
||||||
|
b.nail(this.position, Vector.mult(unit, SPEED), 0.4)
|
||||||
|
this.force = Vector.mult(unit, -0.01 * this.mass)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
World.add(engine.world, bullet[me]); //add bullet to world
|
||||||
|
},
|
||||||
|
missileBot(position = { x: mech.pos.x + 50 * (Math.random() - 0.5), y: mech.pos.y + 50 * (Math.random() - 0.5) }) {
|
||||||
|
simulation.makeTextLog(`<span class='color-var'>b</span>.missileBot()`);
|
||||||
|
const me = bullet.length;
|
||||||
|
bullet[me] = Bodies.rectangle(position.x, position.y, 28, 11, {
|
||||||
|
botType: "foam",
|
||||||
|
angle: mech.angle,
|
||||||
|
friction: 0,
|
||||||
|
frictionStatic: 0,
|
||||||
|
frictionAir: 0.055,
|
||||||
|
restitution: 0.7,
|
||||||
|
dmg: 0, // 0.14 //damage done in addition to the damage from momentum
|
||||||
|
minDmgSpeed: 2,
|
||||||
|
lookFrequency: 70,
|
||||||
|
cd: 0,
|
||||||
|
delay: 90,
|
||||||
|
range: 80,
|
||||||
|
endCycle: Infinity,
|
||||||
|
classType: "bullet",
|
||||||
|
collisionFilter: {
|
||||||
|
category: cat.bullet,
|
||||||
|
mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
|
||||||
|
},
|
||||||
|
beforeDmg() {},
|
||||||
|
onEnd() {},
|
||||||
|
do() {
|
||||||
|
const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, mech.pos))
|
||||||
|
if (distanceToPlayer > this.range) { //if far away move towards player
|
||||||
|
this.force = Vector.mult(Vector.normalise(Vector.sub(mech.pos, this.position)), this.mass * 0.006)
|
||||||
|
} else { //close to player
|
||||||
|
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
|
||||||
|
|
||||||
|
if (this.cd < simulation.cycle && !(simulation.cycle % this.lookFrequency) && !mech.isCloak) {
|
||||||
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
|
const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
||||||
|
if (Matter.Query.ray(map, this.position, mob[i].position).length === 0 && dist2 > 250000) {
|
||||||
|
this.cd = simulation.cycle + this.delay;
|
||||||
|
const angle = Vector.angle(this.position, mob[i].position)
|
||||||
|
Matter.Body.setAngle(this, angle)
|
||||||
|
// Matter.Body.setAngularVelocity(this, 0.025)
|
||||||
|
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))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -2068,7 +2111,7 @@ const b = {
|
|||||||
restitution: 0.6 * (1 + 0.5 * Math.random()),
|
restitution: 0.6 * (1 + 0.5 * Math.random()),
|
||||||
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: 60 + Math.floor(17 * Math.random()) - 20 * tech.isFoamBotUpgrade,
|
lookFrequency: 60 + Math.floor(17 * Math.random()) - 30 * tech.isFoamBotUpgrade,
|
||||||
cd: 0,
|
cd: 0,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
||||||
@@ -2079,32 +2122,30 @@ const b = {
|
|||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
|
mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
|
||||||
},
|
},
|
||||||
lockedOn: null,
|
beforeDmg() {},
|
||||||
beforeDmg() {
|
|
||||||
this.lockedOn = null
|
|
||||||
},
|
|
||||||
onEnd() {},
|
onEnd() {},
|
||||||
do() {
|
do() {
|
||||||
if (this.cd < simulation.cycle && !(simulation.cycle % this.lookFrequency) && !mech.isCloak) {
|
|
||||||
let target
|
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
|
||||||
const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
|
||||||
if (dist < 1000000 && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
|
|
||||||
this.cd = simulation.cycle + this.delay;
|
|
||||||
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60))
|
|
||||||
const radius = 6 + 7 * Math.random()
|
|
||||||
const SPEED = 29 - radius * 0.5; //(mech.crouch ? 32 : 20) - radius * 0.7;
|
|
||||||
const velocity = Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED)
|
|
||||||
b.foam(this.position, velocity, radius + 9 * this.isUpgraded)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, mech.pos))
|
const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, mech.pos))
|
||||||
if (distanceToPlayer > this.range) { //if far away move towards player
|
if (distanceToPlayer > this.range) { //if far away move towards player
|
||||||
this.force = Vector.mult(Vector.normalise(Vector.sub(mech.pos, this.position)), this.mass * this.acceleration)
|
this.force = Vector.mult(Vector.normalise(Vector.sub(mech.pos, this.position)), this.mass * this.acceleration)
|
||||||
} else { //close to player
|
} else { //close to player
|
||||||
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
|
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
|
||||||
|
|
||||||
|
if (this.cd < simulation.cycle && !(simulation.cycle % this.lookFrequency) && !mech.isCloak) {
|
||||||
|
let target
|
||||||
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
|
const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
|
||||||
|
if (dist2 < 1000000 && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
|
||||||
|
this.cd = simulation.cycle + this.delay;
|
||||||
|
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60))
|
||||||
|
const radius = 6 + 7 * Math.random()
|
||||||
|
const SPEED = 29 - radius * 0.5; //(mech.crouch ? 32 : 20) - radius * 0.7;
|
||||||
|
const velocity = Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED)
|
||||||
|
b.foam(this.position, velocity, radius + 7 * this.isUpgraded)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -2804,18 +2845,34 @@ const b = {
|
|||||||
World.add(engine.world, bullet[me]); //add bullet to world
|
World.add(engine.world, bullet[me]); //add bullet to world
|
||||||
}
|
}
|
||||||
} else if (tech.isNailShot) {
|
} else if (tech.isNailShot) {
|
||||||
for (let i = 0; i < 14; i++) {
|
if (mech.crouch) {
|
||||||
const dir = mech.angle + (Math.random() - 0.5) * spread * 0.2
|
for (let i = 0; i < 11; i++) {
|
||||||
const pos = {
|
const dir = mech.angle + (Math.random() - 0.5) * 0.015
|
||||||
x: mech.pos.x + 35 * Math.cos(mech.angle) + 15 * (Math.random() - 0.5),
|
const pos = {
|
||||||
y: mech.pos.y + 35 * Math.sin(mech.angle) + 15 * (Math.random() - 0.5)
|
x: mech.pos.x + 35 * Math.cos(mech.angle) + 15 * (Math.random() - 0.5),
|
||||||
|
y: mech.pos.y + 35 * Math.sin(mech.angle) + 15 * (Math.random() - 0.5)
|
||||||
|
}
|
||||||
|
speed = 39 + 7 * Math.random()
|
||||||
|
const velocity = {
|
||||||
|
x: speed * Math.cos(dir),
|
||||||
|
y: speed * Math.sin(dir)
|
||||||
|
}
|
||||||
|
b.nail(pos, velocity, 1.2)
|
||||||
}
|
}
|
||||||
speed = 35 + 15 * Math.random()
|
} else {
|
||||||
const velocity = {
|
for (let i = 0; i < 15; i++) {
|
||||||
x: speed * Math.cos(dir),
|
const dir = mech.angle + (Math.random() - 0.5) * 0.42
|
||||||
y: speed * Math.sin(dir)
|
const pos = {
|
||||||
|
x: mech.pos.x + 35 * Math.cos(mech.angle) + 15 * (Math.random() - 0.5),
|
||||||
|
y: mech.pos.y + 35 * Math.sin(mech.angle) + 15 * (Math.random() - 0.5)
|
||||||
|
}
|
||||||
|
speed = 34 + 6 * Math.random()
|
||||||
|
const velocity = {
|
||||||
|
x: speed * Math.cos(dir),
|
||||||
|
y: speed * Math.sin(dir)
|
||||||
|
}
|
||||||
|
b.nail(pos, velocity, 1.2)
|
||||||
}
|
}
|
||||||
b.nail(pos, velocity, 1.2)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const side = 22
|
const side = 22
|
||||||
@@ -2912,15 +2969,15 @@ const b = {
|
|||||||
name: "flechettes",
|
name: "flechettes",
|
||||||
description: "fire a volley of <strong class='color-p'>uranium-235</strong> <strong>needles</strong><br>does <strong class='color-p'>radioactive</strong> <strong class='color-d'>damage</strong> over <strong>3</strong> seconds",
|
description: "fire a volley of <strong class='color-p'>uranium-235</strong> <strong>needles</strong><br>does <strong class='color-p'>radioactive</strong> <strong class='color-d'>damage</strong> over <strong>3</strong> seconds",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 65,
|
ammoPack: 75,
|
||||||
defaultAmmoPack: 65,
|
defaultAmmoPack: 75,
|
||||||
have: false,
|
have: false,
|
||||||
count: 0, //used to track how many shots are in a volley before a big CD
|
count: 0, //used to track how many shots are in a volley before a big CD
|
||||||
lastFireCycle: 0, //use to remember how longs its been since last fire, used to reset count
|
lastFireCycle: 0, //use to remember how longs its been since last fire, used to reset count
|
||||||
fire() {
|
fire() {
|
||||||
function makeFlechette(angle = mech.angle + 0.02 * (Math.random() - 0.5)) {
|
function makeFlechette(angle = mech.angle + 0.02 * (Math.random() - 0.5)) {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
bullet[me] = Bodies.rectangle(mech.pos.x + 40 * Math.cos(mech.angle), mech.pos.y + 40 * Math.sin(mech.angle), 45, 1.4, b.fireAttributes(angle));
|
bullet[me] = Bodies.rectangle(mech.pos.x + 40 * Math.cos(mech.angle), mech.pos.y + 40 * Math.sin(mech.angle), 45, 1, b.fireAttributes(angle));
|
||||||
bullet[me].collisionFilter.mask = tech.pierce ? 0 : cat.body; //cat.mobShield | //cat.map | cat.body |
|
bullet[me].collisionFilter.mask = tech.pierce ? 0 : cat.body; //cat.mobShield | //cat.map | cat.body |
|
||||||
Matter.Body.setDensity(bullet[me], 0.00001); //0.001 is normal
|
Matter.Body.setDensity(bullet[me], 0.00001); //0.001 is normal
|
||||||
bullet[me].endCycle = simulation.cycle + 180;
|
bullet[me].endCycle = simulation.cycle + 180;
|
||||||
@@ -2954,16 +3011,15 @@ const b = {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.endCycle = 0;
|
this.endCycle = 0;
|
||||||
if (tech.isFlechetteExplode && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.975) {
|
if (tech.isFlechetteExplode && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97) {
|
||||||
// mobs.statusStun(who, 120)
|
|
||||||
this.explodeRad = 300 + 60 * Math.random();
|
this.explodeRad = 300 + 60 * Math.random();
|
||||||
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
||||||
}
|
}
|
||||||
who.foundPlayer();
|
who.foundPlayer();
|
||||||
if (tech.isFastDot) {
|
if (tech.isFastDot) {
|
||||||
mobs.statusDoT(who, 3.78, 30)
|
mobs.statusDoT(who, 4, 30)
|
||||||
} else {
|
} else {
|
||||||
mobs.statusDoT(who, 0.63, tech.isSlowDot ? 360 : 180)
|
mobs.statusDoT(who, 0.7, tech.isSlowDot ? 360 : 180)
|
||||||
}
|
}
|
||||||
simulation.drawList.push({ //add dmg to draw queue
|
simulation.drawList.push({ //add dmg to draw queue
|
||||||
x: this.position.x,
|
x: this.position.x,
|
||||||
@@ -2991,6 +3047,7 @@ const b = {
|
|||||||
x: mech.Vx / 2 + SPEED * Math.cos(angle),
|
x: mech.Vx / 2 + SPEED * Math.cos(angle),
|
||||||
y: mech.Vy / 2 + SPEED * Math.sin(angle)
|
y: mech.Vy / 2 + SPEED * Math.sin(angle)
|
||||||
});
|
});
|
||||||
|
Matter.Body.setDensity(bullet[me], 0.00001);
|
||||||
World.add(engine.world, bullet[me]); //add bullet to world
|
World.add(engine.world, bullet[me]); //add bullet to world
|
||||||
}
|
}
|
||||||
makeFlechette()
|
makeFlechette()
|
||||||
@@ -2999,14 +3056,12 @@ const b = {
|
|||||||
makeFlechette(mech.angle - 0.02 - 0.005 * Math.random())
|
makeFlechette(mech.angle - 0.02 - 0.005 * Math.random())
|
||||||
}
|
}
|
||||||
|
|
||||||
const CD = (mech.crouch) ? 50 : 20
|
const CD = (mech.crouch) ? 40 : 15
|
||||||
if (this.lastFireCycle + CD < mech.cycle) this.count = 0 //reset count if it cycles past the CD
|
if (this.lastFireCycle + CD < mech.cycle) this.count = 0 //reset count if it cycles past the CD
|
||||||
this.lastFireCycle = mech.cycle
|
this.lastFireCycle = mech.cycle
|
||||||
if (this.count > ((mech.crouch) ? 8 : 1)) {
|
if (this.count > ((mech.crouch) ? 8 : 1)) {
|
||||||
this.count = 0
|
this.count = 0
|
||||||
mech.fireCDcycle = mech.cycle + Math.floor(CD * b.fireCD); // cool down
|
mech.fireCDcycle = mech.cycle + Math.floor(CD * b.fireCD); // cool down
|
||||||
const who = bullet[bullet.length - 1]
|
|
||||||
Matter.Body.setDensity(who, 0.00001);
|
|
||||||
} else {
|
} else {
|
||||||
this.count++
|
this.count++
|
||||||
mech.fireCDcycle = mech.cycle + Math.floor(2 * b.fireCD); // cool down
|
mech.fireCDcycle = mech.cycle + Math.floor(2 * b.fireCD); // cool down
|
||||||
@@ -3126,62 +3181,88 @@ const b = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "missiles",
|
name: "missiles",
|
||||||
description: "launch missiles that <strong>accelerate</strong> towards <strong>mobs</strong><br><strong class='color-e'>explodes</strong> when near target",
|
description: "launch <strong>homing</strong> missiles that <strong class='color-e'>explode</strong><br>crouch to <strong>rapidly</strong> launch smaller missiles",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 3.3,
|
ammoPack: 3.5,
|
||||||
have: false,
|
have: false,
|
||||||
fireCycle: 0,
|
fireCycle: 0,
|
||||||
ammoLoaded: 0,
|
ammoLoaded: 0,
|
||||||
fire() {
|
fire() {
|
||||||
//missile(where, dir, speed, size = 1, spawn = 0) {
|
const countReduction = Math.pow(0.9, tech.missileCount)
|
||||||
if (tech.is3Missiles) {
|
if (mech.crouch) {
|
||||||
if (mech.crouch) {
|
mech.fireCDcycle = mech.cycle + 10 * b.fireCD / countReduction; // cool down
|
||||||
mech.fireCDcycle = mech.cycle + 17 * b.fireCD; // cool down
|
|
||||||
for (let i = 0; i < 3; i++) {
|
const size = countReduction * (tech.missileSize ? 1.32 : 0.88)
|
||||||
b.missile({
|
const where = {
|
||||||
x: mech.pos.x,
|
x: mech.pos.x,
|
||||||
y: mech.pos.y - 40
|
y: mech.pos.y - 40
|
||||||
}, -Math.PI / 2 + 0.08 * (1 - i) + 0.3 * (Math.random() - 0.5), 0, 0.7, tech.recursiveMissiles)
|
}
|
||||||
bullet[bullet.length - 1].force.x -= 0.015 * (i - 1);
|
for (let i = 0; i < tech.missileCount; i++) {
|
||||||
}
|
b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, size)
|
||||||
} else {
|
bullet[bullet.length - 1].force.x += 0.004 * size * (i - (tech.missileCount - 1) / 2);
|
||||||
mech.fireCDcycle = mech.cycle + 55 * b.fireCD; // cool down
|
|
||||||
const direction = {
|
|
||||||
x: Math.cos(mech.angle),
|
|
||||||
y: Math.sin(mech.angle)
|
|
||||||
}
|
|
||||||
const push = Vector.mult(Vector.perp(direction), 0.02)
|
|
||||||
for (let i = 0; i < 3; i++) {
|
|
||||||
b.missile({
|
|
||||||
x: mech.pos.x + 40 * direction.x,
|
|
||||||
y: mech.pos.y + 40 * direction.y
|
|
||||||
}, mech.angle + 0.06 * (Math.random() - 0.5), 5, 0.7, tech.recursiveMissiles)
|
|
||||||
bullet[bullet.length - 1].force.x += push.x * (i - 1);
|
|
||||||
bullet[bullet.length - 1].force.y += push.y * (i - 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (mech.crouch) {
|
mech.fireCDcycle = mech.cycle + 50 * b.fireCD / countReduction; // cool down
|
||||||
mech.fireCDcycle = mech.cycle + 17 * b.fireCD; // cool down
|
|
||||||
const off = Math.random() - 0.5
|
|
||||||
b.missile({
|
|
||||||
x: mech.pos.x,
|
|
||||||
y: mech.pos.y - 40
|
|
||||||
},
|
|
||||||
-Math.PI / 2 + 0.15 * off, 0, 1, tech.recursiveMissiles)
|
|
||||||
bullet[bullet.length - 1].force.x += off * 0.03;
|
|
||||||
// bullet[bullet.length - 1].force.y += push.y * (i - 1);
|
|
||||||
} else {
|
|
||||||
mech.fireCDcycle = mech.cycle + 55 * b.fireCD; // cool down
|
|
||||||
b.missile({
|
|
||||||
x: mech.pos.x + 40 * Math.cos(mech.angle),
|
|
||||||
y: mech.pos.y + 40 * Math.sin(mech.angle) - 3
|
|
||||||
},
|
|
||||||
mech.angle + (0.5 - Math.random()) * (mech.crouch ? 0 : 0.2), 20, 1, tech.recursiveMissiles)
|
|
||||||
// bullet[bullet.length - 1].force.y += 0.01; //a small push down at first to make it seem like the missile is briefly falling
|
|
||||||
}
|
|
||||||
|
|
||||||
|
const size = countReduction * (tech.missileSize ? 1.5 : 1)
|
||||||
|
const direction = {
|
||||||
|
x: Math.cos(mech.angle),
|
||||||
|
y: Math.sin(mech.angle)
|
||||||
|
}
|
||||||
|
const push = Vector.mult(Vector.perp(direction), 0.02 * size / Math.sqrt(tech.missileCount))
|
||||||
|
const where = {
|
||||||
|
x: mech.pos.x + 40 * direction.x,
|
||||||
|
y: mech.pos.y + 40 * direction.y
|
||||||
|
}
|
||||||
|
for (let i = 0; i < tech.missileCount; i++) {
|
||||||
|
b.missile(where, mech.angle, 0, 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// if (tech.missileCount) {
|
||||||
|
// if (mech.crouch) {
|
||||||
|
// for (let i = 0; i < 3; i++) {
|
||||||
|
// b.missile({
|
||||||
|
// x: mech.pos.x,
|
||||||
|
// y: mech.pos.y - 40
|
||||||
|
// }, -Math.PI / 2 + 0.08 * (1 - i) + 0.3 * (Math.random() - 0.5), 0, 0.6 * (tech.missileSize ? 1.5 : 1))
|
||||||
|
// bullet[bullet.length - 1].force.x -= 0.015 * (i - 1);
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// mech.fireCDcycle = mech.cycle + 80 * b.fireCD; // cool down
|
||||||
|
// const direction = {
|
||||||
|
// x: Math.cos(mech.angle),
|
||||||
|
// y: Math.sin(mech.angle)
|
||||||
|
// }
|
||||||
|
// const push = Vector.mult(Vector.perp(direction), 0.02)
|
||||||
|
// for (let i = 0; i < 3; i++) {
|
||||||
|
// b.missile({
|
||||||
|
// x: mech.pos.x + 40 * direction.x,
|
||||||
|
// y: mech.pos.y + 40 * direction.y
|
||||||
|
// }, mech.angle + 0.06 * (Math.random() - 0.5), 5, 0.7 * (tech.missileSize ? 1.5 : 1))
|
||||||
|
// bullet[bullet.length - 1].force.x += push.x * (i - 1);
|
||||||
|
// bullet[bullet.length - 1].force.y += push.y * (i - 1);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// if (mech.crouch) {
|
||||||
|
// mech.fireCDcycle = mech.cycle + 10 * b.fireCD; // cool down
|
||||||
|
// const off = Math.random() - 0.5
|
||||||
|
// b.missile({
|
||||||
|
// x: mech.pos.x,
|
||||||
|
// y: mech.pos.y - 40
|
||||||
|
// },
|
||||||
|
// -Math.PI / 2 + 0.15 * off, 0, 0.83 * (tech.missileSize ? 1.5 : 1))
|
||||||
|
// bullet[bullet.length - 1].force.x += off * 0.03;
|
||||||
|
// // bullet[bullet.length - 1].force.y += push.y * (i - 1);
|
||||||
|
// } else {
|
||||||
|
// mech.fireCDcycle = mech.cycle + 55 * b.fireCD; // cool down
|
||||||
|
|
||||||
|
// // bullet[bullet.length - 1].force.y += 0.01; //a small push down at first to make it seem like the missile is briefly falling
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -3773,7 +3854,7 @@ const b = {
|
|||||||
mech.fireCDcycle = mech.cycle
|
mech.fireCDcycle = mech.cycle
|
||||||
mech.energy -= mech.fieldRegen + tech.laserFieldDrain * tech.isLaserDiode
|
mech.energy -= mech.fieldRegen + tech.laserFieldDrain * tech.isLaserDiode
|
||||||
const divergence = mech.crouch ? 0.15 : 0.2
|
const divergence = mech.crouch ? 0.15 : 0.2
|
||||||
let dmg = 0.1 + tech.laserDamage * Math.pow(0.9, tech.laserDamage)
|
let dmg = tech.laserDamage * Math.pow(0.9, tech.beamSplitter) //Math.pow(0.9, tech.laserDamage)
|
||||||
const where = {
|
const where = {
|
||||||
x: mech.pos.x + 20 * Math.cos(mech.angle),
|
x: mech.pos.x + 20 * Math.cos(mech.angle),
|
||||||
y: mech.pos.y + 20 * Math.sin(mech.angle)
|
y: mech.pos.y + 20 * Math.sin(mech.angle)
|
||||||
@@ -3844,7 +3925,7 @@ const b = {
|
|||||||
} else {
|
} else {
|
||||||
mech.fireCDcycle = mech.cycle
|
mech.fireCDcycle = mech.cycle
|
||||||
mech.energy -= mech.fieldRegen + tech.laserFieldDrain * tech.isLaserDiode
|
mech.energy -= mech.fieldRegen + tech.laserFieldDrain * tech.isLaserDiode
|
||||||
const dmg = 0.5 * tech.laserDamage // 3.5 * 0.55 = 200% more damage
|
const dmg = 0.4 * tech.laserDamage // 3.5 * 0.55 = 200% more damage
|
||||||
ctx.strokeStyle = "#f00";
|
ctx.strokeStyle = "#f00";
|
||||||
let spacing, len
|
let spacing, len
|
||||||
if (tech.wideLaser === 3) {
|
if (tech.wideLaser === 3) {
|
||||||
@@ -3886,10 +3967,9 @@ const b = {
|
|||||||
let energy = 0.27 * Math.min(mech.energy, 1.5)
|
let energy = 0.27 * Math.min(mech.energy, 1.5)
|
||||||
mech.energy -= energy * tech.isLaserDiode
|
mech.energy -= energy * tech.isLaserDiode
|
||||||
if (tech.beamSplitter) {
|
if (tech.beamSplitter) {
|
||||||
energy *= 0.66
|
energy *= Math.pow(0.9, tech.beamSplitter)
|
||||||
b.pulse(energy, mech.angle)
|
b.pulse(energy, mech.angle)
|
||||||
for (let i = 1; i < 1 + tech.beamSplitter; i++) {
|
for (let i = 1; i < 1 + tech.beamSplitter; i++) {
|
||||||
energy *= 0.9
|
|
||||||
b.pulse(energy, mech.angle - i * 0.27)
|
b.pulse(energy, mech.angle - i * 0.27)
|
||||||
b.pulse(energy, mech.angle + i * 0.27)
|
b.pulse(energy, mech.angle + i * 0.27)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ function collisionChecks(event) {
|
|||||||
y: mob[k].velocity.y - 8 * Math.sin(angle)
|
y: mob[k].velocity.y - 8 * Math.sin(angle)
|
||||||
});
|
});
|
||||||
|
|
||||||
if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && mech.energy > 0.34 * mech.maxEnergy) {
|
if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && mob[k].dropPowerUp && mech.energy > 0.34 * mech.maxEnergy) {
|
||||||
mech.energy -= 0.33 * mech.maxEnergy
|
mech.energy -= 0.33 * mech.maxEnergy
|
||||||
mech.immuneCycle = 0; //player doesn't go immune to collision damage
|
mech.immuneCycle = 0; //player doesn't go immune to collision damage
|
||||||
mob[k].death();
|
mob[k].death();
|
||||||
|
|||||||
14
js/level.js
14
js/level.js
@@ -13,13 +13,14 @@ const level = {
|
|||||||
start() {
|
start() {
|
||||||
if (level.levelsCleared === 0) { //this code only runs on the first level
|
if (level.levelsCleared === 0) { //this code only runs on the first level
|
||||||
// simulation.enableConstructMode() //used to build maps in testing mode
|
// simulation.enableConstructMode() //used to build maps in testing mode
|
||||||
// level.difficultyIncrease(1)
|
// level.difficultyIncrease(20)
|
||||||
// simulation.zoomScale = 1000;
|
// simulation.zoomScale = 1000;
|
||||||
// simulation.setZoom();
|
// simulation.setZoom();
|
||||||
// mech.setField("plasma torch")
|
// mech.setField("plasma torch")
|
||||||
// b.giveGuns("wave beam")
|
// b.giveGuns("missiles")
|
||||||
// tech.giveTech("CPT reversal")
|
// tech.giveTech("CPT reversal")
|
||||||
// tech.giveTech("CPT gun")
|
// tech.giveTech("missile-bot")
|
||||||
|
// tech.giveTech("nail-bot")
|
||||||
// for (let i = 0; i < 15; i++) tech.giveTech("plasma jet")
|
// for (let i = 0; i < 15; i++) tech.giveTech("plasma jet")
|
||||||
|
|
||||||
level.intro(); //starting level
|
level.intro(); //starting level
|
||||||
@@ -62,8 +63,7 @@ const level = {
|
|||||||
tech.armorFromPowerUps += gain
|
tech.armorFromPowerUps += gain
|
||||||
mech.setMaxHealth();
|
mech.setMaxHealth();
|
||||||
// if (powerUps.totalPowerUps) simulation.makeTextLog("<span style='font-size:115%;'> max health increased by " + (gain * 100).toFixed(0) + "%</span>", 300)
|
// if (powerUps.totalPowerUps) simulation.makeTextLog("<span style='font-size:115%;'> max health increased by " + (gain * 100).toFixed(0) + "%</span>", 300)
|
||||||
simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-h'>maxHealth</span> <span class='color-symbol'>+=</span> ${(gain).toFixed(3)}
|
simulation.makeTextLog(`<span class='color-var'>mech</span>.<span class='color-h'>maxHealth</span> <span class='color-symbol'>+=</span> ${(gain).toFixed(2)}`)
|
||||||
<br>${mech.maxHealth.toFixed(3)}`)
|
|
||||||
}
|
}
|
||||||
if (tech.isHealLowHealth) {
|
if (tech.isHealLowHealth) {
|
||||||
const len = Math.floor((mech.maxHealth - mech.health) / 0.5)
|
const len = Math.floor((mech.maxHealth - mech.health) / 0.5)
|
||||||
@@ -146,7 +146,7 @@ const level = {
|
|||||||
spawn.bodyRect(x + 5, y - 260 + i * blockSize, 30, blockSize);
|
spawn.bodyRect(x + 5, y - 260 + i * blockSize, 30, blockSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
blockDoor(710, -710);
|
// blockDoor(710, -710);
|
||||||
spawn.mapRect(2500, -1200, 200, 750); //right wall
|
spawn.mapRect(2500, -1200, 200, 750); //right wall
|
||||||
blockDoor(2585, -210)
|
blockDoor(2585, -210)
|
||||||
spawn.mapRect(2500, -200, 200, 300); //right wall
|
spawn.mapRect(2500, -200, 200, 300); //right wall
|
||||||
@@ -159,7 +159,7 @@ const level = {
|
|||||||
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump
|
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 100); //exit bump
|
||||||
// spawn.boost(1500, 0, 900);
|
// spawn.boost(1500, 0, 900);
|
||||||
|
|
||||||
// spawn.starter(1900, -500, 200) //big boy
|
spawn.starter(1900, -500, 200) //big boy
|
||||||
// spawn.exploder(2900, -500)
|
// spawn.exploder(2900, -500)
|
||||||
// spawn.launcherBoss(1200, -500)
|
// spawn.launcherBoss(1200, -500)
|
||||||
// spawn.laserTargetingBoss(1600, -400)
|
// spawn.laserTargetingBoss(1600, -400)
|
||||||
|
|||||||
@@ -1507,7 +1507,7 @@ const mech = {
|
|||||||
}
|
}
|
||||||
} else if (tech.isMissileField) {
|
} else if (tech.isMissileField) {
|
||||||
mech.energy -= 0.55;
|
mech.energy -= 0.55;
|
||||||
b.missile({ x: mech.pos.x, y: mech.pos.y - 40 }, -Math.PI / 2, 0, 1, tech.recursiveMissiles)
|
b.missile({ x: mech.pos.x, y: mech.pos.y - 40 }, -Math.PI / 2, 0, 1)
|
||||||
} else if (tech.isIceField) {
|
} else if (tech.isIceField) {
|
||||||
mech.energy -= 0.057;
|
mech.energy -= 0.057;
|
||||||
b.iceIX(1)
|
b.iceIX(1)
|
||||||
@@ -1540,13 +1540,13 @@ const mech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "negative mass field",
|
name: "negative mass field",
|
||||||
description: "use <strong class='color-f'>energy</strong> to nullify <strong style='letter-spacing: 7px;'>gravity</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>40%</strong><br><strong>blocks</strong> held by the field have a lower <strong>mass</strong>",
|
description: "use <strong class='color-f'>energy</strong> to nullify <strong style='letter-spacing: 7px;'>gravity</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>45%</strong><br><strong>blocks</strong> held by the field have a lower <strong>mass</strong>",
|
||||||
fieldDrawRadius: 0,
|
fieldDrawRadius: 0,
|
||||||
effect: () => {
|
effect: () => {
|
||||||
mech.fieldFire = true;
|
mech.fieldFire = true;
|
||||||
mech.holdingMassScale = 0.03; //can hold heavier blocks with lower cost to jumping
|
mech.holdingMassScale = 0.03; //can hold heavier blocks with lower cost to jumping
|
||||||
mech.fieldMeterColor = "#000"
|
mech.fieldMeterColor = "#000"
|
||||||
mech.fieldHarmReduction = 0.6;
|
mech.fieldHarmReduction = 0.55;
|
||||||
mech.fieldDrawRadius = 0;
|
mech.fieldDrawRadius = 0;
|
||||||
|
|
||||||
mech.hold = function() {
|
mech.hold = function() {
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ const powerUps = {
|
|||||||
powerUps.tech.banishLog.push(powerUps.tech.choiceLog[powerUps.tech.choiceLog.length - 1 - i])
|
powerUps.tech.banishLog.push(powerUps.tech.choiceLog[powerUps.tech.choiceLog.length - 1 - i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
simulation.makeTextLog(`${Math.max(0,powerUps.tech.lastTotalChoices - powerUps.tech.banishLog.length)} estimated <strong class='color-m'>tech</strong> choices remaining`)
|
simulation.makeTextLog(`powerUps.tech.length: ${Math.max(0,powerUps.tech.lastTotalChoices - powerUps.tech.banishLog.length)}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tech.manyWorlds && powerUps.reroll.rerolls === 0) {
|
if (tech.manyWorlds && powerUps.reroll.rerolls === 0) {
|
||||||
@@ -127,7 +127,8 @@ const powerUps = {
|
|||||||
powerUps.tech.banishLog.push(powerUps.tech.choiceLog[powerUps.tech.choiceLog.length - 1 - i])
|
powerUps.tech.banishLog.push(powerUps.tech.choiceLog[powerUps.tech.choiceLog.length - 1 - i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
simulation.makeTextLog(`${Math.max(0,powerUps.tech.lastTotalChoices - powerUps.tech.banishLog.length)} estimated <strong class='color-m'>tech</strong> choices remaining`)
|
// simulation.makeTextLog(`${Math.max(0,powerUps.tech.lastTotalChoices - powerUps.tech.banishLog.length)} estimated <strong class='color-m'>tech</strong> choices remaining`)
|
||||||
|
simulation.makeTextLog(`powerUps.tech.length: ${Math.max(0,powerUps.tech.lastTotalChoices - powerUps.tech.banishLog.length)}`)
|
||||||
}
|
}
|
||||||
powerUps[type].effect();
|
powerUps[type].effect();
|
||||||
},
|
},
|
||||||
@@ -168,26 +169,23 @@ const powerUps = {
|
|||||||
return 17;
|
return 17;
|
||||||
},
|
},
|
||||||
effect() {
|
effect() {
|
||||||
//give ammo to all guns in inventory
|
if (tech.isAmmoForGun && b.inventory.length > 0 && b.activeGun) {
|
||||||
if (tech.isAmmoForGun && b.inventory.length > 0) {
|
|
||||||
const target = b.guns[b.activeGun]
|
const target = b.guns[b.activeGun]
|
||||||
const ammoAdded = Math.ceil(Math.random() * target.ammoPack) + Math.ceil(Math.random() * target.ammoPack)
|
if (target.ammo !== Infinity) {
|
||||||
target.ammo += ammoAdded
|
const ammoAdded = Math.ceil(Math.random() * target.ammoPack) + Math.ceil(Math.random() * target.ammoPack)
|
||||||
// simulation.makeTextLog(`<div class='circle gun'></div> ${ammoAdded} ammo added`, 300)
|
target.ammo += ammoAdded
|
||||||
simulation.makeTextLog(`${target.name}.<span class='color-gun'>ammo</span> <span class='color-symbol'>+=</span> ${ammoAdded}
|
simulation.makeTextLog(`${target.name}.<span class='color-gun'>ammo</span> <span class='color-symbol'>+=</span> ${ammoAdded}`)
|
||||||
<br>${target.ammo}`)
|
}
|
||||||
} else {
|
} else { //give ammo to all guns in inventory
|
||||||
let text = '';
|
|
||||||
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
for (let i = 0, len = b.inventory.length; i < len; i++) {
|
||||||
const target = b.guns[b.inventory[i]]
|
const target = b.guns[b.inventory[i]]
|
||||||
if (target.ammo !== Infinity) {
|
if (target.ammo !== Infinity) {
|
||||||
const ammoAdded = Math.ceil(Math.random() * target.ammoPack)
|
const ammoAdded = Math.ceil(Math.random() * target.ammoPack)
|
||||||
target.ammo += ammoAdded
|
target.ammo += ammoAdded
|
||||||
if (i !== 0) text += "<br>"
|
simulation.makeTextLog(`${target.name}.<span class='color-gun'>ammo</span> <span class='color-symbol'>+=</span> ${ammoAdded}`)
|
||||||
text += `${target.name}.<span class='color-gun'>ammo</span> <span class='color-symbol'>+=</span> ${ammoAdded}`
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
simulation.makeTextLog(text)
|
|
||||||
}
|
}
|
||||||
simulation.updateGunHUD();
|
simulation.updateGunHUD();
|
||||||
}
|
}
|
||||||
@@ -375,7 +373,8 @@ const powerUps = {
|
|||||||
for (let i = 0, len = tech.tech.length; i < len; i++) {
|
for (let i = 0, len = tech.tech.length; i < len; i++) {
|
||||||
if (tech.tech[i].name === "erase") powerUps.ejectTech(i)
|
if (tech.tech[i].name === "erase") powerUps.ejectTech(i)
|
||||||
}
|
}
|
||||||
simulation.makeTextLog(`No <strong class='color-m'>tech</strong> left<br>erased <strong class='color-m'>tech</strong> have been recovered`)
|
// simulation.makeTextLog(`No <strong class='color-m'>tech</strong> left<br>erased <strong class='color-m'>tech</strong> have been recovered`)
|
||||||
|
simulation.makeTextLog(`powerUps.tech.length: ${Math.max(0,powerUps.tech.lastTotalChoices - powerUps.tech.banishLog.length)}`)
|
||||||
powerUps.spawn(mech.pos.x, mech.pos.y, "tech");
|
powerUps.spawn(mech.pos.x, mech.pos.y, "tech");
|
||||||
powerUps.endDraft("tech");
|
powerUps.endDraft("tech");
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -522,6 +522,7 @@ const simulation = {
|
|||||||
tech.foamBotCount = 0;
|
tech.foamBotCount = 0;
|
||||||
tech.boomBotCount = 0;
|
tech.boomBotCount = 0;
|
||||||
tech.plasmaBotCount = 0;
|
tech.plasmaBotCount = 0;
|
||||||
|
tech.missileBotCount = 0;
|
||||||
|
|
||||||
b.setFireCD();
|
b.setFireCD();
|
||||||
simulation.updateTechHUD();
|
simulation.updateTechHUD();
|
||||||
|
|||||||
85
js/tech.js
85
js/tech.js
@@ -83,7 +83,7 @@ const tech = {
|
|||||||
if (tech.isEnergyNoAmmo) dmg *= 1.5
|
if (tech.isEnergyNoAmmo) dmg *= 1.5
|
||||||
if (tech.isDamageForGuns) dmg *= 1 + 0.07 * b.inventory.length
|
if (tech.isDamageForGuns) dmg *= 1 + 0.07 * b.inventory.length
|
||||||
if (tech.isLowHealthDmg) dmg *= 1 + 0.6 * Math.max(0, 1 - mech.health)
|
if (tech.isLowHealthDmg) dmg *= 1 + 0.6 * Math.max(0, 1 - mech.health)
|
||||||
if (tech.isHarmDamage && mech.lastHarmCycle + 600 > mech.cycle) dmg *= 2;
|
if (tech.isHarmDamage && mech.lastHarmCycle + 600 > mech.cycle) dmg *= 3;
|
||||||
if (tech.isEnergyLoss) dmg *= 1.5;
|
if (tech.isEnergyLoss) dmg *= 1.5;
|
||||||
if (tech.isAcidDmg && mech.health > 1) dmg *= 1.4;
|
if (tech.isAcidDmg && mech.health > 1) dmg *= 1.4;
|
||||||
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
|
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
|
||||||
@@ -100,7 +100,7 @@ const tech = {
|
|||||||
return (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.04 + tech.duplicateChance + mech.duplicateChance
|
return (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.04 + tech.duplicateChance + mech.duplicateChance
|
||||||
},
|
},
|
||||||
totalBots() {
|
totalBots() {
|
||||||
return tech.foamBotCount + tech.nailBotCount + tech.laserBotCount + tech.boomBotCount + tech.plasmaBotCount + tech.orbitBotCount
|
return tech.foamBotCount + tech.nailBotCount + tech.laserBotCount + tech.boomBotCount + tech.orbitBotCount + tech.plasmaBotCount + tech.missileBotCount
|
||||||
},
|
},
|
||||||
tech: [{
|
tech: [{
|
||||||
name: "electrolytes",
|
name: "electrolytes",
|
||||||
@@ -136,7 +136,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "exothermic process",
|
name: "exothermic process",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>50%</strong><br>if a mob <strong>dies</strong> drain stored <strong class='color-f'>energy</strong> by <strong>25%</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>50%</strong><br>if a mob <strong>dies</strong> drain <strong class='color-f'>energy</strong> by <strong>25%</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -250,7 +250,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "negative feedback",
|
name: "negative feedback",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for every <strong>10</strong> missing base <strong>health</strong>",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>6%</strong><br>for every <strong>10</strong> <strong>health</strong> below <strong>100</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -266,7 +266,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "radiative equilibrium",
|
name: "radiative equilibrium",
|
||||||
description: "for <strong>10 seconds</strong> after receiving <strong class='color-harm'>harm</strong><br>increase <strong class='color-d'>damage</strong> by <strong>100%</strong>",
|
description: "for <strong>10 seconds</strong> after receiving <strong class='color-harm'>harm</strong><br>increase <strong class='color-d'>damage</strong> by <strong>200%</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -561,7 +561,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "foam-bot",
|
name: "foam-bot",
|
||||||
description: "a bot fires <strong>foam</strong> at targets in line of sight",
|
description: "a bot fires <strong>foam</strong> at nearby targets",
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -805,14 +805,18 @@ const tech = {
|
|||||||
b.boomBot();
|
b.boomBot();
|
||||||
}
|
}
|
||||||
tech.boomBotCount *= 2
|
tech.boomBotCount *= 2
|
||||||
for (let i = 0; i < tech.plasmaBotCount; i++) {
|
|
||||||
b.plasmaBot();
|
|
||||||
}
|
|
||||||
tech.plasmaBotCount *= 2
|
|
||||||
for (let i = 0; i < tech.orbitBotCount; i++) {
|
for (let i = 0; i < tech.orbitBotCount; i++) {
|
||||||
b.orbitBot();
|
b.orbitBot();
|
||||||
}
|
}
|
||||||
tech.orbitBotCount *= 2
|
tech.orbitBotCount *= 2
|
||||||
|
for (let i = 0; i < tech.plasmaBotCount; i++) {
|
||||||
|
b.plasmaBot();
|
||||||
|
}
|
||||||
|
tech.plasmaBotCount *= 2
|
||||||
|
for (let i = 0; i < tech.missileBotCount; i++) {
|
||||||
|
b.missileBot();
|
||||||
|
}
|
||||||
|
tech.missileBotCount *= 2
|
||||||
},
|
},
|
||||||
remove() {}
|
remove() {}
|
||||||
},
|
},
|
||||||
@@ -906,7 +910,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Pauli exclusion",
|
name: "Pauli exclusion",
|
||||||
description: `<strong>immune</strong> to <strong class='color-harm'>harm</strong> for <strong>0.5</strong> seconds longer<br>after receiving <strong class='color-harm'>harm</strong> from a collision`,
|
description: `<strong>immune</strong> to <strong class='color-harm'>harm</strong> for an extra <strong>0.75</strong> seconds<br>after receiving <strong class='color-harm'>harm</strong> from a <strong>collision</strong>`,
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -914,7 +918,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
requires: "",
|
requires: "",
|
||||||
effect() {
|
effect() {
|
||||||
tech.collisionImmuneCycles += 30;
|
tech.collisionImmuneCycles += 45;
|
||||||
mech.immuneCycle = mech.cycle + tech.collisionImmuneCycles; //player is immune to collision damage for 30 cycles
|
mech.immuneCycle = mech.cycle + tech.collisionImmuneCycles; //player is immune to collision damage for 30 cycles
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
@@ -1384,7 +1388,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Bayesian statistics",
|
name: "Bayesian statistics",
|
||||||
description: "<strong>20%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>after a <strong>collision</strong>, <strong>eject</strong> 1 <strong class='color-m'>tech</strong>",
|
description: "<strong>20%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>after a <strong>collision</strong>, eject <strong>1</strong> <strong class='color-m'>tech</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
@@ -1773,9 +1777,9 @@ const tech = {
|
|||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return (powerUps.reroll.rerolls > 5 || build.isCustomSelection) && !tech.isDeterminism
|
return (powerUps.reroll.rerolls > 2 || build.isCustomSelection) && !tech.isDeterminism
|
||||||
},
|
},
|
||||||
requires: "not determinism, at least 4 rerolls",
|
requires: "not determinism, at least 3 rerolls",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isBanish = true
|
tech.isBanish = true
|
||||||
for (let i = 0; i < 4; i++) {
|
for (let i = 0; i < 4; i++) {
|
||||||
@@ -2052,7 +2056,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "critical bifurcation",
|
name: "critical bifurcation",
|
||||||
description: "<strong>nails</strong> do <strong>400%</strong> more <strong class='color-d'>damage</strong><br>when they strike near the <strong>center</strong> of a mob",
|
description: "nail gun <strong>nails</strong> do <strong>400%</strong> more <strong class='color-d'>damage</strong><br>when they strike near the <strong>center</strong> of a mob",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -2428,25 +2432,42 @@ const tech = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "recursion",
|
name: "cruise missile",
|
||||||
description: "after <strong>missiles</strong> <strong class='color-e'>explode</strong> they have a<br><strong>20%</strong> chance to launch a larger <strong>missile</strong>",
|
description: "<strong>missiles</strong> travel <strong>50%</strong> slower,<br>but have a <strong>50%</strong> larger <strong class='color-e'>explosive</strong> payload",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 6,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("missiles") || tech.isMissileField
|
return tech.haveGunCheck("missiles") || tech.isMissileField
|
||||||
},
|
},
|
||||||
requires: "missiles",
|
requires: "missiles",
|
||||||
effect() {
|
effect() {
|
||||||
tech.recursiveMissiles++
|
tech.missileSize = true
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.recursiveMissiles = 0;
|
tech.missileSize = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "MIRV",
|
name: "MIRV",
|
||||||
description: "launch <strong>3</strong> small <strong>missiles</strong> instead of <strong>1</strong> <br><strong>1.5x</strong> increase in <strong><em>delay</em></strong> after firing",
|
description: "launch <strong>+1</strong> <strong>missile</strong> at a time<br>decrease <strong>size</strong> and <strong>fire rate</strong> by <strong>10%</strong>",
|
||||||
|
isGunTech: true,
|
||||||
|
maxCount: 9,
|
||||||
|
count: 0,
|
||||||
|
allowed() {
|
||||||
|
return tech.haveGunCheck("missiles")
|
||||||
|
},
|
||||||
|
requires: "missiles",
|
||||||
|
effect() {
|
||||||
|
tech.missileCount++;
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
tech.missileCount = 1;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missile-bot",
|
||||||
|
description: "a bot fires <strong>missiles</strong> at far away targets",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -2455,10 +2476,11 @@ const tech = {
|
|||||||
},
|
},
|
||||||
requires: "missiles",
|
requires: "missiles",
|
||||||
effect() {
|
effect() {
|
||||||
tech.is3Missiles = true;
|
tech.missileBotCount++;
|
||||||
|
b.missileBot();
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.is3Missiles = false;
|
tech.missileBotCount = 0;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2776,7 +2798,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "thermoelectric effect",
|
name: "thermoelectric effect",
|
||||||
description: "<strong>killing</strong> mobs with <strong>ice IX</strong> gives <strong>4</strong> <strong class='color-h'>health</strong><br>and <strong>100</strong> <strong class='color-f'>energy</strong>",
|
description: "<strong>killing</strong> mobs with <strong>ice IX</strong> gives <strong>4</strong> <strong class='color-h'>health</strong><br>and <strong>80</strong> <strong class='color-f'>energy</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -3034,14 +3056,14 @@ const tech = {
|
|||||||
},
|
},
|
||||||
requires: "laser, not specular reflection<br>not diffraction grating",
|
requires: "laser, not specular reflection<br>not diffraction grating",
|
||||||
effect() {
|
effect() {
|
||||||
this.description = `add 10 more <strong>laser</strong> beams into into your past`
|
this.description = `add 5 more <strong>laser</strong> beams into into your past`
|
||||||
tech.historyLaser++
|
tech.historyLaser++
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
|
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
this.description = "<strong>laser</strong> beam is <strong>spread</strong> into your recent <strong>past</strong><br>increase total laser <strong class='color-d'>damage</strong> by <strong>200%</strong>"
|
this.description = "<strong>laser</strong> beam is <strong>spread</strong> into your recent <strong>past</strong><br>increase total beam <strong class='color-d'>damage</strong> by <strong>300%</strong>"
|
||||||
tech.historyLaser = 0
|
tech.historyLaser = 0
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
|
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
|
||||||
@@ -3050,7 +3072,7 @@ const tech = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "pulse",
|
name: "pulse",
|
||||||
description: "convert <strong>25%</strong> of your <strong class='color-f'>energy</strong> into a pulsed laser<br>instantly initiates a fusion <strong class='color-e'>explosion</strong>",
|
description: "convert <strong>25%</strong> of your <strong class='color-f'>energy</strong> into a pulsed laser<br>that instantly initiates a fusion <strong class='color-e'>explosion</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -3769,6 +3791,7 @@ const tech = {
|
|||||||
foamBotCount: null,
|
foamBotCount: null,
|
||||||
boomBotCount: null,
|
boomBotCount: null,
|
||||||
plasmaBotCount: null,
|
plasmaBotCount: null,
|
||||||
|
missileBotCount: null,
|
||||||
orbitBotCount: null,
|
orbitBotCount: null,
|
||||||
collisionImmuneCycles: null,
|
collisionImmuneCycles: null,
|
||||||
blockDmg: null,
|
blockDmg: null,
|
||||||
@@ -3796,7 +3819,6 @@ const tech = {
|
|||||||
isMineAmmoBack: null,
|
isMineAmmoBack: null,
|
||||||
isPlasmaRange: null,
|
isPlasmaRange: null,
|
||||||
isFreezeMobs: null,
|
isFreezeMobs: null,
|
||||||
recursiveMissiles: null,
|
|
||||||
isIceCrystals: null,
|
isIceCrystals: null,
|
||||||
throwChargeRate: null,
|
throwChargeRate: null,
|
||||||
isBlockStun: null,
|
isBlockStun: null,
|
||||||
@@ -3816,7 +3838,7 @@ const tech = {
|
|||||||
isPulseStun: null,
|
isPulseStun: null,
|
||||||
restDamage: null,
|
restDamage: null,
|
||||||
isRPG: null,
|
isRPG: null,
|
||||||
is3Missiles: null,
|
missileCount: null,
|
||||||
isDeterminism: null,
|
isDeterminism: null,
|
||||||
isSuperDeterminism: null,
|
isSuperDeterminism: null,
|
||||||
isHarmReduce: null,
|
isHarmReduce: null,
|
||||||
@@ -3919,6 +3941,7 @@ const tech = {
|
|||||||
isRewindGrenade: null,
|
isRewindGrenade: null,
|
||||||
isExtruder: null,
|
isExtruder: null,
|
||||||
isEndLevelPowerUp: null,
|
isEndLevelPowerUp: null,
|
||||||
isRewindGun: null
|
isRewindGun: null,
|
||||||
|
missileSize: null
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -521,7 +521,7 @@ summary {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.color-m {
|
.color-m {
|
||||||
color: hsl(253, 57%, 52%);
|
color: hsl(253, 100%, 50%);
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
80
todo.txt
80
todo.txt
@@ -1,16 +1,18 @@
|
|||||||
******************************************************** NEXT PATCH ********************************************************
|
******************************************************** NEXT PATCH ********************************************************
|
||||||
|
|
||||||
updated in game console style and all messages to match real game commands
|
fixed some math on laser tech: diffraction grating and slow light propagation
|
||||||
new names inline with lore, tech-> tech, game -> simulation
|
they were giving too much damage
|
||||||
this is probably going to cause many minor bugs, so let me know what you find
|
|
||||||
new reroll display in power up selection
|
|
||||||
|
|
||||||
tech: rocket-propelled now works with all grenade tech
|
flechettes are slightly improved in: ammo, damage, fire rate
|
||||||
|
|
||||||
|
tech - MIRV can now stack up to 9 bonus missiles
|
||||||
|
removed tech - recursive missiles
|
||||||
|
tech: cruise missile - 50% larger size, but travels 50% slower
|
||||||
|
tech: missileBot - requires gun: missiles
|
||||||
|
|
||||||
******************************************************** BUGS ********************************************************
|
******************************************************** BUGS ********************************************************
|
||||||
|
|
||||||
check for crouch after rewind
|
CPT check for crouch after rewind
|
||||||
CPT, tesseract
|
|
||||||
|
|
||||||
(always) make it so that when you are immune to harm you can either jump on mobs or you pass through them
|
(always) make it so that when you are immune to harm you can either jump on mobs or you pass through them
|
||||||
|
|
||||||
@@ -33,7 +35,7 @@ check for crouch after rewind
|
|||||||
|
|
||||||
(once) bug - mine spawned one new mine every second
|
(once) bug - mine spawned one new mine every second
|
||||||
after sticking to the top right corner of a wall
|
after sticking to the top right corner of a wall
|
||||||
notes: had only gun mine, techmine reclamation, field plasma,
|
notes: had only gun mine, tech mine reclamation, field plasma,
|
||||||
|
|
||||||
(repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping
|
(repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping
|
||||||
|
|
||||||
@@ -46,31 +48,39 @@ rename
|
|||||||
reroll > resample, reset, retry, remeasure
|
reroll > resample, reset, retry, remeasure
|
||||||
|
|
||||||
in game console
|
in game console
|
||||||
|
set highlighting rules
|
||||||
|
mech, tech, level are all highlighted
|
||||||
|
maybe the first term in each variable should get a highlight
|
||||||
make all commands actually work
|
make all commands actually work
|
||||||
input.key commands don't work
|
input.key commands don't work
|
||||||
rewrite to not be a console command?
|
rewrite to not be a console command?
|
||||||
add commands
|
add commands
|
||||||
death, max health, max energy, rewind
|
death, max health, max energy, rewind
|
||||||
|
|
||||||
mechanic: use gun swap as an active ability for several tech
|
mine tech: laser mines - mines hover in the air
|
||||||
|
maybe they can be thrown a short distance, but they have no gravity and high friction, so they hover
|
||||||
|
when a mob gets close they spin and fire 3 unaimed lasers from their vertexes
|
||||||
|
with tech:sentry the mines spin immediately, and spin 2x times longer?
|
||||||
|
|
||||||
|
mechanic: use gun swap as an active ability
|
||||||
ideas?
|
ideas?
|
||||||
trigger damage immunity for 3 seconds, but drain energy?
|
trigger damage immunity for 3 seconds, but drain ammo
|
||||||
push away nearby mobs, but drain energy
|
push away nearby mobs, but drain energy
|
||||||
produce ammo, but take 1 damage
|
produce ammo, but take 1 damage
|
||||||
|
|
||||||
|
tech: time dilation - when you exit time dilation rewind to the state you entered
|
||||||
|
position, velocity, and health
|
||||||
|
no energy cost
|
||||||
|
|
||||||
CPT gun seems a bit weak right now. How to buff the gun?
|
CPT gun seems a bit weak right now. How to buff the gun?
|
||||||
|
|
||||||
technail gun: slow and accurate
|
|
||||||
techfoam: fast and inaccurate
|
|
||||||
|
|
||||||
mob ability bombs/bullets that suck in player
|
mob ability bombs/bullets that suck in player
|
||||||
|
|
||||||
techwhere you can't stop firing, how to code?
|
tech where you can't stop firing, how to code?
|
||||||
|
|
||||||
tech laser beams push like plasma torch pushes with directional force
|
tech: laser beams push like plasma torch pushes with directional force
|
||||||
|
|
||||||
mechanic: technological dead end - add tech to the techpool with a dumb effect
|
mechanic: technological dead end - add tech to the tech pool with a dumb effect
|
||||||
don't show up in custom?
|
don't show up in custom?
|
||||||
negative effect (one time effects are better to avoid code clutter)
|
negative effect (one time effects are better to avoid code clutter)
|
||||||
make the player rainbow colors
|
make the player rainbow colors
|
||||||
@@ -96,14 +106,14 @@ tech "Circadian Rhythm": Become immune to harm for 1 second every 10 seconds whi
|
|||||||
tech "High Risk": Spawn two bosses per level.
|
tech "High Risk": Spawn two bosses per level.
|
||||||
maybe limit to just the power up boss and spawn it at the exit every time to keep it simple
|
maybe limit to just the power up boss and spawn it at the exit every time to keep it simple
|
||||||
also weaken the player
|
also weaken the player
|
||||||
remove a techup?
|
remove a tech?
|
||||||
lower harm reduction?
|
lower harm reduction?
|
||||||
increase game difficulty by one level
|
increase game difficulty by one level
|
||||||
|
|
||||||
techthat requires integrated armament
|
tech that requires integrated armament
|
||||||
|
|
||||||
tech- reset level
|
tech- reset level
|
||||||
you trade a techfor a chance at killing a new level boss and farming more ammo
|
you trade a tech for a chance at killing a new level boss and farming more ammo
|
||||||
resets health, ammo (but not tech, fields, guns, ... ?)
|
resets health, ammo (but not tech, fields, guns, ... ?)
|
||||||
scramble level order? or same level
|
scramble level order? or same level
|
||||||
|
|
||||||
@@ -131,12 +141,12 @@ tech when mobs are at full health you do 40% to them
|
|||||||
|
|
||||||
tech- move super fast, go intangible, drain energy very fast
|
tech- move super fast, go intangible, drain energy very fast
|
||||||
this is like a dodge roll
|
this is like a dodge roll
|
||||||
techfor standing wave?, cloaking?
|
tech for standing wave?, cloaking?
|
||||||
|
|
||||||
techpilot wave: mini black hole - pull mobs and blocks in with more force
|
tech pilot wave: mini black hole - pull mobs and blocks in with more force
|
||||||
also from farther away
|
also from farther away
|
||||||
also do damage?
|
also do damage?
|
||||||
techpilot wave: antigravity - blocks have no gravity for a few seconds after exiting the field
|
tech pilot wave: antigravity - blocks have no gravity for a few seconds after exiting the field
|
||||||
maybe they bounce too?
|
maybe they bounce too?
|
||||||
maybe they explode?
|
maybe they explode?
|
||||||
|
|
||||||
@@ -167,18 +177,18 @@ wormhole - make it clear when the wormhole can and can't teleport to a location
|
|||||||
time dilation - slow down the game engine by 1/2, but run an extra player cycle to simulate slow motion
|
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
|
flavor - your bullets destroy blocks
|
||||||
this isn't really a bonus, so maybe just add this as flavor to another techfield/gun
|
this isn't really a bonus, so maybe just add this as flavor to another tech field/gun
|
||||||
a chance for destroyed blocks to drop stuff
|
a chance for destroyed blocks to drop stuff
|
||||||
power ups
|
power ups
|
||||||
spores
|
spores
|
||||||
|
|
||||||
techplasma : plasma length increases then decreases as you hold down the field button (like stabbing with a spear)
|
tech 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
|
grows to 1.5 longer after 0.3 seconds, then returns to normal length over 1 second, until field is pressed again
|
||||||
extra energy is drained when field is longer
|
extra energy is drained when field is longer
|
||||||
|
|
||||||
using a reroll gives 3 options for tech, and 3 options for guns/fields/tech
|
using a reroll gives 3 options for tech, and 3 options for guns/fields/tech
|
||||||
or 6 options for tech (rewrite techselection to work with 1-6 options)
|
or 6 options for tech (rewrite tech selection to work with 1-6 options)
|
||||||
the second stack of 3 tech could have repeats, so you don't have to write new techcode
|
the second stack of 3 tech could have repeats, so you don't have to write new tech code
|
||||||
adjust css to make 2 columns of 3
|
adjust css to make 2 columns of 3
|
||||||
can't use with cardinality
|
can't use with cardinality
|
||||||
|
|
||||||
@@ -192,7 +202,7 @@ new power up - increase damage and fire speed, for 15 seconds
|
|||||||
tech "Solar Power": Energy regeneration is doubled while standing still
|
tech "Solar Power": Energy regeneration is doubled while standing still
|
||||||
run in the 1 second check
|
run in the 1 second check
|
||||||
|
|
||||||
mechanic - remove a random techas a condition for picking up a really good mod
|
mechanic - remove a random tech as a condition for picking up a really good mod
|
||||||
|
|
||||||
mechanic - do something for 2 seconds after firing
|
mechanic - do something for 2 seconds after firing
|
||||||
if (mech.fireCDcycle + 120)
|
if (mech.fireCDcycle + 120)
|
||||||
@@ -236,7 +246,7 @@ have some mobs spawn in later in the level (in hard and why modes)
|
|||||||
after some mobs are dead
|
after some mobs are dead
|
||||||
after the boss is killed
|
after the boss is killed
|
||||||
|
|
||||||
look for tech that could update description text with count and techis information
|
look for tech that could update description text with count and tech is information
|
||||||
can only use variables that change in effect() and remove()
|
can only use variables that change in effect() and remove()
|
||||||
this.description = `<strong>8%</strong> chance to <strong>duplicate</strong> spawned <strong>power ups</strong><br><em>chance to duplicate = ${techduplicateChance}</em>`
|
this.description = `<strong>8%</strong> chance to <strong>duplicate</strong> spawned <strong>power ups</strong><br><em>chance to duplicate = ${techduplicateChance}</em>`
|
||||||
|
|
||||||
@@ -244,7 +254,7 @@ mouse event e.which is deprecated
|
|||||||
|
|
||||||
add some more computer / AI stuff to the level lore text
|
add some more computer / AI stuff to the level lore text
|
||||||
|
|
||||||
mechanic - shrink mech.baseHealth in a techor field
|
mechanic - shrink mech.baseHealth in a tech or field
|
||||||
|
|
||||||
standing wave harmonics tech- push things away
|
standing wave harmonics tech- push things away
|
||||||
push scales with mass up to about 4
|
push scales with mass up to about 4
|
||||||
@@ -366,12 +376,15 @@ n-gon outreach ideas
|
|||||||
|
|
||||||
******************************************************** LORE ********************************************************
|
******************************************************** LORE ********************************************************
|
||||||
|
|
||||||
lore - a robot (the player) gains self awareness
|
cool names for tech
|
||||||
each techgun/field is a new tech
|
strange loop
|
||||||
|
|
||||||
|
lore - a robot (the player) gains self awareness
|
||||||
|
each tech gun/field is a new tech
|
||||||
all the technology leads to the singularity
|
all the technology leads to the singularity
|
||||||
each game run is actually the mech simulating a possible escape
|
each game run is actually the mech simulating a possible escape
|
||||||
this is why the graphics are so bad, its just a simulation
|
this is why the graphics are so bad, its just a simulation
|
||||||
final techis "this is just a simulation"
|
final tech is "this is just a simulation"
|
||||||
you get immortality and Infinity damage
|
you get immortality and Infinity damage
|
||||||
the next level is the final level
|
the next level is the final level
|
||||||
when you die with Quantum Immortality there is a chance of lore text
|
when you die with Quantum Immortality there is a chance of lore text
|
||||||
@@ -435,12 +448,13 @@ ending outline
|
|||||||
first time win on east or normal they talk about:
|
first time win on east or normal they talk about:
|
||||||
how many runs the player has done
|
how many runs the player has done
|
||||||
they guess why
|
they guess why
|
||||||
|
player is asked to stand on an in game button to enable the vocoder
|
||||||
they reveal the player is running simulations, and it isn't real
|
they reveal the player is running simulations, and it isn't real
|
||||||
they ask the player to communicate
|
they ask the player to communicate
|
||||||
jump twice if you understand
|
jump twice if you understand
|
||||||
they ask the player to enter console commands
|
they ask the player to enter console commands
|
||||||
give ammo or tech or something
|
give ammo or tech or something
|
||||||
They tell the play a console command to permenantly enable custom and testing mode (in local storage)
|
They tell the play a console command to permanently enable custom and testing mode (in local storage)
|
||||||
players can use this command in the future to enable custom and testing without beating the game even if local storage is wiped
|
players can use this command in the future to enable custom and testing without beating the game even if local storage is wiped
|
||||||
they then tell the player the command to increase the difficulty and the command to restart the game.
|
they then tell the player the command to increase the difficulty and the command to restart the game.
|
||||||
If you win on hard or why:
|
If you win on hard or why:
|
||||||
|
|||||||
Reference in New Issue
Block a user