card adjustments

card font is 10% smaller with a bit more padding on the edges
background is darker on power up selection
css border added to research and cancel buttons
JUNK images now timeout if you don't download the image in under 1 sec
  and it will not even try to download an image above 500KB
  and it will try a different random image if it's first attempt is too big
    (gotta protect our friends with slow internet)

finalBoss
  mine mode comes in waves
  orbiters mode comes in waves, and they spawn at a radius that intersects the player

several on new level tech effects now also run on each new final Boss phase
  gun stuff, many worlds, negative entropy heal spawns

perfect diamagnetism slow fall is much strong, but works better when angled like a parachute
This commit is contained in:
landgreen
2022-12-19 10:54:09 -08:00
parent 16834e95be
commit 8b9511f975
16 changed files with 489 additions and 570 deletions

BIN
.DS_Store vendored

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 47 KiB

BIN
img/junk.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View File

@@ -25,7 +25,6 @@
<div id="health-bg"></div> <div id="health-bg"></div>
<div id="health"></div> <div id="health"></div>
<div id="dmg"></div> <div id="dmg"></div>
<div id="choose-background"></div>
<div id='construct'></div> <div id='construct'></div>
<canvas id="canvas"></canvas> <canvas id="canvas"></canvas>
<div id="choose-grid"></div> <div id="choose-grid"></div>

View File

