towers
newLevel - towers please give feedback boost level elements can now be pointed at any angle paradigm shift costs 1 health, but cost increases after each use ejecting with paradigm shift tech sets their frequency to zero, so they don't show up again polyurethane foam - makes more foam from super balls bubble fusion - now works with any shield, but only once per mob so it triggers from the shieldingBoss collider - has a higher chance to form tech vs. other power ups removed all ON/OFF tech I just don't think they are fun JUNK tech - wall jump fixed some bugs player damage reduction adjustment: 0.9x -> 0.89x per level per difficulty mode (1,2,4,5) on easy that's 0.28 -> 0.245 by level 12 (a 12% player damage nerf) on why a 50% player damage nerf by level 12
This commit is contained in:
155
js/powerup.js
155
js/powerup.js
@@ -247,12 +247,14 @@ const powerUps = {
|
||||
if (powerUp[i].isDuplicated) {
|
||||
if (Math.random() < 0.003 && !m.isBodiesAsleep) { // (1-0.003)^240 = chance to be removed after 4 seconds, 240 = 4 seconds * 60 cycles per second
|
||||
b.explosion(powerUp[i].position, 175 + (11 + 3 * Math.random()) * powerUp[i].size);
|
||||
Matter.Composite.remove(engine.world, powerUp[i]);
|
||||
powerUp.splice(i, 1);
|
||||
if (powerUp[i]) {
|
||||
Matter.Composite.remove(engine.world, powerUp[i]);
|
||||
powerUp.splice(i, 1);
|
||||
}
|
||||
break
|
||||
}
|
||||
if (Math.random() < 0.3) { //draw electricity
|
||||
const mag = 4 + powerUp[i].size / 5
|
||||
const mag = Math.max(1, 4 + powerUp[i].size / 5)
|
||||
let unit = Vector.rotate({ x: mag, y: mag }, 2 * Math.PI * Math.random())
|
||||
let path = { x: powerUp[i].position.x + unit.x, y: powerUp[i].position.y + unit.y }
|
||||
ctx.beginPath();
|
||||
@@ -328,7 +330,7 @@ const powerUps = {
|
||||
simulation.circleFlare(value);
|
||||
}
|
||||
if (tech.isCancelRerolls) {
|
||||
for (let i = 0, len = 10 + 4 * Math.random(); i < len; i++) {
|
||||
for (let i = 0, len = 8 + 4 * Math.random(); i < len; i++) {
|
||||
let spawnType
|
||||
if (Math.random() < 0.4 && !tech.isEnergyNoAmmo) {
|
||||
spawnType = "ammo"
|
||||
@@ -340,7 +342,7 @@ const powerUps = {
|
||||
powerUps.spawn(m.pos.x + 40 * (Math.random() - 0.5), m.pos.y + 40 * (Math.random() - 0.5), spawnType, false);
|
||||
}
|
||||
}
|
||||
if (tech.isCancelCouple) powerUps.spawnDelay("coupling", 8)
|
||||
if (tech.isCancelCouple) powerUps.spawnDelay("coupling", 7)
|
||||
if (tech.isCancelTech && tech.cancelTechCount === 0 && type !== "entanglement") {
|
||||
tech.cancelTechCount++
|
||||
// powerUps.research.use('tech')
|
||||
@@ -524,7 +526,7 @@ const powerUps = {
|
||||
name: "heal",
|
||||
color: "#0eb",
|
||||
size() {
|
||||
return Math.sqrt(0.1 + 0.25) * 40 * (simulation.healScale ** 0.25) * Math.sqrt(tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)) * (tech.isFlipFlopOn && tech.isFlipFlopHealth ? Math.sqrt(2) : 1); //(simulation.healScale ** 0.25) gives a smaller radius as heal scale goes down
|
||||
return Math.sqrt(0.1 + 0.25) * 40 * (simulation.healScale ** 0.25) * Math.sqrt(tech.largerHeals * (tech.isHalfHeals ? 0.5 : 1)); //(simulation.healScale ** 0.25) gives a smaller radius as heal scale goes down
|
||||
},
|
||||
effect() {
|
||||
if (!tech.isEnergyHealth && m.alive) {
|
||||
@@ -819,30 +821,92 @@ const powerUps = {
|
||||
${tech.tech[choose].name} ${techCountText}</div>
|
||||
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div></div>`
|
||||
},
|
||||
// junkTechText(choose, click) { //old code with yahoo images
|
||||
// const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count + 1}x)` : "";
|
||||
// const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-size: contain;background-repeat: no-repeat;background-image: url('img/junk.webp');"`
|
||||
// if (!localSettings.isHideImages) {
|
||||
// setTimeout(() => { //delay so that the html element exists
|
||||
// if (tech.tech[choose].url === undefined) { //if on url has been set yet
|
||||
// const url = "https://images.search.yahoo.com/search/images?p=" + tech.tech[choose].name;
|
||||
// fetch(url, { signal: AbortSignal.timeout(1000) }) //give up if it takes over 1 second
|
||||
// .then((response) => response.text())
|
||||
// .then((html) => {
|
||||
// const parser = new DOMParser();
|
||||
// const doc = parser.parseFromString(html, "text/html");
|
||||
// const elements = doc.getElementsByClassName("ld");
|
||||
// // console.log(i, elements[i].getAttribute("data"), JSON.parse(elements[i].getAttribute("data")).iurl)
|
||||
// const index = Math.floor(Math.random() * 4) //randomly choose from the first 4 images
|
||||
// if (parseInt(JSON.parse(elements[index].getAttribute("data")).s.slice(0, -2)) < 500) { //make sure it isn't too big
|
||||
// tech.tech[choose].url = JSON.parse(elements[index].getAttribute("data")).iurl //store the url
|
||||
// document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')` //make the url the background image
|
||||
// } else if (parseInt(JSON.parse(elements[index + 1].getAttribute("data")).s.slice(0, -2)) < 500) { //try a different images and see if it is smaller
|
||||
// tech.tech[choose].url = JSON.parse(elements[index + 1].getAttribute("data")).iurl
|
||||
// document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
|
||||
// } else if (parseInt(JSON.parse(elements[index + 2].getAttribute("data")).s.slice(0, -2)) < 500) { //try a different images and see if it is smaller
|
||||
// tech.tech[choose].url = JSON.parse(elements[index + 2].getAttribute("data")).iurl
|
||||
// document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
|
||||
// }
|
||||
// });
|
||||
// } else {
|
||||
// document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
|
||||
// }
|
||||
// }, 1);
|
||||
// }
|
||||
// return `<div id = "junk-${choose}" class="choose-grid-module card-background" onclick="${click}" onauxclick="${click}"${style}>
|
||||
// <div class="card-text">
|
||||
// <div class="grid-title"><div class="circle-grid junk"></div> ${tech.tech[choose].name} ${techCountText}</div>
|
||||
// ${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div></div>`
|
||||
// },
|
||||
// junkTechText(choose, click) {
|
||||
// const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count + 1}x)` : "";
|
||||
// const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-size: contain;background-repeat: no-repeat;background-image: url('img/junk.webp');"`
|
||||
// if (!localSettings.isHideImages) {
|
||||
// setTimeout(() => { //delay so that the html element exists
|
||||
// if (tech.tech[choose].url === undefined) { //if on url has been set yet
|
||||
// const url = "https://images.search.yahoo.com/search/images?p=" + tech.tech[choose].name;
|
||||
// fetch(url, { signal: AbortSignal.timeout(1000) }) //give up if it takes over 1 second
|
||||
// .then((response) => response.text())
|
||||
// .then((html) => {
|
||||
// const parser = new DOMParser();
|
||||
// const doc = parser.parseFromString(html, "text/html");
|
||||
// const elements = doc.getElementsByClassName("ld");
|
||||
// // console.log(i, elements[i].getAttribute("data"), JSON.parse(elements[i].getAttribute("data")).iurl)
|
||||
// const index = Math.floor(Math.random() * 4) //randomly choose from the first 4 images
|
||||
// if (parseInt(JSON.parse(elements[index].getAttribute("data")).s.slice(0, -2)) < 500) { //make sure it isn't too big
|
||||
// tech.tech[choose].url = JSON.parse(elements[index].getAttribute("data")).iurl //store the url
|
||||
// document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')` //make the url the background image
|
||||
// } else if (parseInt(JSON.parse(elements[index + 1].getAttribute("data")).s.slice(0, -2)) < 500) { //try a different images and see if it is smaller
|
||||
// tech.tech[choose].url = JSON.parse(elements[index + 1].getAttribute("data")).iurl
|
||||
// document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
|
||||
// } else if (parseInt(JSON.parse(elements[index + 2].getAttribute("data")).s.slice(0, -2)) < 500) { //try a different images and see if it is smaller
|
||||
// tech.tech[choose].url = JSON.parse(elements[index + 2].getAttribute("data")).iurl
|
||||
// document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
|
||||
// }
|
||||
// });
|
||||
// } else {
|
||||
// document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
|
||||
// }
|
||||
// }, 1);
|
||||
// }
|
||||
// return `<div id = "junk-${choose}" class="choose-grid-module card-background" onclick="${click}" onauxclick="${click}"${style}>
|
||||
// <div class="card-text">
|
||||
// <div class="grid-title"><div class="circle-grid junk"></div> ${tech.tech[choose].name} ${techCountText}</div>
|
||||
// ${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div></div>`
|
||||
// },
|
||||
junkTechText(choose, click) {
|
||||
const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count + 1}x)` : "";
|
||||
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-size: contain;background-repeat: no-repeat;background-image: url('img/junk.webp');"`
|
||||
if (!localSettings.isHideImages) {
|
||||
setTimeout(() => { //delay so that the html element exists
|
||||
if (tech.tech[choose].url === undefined) { //if on url has been set yet
|
||||
const url = "https://images.search.yahoo.com/search/images?p=" + tech.tech[choose].name;
|
||||
const url = `https://api.openverse.engineering/v1/images/?q=${tech.tech[choose].name}`;
|
||||
fetch(url, { signal: AbortSignal.timeout(1000) }) //give up if it takes over 1 second
|
||||
.then((response) => response.text())
|
||||
.then((html) => {
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(html, "text/html");
|
||||
const elements = doc.getElementsByClassName("ld");
|
||||
// console.log(i, elements[i].getAttribute("data"), JSON.parse(elements[i].getAttribute("data")).iurl)
|
||||
const index = Math.floor(Math.random() * 4) //randomly choose from the first 4 images
|
||||
if (parseInt(JSON.parse(elements[index].getAttribute("data")).s.slice(0, -2)) < 500) { //make sure it isn't too big
|
||||
tech.tech[choose].url = JSON.parse(elements[index].getAttribute("data")).iurl //store the url
|
||||
.then((response) => response.json())
|
||||
.then((responseJson) => {
|
||||
if (responseJson.results.length > 0) {
|
||||
const index = Math.floor(Math.random() * responseJson.results.length) //randomly choose from the images
|
||||
tech.tech[choose].url = responseJson.results[index].url //store the url
|
||||
document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')` //make the url the background image
|
||||
} else if (parseInt(JSON.parse(elements[index + 1].getAttribute("data")).s.slice(0, -2)) < 500) { //try a different images and see if it is smaller
|
||||
tech.tech[choose].url = JSON.parse(elements[index + 1].getAttribute("data")).iurl
|
||||
document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
|
||||
} else if (parseInt(JSON.parse(elements[index + 2].getAttribute("data")).s.slice(0, -2)) < 500) { //try a different images and see if it is smaller
|
||||
tech.tech[choose].url = JSON.parse(elements[index + 2].getAttribute("data")).iurl
|
||||
document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@@ -878,7 +942,6 @@ const powerUps = {
|
||||
// console.log(options.length)
|
||||
if (options.length > 0 || !tech.isSuperDeterminism) {
|
||||
let totalChoices = Math.min(options.length, (tech.isDeterminism ? 1 : 2 + tech.extraChoices + 2 * (m.fieldMode === 8)))
|
||||
if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay
|
||||
function removeOption(index) {
|
||||
for (let i = 0; i < options.length; i++) {
|
||||
if (options[i] === index) {
|
||||
@@ -940,8 +1003,6 @@ const powerUps = {
|
||||
if (i !== m.fieldMode) options.push(i);
|
||||
}
|
||||
let totalChoices = Math.min(options.length, (tech.isDeterminism ? 1 : 2 + tech.extraChoices + 2 * (m.fieldMode === 8)))
|
||||
if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay
|
||||
|
||||
function removeOption(index) {
|
||||
for (let i = 0; i < options.length; i++) {
|
||||
if (options[i] === index) {
|
||||
@@ -1016,7 +1077,6 @@ const powerUps = {
|
||||
}
|
||||
//set total choices
|
||||
let totalChoices = (tech.isDeterminism ? 1 : 3 + tech.extraChoices + 2 * (m.fieldMode === 8))
|
||||
if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay
|
||||
if (optionLengthNoDuplicates < totalChoices + 1) { //if not enough options for all the choices
|
||||
totalChoices = optionLengthNoDuplicates
|
||||
if (tech.isBanish) { //when you run out of options eject banish
|
||||
@@ -1214,7 +1274,7 @@ const powerUps = {
|
||||
} else if (tech.tech[choose].isSkin) {
|
||||
text += powerUps.skinTechText(choose, `powerUps.choose('tech',${choose})`)
|
||||
} else if (tech.tech[choose].isInstant) {
|
||||
text += powerUps.instantTechTextTechText(choose, `powerUps.choose('tech',${choose})`)
|
||||
text += powerUps.instantTechText(choose, `powerUps.choose('tech',${choose})`)
|
||||
} else { //normal tech
|
||||
text += powerUps.techText(choose, `powerUps.choose('tech',${choose})`)
|
||||
}
|
||||
@@ -1229,14 +1289,14 @@ const powerUps = {
|
||||
}
|
||||
},
|
||||
},
|
||||
spawnDelay(type, count) {
|
||||
count *= 2
|
||||
spawnDelay(type, count, delay = 2) {
|
||||
count *= delay
|
||||
let cycle = () => {
|
||||
if (count > 0) {
|
||||
if (m.alive) requestAnimationFrame(cycle);
|
||||
if (!simulation.paused && !simulation.isChoosing) { //&& !(simulation.cycle % 2)
|
||||
count--
|
||||
if (!(count % 2)) {
|
||||
if (!(count % delay)) {
|
||||
const where = { x: m.pos.x + 50 * (Math.random() - 0.5), y: m.pos.y + 50 * (Math.random() - 0.5) }
|
||||
powerUps.spawn(where.x, where.y, type);
|
||||
}
|
||||
@@ -1256,18 +1316,6 @@ const powerUps = {
|
||||
b.mine(who.position, { x: 0, y: 0 }, 0)
|
||||
}
|
||||
}
|
||||
if (tech.isRelay) {
|
||||
if (tech.isFlipFlopOn) {
|
||||
tech.isFlipFlopOn = false
|
||||
if (document.getElementById("tech-switch")) document.getElementById("tech-switch").innerHTML = ` = <strong>OFF</strong>`
|
||||
m.eyeFillColor = 'transparent'
|
||||
} else {
|
||||
tech.isFlipFlopOn = true //immune to damage this hit, lose immunity for next hit
|
||||
if (document.getElementById("tech-switch")) document.getElementById("tech-switch").innerHTML = ` = <strong>ON</strong>`
|
||||
m.eyeFillColor = m.fieldMeterColor //'#0cf'
|
||||
}
|
||||
if (tech.isRelayEnergy) m.setMaxEnergy();
|
||||
}
|
||||
},
|
||||
spawnRandomPowerUp(x, y) { //mostly used after mob dies, doesn't always return a power up
|
||||
if (!tech.isEnergyHealth && (Math.random() * Math.random() - 0.3 > Math.sqrt(m.health)) || Math.random() < 0.04) { //spawn heal chance is higher at low health
|
||||
@@ -1449,8 +1497,10 @@ const powerUps = {
|
||||
// tech.removeTech(index)
|
||||
// } else {
|
||||
// }
|
||||
tech.tech[index].frequency = 0 //banish tech
|
||||
powerUps.ejectTech(index)
|
||||
m.damage(0.04)
|
||||
m.damage(tech.pauseEjectTech * 0.01)
|
||||
tech.pauseEjectTech *= 1.2
|
||||
document.getElementById(`${index}-pause-tech`).style.textDecoration = "line-through"
|
||||
document.getElementById(`${index}-pause-tech`).style.animation = ""
|
||||
document.getElementById(`${index}-pause-tech`).onclick = null
|
||||
@@ -1478,15 +1528,9 @@ const powerUps = {
|
||||
smallIndexes.push(i)
|
||||
}
|
||||
}
|
||||
if (bigIndexes.length > 0) {
|
||||
// console.log("at least 1 big will always spilt")
|
||||
const index = bigIndexes[Math.floor(Math.random() * bigIndexes.length)]
|
||||
for (let i = 0; i < 3; i++) powerUps.directSpawn(where.x, where.y, options[Math.floor(Math.random() * options.length)], false)
|
||||
|
||||
Matter.Composite.remove(engine.world, powerUp[index]);
|
||||
powerUp.splice(index, 1);
|
||||
} else if (smallIndexes.length > 2 && Math.random() < 0.33) {
|
||||
// console.log("no big, at least 3 small can combine")
|
||||
|
||||
if (smallIndexes.length > 2 && Math.random() < 0.66) { // console.log("no big, at least 3 small can combine")
|
||||
for (let j = 0; j < 3; j++) {
|
||||
for (let i = 0; i < powerUp.length; i++) {
|
||||
if (powerUp[i].name === "heal" || powerUp[i].name === "research" || powerUp[i].name === "ammo" || powerUp[i].name === "coupling" || powerUp[i].name === "boost") {
|
||||
@@ -1499,8 +1543,13 @@ const powerUps = {
|
||||
|
||||
options = ["tech", "gun", "field"]
|
||||
powerUps.directSpawn(where.x, where.y, options[Math.floor(Math.random() * options.length)], false)
|
||||
} else if (smallIndexes.length > 0) {
|
||||
// console.log("no big, at least 1 small will swap flavors")
|
||||
} else if (bigIndexes.length > 0 && Math.random() < 0.5) { // console.log("at least 1 big can spilt")
|
||||
const index = bigIndexes[Math.floor(Math.random() * bigIndexes.length)]
|
||||
for (let i = 0; i < 3; i++) powerUps.directSpawn(where.x, where.y, options[Math.floor(Math.random() * options.length)], false)
|
||||
|
||||
Matter.Composite.remove(engine.world, powerUp[index]);
|
||||
powerUp.splice(index, 1);
|
||||
} else if (smallIndexes.length > 0) { // console.log("no big, at least 1 small will swap flavors")
|
||||
const index = Math.floor(Math.random() * powerUp.length)
|
||||
options = options.filter(e => e !== powerUp[index].name); //don't repeat the current power up type
|
||||
powerUps.directSpawn(where.x, where.y, options[Math.floor(Math.random() * options.length)], false)
|
||||
|
||||
Reference in New Issue
Block a user