${tech.tech[choose].name} ${techCountText}
@@ -1044,15 +1040,15 @@ const powerUps = {
text += powerUps.fieldText(pick, `powerUps.choose('field',${pick})`)
}
}
- if (tech.isMicroTransactions && powerUps.research.count > 0) {
- const skins = [] //find skins
- for (let i = 0; i < tech.tech.length; i++) {
- if (tech.tech[i].isSkin) skins.push(i)
- }
- const choose = skins[Math.floor(Math.seededRandom(0, skins.length))] //pick an element from the array of options
+ // if (tech.isMicroTransactions && powerUps.research.count > 0) {
+ // const skins = [] //find skins
+ // for (let i = 0; i < tech.tech.length; i++) {
+ // if (tech.tech[i].isSkin) skins.push(i)
+ // }
+ // const choose = skins[Math.floor(Math.seededRandom(0, skins.length))] //pick an element from the array of options
- text += `
microtransaction: ${tech.tech[choose].name}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
`
- }
+ // text += `
microtransaction: ${tech.tech[choose].name}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
`
+ // }
if (tech.isBrainstorm && !tech.isBrainstormActive && !simulation.isChoosing) {
tech.isBrainstormActive = true
let count = 0
@@ -1410,13 +1406,13 @@ const powerUps = {
if (bigIndexes.length > 0) {
// console.log("at least 1 big will always spilt")
const index = bigIndexes[Math.floor(Math.random() * bigIndexes.length)]
- for (let i = 0; i < 4; i++) powerUps.directSpawn(where.x, where.y, options[Math.floor(Math.random() * options.length)], false)
+ for (let i = 0; i < 3; i++) powerUps.directSpawn(where.x, where.y, options[Math.floor(Math.random() * options.length)], false)
Matter.Composite.remove(engine.world, powerUp[index]);
powerUp.splice(index, 1);
- } else if (smallIndexes.length > 3 && Math.random() < 0.25) {
- // console.log("no big, at least 4 small can combine")
- for (let j = 0; j < 4; j++) {
+ } else if (smallIndexes.length > 2 && Math.random() < 0.33) {
+ // console.log("no big, at least 3 small can combine")
+ for (let j = 0; j < 3; j++) {
for (let i = 0; i < powerUp.length; i++) {
if (powerUp[i].name === "heal" || powerUp[i].name === "research" || powerUp[i].name === "ammo" || powerUp[i].name === "coupling" || powerUp[i].name === "boost") {
Matter.Composite.remove(engine.world, powerUp[i]);
diff --git a/js/simulation.js b/js/simulation.js
index 7f7396b..384db5b 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -676,48 +676,6 @@ const simulation = {
},
fpsInterval: 0, //set in startGame
then: null,
- introPlayer() { //not work, but trying to show player in the intro screen
- setTimeout(() => {
- document.getElementById("info").style.display = "none";
- document.getElementById("splash").style.display = "none"; //hides the element that spawned the function
-
- simulation.clearMap()
- m.draw = m.drawDefault //set the play draw to normal, undoing some junk tech
- m.spawn(); //spawns the player
- m.look = m.lookDefault
-
-
- //level
-
- level.testing(); //not in rotation, used for testing
-
-
- //load level
- simulation.setZoom();
- level.addToWorld(); //add bodies to game engine
- simulation.draw.setPaths();
-
- function cycle() {
- simulation.gravity();
- Engine.update(engine, simulation.delta);
- simulation.wipe();
- if (m.onGround) {
- m.groundControl()
- } else {
- m.airControl()
- }
- m.move();
- // m.look();
- // simulation.camera();
- m.draw();
- m.hold();
- simulation.draw.drawMapPath();
- ctx.restore();
- if (simulation.onTitlePage) requestAnimationFrame(cycle);
- }
- requestAnimationFrame(cycle)
- }, 1000);
- },
startGame(isBuildRun = false, isTrainingRun = false) {
simulation.isTextLogOpen = true
simulation.clearMap()
@@ -762,7 +720,7 @@ const simulation = {
})
// ctx.shadowColor = '#000';
if (!m.isShipMode) {
- m.draw = m.drawDefault //set the play draw to normal, undoing some junk tech
+ m.resetSkin() //set the play draw to normal, undoing some junk tech
m.spawn(); //spawns the player
m.look = m.lookDefault
} else {
diff --git a/js/tech.js b/js/tech.js
index d5990b6..d7cc875 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -220,6 +220,7 @@ const tech = {
damage: 1, //used for tech changes to player damage that don't have complex conditions
damageFromTech() {
let dmg = tech.damage //m.fieldDamage
+ if (tech.isDilate) dmg *= 1.25 + Math.sin(m.cycle * 0.01)
if (tech.isGunChoice && tech.buffedGun === b.inventoryGun) dmg *= 1 + 0.31 * b.inventory.length
if (powerUps.boost.endCycle > m.cycle) dmg *= 1 + powerUps.boost.damage
if (m.coupling && (m.fieldMode === 0 || m.fieldMode === 5)) dmg *= 1 + 0.15 * m.coupling
@@ -733,10 +734,10 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() {
- return true
+ return this.count > 0
},
requires: "",
- effect() { // good with melee builds, content skipping builds
+ effect() {
tech.squirrelFx += 0.25;
tech.squirrelJump += 0.1;
m.setMovement()
@@ -1008,7 +1009,7 @@ const tech = {
{
name: "collider",
descriptionFunction() {
- return `after mobs
die there is a
+33% chance
to change a
power up into a different
flavor`
+ return `after mobs
die there is a
+33% chance
to smash
power ups into a different
flavor`
},
maxCount: 3,
count: 0,
@@ -1896,6 +1897,7 @@ const tech = {
count: 0,
frequency: 1,
frequencyDefault: 1,
+ isSkin: true,
allowed() {
return !tech.isRelay
},
@@ -1912,7 +1914,7 @@ const tech = {
}
}
if (!m.isShipMode) {
- m.draw = m.drawFlipFlop
+ m.skin.flipFlop()
}
},
remove() {
@@ -1927,6 +1929,7 @@ const tech = {
}
}
m.eyeFillColor = 'transparent'
+ m.resetSkin();
}
},
{
@@ -2047,11 +2050,13 @@ const tech = {
count: 0,
frequency: 1,
frequencyDefault: 1,
+ isSkin: true,
allowed() {
return !tech.isFlipFlop
},
requires: "not flip-flop",
effect() {
+ m.isAltSkin = true
tech.isRelay = true //do you have this tech?
if (!tech.isFlipFlopOn) {
tech.isFlipFlopOn = true //what is the state of flip-Flop?
@@ -2063,7 +2068,7 @@ const tech = {
}
}
if (!m.isShipMode) {
- m.draw = m.drawFlipFlop
+ m.skin.flipFlop()
}
},
remove() {
@@ -2078,6 +2083,7 @@ const tech = {
}
}
m.eyeFillColor = 'transparent'
+ m.resetSkin();
}
},
{
@@ -2293,21 +2299,24 @@ const tech = {
// description: "
charge,
parity, and
time invert to undo
defenserewind (1.5—5) seconds for
(66—220) energy",
// description: "after losing
health, if you have
full energyrewind time for
44 energy per second",
descriptionFunction() {
- return `after losing
health, if you have
${(100*Math.min(100,m.maxEnergy)).toFixed(0)} energyrewind time for
44 energy per second`
+ return `after losing
health, if you have
${(100*Math.min(100,m.maxEnergy)).toFixed(0)} energyrewind time for
40 energy per second`
},
maxCount: 1,
count: 0,
frequency: 1,
frequencyDefault: 1,
+ isSkin: true,
allowed() {
- return m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isRewindField && !tech.isEnergyHealth
+ return !m.isAltSkin && m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isRewindField && !tech.isEnergyHealth
},
- requires: "not standing wave, max energy reduction, retrocausality, mass-energy",
+ requires: "not skinned, standing wave, max energy reduction, retrocausality, mass-energy",
effect() {
tech.isRewindAvoidDeath = true;
+ m.skin.CPT()
},
remove() {
tech.isRewindAvoidDeath = false;
+ m.resetSkin();
}
},
{
@@ -2371,13 +2380,14 @@ const tech = {
{
name: "mass-energy equivalence",
// description: "
energy protects you instead of
health√ of
defense reduction reduces max
energy",
- description: "
energy protects you instead of
healthexponentially
reduced defense (~ x^0.1)",
+ description: "
energy protects you instead of
healthexponentially
reduced defense (~ x^0.12)",
maxCount: 1,
count: 0,
frequency: 1,
frequencyDefault: 1,
+ isSkin: true,
allowed() {
- return !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isAnnihilation //&& !tech.isAmmoFromHealth && !tech.isRewindGun
+ return !m.isAltSkin && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isAnnihilation //&& !tech.isAmmoFromHealth && !tech.isRewindGun
},
requires: "not piezoelectricity, CPT, annihilation",
effect() {
@@ -2386,8 +2396,9 @@ const tech = {
document.getElementById("health-bg").style.display = "none"
document.getElementById("dmg").style.backgroundColor = "#0cf";
tech.isEnergyHealth = true;
- simulation.mobDmgColor = "rgba(14, 190, 235,0.7)" //"#0cf"
+ simulation.mobDmgColor = "rgba(0, 255, 255,0.6)" //"#0cf"
m.displayHealth();
+ m.skin.energy();
},
remove() {
if (tech.isEnergyHealth) {
@@ -2400,6 +2411,7 @@ const tech = {
m.displayHealth();
}
tech.isEnergyHealth = false;
+ m.resetSkin();
}
},
{
@@ -2850,23 +2862,26 @@ const tech = {
},
{
name: "tungsten carbide",
- description: "
+100 maximum
healthlose health after hard
landings",
+ description: "
+150 maximum
healthlose health after hard
landings",
maxCount: 1,
count: 0,
frequency: 1,
frequencyDefault: 1,
+ isSkin: true,
allowed() {
- return true
+ return !m.isAltSkin
},
- requires: "",
+ requires: "not skin",
effect() {
tech.isFallingDamage = true;
m.setMaxHealth();
m.addHealth(1 / simulation.healScale)
+ m.skin.tungsten()
},
remove() {
tech.isFallingDamage = false;
m.setMaxHealth();
+ m.resetSkin();
}
},
{
@@ -3495,6 +3510,27 @@ const tech = {
}
}
},
+ {
+ name: "aperture",
+ description: "your damage cycles every
6 seconds
between
-75% and
+125% damage",
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ isSkin: true,
+ allowed() {
+ return !m.isAltSkin
+ },
+ requires: "not skinned",
+ effect() {
+ tech.isDilate = true
+ m.skin.dilate()
+ },
+ remove() {
+ tech.isDilate = false
+ m.resetSkin();
+ }
+ },
{
name: "exciton",
descriptionFunction() {
@@ -10063,30 +10099,25 @@ const tech = {
},
remove() {}
},
- // {
- // name: "inverted input",
- // description: "left input becomes right and up input becomes down",
- // maxCount: 9,
- // count: 0,
- // frequency: 0,
- // isNonRefundable: true,
- // isExperimentHide: true,
- // isJunk: true,
- // allowed() {
- // return true
- // },
- // requires: "",
- // effect() {
- // const left = input.key.left
- // input.key.left = input.key.right
- // input.key.right = left
-
- // const up = input.key.up
- // input.key.up = input.key.down
- // input.key.down = up
- // },
- // remove() {}
- // },
+ {
+ name: "stubs",
+ description: "no knees or toes are drawn on the player",
+ maxCount: 1,
+ count: 0,
+ frequency: 0,
+ isSkin: true,
+ isJunk: true,
+ allowed() {
+ return !m.isShipMode
+ },
+ requires: "",
+ effect() {
+ m.skin.stubs()
+ },
+ remove() {
+ m.resetSkin();
+ }
+ },
{
name: "Sleipnir",
description: "grow more legs",
@@ -10094,44 +10125,17 @@ const tech = {
count: 0,
frequency: 0,
isSkin: true,
- isNonRefundable: true,
isJunk: true,
allowed() {
return !m.isShipMode
},
requires: "",
effect() {
- m.draw = function() {
- ctx.fillStyle = m.fillColor;
- m.walk_cycle += m.flipLegs * m.Vx;
-
- //draw body
- ctx.save();
- ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5
- ctx.translate(m.pos.x, m.pos.y);
- for (let i = 0; i < 16; i++) {
- m.calcLeg(Math.PI * i / 8, -3 * i / 16)
- m.drawLeg("#444")
- }
- ctx.rotate(m.angle);
-
- ctx.beginPath();
- ctx.arc(0, 0, 30, 0, 2 * Math.PI);
- ctx.fillStyle = m.bodyGradient
- ctx.fill();
- ctx.arc(15, 0, 4, 0, 2 * Math.PI);
- ctx.strokeStyle = "#333";
- ctx.lineWidth = 2;
- ctx.stroke();
- // ctx.beginPath();
- // ctx.arc(15, 0, 3, 0, 2 * Math.PI);
- // ctx.fillStyle = '#0cf';
- // ctx.fill()
- ctx.restore();
- m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
- }
+ m.skin.Sleipnir()
},
- remove() {}
+ remove() {
+ m.resetSkin();
+ }
},
{
name: "diegesis",
@@ -10140,39 +10144,17 @@ const tech = {
count: 0,
frequency: 0,
isSkin: true,
- isNonRefundable: true,
isJunk: true,
allowed() {
return !m.isShipMode
},
requires: "",
effect() {
- m.draw = function() {
- ctx.fillStyle = m.fillColor;
- m.walk_cycle += m.flipLegs * m.Vx;
-
- ctx.save();
- ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5
- ctx.translate(m.pos.x, m.pos.y);
- m.calcLeg(Math.PI, -3);
- m.drawLeg("#4a4a4a");
- m.calcLeg(0, 0);
- m.drawLeg("#333");
- ctx.rotate(m.angle - (m.fireCDcycle !== Infinity ? m.flipLegs * 0.25 * Math.pow(Math.max(m.fireCDcycle - m.cycle, 0), 0.5) : 0));
-
- ctx.beginPath();
- ctx.arc(0, 0, 30, 0, 2 * Math.PI);
- ctx.fillStyle = m.bodyGradient
- ctx.fill();
- ctx.arc(15, 0, 4, 0, 2 * Math.PI);
- ctx.strokeStyle = "#333";
- ctx.lineWidth = 2;
- ctx.stroke();
- ctx.restore();
- m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
- }
+ m.skin.diegesis()
},
- remove() {}
+ remove() {
+ m.resetSkin();
+ }
},
{
name: "🐱",
@@ -10181,80 +10163,17 @@ const tech = {
count: 0,
frequency: 0,
isSkin: true,
- isNonRefundable: true,
isJunk: true,
allowed() {
return !m.isShipMode
},
requires: "",
effect() {
- m.draw = function() {
- ctx.fillStyle = m.fillColor;
- m.walk_cycle += m.flipLegs * m.Vx;
- ctx.save();
- ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5
- ctx.translate(m.pos.x, m.pos.y);
- m.calcLeg(Math.PI, -3);
- m.drawLeg("#4a4a4a");
-
-
- if (!(m.angle > -Math.PI / 2 && m.angle < Math.PI / 2)) {
- ctx.scale(1, -1);
- ctx.rotate(Math.PI);
- }
- ctx.beginPath();
- ctx.moveTo(-30, 0);
- ctx.bezierCurveTo(-65, -75,
- -5, 150 + (5 * Math.sin(simulation.cycle / 10)),
- -70 + (10 * Math.sin(simulation.cycle / 10)), 0 + (10 * Math.sin(simulation.cycle / 10)));
- ctx.strokeStyle = "#333";
- ctx.lineWidth = 4;
- ctx.stroke();
-
- if (!(m.angle > -Math.PI / 2 && m.angle < Math.PI / 2)) {
- ctx.scale(1, -1);
- ctx.rotate(0 - Math.PI);
- }
- m.calcLeg(0, 0);
- m.drawLeg("#333");
-
- ctx.rotate(m.angle);
- if (!(m.angle > -Math.PI / 2 && m.angle < Math.PI / 2)) ctx.scale(1, -1);
- ctx.beginPath();
- ctx.moveTo(5, -30);
- ctx.lineTo(20, -40);
- ctx.lineTo(20, -20);
- ctx.lineWidth = 2;
- ctx.fillStyle = "#f3f";
- ctx.fill();
- ctx.stroke();
-
- ctx.beginPath();
- ctx.arc(0, 0, 30, 0, 2 * Math.PI);
- ctx.fillStyle = m.bodyGradient
- ctx.fill();
- ctx.stroke();
- ctx.moveTo(19, 0);
- ctx.arc(15, 0, 4, Math.PI, 2 * Math.PI);
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(24.3, 6, 5, Math.PI * 2, Math.PI);
- ctx.stroke();
-
- ctx.beginPath();
- ctx.moveTo(30, 6);
- ctx.lineTo(32, 0);
- ctx.lineTo(26, 0);
- ctx.lineTo(30, 6);
- ctx.fillStyle = "#f3f";
- ctx.fill();
- ctx.stroke();
-
- ctx.restore();
- m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
- }
+ m.skin.cat();
},
- remove() {}
+ remove() {
+ m.resetSkin();
+ }
},
{
name: "n-gone",
@@ -10263,7 +10182,6 @@ const tech = {
count: 0,
frequency: 0,
isSkin: true,
- isNonRefundable: true,
isJunk: true,
allowed() {
return true
@@ -10272,7 +10190,29 @@ const tech = {
effect() {
m.draw = () => {}
},
- remove() {}
+ remove() {
+ m.resetSkin();
+ }
+ },
+ {
+ name: "pareidolia",
+ description: "don't",
+ maxCount: 1,
+ count: 0,
+ frequency: 0,
+ isSkin: true,
+ isNonRefundable: true,
+ isJunk: true,
+ allowed() {
+ return !m.isShipMode
+ },
+ requires: "",
+ effect() {
+ m.skin.pareidolia()
+ },
+ remove() {
+ m.resetSkin();
+ }
},
{
name: "posture",
@@ -10280,7 +10220,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isSkin: true,
isJunk: true,
allowed() {
return !m.isShipMode
@@ -10299,7 +10238,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isSkin: true,
isJunk: true,
isNonRefundable: true,
allowed() {
@@ -10314,82 +10252,12 @@ const tech = {
},
remove() {}
},
- {
- name: "pareidolia",
- description: "don't",
- maxCount: 1,
- count: 0,
- frequency: 0,
- isSkin: true,
- isNonRefundable: true,
- isJunk: true,
- allowed() {
- return !m.isShipMode
- },
- requires: "",
- effect() {
- m.draw = function() {
- ctx.fillStyle = m.fillColor;
- m.walk_cycle += m.flipLegs * m.Vx;
- ctx.save();
- ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.7
- ctx.translate(m.pos.x, m.pos.y);
- m.calcLeg(Math.PI, -3);
- m.drawLeg("#4a4a4a");
- m.calcLeg(0, 0);
- m.drawLeg("#333");
- ctx.rotate(m.angle);
- ctx.beginPath();
- ctx.arc(0, 0, 30, 0, 2 * Math.PI);
- ctx.fillStyle = m.bodyGradient
- ctx.fill();
- ctx.strokeStyle = "#333";
- ctx.lineWidth = 2;
- if (!(m.angle > -Math.PI / 2 && m.angle < Math.PI / 2)) ctx.scale(1, -1); //here is the flip
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(2, -6, 7, 0, 2 * Math.PI);
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(25, -6, 7, 0.25 * Math.PI, 1.6 * Math.PI);
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(2, -10, 9, 1.25 * Math.PI, 1.75 * Math.PI);
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(25, -10, 9, 1.25 * Math.PI, 1.4 * Math.PI);
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(18, 13, 10, 0, 2 * Math.PI);
- ctx.fillStyle = m.bodyGradient;
- ctx.fill();
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(18, 13, 6, 0, 2 * Math.PI);
- ctx.fillStyle = "#555";
- ctx.fill();
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(3, -6, 3, 0, 2 * Math.PI);
- ctx.fill();
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(26, -6, 3, 0, 2 * Math.PI);
- ctx.fill();
- ctx.stroke();
- ctx.restore();
- m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15;
- }
- },
- remove() {}
- },
{
name: "prism",
description: "you cycle through different
colors",
maxCount: 1,
count: 0,
frequency: 0,
- isSkin: true,
isNonRefundable: true,
isJunk: true,
allowed() {
@@ -10409,24 +10277,24 @@ const tech = {
},
remove() {}
},
- {
- name: "microtransactions",
- description: `when you choose a
tech you can
use ${powerUps.orb.research(1)} to buy a free in game
skin`,
- maxCount: 1,
- count: 0,
- frequency: 0,
- isJunk: true,
- allowed() {
- return true
- },
- requires: "",
- effect() {
- tech.isMicroTransactions = true
- },
- remove() {
- tech.isMicroTransactions = false
- }
- },
+ // {
+ // name: "microtransactions",
+ // description: `when you choose a
tech you can
use ${powerUps.orb.research(1)} to buy a free in game
skin`,
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 0,
+ // isJunk: true,
+ // allowed() {
+ // return true
+ // },
+ // requires: "",
+ // effect() {
+ // tech.isMicroTransactions = true
+ // },
+ // remove() {
+ // tech.isMicroTransactions = false
+ // }
+ // },
{
name: "ship",
description: "fly around with no legs
reduce combat
difficulty by
1 level",
@@ -10436,10 +10304,11 @@ const tech = {
isNonRefundable: true,
isJunk: true,
allowed() {
- return !m.isShipMode && m.fieldUpgrades[m.fieldMode].name !== "negative mass"
+ return !m.isShipMode && !m.isAltSkin && m.fieldUpgrades[m.fieldMode].name !== "negative mass"
},
requires: "",
effect() {
+ m.isAltSkin = true
m.shipMode()
level.difficultyDecrease(simulation.difficultyMode)
//unlock relativistic rotation
@@ -11399,7 +11268,7 @@ const tech = {
quantumEraserCount: null,
isPhononBlock: null,
isPhononWave: null,
- isMicroTransactions: null,
+ // isMicroTransactions: null,
isLaserLens: null,
laserCrit: null,
isSporeColony: null,
@@ -11422,4 +11291,5 @@ const tech = {
isSuperMine: null,
sentryAmmo: null,
collidePowerUps: null,
+ isDilate: null,
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 28b627a..38752c3 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,38 +1,50 @@
******************************************************** NEXT PATCH **************************************************
-exit doors take longer to open
- it's nice to take a few seconds to relax between levels
- please don't submit a bug report about this
+some tech come with a skin - but only 1 at a time
+ tech aperture - skin, damage cycles between -25% and +125%
+ tungsten carbide - skin, +100->150 max health
+ mass-energy equivalence - skin, gets a bit more benefit from defense
+ CPT symmetry - skin, costs a bit less energy
+ flip-flop, and relay switch and a few JUNK tech are also skins
-plasma torch energy regen 6->10
-perfect diamagnetism energy regen 6->5
-
-a few more new images
-
-tech: collider - after a mob dies smash power ups and change the flavor of one of them
- powerUps.randomize(where)
- if there is a tech,field,gun it will split into 4 small power ups
- else if there are at least 4 small power ups they have a 1/4 chance to combine into a tech, field, gun
- else a random small power up will change
+some new images
+bug fixes
*********************************************************** TODO *****************************************************
+tech: if a needle hits 2 mobs reset your fire CD
+ and maybe to 2x damage for each consecutive mob hit?
+
+tech for lens - you can only fire through the lens and some buff? damage or energy?
+ this was in todo.txt on GitHub. I think it should be 'laser never drains energy, but you can only fire through lens and +90° lens arc, +100% damage (also you can not gain compound lens with this upgrade)
+
+Tech: Von Neuman probes - Drones will consume blocks to replicate themselves
+ it's a little too similar to the drone repair tech, but I kinda like it better. drones that eat blocks and spit out more drones is cool
+
+new boss level like reactor with a very very big boss
+ mechanics around a very big boss?
+ maybe the boss moves into rooms so you have to do platforming to clear the room before the boss enters the room
+ boss can destroy blocks and smaller map elements
+
+tech - after standing wave runs out of energy from blocking, gain a buff
+ buff: defense, damage?
+ aoe damage like railgun
+ push mobs away
+
diagetic UI Elements
ammo number?
doesn't text look choppy when camera moves?
health bar could be rendered similarly to energy bar
what about 2 bezier curves on left and right of player head that looks like 1/3 circleRadiusScale
- what about 2 bezier both above player
+ rotate the curves as the head rotates
+ what about 2 bezier both above player
as the total energy and health increases the curses could asymptotically approach a maximum length as max energy/health goes to infinity
-
level: lock
should there be something in the top part of the map?
add alt versions of left and right sides
make flipped L/R version (after everything else is done)
-Tech: Drones always follow you mouse, never going to attack enemies or pick up power ups unless they are close to your mouse
-
tech: add an selection option to all tech, gun, fields to do something
set all mobs to 30% health, and stun all mobs
50% chance to convert all power ups into research
@@ -43,8 +55,6 @@ tech: if you die inside MACHO, heal to full and delete the MACHO for the rest of
tech: after bosses die
they spawn a research
-tech: neutrino oscillation - when a mob dies there is a __% chance to convert a random existing power up to a different type
-
tech: +8% damage each time you kill a boss
tech: maybe missiles explode when they hit walls, but explosions only drain energy
@@ -66,11 +76,6 @@ tech: Bose Einstein condensate - freezes enemies in pilot wave, and drains some
super-bot
-tech - after standing wave runs out of energy from blocking, gain a buff
- buff: defense, damage?
- aoe damage like railgun
- push mobs away
-
make super balls with Zectron deflectable with field
but is there a simple way to do this?
@@ -1172,6 +1177,7 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
supercritical fission
***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
+ damaged dirty white robot spherical gun turret on bird legs in the style of Solarpunk
standing wave - concentric transparent blue geometric circles science
perfect diamagnetism - physics magnetic field chalk diagram
time dilation - graphic of a hyperbolic equation Luminogram