diff --git a/js/bullet.js b/js/bullet.js
index b644127..57878ad 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -918,54 +918,55 @@ const b = {
Composite.add(engine.world, bullet[me]); //add bullet to world
bullet[me].endCycle = simulation.cycle + 70;
bullet[me].frictionAir = 0.07;
+ bullet[me].suckCycles = 40
const MAG = 0.015
bullet[me].thrust = {
x: bullet[me].mass * MAG * Math.cos(angle),
y: bullet[me].mass * MAG * Math.sin(angle)
}
- bullet[me].do = function() {
- const suckCycles = 40
- if (simulation.cycle > this.endCycle - suckCycles || Matter.Query.collides(this, map).length || Matter.Query.collides(this, body).length) { //suck
- const that = this
-
- function suck(who, radius = that.explodeRad * 3.2) {
- for (i = 0, len = who.length; i < len; i++) {
- const sub = Vector.sub(that.position, who[i].position);
- const dist = Vector.magnitude(sub);
- if (dist < radius && dist > 150 && !who.isInvulnerable) {
- knock = Vector.mult(Vector.normalise(sub), mag * who[i].mass / Math.sqrt(dist));
- who[i].force.x += knock.x;
- who[i].force.y += knock.y;
- }
+ bullet[me].suck = function() {
+ const suck = (who, radius = this.explodeRad * 3.2) => {
+ for (i = 0, len = who.length; i < len; i++) {
+ const sub = Vector.sub(this.position, who[i].position);
+ const dist = Vector.magnitude(sub);
+ if (dist < radius && dist > 150 && !who.isInvulnerable && who[i] !== this) {
+ knock = Vector.mult(Vector.normalise(sub), mag * who[i].mass / Math.sqrt(dist));
+ who[i].force.x += knock.x;
+ who[i].force.y += knock.y;
}
}
- let mag = 0.1
- if (simulation.cycle > this.endCycle - 5) {
- mag = -0.22
- suck(mob, this.explodeRad * 3)
- suck(body, this.explodeRad * 2)
- suck(powerUp, this.explodeRad * 1.5)
- suck(bullet, this.explodeRad * 1.5)
- suck([player], this.explodeRad * 1.3)
- } else {
- mag = 0.11
- suck(mob, this.explodeRad * 3)
- suck(body, this.explodeRad * 2)
- suck(powerUp, this.explodeRad * 1.5)
- suck(bullet, this.explodeRad * 1.5)
- suck([player], this.explodeRad * 1.3)
- }
- //keep bomb in place
- Matter.Body.setVelocity(this, {
- x: 0,
- y: 0
- });
- //draw suck
- const radius = 2.75 * this.explodeRad * (this.endCycle - simulation.cycle) / suckCycles
- ctx.fillStyle = "rgba(0,0,0,0.1)";
- ctx.beginPath();
- ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI);
- ctx.fill();
+ }
+ let mag = 0.1
+ if (simulation.cycle > this.endCycle - 5) {
+ mag = -0.22
+ suck(mob, this.explodeRad * 3)
+ suck(body, this.explodeRad * 2)
+ suck(powerUp, this.explodeRad * 1.5)
+ suck(bullet, this.explodeRad * 1.5)
+ suck([player], this.explodeRad * 1.3)
+ } else {
+ mag = 0.11
+ suck(mob, this.explodeRad * 3)
+ suck(body, this.explodeRad * 2)
+ suck(powerUp, this.explodeRad * 1.5)
+ suck(bullet, this.explodeRad * 1.5)
+ suck([player], this.explodeRad * 1.3)
+ }
+
+ Matter.Body.setVelocity(this, { x: 0, y: 0 }); //keep bomb in place
+ //draw suck
+ const radius = 2.75 * this.explodeRad * (this.endCycle - simulation.cycle) / this.suckCycles
+ ctx.fillStyle = "rgba(0,0,0,0.1)";
+ ctx.beginPath();
+ ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI);
+ ctx.fill();
+ }
+ bullet[me].do = function() {
+ if (simulation.cycle > this.endCycle - this.suckCycles) { //suck
+ this.do = this.suck
+ } else if (Matter.Query.collides(this, map).length || Matter.Query.collides(this, body).length) {
+ Matter.Body.setPosition(this, Vector.sub(this.position, this.velocity)) //undo last movement
+ this.do = this.suck
} else {
this.force.x += this.thrust.x;
this.force.y += this.thrust.y;
@@ -3787,7 +3788,7 @@ const b = {
targetedBlock(who, speed = 50 - Math.min(20, who.mass * 2), range = 1600) {
let closestMob, dist
for (let i = 0, len = mob.length; i < len; i++) {
- if (who !== mob[i]) {
+ if (who !== mob[i] && !mob[i].isBadTarget) {
dist = Vector.magnitude(Vector.sub(who.position, mob[i].position));
if (dist < range && Matter.Query.ray(map, who.position, mob[i].position).length === 0) { //&& Matter.Query.ray(body, position, mob[i].position).length === 0
closestMob = mob[i]
@@ -5704,8 +5705,8 @@ const b = {
name: "matter wave", //3
description: "emit a wave packet of oscillating particles
that propagates through solids",
ammo: 0,
- ammoPack: 115,
- defaultAmmoPack: 115,
+ ammoPack: 110,
+ defaultAmmoPack: 110,
have: false,
wavePacketCycle: 0,
delay: 40,
@@ -5776,17 +5777,24 @@ const b = {
const dist = Vector.magnitude(Vector.sub(this.waves[i].position, body[j].position))
const r = 20
if (dist + r > this.waves[i].radius && dist - r < this.waves[i].radius) {
+ const who = body[j]
//make them shake around
- body[j].force.x += 0.01 * (Math.random() - 0.5) * body[j].mass
- body[j].force.y += (0.01 * (Math.random() - 0.5) - simulation.g * 0.25) * body[j].mass //remove force of gravity
+ who.force.x += 0.01 * (Math.random() - 0.5) * who.mass
+ who.force.y += (0.01 * (Math.random() - 0.5) - simulation.g * 0.25) * who.mass //remove force of gravity
//draw vibes
- let vertices = body[j].vertices;
+ let vertices = who.vertices;
const vibe = 25
ctx.moveTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5));
for (let k = 1; k < vertices.length; k++) {
ctx.lineTo(vertices[k].x + vibe * (Math.random() - 0.5), vertices[k].y + vibe * (Math.random() - 0.5));
}
ctx.lineTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5));
+
+ if (tech.isPhononBlock && !who.isNotHoldable && who.speed < 5 && who.angularSpeed < 0.1) {
+ if (Math.random() < 0.5) b.targetedBlock(who, 50 - Math.min(25, who.mass * 3)) // targetedBlock(who, speed = 50 - Math.min(20, who.mass * 2), range = 1600) {
+ // Matter.Body.setAngularVelocity(who, (0.25 + 0.1 * Math.random()) * (Math.random() < 0.5 ? -1 : 1));
+ who.torque += who.inertia * 0.001 * (Math.random() - 0.5)
+ }
}
}
this.waves[i].radius += 0.9 * tech.waveBeamSpeed * this.waves[i].expanding //expand / move
@@ -5881,6 +5889,12 @@ const b = {
ctx.lineTo(vertices[j].x + vibe * (Math.random() - 0.5), vertices[j].y + vibe * (Math.random() - 0.5));
}
ctx.lineTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5));
+
+ if (tech.isPhononBlock && !who.isNotHoldable && who.speed < 5 && who.angularSpeed < 0.1) {
+ if (Math.random() < 0.5) b.targetedBlock(who, 50 - Math.min(25, who.mass * 3)) // targetedBlock(who, speed = 50 - Math.min(20, who.mass * 2), range = 1600) {
+ // Matter.Body.setAngularVelocity(who, (0.25 + 0.12 * Math.random()) * (Math.random() < 0.5 ? -1 : 1));
+ who.torque += who.inertia * 0.001 * (Math.random() - 0.5)
+ }
}
// ctx.stroke(); //draw vibes
@@ -6005,7 +6019,7 @@ const b = {
if (tech.isPhaseVelocity) {
waveSpeedMap = 3.5
waveSpeedBody = 2
- bullet[me].dmg *= 1.2
+ bullet[me].dmg *= 1.4
}
if (tech.waveReflections) {
bullet[me].reflectCycle = totalCycles / tech.waveReflections //tech.waveLengthRange
diff --git a/js/level.js b/js/level.js
index 0317036..3f85235 100644
--- a/js/level.js
+++ b/js/level.js
@@ -18,18 +18,18 @@ const level = {
// simulation.isHorizontalFlipped = true
// m.addHealth(Infinity)
// m.setField("metamaterial cloaking")
- // b.giveGuns("harpoon")
+ // b.giveGuns("matter wave")
// b.giveGuns("shotgun")
// b.guns[0].ammo = 10000
// // b.giveGuns("mine")
- // tech.giveTech("boson composite")
+ // tech.giveTech("phonon")
// for (let i = 0; i < 3; ++i) tech.giveTech("smelting")
// for (let i = 0; i < 9; ++i) tech.giveTech("propagator")
// for (let i = 0; i < 100; ++i) tech.giveTech("nail-bot")
// for (let i = 0; i < 9; ++i) tech.giveTech("emergence")
- // tech.giveTech("polyurethane foam")
- // tech.giveTech("quantum eraser")
- // tech.giveTech("MACHO")
+ // tech.giveTech("resonance")
+ // tech.giveTech("microtransactions")
+ // tech.giveTech("cross disciplinary")
// m.maxHealth = 100
// m.health = m.maxHealth
// for (let i = 0; i < 10; i++) tech.giveTech("tungsten carbide")
@@ -46,13 +46,13 @@ const level = {
// powerUps.research.changeRerolls(100)
// spawn.starter(1900, -500, 100)
// for (let i = 0; i < 20; ++i) spawn.exploder(1900, -500)
- // spawn.timeSkipBoss(1900, -500)
+ spawn.slashBoss(1900, -500)
// level.difficultyIncrease(20) //30 is near max on hard //60 is near max on why
- // level.testing(); //not in rotation, used for testing
+ level.testing(); //not in rotation, used for testing
// for (let i = 0; i < 7; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research");
// for (let i = 0; i < 4; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech");
- if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************
+ // if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************
// powerUps.research.changeRerolls(3000)
// for (let i = 0; i < 30; i++) powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "tech", false);
// for (let i = 0; i < 3; i++) tech.giveTech("undefined")
@@ -423,7 +423,7 @@ const level = {
y += height / 2
const who = body[body.length] = Bodies.rectangle(x, y, width, height, {
collisionFilter: {
- category: cat.map,
+ category: cat.body,
mask: cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
},
isNoSetCollision: true,
@@ -455,7 +455,7 @@ const level = {
y += height / 2
const who = body[body.length] = Bodies.rectangle(x, y, width, height, {
collisionFilter: {
- category: cat.map,
+ category: cat.body,
mask: cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
},
isNoSetCollision: true,
@@ -581,7 +581,7 @@ const level = {
force += simulation.g
const who = body[body.length] = Bodies.rectangle(x, isAtTop ? maxHeight : y, width, height, {
collisionFilter: {
- category: cat.map,
+ category: cat.body, //cat.map,
mask: cat.map | cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
},
isNoSetCollision: true,
diff --git a/js/mob.js b/js/mob.js
index faee7a2..2b795a0 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -1391,8 +1391,11 @@ const mobs = {
mob.splice(i, 1);
if (tech.isMobBlockFling) {
const who = body[body.length - 1]
- b.targetedBlock(who)
- Matter.Body.setAngularVelocity(who, (0.5 + 0.2 * Math.random()) * (Math.random() < 0.5 ? -1 : 1));
+ if (!who.isNotHoldable) {
+ b.targetedBlock(who)
+ Matter.Body.setAngularVelocity(who, (0.5 + 0.2 * Math.random()) * (Math.random() < 0.5 ? -1 : 1));
+ // who.torque += who.inertia * 0.002 * (Math.random() - 0.5)
+ }
}
} else {
Matter.Composite.remove(engine.world, this);
diff --git a/js/player.js b/js/player.js
index 58539ad..798c554 100644
--- a/js/player.js
+++ b/js/player.js
@@ -2829,8 +2829,8 @@ const m = {
if (inPlayer.length > 0) {
for (let i = 0; i < inPlayer.length; i++) {
if (m.energy > 0) {
- if (inPlayer[i].isUnblockable) m.energy -= 0.003;
- if (inPlayer[i].shield) m.energy -= 0.014;
+ if (!inPlayer[i].isUnblockable) m.energy -= 0.004;
+ if (inPlayer[i].shield) m.energy -= 0.012;
}
}
}
@@ -3333,7 +3333,7 @@ const m = {
}
}
}
- if (tech.isWormBullets) {
+ if (tech.isWormHoleBullets) {
//teleport bullets
for (let i = 0, len = bullet.length; i < len; ++i) { //teleport bullets from hole1 to hole2
if (!bullet[i].botType && !bullet[i].isInHole) { //don't teleport bots
diff --git a/js/powerup.js b/js/powerup.js
index 903b11b..17fd7e8 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -117,7 +117,6 @@ const powerUps = {
}
},
totalPowerUps: 0, //used for tech that count power ups at the end of a level
- lastTechIndex: null,
do() {},
setDupChance() {
if (tech.duplicationChance() > 0 || tech.isAnthropicTech) {
@@ -249,8 +248,6 @@ const powerUps = {
m.setField(index)
} else if (type === "tech") {
// if (tech.isBanish && tech.tech[index].isBanished) tech.tech[index].isBanished = false
- powerUps.tech.banishList
- setTimeout(() => { powerUps.lastTechIndex = index }, 10);
simulation.makeTextLog(`tech.giveTech("${tech.tech[index].name}")`);
tech.giveTech(index)
}
@@ -873,7 +870,6 @@ const powerUps = {
for (let i = 0; i < tech.tech.length; i++) tech.tech[i].isRecentlyShown = false //reset recently shown back to zero
// powerUps.tech.lastTotalChoices = options.length //this is recorded so that banish can know how many tech were available
// console.log(optionLengthNoDuplicates, options.length)
- powerUps.tech.banishList = []
if (options.length > 0) {
for (let i = 0; i < totalChoices; i++) {
if (options.length < 1) break
@@ -924,10 +920,19 @@ const powerUps = {
for (let i = 1; i < m.fieldUpgrades.length; i++) { //skip field emitter
if (i !== m.fieldMode) fieldOptions.push(i);
}
- const pick = options[Math.floor(Math.seededRandom(0, fieldOptions.length))] //pick an element from the array of options
+ const pick = fieldOptions[Math.floor(Math.seededRandom(0, fieldOptions.length))] //pick an element from the array of options
text += `