@@ -3455,7 +3455,7 @@ const b = {
ctx.stroke(); ctx.stroke();
} }
//power ups //power ups
if (!this.isImproved && !simulation.isChoosing && !tech.isExtraMaxEnergy) { if (!this.isImproved && !simulation.isChoosing) {
if (this.lockedOn) { if (this.lockedOn) {
for (let i = 0, len = powerUp.length; i < len; ++i) { //grab, but don't lock onto nearby power up for (let i = 0, len = powerUp.length; i < len; ++i) { //grab, but don't lock onto nearby power up
if ( if (
@@ -3665,7 +3665,7 @@ const b = {
} }
} }
//power ups //power ups
if (!this.isImproved && !simulation.isChoosing && !tech.isExtraMaxEnergy) { if (!this.isImproved && !simulation.isChoosing) {
if (this.lockedOn) { if (this.lockedOn) {
//grab, but don't lock onto nearby power up //grab, but don't lock onto nearby power up
for (let i = 0, len = powerUp.length; i < len; ++i) { for (let i = 0, len = powerUp.length; i < len; ++i) {

View File

@@ -412,7 +412,7 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
// } else { // } else {
// text += `<div class="pause-grid-module" id ="${i}-pause-tech" onclick="powerUps.pauseEjectTech(${i})" ${style}><div class="grid-title"><div class="circle-grid tech"></div> &nbsp; ${tech.tech[i].link} ${techCountText}</div>${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}</div></div>` // text += `<div class="pause-grid-module" id ="${i}-pause-tech" onclick="powerUps.pauseEjectTech(${i})" ${style}><div class="grid-title"><div class="circle-grid tech"></div> &nbsp; ${tech.tech[i].link} ${techCountText}</div>${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}</div></div>`
// } // }
const style = localSettings.isHideImages ? `style="height:auto;"` : `style = "background-image: url('img/${tech.tech[i].name}.webp');"` const style = (localSettings.isHideImages || tech.tech[i].isJunk) ? `style="height:auto;"` : `style = "background-image: url('img/${tech.tech[i].name}.webp');"`
const techCountText = tech.tech[i].count > 1 ? `(${tech.tech[i].count}x)` : ""; const techCountText = tech.tech[i].count > 1 ? `(${tech.tech[i].count}x)` : "";
if (tech.tech[i].isNonRefundable) { if (tech.tech[i].isNonRefundable) {
text += `<div class="pause-grid-module" id ="${i}-pause-tech" style = "border: 0px; opacity:0.5; font-size: 60%; line-height: 130%; margin: 1px; padding-top: 6px; padding-bottom: 6px;"><div class="grid-title">${tech.tech[i].link} ${techCountText}</div>${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}</div></div>` text += `<div class="pause-grid-module" id ="${i}-pause-tech" style = "border: 0px; opacity:0.5; font-size: 60%; line-height: 130%; margin: 1px; padding-top: 6px; padding-bottom: 6px;"><div class="grid-title">${tech.tech[i].link} ${techCountText}</div>${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}</div></div>`
@@ -542,10 +542,10 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
}, 50); }, 50);
} }
} }
//update tech text //disable not allowed tech //update tech text
for (let i = 0, len = tech.tech.length; i < len; i++) { for (let i = 0, len = tech.tech.length; i < len; i++) {
const techID = document.getElementById("tech-" + i) const techID = document.getElementById("tech-" + i)
if ((!tech.tech[i].isJunk || localSettings.isJunkExperiment)) { //!tech.tech[i].isNonRefundable && //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! does removing this cause problems???? if ((!tech.tech[i].isJunk || localSettings.isJunkExperiment) && !tech.tech[i].isLore) {
if (tech.tech[i].allowed() || isAllowed || tech.tech[i].count > 0) { if (tech.tech[i].allowed() || isAllowed || tech.tech[i].count > 0) {
if (tech.tech[i].isFieldTech) { if (tech.tech[i].isFieldTech) {
techID.classList.remove('experiment-grid-hide'); techID.classList.remove('experiment-grid-hide');
@@ -559,28 +559,20 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
} else { } else {
techID.innerHTML = build.techText(i) techID.innerHTML = build.techText(i)
} }
//deselect selected tech options if you don't have the tech any more // for example: when bot techs are converted after a bot upgrade tech is taken //deselect selected tech options if you don't have the tech any more // for example: when bot techs are converted after a bot upgrade tech is taken
if (tech.tech[i].count === 0 && techID.classList.contains("build-tech-selected")) techID.classList.remove("build-tech-selected"); if (tech.tech[i].count === 0 && techID.classList.contains("build-tech-selected")) techID.classList.remove("build-tech-selected");
if (techID.classList.contains("experiment-grid-disabled")) { if (techID.classList.contains("experiment-grid-disabled")) {
techID.classList.remove("experiment-grid-disabled"); techID.classList.remove("experiment-grid-disabled");
techID.setAttribute("onClick", `javascript: build.choosePowerUp(${i},'tech')`); techID.setAttribute("onClick", `javascript: build.choosePowerUp(${i},'tech')`);
} }
// } else if (tech.tech[i].isGunTech || tech.tech[i].isFieldTech) { } else { //disabled color for disabled tech
// techID.classList.add('experiment-grid-hide');
} else { //disabled color
// techID.innerHTML = `<div class="grid-title"> ${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>`
// techID.innerHTML = `<div class="grid-title"> ${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>`
techID.innerHTML = `<div class="grid-title">${tech.tech[i].name}</div>${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}</div>` techID.innerHTML = `<div class="grid-title">${tech.tech[i].name}</div>${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}</div>`
// console.log(techID)
if (!techID.classList.contains("experiment-grid-disabled")) { if (!techID.classList.contains("experiment-grid-disabled")) {
techID.classList.add("experiment-grid-disabled"); techID.classList.add("experiment-grid-disabled");
techID.onclick = null techID.onclick = null
} }
if (tech.tech[i].count > 0) tech.removeTech(i) if (tech.tech[i].count > 0) tech.removeTech(i)
if (techID.classList.contains("build-tech-selected")) techID.classList.remove("build-tech-selected"); if (techID.classList.contains("build-tech-selected")) techID.classList.remove("build-tech-selected");
if (tech.tech[i].isFieldTech) { if (tech.tech[i].isFieldTech) {
techID.innerHTML = build.fieldTechText(i) techID.innerHTML = build.fieldTechText(i)
} else if (tech.tech[i].isGunTech) { } else if (tech.tech[i].isGunTech) {
@@ -652,9 +644,8 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
// text += `<div id = "gun-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'gun')"><div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${build.nameLink(b.guns[i].name)}</div> ${b.guns[i].description}</div>` // text += `<div id = "gun-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'gun')"><div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${build.nameLink(b.guns[i].name)}</div> ${b.guns[i].description}</div>`
} }
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].isJunk || localSettings.isJunkExperiment) { if ((!tech.tech[i].isJunk || localSettings.isJunkExperiment) && !tech.tech[i].isLore) {
const style = localSettings.isHideImages ? hideStyle : `style="background-image: url('img/${tech.tech[i].name}.webp');"` const style = (localSettings.isHideImages || tech.tech[i].isJunk) ? hideStyle : `style="background-image: url('img/${tech.tech[i].name}.webp');"`
if (tech.tech[i].allowed() && (!tech.tech[i].isNonRefundable || localSettings.isJunkExperiment)) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment" if (tech.tech[i].allowed() && (!tech.tech[i].isNonRefundable || localSettings.isJunkExperiment)) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment"
text += `<div id="tech-${i}" class="experiment-grid-module card-background" onclick="build.choosePowerUp(${i},'tech')" ${style}>` text += `<div id="tech-${i}" class="experiment-grid-module card-background" onclick="build.choosePowerUp(${i},'tech')" ${style}>`
} else { //disabled } else { //disabled

View File

@@ -21,15 +21,15 @@ const level = {
// level.difficultyIncrease(30 * 4) //30 is near max on hard //60 is near max on why // level.difficultyIncrease(30 * 4) //30 is near max on hard //60 is near max on why
// m.maxHealth = m.health = 100 // m.maxHealth = m.health = 100
// tech.isRerollDamage = true // tech.isRerollDamage = true
// powerUps.research.changeRerolls(5) // powerUps.research.changeRerolls(20)
// m.immuneCycle = Infinity //you can't take damage // m.immuneCycle = Infinity //you can't take damage
// tech.tech[297].frequency = 100 // tech.tech[297].frequency = 100
// m.couplingChange(5) // m.couplingChange(5)
// m.setField("time dilation") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch // m.setField("perfect diamagnetism") //molecular assembler standing wave time dilation perfect diamagnetism metamaterial cloaking wormhole negative mass pilot wave plasma torch
// simulation.molecularMode = 2 // simulation.molecularMode = 2
// m.damage(0.1); // m.damage(0.1);
// b.giveGuns("harpoon") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser // b.giveGuns("nail gun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
// b.giveGuns("wave") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser // b.giveGuns("spores") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
// b.guns[0].ammo = 10000 // b.guns[0].ammo = 10000
// tech.giveTech("alternator") // tech.giveTech("alternator")
// tech.giveTech("posture") // tech.giveTech("posture")
@@ -100,19 +100,6 @@ const level = {
m.resetHistory(); m.resetHistory();
spawn.quantumEraserCheck(); //remove mobs from tech: quantum eraser spawn.quantumEraserCheck(); //remove mobs from tech: quantum eraser
//used for generalist and pigeonhole principle
tech.buffedGun++
if (tech.buffedGun > b.inventory.length - 1) tech.buffedGun = 0;
if (tech.isGunCycle) {
b.inventoryGun = tech.buffedGun;
simulation.switchGun();
}
if (tech.isGunChoice && Number.isInteger(tech.buffedGun) && b.inventory.length) {
var gun = b.guns[b.inventory[tech.buffedGun]].name
simulation.makeTextLog(`pigeonhole principle: <strong>+${(31 * Math.max(0, b.inventory.length)).toFixed(0)}%</strong> <strong class='color-d'>damage</strong> for <strong class="highlight">${gun}</strong>`, 600);
}
if (tech.isForeverDrones) { if (tech.isForeverDrones) {
if (tech.isDroneRadioactive) { if (tech.isDroneRadioactive) {
for (let i = 0; i < tech.isForeverDrones * 0.25; i++) { for (let i = 0; i < tech.isForeverDrones * 0.25; i++) {
@@ -132,29 +119,7 @@ const level = {
} }
} }
} }
if (tech.isExtraMaxEnergy) {
tech.healMaxEnergyBonus += 0.1 * powerUps.totalPowerUps //Math.min(0.02 * powerUps.totalPowerUps, 0.51)
m.setMaxEnergy();
}
if (tech.isSwitchReality) {
simulation.makeTextLog(`simulation.amplitude <span class='color-symbol'>=</span> ${Math.random()}`);
m.switchWorlds()
simulation.trails()
powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "tech", false);
}
if (tech.isHealLowHealth) {
// if (tech.isEnergyHealth) {
// var len = Math.ceil((m.maxEnergy - m.energy) / 0.33)
// } else {
// var len = Math.ceil((m.maxHealth - m.health) / 0.33)
// }
if (tech.isEnergyHealth) {
var len = 3 * (1 - m.energy / m.maxEnergy) //as a percent
} else {
var len = 3 * (1 - m.health / m.maxHealth) //as a percent
}
for (let i = 0; i < len; i++) powerUps.spawn(player.position.x + 90 * (Math.random() - 0.5), player.position.y + 90 * (Math.random() - 0.5), "heal", false);
}
if (tech.isMACHO) spawn.MACHO() if (tech.isMACHO) spawn.MACHO()
for (let i = 0; i < tech.wimpCount; i++) { for (let i = 0; i < tech.wimpCount; i++) {
spawn.WIMP() spawn.WIMP()
@@ -175,15 +140,40 @@ const level = {
m.eyeFillColor = m.fieldMeterColor m.eyeFillColor = m.fieldMeterColor
simulation.makeTextLog(`tech.isFlipFlopOn <span class='color-symbol'>=</span> true`); simulation.makeTextLog(`tech.isFlipFlopOn <span class='color-symbol'>=</span> true`);
} }
if (tech.isSpawnExitTech) {
for (let i = 0; i < 2; i++) powerUps.spawn(level.exit.x + 10 * (Math.random() - 0.5), level.exit.y - 100 + 10 * (Math.random() - 0.5), "tech", false) //exit
}
// if (m.plasmaBall) m.plasmaBall.reset() // if (m.plasmaBall) m.plasmaBall.reset()
if (m.plasmaBall) m.plasmaBall.fire() if (m.plasmaBall) m.plasmaBall.fire()
if (localSettings.entanglement && localSettings.entanglement.levelName === level.levels[level.onLevel]) { if (localSettings.entanglement && localSettings.entanglement.levelName === level.levels[level.onLevel]) {
const flip = localSettings.entanglement.isHorizontalFlipped === simulation.isHorizontalFlipped ? 1 : -1 const flip = localSettings.entanglement.isHorizontalFlipped === simulation.isHorizontalFlipped ? 1 : -1
powerUps.directSpawn(flip * localSettings.entanglement.position.x, localSettings.entanglement.position.y, "entanglement", false); powerUps.directSpawn(flip * localSettings.entanglement.position.x, localSettings.entanglement.position.y, "entanglement", false);
} }
level.newLevelOrPhase()
},
newLevelOrPhase() { //runs on each new level but also on final boss phases
//used for generalist and pigeonhole principle
tech.buffedGun++
if (tech.buffedGun > b.inventory.length - 1) tech.buffedGun = 0;
if (tech.isGunCycle) {
b.inventoryGun = tech.buffedGun;
simulation.switchGun();
}
if (tech.isGunChoice && Number.isInteger(tech.buffedGun) && b.inventory.length) {
var gun = b.guns[b.inventory[tech.buffedGun]].name
simulation.makeTextLog(`pigeonhole principle: <strong>+${(31 * Math.max(0, b.inventory.length)).toFixed(0)}%</strong> <strong class='color-d'>damage</strong> for <strong class="highlight">${gun}</strong>`, 600);
}
if (tech.isSwitchReality) {
simulation.makeTextLog(`simulation.amplitude <span class='color-symbol'>=</span> ${Math.random()}`);
m.switchWorlds()
simulation.trails()
powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "tech", false);
}
if (tech.isHealLowHealth) {
if (tech.isEnergyHealth) {
var len = 3 * (1 - m.energy / m.maxEnergy) //as a percent
} else {
var len = 3 * (1 - m.health / m.maxHealth) //as a percent
}
for (let i = 0; i < len; i++) powerUps.spawn(player.position.x + 90 * (Math.random() - 0.5), player.position.y + 90 * (Math.random() - 0.5), "heal", false);
}
}, },
trainingText(say) { trainingText(say) {
simulation.lastLogTime = 0; //clear previous messages simulation.lastLogTime = 0; //clear previous messages
@@ -3009,7 +2999,7 @@ const level = {
// spawn.starter(1900, -500, 200) //big boy // spawn.starter(1900, -500, 200) //big boy
// for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500) // for (let i = 0; i < 10; ++i) spawn.launcher(1900, -500)
spawn.suckerBoss(1900, -500) // spawn.suckerBoss(1900, -500)
// spawn.launcherBoss(3200, -500) // spawn.launcherBoss(3200, -500)
// spawn.laserTargetingBoss(1700, -500) // spawn.laserTargetingBoss(1700, -500)
// spawn.powerUpBoss(1900, -500) // spawn.powerUpBoss(1900, -500)

View File

@@ -1987,8 +1987,12 @@ const m = {
m.throwBlock(); m.throwBlock();
} else if (input.field) { //not hold but field button is pressed } else if (input.field) { //not hold but field button is pressed
//float while field is on //float while field is on
// console.log(m.angle, Math.abs(m.angle + Math.PI / 2))
//
const angleReduction = 0.1 + (Math.PI / 2 - Math.min(Math.PI / 2, Math.abs(m.angle + Math.PI / 2)))
if (player.velocity.y > 1) { if (player.velocity.y > 1) {
player.force.y -= (tech.isBigField ? 0.87 : 0.7) * player.mass * simulation.g; player.force.y -= angleReduction * (tech.isBigField ? 0.87 : 0.7) * player.mass * simulation.g;
Matter.Body.setVelocity(player, { Matter.Body.setVelocity(player, {
x: player.velocity.x, x: player.velocity.x,
y: 0.98 * player.velocity.y y: 0.98 * player.velocity.y

View File

@@ -322,7 +322,7 @@ const powerUps = {
document.getElementById("choose-grid").style.visibility = "visible" document.getElementById("choose-grid").style.visibility = "visible"
requestAnimationFrame(() => { requestAnimationFrame(() => {
ctx.fillStyle = `rgba(221,221,221,0.6)`; ctx.fillStyle = `rgba(150,150,150,0.6)`; //`rgba(221,221,221,0.6)`;
ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillRect(0, 0, canvas.width, canvas.height);
}); });
// document.getElementById("pause-grid-right").style.opacity = "0.7" // document.getElementById("pause-grid-right").style.opacity = "0.7"
@@ -378,9 +378,6 @@ const powerUps = {
// document.getElementById("choose-grid").style.display = "none" // document.getElementById("choose-grid").style.display = "none"
document.getElementById("choose-grid").style.visibility = "hidden" document.getElementById("choose-grid").style.visibility = "hidden"
document.getElementById("choose-grid").style.opacity = "0" document.getElementById("choose-grid").style.opacity = "0"
// document.getElementById("choose-background").style.display = "none"
document.getElementById("choose-background").style.visibility = "hidden"
document.getElementById("choose-background").style.opacity = "0"
document.body.style.cursor = "none"; document.body.style.cursor = "none";
// document.body.style.overflow = "hidden" // document.body.style.overflow = "hidden"
@@ -623,21 +620,21 @@ const powerUps = {
if (tech.isSuperDeterminism) { if (tech.isSuperDeterminism) {
return `<div></div>` return `<div></div>`
} else if (tech.isCancelTech) { } else if (tech.isCancelTech) {
return `<div class='choose-grid-module' onclick='powerUps.endDraft("${type}",true)' style="width: 115px; text-align: center;font-size: 1.1em;font-weight: 100;justify-self: end;">randomize</div>` return `<div class='choose-grid-module' onclick='powerUps.endDraft("${type}",true)' style="width: 115px; text-align: center;font-size: 1.1em;font-weight: 100;justify-self: end;border: 1px solid #444;">randomize</div>`
} else { } else {
return `<div class='choose-grid-module' onclick='powerUps.endDraft("${type}",true)' style="width: 82px; text-align: center;font-size: 1.1em;font-weight: 100;justify-self: end;">cancel</div>` return `<div class='choose-grid-module' onclick='powerUps.endDraft("${type}",true)' style="width: 82px; text-align: center;font-size: 1.1em;font-weight: 100;justify-self: end;border: 1px solid #444;">cancel</div>`
} }
}, },
researchText(type) { researchText(type) {
let text = "" let text = ""
if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) { if (tech.isJunkResearch && powerUps.research.currentRerollCount < 3) {
text += `<div onclick="powerUps.research.use('${type}')" class='choose-grid-module' style="font-size: 1.1em;font-weight: 100;">` // style = "margin-left: 192px; margin-right: -192px;" text += `<div onclick="powerUps.research.use('${type}')" class='choose-grid-module' style="font-size: 1.1em;font-weight: 100;border: 1px solid #444;">` // style = "margin-left: 192px; margin-right: -192px;"
tech.junkResearchNumber = Math.ceil(4 * Math.random()) tech.junkResearchNumber = Math.ceil(4 * Math.random())
text += `<div><div> <span style="position:relative;">` text += `<div><div> <span style="position:relative;">`
for (let i = 0; i < tech.junkResearchNumber; i++) text += `<div class="circle-grid junk" style="position:absolute; top:0; left:${15*i}px ;opacity:0.8; border: 1px #fff solid;"></div>` for (let i = 0; i < tech.junkResearchNumber; i++) text += `<div class="circle-grid junk" style="position:absolute; top:0; left:${15*i}px ;opacity:0.8; border: 1px #fff solid;"></div>`
text += `</span>&nbsp; <span class='research-select'>pseudoscience</span></div></div></div>` text += `</span>&nbsp; <span class='research-select'>pseudoscience</span></div></div></div>`
} else if (powerUps.research.count > 0) { } else if (powerUps.research.count > 0) {
text += `<div onclick="powerUps.research.use('${type}')" class='choose-grid-module' style="font-size: 1.1em;font-weight: 100;">` // style = "margin-left: 192px; margin-right: -192px;" text += `<div onclick="powerUps.research.use('${type}')" class='choose-grid-module' style="font-size: 1.1em;font-weight: 100;border: 1px solid #444;">` // style = "margin-left: 192px; margin-right: -192px;"
text += `<div><div><span style="position:relative;">` text += `<div><div><span style="position:relative;">`
for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.21)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>` for (let i = 0, len = Math.min(powerUps.research.count, 30); i < len; i++) text += `<div class="circle-grid research" style="position:absolute; top:0; left:${(18 - len*0.21)*i}px ;opacity:0.8; border: 1px #fff solid;"></div>`
text += `</span>&nbsp; <span class='research-select'>${tech.isResearchReality?"<span class='alt'>alternate reality</span>": "research"}</span></div></div></div>` text += `</span>&nbsp; <span class='research-select'>${tech.isResearchReality?"<span class='alt'>alternate reality</span>": "research"}</span></div></div></div>`
@@ -649,7 +646,6 @@ const powerUps = {
hideStyle: `style="height:auto; border: none; background-color: transparent;"`, hideStyle: `style="height:auto; border: none; background-color: transparent;"`,
gunText(choose, click) { gunText(choose, click) {
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/gun/${b.guns[choose].name}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/gun/${b.guns[choose].name}.webp');"`
return `<div class="choose-grid-module card-background" onclick="${click}" ${style}> return `<div class="choose-grid-module card-background" onclick="${click}" ${style}>
<div class="card-text"> <div class="card-text">
<div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${b.guns[choose].name}</div> <div class="grid-title"><div class="circle-grid gun"></div> &nbsp; ${b.guns[choose].name}</div>
@@ -657,16 +653,14 @@ const powerUps = {
}, },
fieldText(choose, click) { fieldText(choose, click) {
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/field/${m.fieldUpgrades[choose].name}${choose === 0 ? Math.floor(Math.random()*10) : ""}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/field/${m.fieldUpgrades[choose].name}${choose === 0 ? Math.floor(Math.random()*10) : ""}.webp');"`
return `<div class="choose-grid-module card-background" onclick="${click}" ${style}> return `<div class="choose-grid-module card-background" onclick="${click}" ${style}>
<div class="card-text"> <div class="card-text">
<div class="grid-title"><div class="circle-grid field"></div> &nbsp; ${m.fieldUpgrades[choose].name}</div> <div class="grid-title"><div class="circle-grid field"></div> &nbsp; ${m.fieldUpgrades[choose].name}</div>
${m.fieldUpgrades[choose].description}</div></div>` ${m.fieldUpgrades[choose].description}</div></div>`
}, },
techText(choose, click) { techText(choose, click) {
const techCountText = tech.tech[choose].count > 1 ? `(${tech.tech[choose].count}x)` : ""; const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"`
return `<div class="choose-grid-module card-background" onclick="${click}" ${style}> return `<div class="choose-grid-module card-background" onclick="${click}" ${style}>
<div class="card-text"> <div class="card-text">
<div class="grid-title"><div class="circle-grid tech"></div> &nbsp; ${tech.tech[choose].name} ${techCountText}</div> <div class="grid-title"><div class="circle-grid tech"></div> &nbsp; ${tech.tech[choose].name} ${techCountText}</div>
@@ -674,9 +668,8 @@ const powerUps = {
}, },
fieldTechText(choose, click) { fieldTechText(choose, click) {
const techCountText = tech.tech[choose].count > 1 ? `(${tech.tech[choose].count}x)` : ""; const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"`
return `<div class="choose-grid-module card-background" onclick="${click}" ${style}> return `<div class="choose-grid-module card-background" onclick="${click}" ${style}>
<div class="card-text"> <div class="card-text">
<div class="grid-title"> <div class="grid-title">
@@ -688,9 +681,8 @@ const powerUps = {
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div></div>` ${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div></div>`
}, },
gunTechText(choose, click) { gunTechText(choose, click) {
const techCountText = tech.tech[choose].count > 1 ? `(${tech.tech[choose].count}x)` : ""; const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"`
return `<div class="choose-grid-module card-background" onclick="${click}" ${style}> return `<div class="choose-grid-module card-background" onclick="${click}" ${style}>
<div class="card-text"> <div class="card-text">
<div class="grid-title"> <div class="grid-title">
@@ -702,28 +694,33 @@ const powerUps = {
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div></div>` ${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div></div>`
}, },
junkTechText(choose, click) { junkTechText(choose, click) {
const techCountText = tech.tech[choose].count > 1 ? `(${tech.tech[choose].count}x)` : ""; 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;"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-size: contain;background-repeat: no-repeat;background-image: url('img/junk.webp');"`
if (!localSettings.isHideImages) { if (!localSettings.isHideImages) {
setTimeout(() => { //pull image from web search if no url setTimeout(() => { //delay so that the html element exists
if (tech.tech[choose].url === undefined) { 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://images.search.yahoo.com/search/images?p=" + tech.tech[choose].name;
fetch(url) fetch(url, { signal: AbortSignal.timeout(1000) }) //give up if it takes over 1 second
.then((response) => response.text()) .then((response) => response.text())
.then((html) => { .then((html) => {
const parser = new DOMParser(); const parser = new DOMParser();
const doc = parser.parseFromString(html, "text/html"); const doc = parser.parseFromString(html, "text/html");
const elements = doc.getElementsByClassName("ld"); const elements = doc.getElementsByClassName("ld");
// console.log(JSON.parse(elements[i].getAttribute("data")).iurl) // console.log(i, elements[i].getAttribute("data"), JSON.parse(elements[i].getAttribute("data")).iurl)
tech.tech[choose].url = 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}')` document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
}
}); });
} else { } else {
document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')` document.getElementById(`junk-${choose}`).style.backgroundImage = `url('${tech.tech[choose].url}')`
} }
}, 100); }, 1);
} }
return `<div id = "junk-${choose}" class="choose-grid-module card-background" onclick="${click}" ${style}> return `<div id = "junk-${choose}" class="choose-grid-module card-background" onclick="${click}" ${style}>
<div class="card-text"> <div class="card-text">
<div class="grid-title"><div class="circle-grid junk"></div> &nbsp; ${tech.tech[choose].name} ${techCountText}</div> <div class="grid-title"><div class="circle-grid junk"></div> &nbsp; ${tech.tech[choose].name} ${techCountText}</div>
@@ -731,7 +728,6 @@ const powerUps = {
}, },
incoherentTechText(choose, click) { incoherentTechText(choose, click) {
// text += `<div class="choose-grid-module" style = "background-color: #efeff5; border: 0px; opacity:0.5; font-size: 60%; line-height: 130%; margin: 1px; padding-top: 6px; padding-bottom: 6px;"><div class="grid-title">${tech.tech[choose].name} <span style = "color: #aaa;font-weight: normal;font-size:80%;">- incoherent</span></div></div>` // text += `<div class="choose-grid-module" style = "background-color: #efeff5; border: 0px; opacity:0.5; font-size: 60%; line-height: 130%; margin: 1px; padding-top: 6px; padding-bottom: 6px;"><div class="grid-title">${tech.tech[choose].name} <span style = "color: #aaa;font-weight: normal;font-size:80%;">- incoherent</span></div></div>`
const techCountText = tech.tech[choose].count > 1 ? `(${tech.tech[choose].count}x)` : "";
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"`
return `<div class="choose-grid-module card-background" ${style}> return `<div class="choose-grid-module card-background" ${style}>
<div class="card-text" style = "background-color: #efeff5;"> <div class="card-text" style = "background-color: #efeff5;">
@@ -801,7 +797,7 @@ const powerUps = {
// const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : ""; // const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
// text += `<div class="choose-grid-module" onclick="powerUps.choose('tech',${choose})"><div class="grid-title"> <span id = "cellular-rule-id${this.id}" style = "font-size: 150%;font-family: 'Courier New', monospace;">⭓▸●■</span> &nbsp; ${tech.tech[choose].name} ${isCount}</div>${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div>` // text += `<div class="choose-grid-module" onclick="powerUps.choose('tech',${choose})"><div class="grid-title"> <span id = "cellular-rule-id${this.id}" style = "font-size: 150%;font-family: 'Courier New', monospace;">⭓▸●■</span> &nbsp; ${tech.tech[choose].name} ${isCount}</div>${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div>`
const choose = botTech[Math.floor(Math.random() * botTech.length)]; const choose = botTech[Math.floor(Math.random() * botTech.length)];
const techCountText = tech.tech[choose].count > 1 ? `(${tech.tech[choose].count}x)` : ""; const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"`
text += `<div class="choose-grid-module card-background" onclick="powerUps.choose('tech',${choose})" ${style}> text += `<div class="choose-grid-module card-background" onclick="powerUps.choose('tech',${choose})" ${style}>
<div class="card-text"> <div class="card-text">
@@ -880,7 +876,7 @@ const powerUps = {
// const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : ""; // const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
// text += `<div class="choose-grid-module" onclick="powerUps.choose('tech',${choose})"><div class="grid-title"> <span id = "cellular-rule-id${this.id}" style = "font-size: 150%;font-family: 'Courier New', monospace;">⭓▸●■</span> &nbsp; ${tech.tech[choose].name} ${isCount}</div>${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div>` // text += `<div class="choose-grid-module" onclick="powerUps.choose('tech',${choose})"><div class="grid-title"> <span id = "cellular-rule-id${this.id}" style = "font-size: 150%;font-family: 'Courier New', monospace;">⭓▸●■</span> &nbsp; ${tech.tech[choose].name} ${isCount}</div>${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div>`
const choose = botTech[Math.floor(Math.random() * botTech.length)]; const choose = botTech[Math.floor(Math.random() * botTech.length)];
const techCountText = tech.tech[choose].count > 1 ? `(${tech.tech[choose].count}x)` : ""; const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"`
text += `<div class="choose-grid-module card-background" onclick="powerUps.choose('tech',${choose})" ${style}> text += `<div class="choose-grid-module card-background" onclick="powerUps.choose('tech',${choose})" ${style}>
<div class="card-text"> <div class="card-text">
@@ -1001,7 +997,7 @@ const powerUps = {
// const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : ""; // const isCount = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
// text += `<div class="choose-grid-module" onclick="powerUps.choose('tech',${choose})"><div class="grid-title"> <span id = "cellular-rule-id${this.id}" style = "font-size: 150%;font-family: 'Courier New', monospace;">⭓▸●■</span> &nbsp; ${tech.tech[choose].name} ${isCount}</div> ${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div>` // text += `<div class="choose-grid-module" onclick="powerUps.choose('tech',${choose})"><div class="grid-title"> <span id = "cellular-rule-id${this.id}" style = "font-size: 150%;font-family: 'Courier New', monospace;">⭓▸●■</span> &nbsp; ${tech.tech[choose].name} ${isCount}</div> ${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div>`
const choose = botTech[Math.floor(Math.random() * botTech.length)]; const choose = botTech[Math.floor(Math.random() * botTech.length)];
const techCountText = tech.tech[choose].count > 1 ? `(${tech.tech[choose].count}x)` : ""; const techCountText = tech.tech[choose].count > 0 ? `(${tech.tech[choose].count+1}x)` : "";
const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"` const style = localSettings.isHideImages ? powerUps.hideStyle : `style="background-image: url('img/${tech.tech[choose].name}.webp');"`
text += `<div class="choose-grid-module card-background" onclick="powerUps.choose('tech',${choose})" ${style}> text += `<div class="choose-grid-module card-background" onclick="powerUps.choose('tech',${choose})" ${style}>
<div class="card-text"> <div class="card-text">

View File

@@ -619,11 +619,8 @@ const simulation = {
document.getElementById("splash").onclick = function() { document.getElementById("splash").onclick = function() {
simulation.startGame(); simulation.startGame();
}; };
// document.getElementById("choose-grid").style.display = "none"
document.getElementById("choose-grid").style.visibility = "hidden" document.getElementById("choose-grid").style.visibility = "hidden"
document.getElementById("choose-grid").style.opacity = "0" document.getElementById("choose-grid").style.opacity = "0"
document.getElementById("choose-background").style.visibility = "hidden"
document.getElementById("choose-background").style.opacity = "0"
document.getElementById("info").style.display = "inline"; document.getElementById("info").style.display = "inline";
document.getElementById("info").style.opacity = "0"; document.getElementById("info").style.opacity = "0";
document.getElementById("experiment-button").style.display = "inline" document.getElementById("experiment-button").style.display = "inline"

View File

@@ -397,6 +397,8 @@ const spawn = {
//spawn 6 mobs //spawn 6 mobs
me.mobType = spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)]; //fire a bullet from each vertex me.mobType = spawn.fullPickList[Math.floor(Math.random() * spawn.fullPickList.length)]; //fire a bullet from each vertex
for (let i = 0; i < 6; i++) me.spawnMobs(i) for (let i = 0; i < 6; i++) me.spawnMobs(i)
level.newLevelOrPhase() //run some new level tech effects
} }
ctx.beginPath(); //draw invulnerable ctx.beginPath(); //draw invulnerable
let vertices = this.vertices; let vertices = this.vertices;
@@ -499,13 +501,12 @@ const spawn = {
{ {
name: "mines", name: "mines",
bombCycle: 0, bombCycle: 0,
bombInterval: 55 - 2 * simulation.difficultyMode, bombInterval: 10 - simulation.difficultyMode,
do() { do() {
const yOff = 120 const yOff = 120
this.bombCycle++ this.bombCycle++
if (!(this.bombCycle % this.bombInterval) && (this.bombCycle & 60) > 30) { //mines above player if (!(this.bombCycle % this.bombInterval) && (this.bombCycle % 660) > 330) { //mines above player
if (simulation.isHorizontalFlipped) { if (simulation.isHorizontalFlipped) {
if (this.bombCycle > 120) { //wait 2 seconds before targeted mines drop
const x = m.pos.x + 200 * (Math.random() - 0.5) const x = m.pos.x + 200 * (Math.random() - 0.5)
if (x > -750) { //mines above player IN tunnel if (x > -750) { //mines above player IN tunnel
spawn.mine(Math.min(Math.max(-730, x), 100), -450 - yOff * Math.random()) //player in main room spawn.mine(Math.min(Math.max(-730, x), 100), -450 - yOff * Math.random()) //player in main room
@@ -514,13 +515,11 @@ const spawn = {
spawn.mine(Math.min(Math.max(-5375, x), -765), -1500 - yOff * Math.random()) //player in tunnel spawn.mine(Math.min(Math.max(-5375, x), -765), -1500 - yOff * Math.random()) //player in tunnel
mob[mob.length - 1].fallHeight = -9 mob[mob.length - 1].fallHeight = -9
} }
}
if (Math.random() < 0.5) { if (Math.random() < 0.5) {
spawn.mine(-5350 + 4550 * Math.random(), -1500 - yOff * Math.random()) //random mines spawn.mine(-5350 + 4550 * Math.random(), -1500 - yOff * Math.random()) //random mines
mob[mob.length - 1].fallHeight = -9 mob[mob.length - 1].fallHeight = -9
} }
} else { } else {
if (this.bombCycle > 120) { //wait 2 seconds before targeted mines drop
const x = m.pos.x + 200 * (Math.random() - 0.5) const x = m.pos.x + 200 * (Math.random() - 0.5)
if (x < 750) { //mines above player IN tunnel if (x < 750) { //mines above player IN tunnel
spawn.mine(Math.min(Math.max(-100, x), 735), -450 - yOff * Math.random()) //player in main room spawn.mine(Math.min(Math.max(-100, x), 735), -450 - yOff * Math.random()) //player in main room
@@ -529,7 +528,6 @@ const spawn = {
spawn.mine(Math.min(Math.max(760, x), 5375), -1500 - yOff * Math.random()) //player in tunnel spawn.mine(Math.min(Math.max(760, x), 5375), -1500 - yOff * Math.random()) //player in tunnel
mob[mob.length - 1].fallHeight = -9 mob[mob.length - 1].fallHeight = -9
} }
}
if (Math.random() < 0.5) { //random mines, but not in tunnel if (Math.random() < 0.5) { //random mines, but not in tunnel
spawn.mine(800 + 4550 * Math.random(), -1500 - yOff * Math.random()) //random mines spawn.mine(800 + 4550 * Math.random(), -1500 - yOff * Math.random()) //random mines
mob[mob.length - 1].fallHeight = -9 mob[mob.length - 1].fallHeight = -9
@@ -561,12 +559,17 @@ const spawn = {
}, },
{ {
name: "orbiters", name: "orbiters",
spawnRate: 42 - 2 * simulation.difficultyMode, spawnRate: Math.ceil(4 - 0.25 * simulation.difficultyMode),
orbitersCycle: 0,
do() { do() {
if (!(me.cycle % this.spawnRate) && mob.length < me.maxMobs) { this.orbitersCycle++
if (!(this.orbitersCycle % this.spawnRate) && (this.orbitersCycle % 660) > 600 && mob.length < me.maxMobs) {
const speed = (0.01 + 0.0005 * simulation.difficultyMode) * ((Math.random() < 0.5) ? 0.85 : -1.15) const speed = (0.01 + 0.0005 * simulation.difficultyMode) * ((Math.random() < 0.5) ? 0.85 : -1.15)
const phase = 0 //Math.floor(2 * Math.random()) * Math.PI const phase = 0 //Math.floor(2 * Math.random()) * Math.PI
me.orbitalNoVelocity(me, 360 + 2150 * Math.random(), 0.1 * Math.random() + phase, speed) // orbital(who, radius, phase, speed) //find distance to play and set orbs at that range
const dist = me.distanceToPlayer()
//360 + 2150 * Math.random()
me.orbitalNoVelocity(me, dist + 900 * (Math.random() - 0.5), 0.1 * Math.random() + phase, speed) // orbital(who, radius, phase, speed)
} }
}, },
enter() {}, enter() {},
@@ -706,6 +709,7 @@ const spawn = {
this.damageReductionDecay(); this.damageReductionDecay();
for (let i = 0; i < this.totalModes; i++) this.mode[i].do() for (let i = 0; i < this.totalModes; i++) this.mode[i].do()
} }
// this.mode[5].do() //deelete this
// this.cycle++; // this.cycle++;
// this.mode[4].do() // this.mode[4].do()
// this.mode[7].do() // this.mode[7].do()
@@ -1537,16 +1541,18 @@ const spawn = {
zombie(x, y, radius, sides, color) { //mob that attacks other mobs zombie(x, y, radius, sides, color) { //mob that attacks other mobs
mobs.spawn(x, y, sides, radius, color); mobs.spawn(x, y, sides, radius, color);
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.damageReduction = 0.5 //take less damage
// Matter.Body.setDensity(me, 0.0005) // normal density is 0.001 // this reduces life by half and decreases knockback
me.isZombie = true me.isZombie = true
me.isBadTarget = true;
me.isDropPowerUp = false; me.isDropPowerUp = false;
me.showHealthBar = false; me.showHealthBar = false;
me.stroke = "#83a" me.stroke = "#83a"
me.accelMag = 0.0015 me.accelMag = 0.0015
me.frictionAir = 0.01 me.frictionAir = 0.01
// me.repulsionRange = 400000 + radius * radius; //squared // me.collisionFilter.mask = cat.player | cat.map | cat.body
// me.memory = 120; // me.memory = 120;
me.seeAtDistance2 = 1000000 //1000 vision range me.seeAtDistance2 = 1000000 //1000 vision range
// Matter.Body.setDensity(me, 0.0005) // normal density is 0.001 // this reduces life by half and decreases knockback
me.do = function() { me.do = function() {
this.zombieHealthBar(); this.zombieHealthBar();
this.lookForMobTargets(); this.lookForMobTargets();
@@ -1556,15 +1562,31 @@ const spawn = {
me.mobSearchIndex = 0; me.mobSearchIndex = 0;
me.target = null me.target = null
me.lookForMobTargets = function() { me.lookForMobTargets = function() {
if (this.target && !this.target.alive) this.target = null if (!(simulation.cycle % 10)) {
if (this.target === null && !(simulation.cycle % 10) && mob.length > 1) { //if you have no target if (this.target === null) { //if you have no target
this.mobSearchIndex++ //look for a different mob index every time this.mobSearchIndex++ //look for a different mob index every time
if (this.mobSearchIndex > mob.length - 1) this.mobSearchIndex = 0 if (this.mobSearchIndex > mob.length - 1) this.mobSearchIndex = 0
if ( if (
mob.length > 1 &&
!mob[this.mobSearchIndex].isZombie && !mob[this.mobSearchIndex].isZombie &&
(Vector.magnitudeSquared(Vector.sub(this.position, mob[this.mobSearchIndex].position)) < this.seeAtDistance2 || Matter.Query.ray(map, this.position, mob[this.mobSearchIndex].position).length === 0) (Vector.magnitudeSquared(Vector.sub(this.position, mob[this.mobSearchIndex].position)) < this.seeAtDistance2 && Matter.Query.ray(map, this.position, mob[this.mobSearchIndex].position).length === 0)
) { ) {
this.target = mob[this.mobSearchIndex] this.target = mob[this.mobSearchIndex]
} else if (Math.random() < 0.05 && (Vector.magnitudeSquared(Vector.sub(this.position, player.position)) < this.seeAtDistance2 || Matter.Query.ray(map, this.position, player.position).length === 0)) {
this.target = player
this.isBadTarget = false;
}
}
}
//chance to forget target
if (!(simulation.cycle % this.memory) && this.target) {
if (
(this.target && this.target !== player && !this.target.alive) ||
Vector.magnitudeSquared(Vector.sub(this.position, this.target.position)) > this.seeAtDistance2 ||
Matter.Query.ray(map, this.position, this.target.position).length !== 0
) {
if (this.target === player) this.isBadTarget = true
this.target = null
} }
} }
} }
@@ -1600,13 +1622,11 @@ const spawn = {
const force = Vector.mult(Vector.normalise(Vector.sub(who.position, this.position)), 0.03 * this.mass) const force = Vector.mult(Vector.normalise(Vector.sub(who.position, this.position)), 0.03 * this.mass)
this.force.x -= force.x; this.force.x -= force.x;
this.force.y -= force.y; this.force.y -= force.y;
this.target = null //look for a new target this.target = null //look for a new target
const dmg = 0.3 * m.dmgScale const dmg = 0.3 * m.dmgScale
who.damage(dmg); who.damage(dmg);
who.locatePlayer();
simulation.drawList.push({ simulation.drawList.push({
x: this.position.x, x: this.position.x,
y: this.position.y, y: this.position.y,

View File

@@ -2408,42 +2408,6 @@ const tech = {
} }
} }
}, },
// {
// name: "weak interaction",
// description: "for each unused <strong>power up</strong> at the end of a <strong>level</strong><br><strong>+10</strong> maximum <strong class='color-f'>energy</strong>", // <em>(up to 51 health per level)</em>",
// maxCount: 1,
// count: 0,
// frequency: 1,
// frequencyDefault: 1,
// allowed() {
// return !tech.isDroneGrab
// },
// requires: "not delivery drone",
// effect() {
// tech.isExtraMaxEnergy = true; //tracked by tech.extraMaxHealth
// },
// remove() {
// tech.isExtraMaxEnergy = false;
// }
// },
// {
// name: "electroweak interaction",
// description: "unused <strong>power ups</strong> at the end of a <strong>level</strong><br>are still activated <em>(selections are random)</em>",
// maxCount: 1,
// count: 0,
// frequency: 2,
// frequencyDefault: 2,
// allowed() {
// return tech.isExtraMaxEnergy
// },
// requires: "weak interaction",
// effect() {
// tech.isEndLevelPowerUp = true;
// },
// remove() {
// tech.isEndLevelPowerUp = false;
// }
// },
{ {
name: "electronegativity", name: "electronegativity",
descriptionFunction() { descriptionFunction() {
@@ -8421,7 +8385,7 @@ const tech = {
const loop = () => { const loop = () => {
if ((simulation.isChoosing) && m.alive && !build.isExperimentSelection) { if ((simulation.isChoosing) && m.alive && !build.isExperimentSelection) {
const dmg = Math.floor(33 * Math.random()) * 0.01 const dmg = Math.floor(33 * Math.random()) * 0.01
this.text = `<strong style = "font-family: 'Courier New', monospace;">+${(dmg*100).toFixed(0).padStart(2, '0')}%</strong> <strong class='color-d'>damage</strong>` this.text = `<strong style = "font-family: 'Courier New', monospace;">+${(dmg*100).toFixed(0).padStart(2, '0')}%</strong> <strong class='color-d'>damage</strong><br>&nbsp;`
this.damage = 1 + dmg this.damage = 1 + dmg
if (document.getElementById(`damage-JUNK-id${this.id}`)) document.getElementById(`damage-JUNK-id${this.id}`).innerHTML = this.text if (document.getElementById(`damage-JUNK-id${this.id}`)) document.getElementById(`damage-JUNK-id${this.id}`).innerHTML = this.text
setTimeout(() => { setTimeout(() => {
@@ -8548,7 +8512,7 @@ const tech = {
}, },
{ {
name: "meteor shower", name: "meteor shower",
description: "take a shower, but meteors instead of water", description: "take a shower, but meteors instead of water<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8694,7 +8658,7 @@ const tech = {
// }, // },
{ {
name: "discount", name: "discount",
description: "get 3 random <strong class='color-j'>JUNK</strong><strong class='color-m'>tech</strong> for the price of 1!", description: "get 3 random <strong class='color-j'>JUNK</strong><strong class='color-m'>tech</strong> for the price of 1!<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8763,7 +8727,7 @@ const tech = {
}, },
{ {
name: "harvest", name: "harvest",
description: "convert all the mobs on this level into <strong class='color-ammo'>ammo</strong>", description: "convert all the mobs on this level into <strong class='color-ammo'>ammo</strong><br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8788,19 +8752,6 @@ const tech = {
}, },
remove() {} remove() {}
}, },
{
name: "&nbsp;",
description: "",
maxCount: 1,
count: 0,
frequency: 0,
frequencyDefault: 0,
isJunk: true,
allowed: () => true,
requires: "",
effect() {},
remove() {}
},
{ {
name: "brainstorm", name: "brainstorm",
description: "the <strong class='color-m'>tech</strong> choice menu <strong>randomizes</strong><br>every <strong>0.5</strong> seconds for <strong>10</strong> seconds", description: "the <strong class='color-m'>tech</strong> choice menu <strong>randomizes</strong><br>every <strong>0.5</strong> seconds for <strong>10</strong> seconds",
@@ -8843,7 +8794,7 @@ const tech = {
}, },
{ {
name: "palantír", name: "palantír",
description: `see far away lands`, description: `see far away lands<br>&nbsp;`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8874,7 +8825,7 @@ const tech = {
}, },
{ {
name: "motion sickness", name: "motion sickness",
description: `disable camera smoothing`, description: `disable camera smoothing<br>&nbsp;`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8907,7 +8858,7 @@ const tech = {
}, },
{ {
name: "facsimile", name: "facsimile",
description: `inserts a copy of your current level into the level list`, description: `inserts a copy of your current level into the level list<br>&nbsp;`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8943,7 +8894,7 @@ const tech = {
}, },
{ {
name: "bounce", name: "bounce",
description: "you bounce off things. It's annoying, but not that bad.", description: "you bounce off things. It's annoying, but not that bad.<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -8961,7 +8912,7 @@ const tech = {
}, },
{ {
name: "mouth", name: "mouth",
description: "mobs have a non functional mouth", description: "mobs have a non functional mouth<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9007,7 +8958,7 @@ const tech = {
}, },
{ {
name: "all-stars", name: "all-stars",
description: "make all mobs look like stars", description: "make all mobs look like stars<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9068,7 +9019,7 @@ const tech = {
// }, // },
{ {
name: "true colors", name: "true colors",
description: `set all power ups to their real world colors`, description: `set all power ups to their real world colors<br>&nbsp;`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9283,7 +9234,7 @@ const tech = {
}, },
{ {
name: "not a bug", name: "not a bug",
description: "initiate a totally safe game crash for 10 seconds", description: "initiate a totally safe game crash for 10 seconds<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9310,7 +9261,7 @@ const tech = {
}, },
{ {
name: "spinor", name: "spinor",
description: "the direction you aim is determined by your position", description: "the direction you aim is determined by your position<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9339,7 +9290,7 @@ const tech = {
}, },
{ {
name: "decomposers", name: "decomposers",
description: "after they die <strong>mobs</strong> leave behind <strong>spawns</strong>", description: "after they die <strong>mobs</strong> leave behind <strong>spawns</strong><br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9358,7 +9309,7 @@ const tech = {
}, },
{ {
name: "panopticon", name: "panopticon",
description: "<strong>mobs</strong> can always see you", description: "<strong>mobs</strong> can always see you<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9482,7 +9433,7 @@ const tech = {
}, },
{ {
name: "encryption", name: "encryption",
description: "secure <strong class='color-m'>tech</strong> information", description: "secure <strong class='color-m'>tech</strong> information<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9532,7 +9483,7 @@ const tech = {
}, },
{ {
name: "score", name: "score",
description: "Add a score to n-gon!", description: "Add a score to n-gon!<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9571,7 +9522,7 @@ const tech = {
}, },
{ {
name: "music", name: "music",
description: "add music to n-gon", description: "add music to n-gon<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9588,7 +9539,7 @@ const tech = {
}, },
{ {
name: "performance", name: "performance",
description: "display performance stats to n-gon", description: "display performance stats to n-gon<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9644,7 +9595,7 @@ const tech = {
}, },
{ {
name: "defragment", name: "defragment",
description: "set the <strong class='flicker'>frequency</strong> of finding <strong class='color-j'>JUNK</strong><strong class='color-m'>tech</strong> to zero", description: "set the <strong class='flicker'>frequency</strong> of finding <strong class='color-j'>JUNK</strong><strong class='color-m'>tech</strong> to zero<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9684,7 +9635,7 @@ const tech = {
// }, // },
{ {
name: "pitch", name: "pitch",
description: "oscillate the pitch of your world", description: "oscillate the pitch of your world<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9721,7 +9672,7 @@ const tech = {
}, },
{ {
name: "lighter", name: "lighter",
description: `ctx.globalCompositeOperation = "lighter"`, description: `ctx.globalCompositeOperation = "lighter"<br>&nbsp;`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9738,7 +9689,7 @@ const tech = {
}, },
{ {
name: "rewind", name: "rewind",
description: "every 10 seconds <strong class='color-rewind'>rewind</strong> <strong>2</strong> seconds", description: "every 10 seconds <strong class='color-rewind'>rewind</strong> <strong>2</strong> seconds<br>&nbsp;",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9761,7 +9712,7 @@ const tech = {
}, },
{ {
name: "undo", name: "undo",
description: "every 4 seconds <strong class='color-rewind'>rewind</strong> <strong>1/2</strong> a second", description: "every 4 seconds <strong class='color-rewind'>rewind</strong> <strong>1/2</strong> a second<br>&nbsp;",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9781,7 +9732,7 @@ const tech = {
}, },
{ {
name: "energy to mass conversion", name: "energy to mass conversion",
description: "convert your <strong class='color-f'>energy</strong> into <strong class='color-block'>blocks</strong>", description: "convert your <strong class='color-f'>energy</strong> into <strong class='color-block'>blocks</strong><br>&nbsp;",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9813,7 +9764,7 @@ const tech = {
}, },
{ {
name: "level.nextLevel()", name: "level.nextLevel()",
description: "advance to the next level", description: "advance to the next level<br>&nbsp;",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9899,7 +9850,7 @@ const tech = {
}, },
{ {
name: "missile launching system", name: "missile launching system",
description: "fire missiles for the next 120 seconds", description: "fire missiles for the next 120 seconds<br>&nbsp;",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9924,7 +9875,7 @@ const tech = {
}, },
{ {
name: "grenade production", name: "grenade production",
description: "drop a grenade every 2 seconds", description: "drop a grenade every 2 seconds<br>&nbsp;",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -9977,7 +9928,7 @@ const tech = {
// }, // },
{ {
name: "Sleipnir", name: "Sleipnir",
description: "grow more legs", description: "grow more legs<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10064,7 +10015,7 @@ const tech = {
}, },
{ {
name: "🐱", name: "🐱",
description: "🐈", description: "🐈<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10164,7 +10115,7 @@ const tech = {
}, },
{ {
name: "posture", name: "posture",
description: "stand a bit taller", description: "stand a bit taller<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10183,7 +10134,7 @@ const tech = {
}, },
{ {
name: "rhythm", name: "rhythm",
description: "you oscillate up and down", description: "you oscillate up and down<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10204,7 +10155,7 @@ const tech = {
}, },
{ {
name: "pareidolia", name: "pareidolia",
description: "don't", description: "don't<br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10273,7 +10224,7 @@ const tech = {
}, },
{ {
name: "prism", name: "prism",
description: "you cycle through different <strong>colors</strong>", description: "you cycle through different <strong>colors</strong><br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10427,7 +10378,7 @@ const tech = {
}, },
{ {
name: "growth hacking", name: "growth hacking",
description: "increase combat <strong>difficulty</strong> by <strong>1 level</strong>", description: "increase combat <strong>difficulty</strong> by <strong>1 level</strong><br>&nbsp;",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10444,7 +10395,7 @@ const tech = {
}, },
{ {
name: "stun", name: "stun",
description: "<strong>stun</strong> all mobs for up to <strong>8</strong> seconds", description: "<strong>stun</strong> all mobs for up to <strong>8</strong> seconds<br>&nbsp;",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10489,7 +10440,7 @@ const tech = {
}, },
{ {
name: "re-research", name: "re-research",
description: `<strong>eject</strong> all your ${powerUps.orb.research(1)}`, description: `<strong>eject</strong> all your ${powerUps.orb.research(1)}<br>&nbsp;`,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -10527,7 +10478,7 @@ const tech = {
}, },
{ {
name: "black hole cluster", name: "black hole cluster",
description: `spawn <strong>30</strong> nearby <strong>black holes</strong>`, description: `spawn <strong>30</strong> nearby <strong>black holes</strong><br>&nbsp;`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 0, frequency: 0,
@@ -11056,7 +11007,6 @@ const tech = {
fastTime: null, fastTime: null,
squirrelJump: null, squirrelJump: null,
isFastRadiation: null, isFastRadiation: null,
isExtraMaxEnergy: null,
isAmmoForGun: null, isAmmoForGun: null,
isRapidPulse: null, isRapidPulse: null,
isSporeFreeze: null, isSporeFreeze: null,
@@ -11239,7 +11189,6 @@ const tech = {
isHarpoonPowerUp: null, isHarpoonPowerUp: null,
harpoonDensity: null, harpoonDensity: null,
isAddRemoveMaxHealth: null, isAddRemoveMaxHealth: null,
isSpawnExitTech: null,
cloakDuplication: null, cloakDuplication: null,
extruderRange: null, extruderRange: null,
isForeverDrones: null, isForeverDrones: null,
@@ -11250,11 +11199,9 @@ const tech = {
isFreeWormHole: null, isFreeWormHole: null,
isRewindField: null, isRewindField: null,
isCrouchRegen: null, isCrouchRegen: null,
// OccamDamage: null,
isAxion: null, isAxion: null,
isWormholeMapIgnore: null, isWormholeMapIgnore: null,
isLessDamageReduction: null, isLessDamageReduction: null,
// bulletSize: null,
needleTunnel: null, needleTunnel: null,
isBrainstorm: null, isBrainstorm: null,
isBrainstormActive: null, isBrainstormActive: null,

View File

@@ -6,8 +6,6 @@ body {
font-family: "Helvetica", "Arial", sans-serif; font-family: "Helvetica", "Arial", sans-serif;
margin: 0; margin: 0;
overflow: hidden; overflow: hidden;
/* background-color: #eee; */
cursor: auto; cursor: auto;
} }
@@ -23,9 +21,6 @@ select {
font-size: 0.8em; font-size: 0.8em;
border: 1px #333 solid; border: 1px #333 solid;
border-radius: 6px; border-radius: 6px;
/* margin-bottom: -20px; */
/* position: "relative";
top: "-15px"; */
} }
select option { select option {
@@ -33,13 +28,10 @@ select option {
} }
input { input {
/* font-family: Monaco, monospace; */
padding: 0px 4px; padding: 0px 4px;
font-size: 0.8em; font-size: 0.8em;
border: 1px #333 solid; border: 1px #333 solid;
border-radius: 4px; border-radius: 4px;
/* margin: 0.2em; */
/* width: 38px; */
} }
a { a {
@@ -68,9 +60,7 @@ em {
table { table {
border-collapse: collapse; border-collapse: collapse;
/* border: 1px solid #eee; */
width: 360px; width: 360px;
/* background-color: #ddd; */
} }
tr { tr {
@@ -142,16 +132,10 @@ summary {
#training-button { #training-button {
position: absolute; position: absolute;
/* bottom: 4px; */
/* right: 0px;
left: 0px;
margin: auto; */
/* bottom: 58px; */
top: 4px; top: 4px;
right: 4px; right: 4px;
z-index: 12; z-index: 12;
transition: opacity 5s ease-in; transition: opacity 5s ease-in;
} }
#construct { #construct {
@@ -170,19 +154,6 @@ summary {
border: 1px #333 solid; border: 1px #333 solid;
} }
#choose-background {
position: absolute;
z-index: 2;
width: 100%;
height: 100%;
background-color: #ccc;
/* opacity: 0.6; */
/* display: none; */
visibility: hidden;
opacity: 0;
transition: opacity 0.25s linear;
}
#flex-center{ #flex-center{
display: flex; display: flex;
align-items: center; align-items: center;
@@ -384,11 +355,12 @@ summary {
.card-text { .card-text {
background-color: rgba(255,255,255,1); background-color: rgba(255,255,255,1);
/* border-radius: 8px; */ /* border-radius: 8px; */
padding: 8px; padding: 11px 13px;
/* border-top: 1px solid var(--build-bg-color); */ /* border-top: 1px solid var(--build-bg-color); */
border: 1px solid #444; border: 1px solid #444;
margin-top: -1px; margin-top: -1px;
margin-right: -1px; margin-right: -1px;
font-size: 0.92em;
} }
/* .no-image-cards{ /* .no-image-cards{

185
todo.txt
View File

@@ -1,29 +1,40 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
added images to tech, field, gun cards (enable this in settings) card font is 10% smaller with a bit more padding on the edges
in progress - not all images are generated yet background is darker on power up selection
images are generated by me using midJourney plus significant post processing css border added to research and cancel buttons
JUNK images now timeout if you don't download the image in under 1 sec
and it will not even try to download an image above 500KB
and it will try a different random image if it's first attempt is too big
(gotta protect our friends with slow internet)
random research power ups are 20% more common per level finalBoss
global difficulty balance: player takes a bit less damage mine mode comes in waves
mutualism: 0.5->1 borrowed health for 250->300% more spore damage orbiters mode comes in waves, and they spawn at a radius that intersects the player
harpoon can still fire when out of energy, but slower several on new level tech effects now also run on each new final Boss phase
harpoon fire cooldown no longer triggers when the harpoon returns gun stuff, many worlds, negative entropy heal spawns
it's just a flat 2/3 of a second after you Fire
improved fire rate now allows you to fire many harpoons at once until you run out of energy
default harpoon rope is a bit longer
several bug fixes and undocumented changes I forgot to list perfect diamagnetism slow fall is much strong, but works better when angled like a parachute
*********************************************************** TODO ***************************************************** *********************************************************** TODO *****************************************************
maybe harpoon should start with less ammo?
tech: p-zombie - sporangium infect mobs, making them fight for you
zombies should attack player if there are no mob targets
name: cordyceps, zombie, p-zombie?
infected mobs get a status debuff. when they die they return as zombie mob type
zombie mobs run code similar to drones
they inherit color, sides, radius from host
tech super balls - super ball can damage you, but it does more damage to mobs
set media rules for smaller screens set media rules for smaller screens
smaller card size smaller card size
set font to 0.8em
tech super balls - super ball can damage you set card width to 384*0.8
and set background images to fit
add to todo: make it so each phase of the final boss works like a new level (call new level code on each new phase)
bug reactor boss + harpoon foam production seems to make too much foam bug reactor boss + harpoon foam production seems to make too much foam
@@ -36,73 +47,6 @@ physics notes: add link to double slit content
seekers after taking damage if seekers are below 1/2 life they teleport to a random point on the player history and sneak attack again seekers after taking damage if seekers are below 1/2 life they teleport to a random point on the player history and sneak attack again
make sure they don't teleport on top of the player make sure they don't teleport on top of the player
card images
process: discord midjourney prompts -> "pixelmator pro" -> adjust color, repair, scale to 384x256, export PNG -> webP? -> place in /img folder
make n-gon a progressive web app to manage image downloads, cache
wave function collapse opens the pause menu after it triggers alternate reality
this is actually good, maybe reuse this code to get pause menu to open at any time
if pause is pressed while selecting power ups, display pause menu on top of selection menu
***styles***
try --- Pastel drawing, Psychedelic art, Arabesque (cool patterns), knolling (everything spread out and placed on a flat mat)
try taking screen shots of fields graphics and feeding them into midJourney V4
technology stuff --- Dan Matutina (cute complex technology),
Katsuhiro Otomo (intricate space technology), Tsutomu Nihei (black and white detailed future tech)
infographics of all know multiverses. 1980s Japanese graphic design, dimensional astrolabe,
Japanese poster graphics, Ralph McQuarrie (looks like star wars), Simon Stålenhag (retro-futuristic), Yoshiyuki Tomino (detailed anime future technology)
isometric: low-poly, box cutout, made in blender, Materials: matte clay
subtractive sculpture
kinetic sculpture
quantum stuff -- Hypertorus, Glowing Opal Pearlescent, Physics, Hydro-Dipping Hydrodipped, Vija Celmins, Matt Molloy (photo of golden waves in the sky)
***major themes missing***
***maybe redo***
dynamical systems
harpoon gun
nail-bot
homeostasis
***past style themes***
field emitter - isometric, clean white robot spherical gun turret on bird legs, blender 3d, style of artstation and behance, Disney Pixar, cute
standing wave - concentric transparent blue geometric circles science
perfect diamagnetism - physics magnetic field chalk diagram
time dilation - graphic of a hyperbolic equation Luminogram
negative mass - Blacklight painting by Moebius
plasma torch - by Dan Mumford
metamaterial cloaking - Scientific photography by Miki Asai
molecular assembler - by Laurie Greasley 16-bit Isometric
wormhole - by Tim White
nail gun - Screenprint
shotgun - blueprint by Dan McPharlin
grenades, missiles, explosions - by Victo Ngai
spores - by Ernst Haeckel
drones - tilt-shift photography
super balls - By Akari Toriyama
wave - sound wave oscilloscope by Paul Catherall, concentric circles by Paul Catherall
foam - black blobs Ink doodle
harpoon - by Eiichiro Oda
mine - by Dan McPharlin
laser - complex optical scientific equipment
guns, ammo - isometric clean pixel art image cutaway of , style of tekkonkinkreet
defensive - Paper cutout
bots - hovering drone by Laurie Greasley 16-bit Isometric
generic energy tech - by Laurie Greasley
duplication, cancel - by Kazumasa Nagai
anti-shear topology, fracture analysis, shear stress - Chemigram
ON/OFF - ASCII art
block throwing - Bauhaus style
tech that adds JUNK - by Choi Jeong-hwa
ice IX - microscope images of ice crystals
tech that spawns health - glowing green balls by Enki Bilal
invulnerable - by Nick Veasey (photos that look like x-rays)
alternate reality - Fractal art
tech choice - mandala tile Mosaic
tech that spawns heal power ups - green Quilling
time, CPT, pause - by Lee Bontecou
boost, coupling power ups tech - cyan electron orbiting a black nucleus electric field as bas-relief //(by Kazumasa Nagai)
radioactive - volumetric atomic nucleus diagram by Paul Catherall
tech: railgun area damage effect, but for all harpoon mode tech: railgun area damage effect, but for all harpoon mode
laser momentum pushed back on player? laser momentum pushed back on player?
@@ -111,14 +55,6 @@ laser momentum pushed back on player?
JUNK - overwrite mob draw function so mobs only draw if they can connect a ray from player to mob JUNK - overwrite mob draw function so mobs only draw if they can connect a ray from player to mob
gonna cause lag? gonna cause lag?
tech: p-zombie - sporangium infect mobs, making them fight for you
zombies should attack player if there are no mob targets
name: cordyceps, zombie, p-zombie?
infected mobs get a status debuff. when they die they return as zombie mob type
zombie mobs run code similar to drones
they inherit color, sides, radius from host
mob status effect - vulnerability mob status effect - vulnerability
mobs take 4x damage for __ time mobs take 4x damage for __ time
afterwards mobs go back to normal damage taken afterwards mobs go back to normal damage taken
@@ -1214,6 +1150,73 @@ possible names for tech
https://en.wikipedia.org/wiki/Cosmic_censorship_hypothesis - black holes can't leak https://en.wikipedia.org/wiki/Cosmic_censorship_hypothesis - black holes can't leak
Alcubierre warp drive (FTL with negative mass) Alcubierre warp drive (FTL with negative mass)
******************************************************** CARS IMAGES ********************************************************
process: discord midjourney prompts -> "pixelmator pro" -> adjust color, repair, scale to 384x256, export PNG -> webP? -> place in /img folder
make n-gon a progressive web app to manage image downloads, cache
wave function collapse opens the pause menu after it triggers alternate reality
this is actually good, maybe reuse this code to get pause menu to open at any time
if pause is pressed while selecting power ups, display pause menu on top of selection menu
***styles***
try --- Pastel drawing, Psychedelic art, Arabesque (cool patterns), knolling (everything spread out and placed on a flat mat)
try taking screen shots of fields graphics and feeding them into midJourney V4
technology stuff --- Dan Matutina (cute complex technology),
Katsuhiro Otomo (intricate space technology), Tsutomu Nihei (black and white detailed future tech)
infographics of all know multiverses. 1980s Japanese graphic design, dimensional astrolabe,
Japanese poster graphics, Ralph McQuarrie (looks like star wars), Simon Stålenhag (retro-futuristic), Yoshiyuki Tomino (detailed anime future technology)
isometric: low-poly, box cutout, made in blender, Materials: matte clay
subtractive sculpture
kinetic sculpture
quantum stuff -- Hypertorus, Glowing Opal Pearlescent, Physics, Hydro-Dipping Hydrodipped, Vija Celmins, Matt Molloy (photo of golden waves in the sky)
***major themes missing***
***maybe redo***
dynamical systems
harpoon gun
nail-bot
homeostasis
heuristics
thermal runaway - infrared maybe?
redo the energy tech images with by Laurie Greasley
now that you can use --ar 3:2 --stylize 1000 and photo repair
***past style themes***
field emitter - isometric, clean white robot spherical gun turret on bird legs, blender 3d, style of artstation and behance, Disney Pixar, cute
standing wave - concentric transparent blue geometric circles science
perfect diamagnetism - physics magnetic field chalk diagram
time dilation - graphic of a hyperbolic equation Luminogram
negative mass - Blacklight painting by Moebius
plasma torch - by Dan Mumford
metamaterial cloaking - Scientific photography by Miki Asai
molecular assembler - by Laurie Greasley 16-bit Isometric
wormhole - by Tim White
nail gun - Screenprint
shotgun - blueprint by Dan McPharlin
grenades, missiles, explosions - by Victo Ngai
spores - by Ernst Haeckel
drones - tilt-shift photography
super balls - By Akari Toriyama
wave - sound wave oscilloscope by Paul Catherall, concentric circles by Paul Catherall
foam - black blobs Ink doodle
harpoon - by Eiichiro Oda
mine - by Dan McPharlin
laser - complex optical scientific equipment
guns, ammo - isometric clean pixel art image cutaway of , style of tekkonkinkreet
defensive - Paper cutout
bots - hovering drone by Laurie Greasley 16-bit Isometric
generic energy tech - by Laurie Greasley
duplication, cancel - by Kazumasa Nagai
anti-shear topology, fracture analysis, shear stress - Chemigram
ON/OFF - ASCII art
block throwing - Bauhaus style
tech that adds JUNK - by Choi Jeong-hwa
ice IX - microscope images of ice crystals
tech that spawns health - glowing green balls by Enki Bilal
invulnerable - by Nick Veasey (photos that look like x-rays)
alternate reality - Fractal art
tech choice - mandala tile Mosaic
tech that spawns heal power ups - green Quilling
time, CPT, pause - by Lee Bontecou
boost, coupling power ups tech - cyan electron orbiting a black nucleus electric field as bas-relief //(by Kazumasa Nagai)
radioactive - volumetric atomic nucleus diagram by Paul Catherall