eternalism

tech: eternalism - tech,gun,field gives an ammo but, time doesn't pause while choosing
  I might change the ammo to something else, not sure, maybe just damage
JUNK tech: panpsychism - awaken blocks, blocks can drop power ups

cache gives 14->16x ammo
1st ionization energy gives 8->10% max energy on heal

powerUpBossBaby immunity phase is a bit shorter

bug fixes
This commit is contained in:
landgreen
2022-04-27 06:00:40 -07:00
parent 099fc07efe
commit 38d356e592
7 changed files with 198 additions and 109 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -19,7 +19,7 @@ const level = {
// m.setField("standing wave") // m.setField("standing wave")
// b.giveGuns("laser") // b.giveGuns("laser")
// tech.giveTech("scrap-bot manufacturing") // tech.giveTech("scrap-bot manufacturing")
// tech.giveTech("dynamo-bot upgrade") // tech.giveTech("eternalism")
// tech.giveTech("options exchange") // tech.giveTech("options exchange")
// tech.giveTech("ICBM") // tech.giveTech("ICBM")
// tech.giveTech("grappling hook") // tech.giveTech("grappling hook")
@@ -37,7 +37,7 @@ const level = {
// m.immuneCycle = Infinity //you can't take damage // m.immuneCycle = Infinity //you can't take damage
// level.difficultyIncrease(15) //30 is near max on hard //60 is near max on why // level.difficultyIncrease(15) //30 is near max on hard //60 is near max on why
// simulation.enableConstructMode() //used to build maps in testing mode // simulation.enableConstructMode() //used to build maps in testing mode
// level.temple(); // level.testChamber();
// level.testing(); //not in rotation, used for testing // level.testing(); //not in rotation, used for testing
if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************ if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************
// powerUps.research.changeRerolls(3000) // powerUps.research.changeRerolls(3000)
@@ -2671,8 +2671,8 @@ const level = {
spawn.mapRect(level.exit.x, level.exit.y + 25, 100, 25); spawn.mapRect(level.exit.x, level.exit.y + 25, 100, 25);
level.defaultZoom = 2000 level.defaultZoom = 2000
simulation.zoomTransition(level.defaultZoom) simulation.zoomTransition(level.defaultZoom)
document.body.style.backgroundColor = "#d0d5df" //"#d8dadf"; document.body.style.backgroundColor = "#c3d6df" //"#d8dadf";
color.map = "#334046"; color.map = "#303639";
// powerUps.spawnStartingPowerUps(1475, -1175); // powerUps.spawnStartingPowerUps(1475, -1175);
// spawn.debris(750, -2200, 3700, 16); //16 debris per level // spawn.debris(750, -2200, 3700, 16); //16 debris per level
const button = level.button(1400, 0) const button = level.button(1400, 0)
@@ -3673,8 +3673,8 @@ const level = {
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20); spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20);
level.defaultZoom = 2200 level.defaultZoom = 2200
simulation.zoomTransition(level.defaultZoom) simulation.zoomTransition(level.defaultZoom)
document.body.style.backgroundColor = "#d5d5d5"; document.body.style.backgroundColor = "#d0d5d5";
color.map = "#555" color.map = "#444"
spawn.mapRect(0, -1955, 175, 30); spawn.mapRect(0, -1955, 175, 30);
const removeIndex1 = map.length - 1 //so much work to catch blocks caught at the bottom of the vertical portals const removeIndex1 = map.length - 1 //so much work to catch blocks caught at the bottom of the vertical portals
spawn.mapRect(1225, -1955, 175, 30); spawn.mapRect(1225, -1955, 175, 30);

View File

@@ -1540,7 +1540,7 @@ const m = {
const fieldRange2 = (0.68 + 0.37 * Math.sin(m.cycle / 37)) * m.fieldRange * m.harmonicRadius const fieldRange2 = (0.68 + 0.37 * Math.sin(m.cycle / 37)) * m.fieldRange * m.harmonicRadius
const fieldRange3 = (0.7 + 0.35 * Math.sin(m.cycle / 47)) * m.fieldRange * m.harmonicRadius const fieldRange3 = (0.7 + 0.35 * Math.sin(m.cycle / 47)) * m.fieldRange * m.harmonicRadius
const netfieldRange = Math.max(fieldRange1, fieldRange2, fieldRange3) const netfieldRange = Math.max(fieldRange1, fieldRange2, fieldRange3)
ctx.fillStyle = "rgba(110,170,200," + Math.min(0.73, (0.04 + m.energy * (0.11 + 0.13 * Math.random()))) + ")"; ctx.fillStyle = "rgba(110,170,200," + Math.min(0.65, (0.04 + m.energy * (0.11 + 0.13 * Math.random()))) + ")";
ctx.beginPath(); ctx.beginPath();
ctx.arc(m.pos.x, m.pos.y, fieldRange1, 0, 2 * Math.PI); ctx.arc(m.pos.x, m.pos.y, fieldRange1, 0, 2 * Math.PI);
ctx.fill(); ctx.fill();
@@ -1571,7 +1571,7 @@ const m = {
const radius = m.fieldRange * m.harmonicRadius const radius = m.fieldRange * m.harmonicRadius
ctx.lineWidth = 1; ctx.lineWidth = 1;
ctx.strokeStyle = "rgba(110,170,200,0.8)" ctx.strokeStyle = "rgba(110,170,200,0.8)"
ctx.fillStyle = "rgba(110,170,200," + Math.min(0.7, m.energy * (0.13 + 0.1 * Math.random()) * (3 / tech.harmonics)) + ")"; ctx.fillStyle = "rgba(110,170,200," + Math.min(0.65, m.energy * (0.13 + 0.1 * Math.random()) * (3 / tech.harmonics)) + ")";
// ctx.fillStyle = "rgba(110,170,200," + Math.min(0.7, m.energy * (0.22 - 0.01 * tech.harmonics) * (0.5 + 0.5 * Math.random())) + ")"; // ctx.fillStyle = "rgba(110,170,200," + Math.min(0.7, m.energy * (0.22 - 0.01 * tech.harmonics) * (0.5 + 0.5 * Math.random())) + ")";
for (let i = 0; i < tech.harmonics; i++) { for (let i = 0; i < tech.harmonics; i++) {
ctx.beginPath(); ctx.beginPath();

View File

@@ -262,15 +262,13 @@ const powerUps = {
// document.getElementById("choose-background").style.visibility = "visible" // document.getElementById("choose-background").style.visibility = "visible"
// document.getElementById("choose-background").style.opacity = "0.8" // document.getElementById("choose-background").style.opacity = "0.8"
// document.getElementById("choose-grid").style.display = "grid" // document.getElementById("choose-grid").style.display = "grid"
document.getElementById("choose-grid").style.transitionDuration = "0.25s";
document.getElementById("choose-grid").style.visibility = "visible"
document.getElementById("choose-grid").style.opacity = "1"
//disable clicking for 1/2 a second to prevent mistake clicks //disable clicking for 1/2 a second to prevent mistake clicks
document.getElementById("choose-grid").style.pointerEvents = "none"; document.getElementById("choose-grid").style.pointerEvents = "none";
document.body.style.cursor = "none"; document.body.style.cursor = "none";
setTimeout(() => { setTimeout(() => {
if (!tech.isNoDraftPause) document.body.style.cursor = "auto";
document.getElementById("choose-grid").style.pointerEvents = "auto"; document.getElementById("choose-grid").style.pointerEvents = "auto";
document.body.style.cursor = "auto";
document.getElementById("choose-grid").style.transitionDuration = "0s"; document.getElementById("choose-grid").style.transitionDuration = "0s";
}, 500); }, 500);
@@ -278,17 +276,27 @@ const powerUps = {
// document.body.style.overflowY = "scroll"; // document.body.style.overflowY = "scroll";
// document.body.style.overflowX = "hidden"; // document.body.style.overflowX = "hidden";
// } // }
simulation.paused = true;
simulation.isChoosing = true; //stops p from un pausing on key down simulation.isChoosing = true; //stops p from un pausing on key down
build.pauseGrid()
document.getElementById("pause-grid-right").style.opacity = "0.3" if (!simulation.paused) {
document.getElementById("pause-grid-left").style.opacity = "0.3" if (tech.isNoDraftPause) {
//hide health bar, guns, power ups list powerUps.spawn(m.pos.x, m.pos.y, "ammo");
document.getElementById("choose-grid").style.opacity = "0.7"
} else {
simulation.paused = true;
document.getElementById("choose-grid").style.opacity = "1"
}
document.getElementById("choose-grid").style.transitionDuration = "0.25s";
document.getElementById("choose-grid").style.visibility = "visible"
requestAnimationFrame(() => { requestAnimationFrame(() => {
ctx.fillStyle = `rgba(221,221,221,0.6)`; ctx.fillStyle = `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.3"
document.getElementById("pause-grid-left").style.opacity = "0.3"
}
build.pauseGrid()
}, },
endDraft(type, isCanceled = false) { //type should be a gun, tech, or field endDraft(type, isCanceled = false) { //type should be a gun, tech, or field
if (isCanceled) { if (isCanceled) {
@@ -342,11 +350,11 @@ const powerUps = {
document.body.style.cursor = "none"; document.body.style.cursor = "none";
// document.body.style.overflow = "hidden" // document.body.style.overflow = "hidden"
// if (m.alive){} // if (m.alive){}
if (simulation.paused) requestAnimationFrame(cycle);
simulation.paused = false; simulation.paused = false;
simulation.isChoosing = false; //stops p from un pausing on key down simulation.isChoosing = false; //stops p from un pausing on key down
if (m.immuneCycle < m.cycle + 15) m.immuneCycle = m.cycle + 15; //player is immune to damage for 30 cycles
build.unPauseGrid() build.unPauseGrid()
requestAnimationFrame(cycle); if (m.immuneCycle < m.cycle + 15) m.immuneCycle = m.cycle + 15; //player is immune to damage for 30 cycles
if (m.holdingTarget) m.drop(); if (m.holdingTarget) m.drop();
}, },
research: { research: {
@@ -489,7 +497,7 @@ const powerUps = {
} }
if (tech.healGiveMaxEnergy) { if (tech.healGiveMaxEnergy) {
tech.healMaxEnergyBonus += 0.08 tech.healMaxEnergyBonus += 0.1
m.setMaxEnergy(); m.setMaxEnergy();
} }
}, },
@@ -890,7 +898,7 @@ const powerUps = {
powerUps.research.currentRerollCount = 0 powerUps.research.currentRerollCount = 0
if (tech.isTechDamage && who.name === "tech") m.damage(0.11) if (tech.isTechDamage && who.name === "tech") m.damage(0.11)
if (tech.isMassEnergy) m.energy += 2; if (tech.isMassEnergy) m.energy += 2;
if (tech.isMineDrop && bullet.length < 150 && Math.random() < 0.60) { if (tech.isMineDrop && bullet.length < 150 && Math.random() < 0.6) {
if (tech.isLaserMine && input.down) { if (tech.isLaserMine && input.down) {
b.laserMine(who.position) b.laserMine(who.position)
} else { } else {
@@ -1012,6 +1020,9 @@ const powerUps = {
} }
}, },
ejectTech(choose = 'random') { ejectTech(choose = 'random') {
if (!simulation.isChoosing)
//find which tech you have //find which tech you have
if (choose === 'random') { if (choose === 'random') {
const have = [] const have = []

View File

@@ -1213,11 +1213,11 @@ const spawn = {
} else if (!m.isCloak) { } else if (!m.isCloak) {
me.foundPlayer(); me.foundPlayer();
} }
me.damageReduction = 0.22 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.damageReduction = 0.2 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.isInvulnerable = true me.isInvulnerable = true
me.startingDamageReduction = me.damageReduction me.startingDamageReduction = me.damageReduction
me.damageReduction = 0 me.damageReduction = 0
me.invulnerabilityCountDown = 60 + simulation.difficulty * 2 me.invulnerabilityCountDown = 40 + simulation.difficulty
me.onHit = function() { //run this function on hitting player me.onHit = function() { //run this function on hitting player
if (powerUps.ejectTech()) { if (powerUps.ejectTech()) {
powerUps.ejectGraphic("150, 138, 255"); powerUps.ejectGraphic("150, 138, 255");

View File

@@ -555,7 +555,7 @@ const tech = {
{ {
name: "cache", name: "cache",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Cache_(computing)' class="link">cache</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Cache_(computing)' class="link">cache</a>`,
description: `${powerUps.orb.ammo()} give <strong>14x</strong> more <strong class='color-ammo'>ammo</strong>, but<br>you can't <strong>store</strong> any more <strong class='color-ammo'>ammo</strong> than that`, description: `${powerUps.orb.ammo()} give <strong>16x</strong> more <strong class='color-ammo'>ammo</strong>, but<br>you can't <strong>store</strong> any more <strong class='color-ammo'>ammo</strong> than that`,
// ammo powerups always max out your gun, // ammo powerups always max out your gun,
// but the maximum ammo ti limited // but the maximum ammo ti limited
// description: `${powerUps.orb.ammo()} give <strong>13x</strong> more <strong class='color-ammo'>ammo</strong>, but<br>you can't <strong>store</strong> any more <strong class='color-ammo'>ammo</strong> than that`, // description: `${powerUps.orb.ammo()} give <strong>13x</strong> more <strong class='color-ammo'>ammo</strong>, but<br>you can't <strong>store</strong> any more <strong class='color-ammo'>ammo</strong> than that`,
@@ -568,7 +568,7 @@ const tech = {
}, },
requires: "not exciton", requires: "not exciton",
effect() { effect() {
tech.ammoCap = 14; tech.ammoCap = 16;
powerUps.ammo.effect() powerUps.ammo.effect()
}, },
remove() { remove() {
@@ -593,6 +593,25 @@ const tech = {
tech.isAmmoFromHealth = false; tech.isAmmoFromHealth = false;
} }
}, },
{
name: "eternalism",
description: `choosing a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong> spawns ${powerUps.orb.ammo()}<br><strong>time</strong> doesn't <strong>pause</strong> while choosing`, //${powerUps.orb.heal()} or
// description: "increase <strong class='color-d'>damage</strong> by <strong>50%</strong>, but <strong>time</strong> continues<br>while choosing a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong>",
maxCount: 1,
count: 0,
frequency: 1,
frequencyDefault: 1,
allowed() {
return true
},
requires: "",
effect() {
tech.isNoDraftPause = true
},
remove() {
tech.isNoDraftPause = false
}
},
{ {
name: "exciton", name: "exciton",
description: `increase <strong class='color-d'>damage</strong> by <strong>88%</strong>, but<br>${powerUps.orb.ammo()} will no longer <strong>spawn</strong>`, description: `increase <strong class='color-d'>damage</strong> by <strong>88%</strong>, but<br>${powerUps.orb.ammo()} will no longer <strong>spawn</strong>`,
@@ -2219,7 +2238,7 @@ const tech = {
{ {
name: "1st ionization energy", name: "1st ionization energy",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Ionization_energy' class="link">1st ionization energy</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Ionization_energy' class="link">1st ionization energy</a>`,
description: `each ${powerUps.orb.heal()} you collect<br>increases your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>8</strong>`, description: `each ${powerUps.orb.heal()} you collect<br>increases your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>10</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
@@ -3480,8 +3499,8 @@ const tech = {
description: `when you reach <strong>111%</strong> <strong class='color-dup'>duplication</strong><br>spawn <strong>11 bosses</strong> with <strong>111%</strong> more <strong>health</strong>`, description: `when you reach <strong>111%</strong> <strong class='color-dup'>duplication</strong><br>spawn <strong>11 bosses</strong> with <strong>111%</strong> more <strong>health</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 10, frequency: 6,
frequencyDefault: 10, frequencyDefault: 6,
isNonRefundable: true, isNonRefundable: true,
allowed() { allowed() {
return tech.duplicationChance() > 0.6 return tech.duplicationChance() > 0.6
@@ -4071,7 +4090,8 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + (tech.haveGunCheck("nail gun") && !tech.isShieldPierce) + tech.isNeedles + tech.isNailShot) * 2 > 1 // return tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + (tech.haveGunCheck("nail gun") && !tech.isShieldPierce) + tech.isNeedles + tech.isNailShot) * 2 > 1
return tech.isMineDrop || tech.nailBotCount || tech.fragments || tech.nailsDeathMob || (tech.haveGunCheck("mine") && !tech.isLaserMine) || (tech.haveGunCheck("nail gun") && !tech.isShieldPierce) || (tech.haveGunCheck("shotgun") && (tech.isNeedles || tech.isNailShot))
}, },
requires: "nail gun, nails, rivets, mine, not ceramic needles", requires: "nail gun, nails, rivets, mine, not ceramic needles",
effect() { effect() {
@@ -7631,6 +7651,74 @@ const tech = {
// }, // },
// remove() {} // remove() {}
// }, // },
{
name: "panpsychism",
description: "awaken all <strong class='color-block'>blocks</strong><br><strong class='color-block'>blocks</strong> have a chance to spawn random power ups",
maxCount: 1,
count: 0,
frequency: 0,
isJunk: true,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
setInterval(() => {
for (let i = body.length - 1; i > -1; i--) {
if (!body[i].isNotHoldable) {
Matter.Composite.remove(engine.world, body[i]);
spawn.blockMob(body[i].position.x, body[i].position.y, body[i], 0);
if (!body[i].isAboutToBeRemoved) mob[mob.length - 1].isDropPowerUp = true
body.splice(i, 1);
}
}
}, 6000);
},
remove() {}
},
{
name: "meteor shower",
description: "take a shower, but meteors instead of water",
maxCount: 1,
count: 0,
frequency: 0,
isJunk: true,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
setInterval(() => {
fireBlock = function(xPos, yPos) {
const index = body.length
spawn.bodyRect(xPos, yPos, 20 + 50 * Math.random(), 20 + 50 * Math.random());
const bodyBullet = body[index]
Matter.Body.setVelocity(bodyBullet, { x: 5 * (Math.random() - 0.5), y: 10 * (Math.random() - 0.5) });
bodyBullet.isAboutToBeRemoved = true
bodyBullet.collisionFilter.category = cat.body;
bodyBullet.collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet
bodyBullet.classType = "body";
Composite.add(engine.world, bodyBullet); //add to world
setTimeout(() => { //remove block
for (let i = 0; i < body.length; i++) {
if (body[i] === bodyBullet) {
Matter.Composite.remove(engine.world, body[i]);
body.splice(i, 1);
}
}
}, 4000 + Math.floor(9000 * Math.random()));
}
fireBlock(player.position.x + 600 * (Math.random() - 0.5), player.position.y - 500 - 500 * Math.random());
// for (let i = 0, len = Math.random(); i < len; i++) {
// }
}, 1000);
},
remove() {}
},
{ {
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!",
@@ -7668,47 +7756,6 @@ const tech = {
// }, // },
// remove() {} // remove() {}
// }, // },
{
name: "meteor shower",
description: "take a shower, but meteors instead of water",
maxCount: 1,
count: 0,
frequency: 0,
isJunk: true,
isNonRefundable: true,
allowed() {
return true
},
requires: "",
effect() {
setInterval(() => {
fireBlock = function(xPos, yPos) {
const index = body.length
spawn.bodyRect(xPos, yPos, 20 + 50 * Math.random(), 20 + 50 * Math.random());
const bodyBullet = body[body.length - 1]
Matter.Body.setVelocity(body[index], { x: 5 * (Math.random() - 0.5), y: 10 * (Math.random() - 0.5) });
body[index].collisionFilter.category = cat.body;
body[index].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet
body[index].classType = "body";
Composite.add(engine.world, body[index]); //add to world
setTimeout(() => { //remove block
for (let i = 0; i < body.length; i++) {
if (body[i] === bodyBullet) {
Matter.Composite.remove(engine.world, body[i]);
body.splice(i, 1);
}
}
}, 3000 + Math.floor(6000 * Math.random()));
}
fireBlock(player.position.x + 600 * (Math.random() - 0.5), player.position.y - 500 - 500 * Math.random());
// for (let i = 0, len = Math.random(); i < len; i++) {
// }
}, 1000);
},
remove() {}
},
{ {
name: "Higgs phase transition", name: "Higgs phase transition",
description: "instantly spawn 5 <strong class='color-m'>tech</strong>, but add a chance to<br>remove everything with a 5 minute <strong>half-life</strong>", description: "instantly spawn 5 <strong class='color-m'>tech</strong>, but add a chance to<br>remove everything with a 5 minute <strong>half-life</strong>",
@@ -7774,6 +7821,25 @@ const tech = {
}, },
remove() {} remove() {}
}, },
{
name: "opacity",
description: "",
maxCount: 1,
count: 0,
frequency: 0,
frequencyDefault: 0,
isJunk: true,
allowed() {
return 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",
@@ -9828,5 +9894,5 @@ const tech = {
isRelayEnergy: null, isRelayEnergy: null,
coyoteTime: null, coyoteTime: null,
missileFireCD: null, missileFireCD: null,
isBotField: null isBotField: null,
} }

View File

@@ -1,17 +1,29 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
you can scroll through the tech and gun menus while selecting power ups tech: eternalism - tech,gun,field gives an ammo but, time doesn't pause while choosing
added another classic n-gon option in settings I might change the ammo to something else, not sure, maybe just damage
JUNK tech: panpsychism - awaken blocks, blocks can drop power ups
tech: options exchange - canceling tech,gun,field has a 90% chance for a reroll cache gives 14->16x ammo
1st ionization energy gives 8->10% max energy on heal
stabber mobs now stab 15% shorter distance, but they can stab more often powerUpBossBaby immunity phase is a bit shorter
weak interaction gives 5->10 max energy per unused power up
bug fixes bug fixes
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
tech: - don't pause time during draft
bugs
requirements change after draft is generated
disable effects that change requirements
when simulation.isChoosing you can't: eject tech,
check for requirements onclick and give random tech if not met?
make lasers on labs flash on and off
make switch a button that stays down
nonrefundable tech don't display, this is confusing nonrefundable tech don't display, this is confusing
maybe they can show up but greyed out or something maybe they can show up but greyed out or something