ergodicity, tooltips
tech requirement info UI updated in experiment mode tech: ergodicity - remove heal power ups and heal tech, reduce difficulty by 2 levels
This commit is contained in:
10
js/bullet.js
10
js/bullet.js
@@ -2023,13 +2023,13 @@ const b = {
|
|||||||
// y: m.Vy / 2 + speed * Math.sin(dir)
|
// y: m.Vy / 2 + speed * Math.sin(dir)
|
||||||
// });
|
// });
|
||||||
},
|
},
|
||||||
drone(speed = 1) {
|
drone(where = { x: m.pos.x + 30 * Math.cos(m.angle) + 20 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 20 * (Math.random() - 0.5) }, speed = 1) {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
const THRUST = tech.isFastDrones ? 0.0023 : 0.0015
|
const THRUST = tech.isFastDrones ? 0.0023 : 0.0015
|
||||||
// const FRICTION = tech.isFastDrones ? 0.008 : 0.0005
|
// const FRICTION = tech.isFastDrones ? 0.008 : 0.0005
|
||||||
const dir = m.angle + 0.4 * (Math.random() - 0.5);
|
const dir = m.angle + 0.4 * (Math.random() - 0.5);
|
||||||
const RADIUS = (4.5 + 3 * Math.random())
|
const RADIUS = (4.5 + 3 * Math.random())
|
||||||
bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle) + Math.random(), m.pos.y + 30 * Math.sin(m.angle) + Math.random(), 8, RADIUS, {
|
bullet[me] = Bodies.polygon(where.x, where.y, 8, RADIUS, {
|
||||||
angle: dir,
|
angle: dir,
|
||||||
inertia: Infinity,
|
inertia: Infinity,
|
||||||
friction: 0.05,
|
friction: 0.05,
|
||||||
@@ -2037,7 +2037,7 @@ const b = {
|
|||||||
restitution: 1,
|
restitution: 1,
|
||||||
dmg: 0.24, //damage done in addition to the damage from momentum
|
dmg: 0.24, //damage done in addition to the damage from momentum
|
||||||
lookFrequency: 80 + Math.floor(23 * Math.random()),
|
lookFrequency: 80 + Math.floor(23 * Math.random()),
|
||||||
endCycle: simulation.cycle + Math.floor((960 + 420 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 130 + RADIUS * 5,
|
endCycle: simulation.cycle + Math.floor((950 + 420 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 140 + RADIUS * 5,
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
@@ -4034,10 +4034,10 @@ const b = {
|
|||||||
have: false,
|
have: false,
|
||||||
fire() {
|
fire() {
|
||||||
if (m.crouch) {
|
if (m.crouch) {
|
||||||
b.drone(45)
|
b.drone({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 45)
|
||||||
m.fireCDcycle = m.cycle + Math.floor(13 * b.fireCD); // cool down
|
m.fireCDcycle = m.cycle + Math.floor(13 * b.fireCD); // cool down
|
||||||
} else {
|
} else {
|
||||||
b.drone(1)
|
b.drone()
|
||||||
m.fireCDcycle = m.cycle + Math.floor(6 * b.fireCD); // cool down
|
m.fireCDcycle = m.cycle + Math.floor(6 * b.fireCD); // cool down
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
js/index.js
15
js/index.js
@@ -341,7 +341,9 @@ const build = {
|
|||||||
techID.setAttribute("onClick", `javascript: build.choosePowerUp(this,${i},'tech')`);
|
techID.setAttribute("onClick", `javascript: build.choosePowerUp(this,${i},'tech')`);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
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><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].description}</div>`
|
||||||
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
|
||||||
@@ -403,7 +405,8 @@ const build = {
|
|||||||
text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title"><div class="circle-grid tech"></div> ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
|
text += `<div id="tech-${i}" class="experiment-grid-module" onclick="build.choosePowerUp(this,${i},'tech')"><div class="grid-title"><div class="circle-grid tech"></div> ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
text += `<div id="tech-${i}" class="experiment-grid-module experiment-grid-disabled"><div class="grid-title">${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>`
|
// text += `<div id="tech-${i}" class="experiment-grid-module "><div class="grid-title">${tech.tech[i].name}</div><span style="color:#666;">requires: ${tech.tech[i].requires}</span></div>`
|
||||||
|
text += `<div id="tech-${i}" class="experiment-grid-module experiment-grid-disabled"><div class="grid-title"> ${tech.tech[i].name}</div> ${tech.tech[i].description}</div>`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -415,6 +418,14 @@ const build = {
|
|||||||
document.getElementById("difficulty-select").value = document.getElementById("difficulty-select-experiment").value
|
document.getElementById("difficulty-select").value = document.getElementById("difficulty-select-experiment").value
|
||||||
localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
|
localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//add tooltips
|
||||||
|
for (let i = 0, len = tech.tech.length; i < len; i++) {
|
||||||
|
if (document.getElementById(`tech-${i}`)) {
|
||||||
|
document.getElementById(`tech-${i}`).setAttribute('data-descr', tech.tech[i].requires); //add tooltip
|
||||||
|
// document.getElementById(`tech-${i}`).setAttribute('title', tech.tech[i].requires); //add tooltip
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
reset() {
|
reset() {
|
||||||
build.isExperimentSelection = true;
|
build.isExperimentSelection = true;
|
||||||
|
|||||||
@@ -1102,7 +1102,7 @@ const level = {
|
|||||||
|
|
||||||
// simulation.difficulty = 30
|
// simulation.difficulty = 30
|
||||||
// spawn.starter(1900, -500, 200) //big boy
|
// spawn.starter(1900, -500, 200) //big boy
|
||||||
// spawn.pulsar(1900, -500)
|
spawn.exploder(1900, -500)
|
||||||
// spawn.pulsarBoss(1900, -500)
|
// spawn.pulsarBoss(1900, -500)
|
||||||
// spawn.historyBoss(1900, -500)
|
// spawn.historyBoss(1900, -500)
|
||||||
// spawn.ghoster(2900, -500)
|
// spawn.ghoster(2900, -500)
|
||||||
@@ -1115,7 +1115,7 @@ const level = {
|
|||||||
// spawn.streamBoss(1600, -500)
|
// spawn.streamBoss(1600, -500)
|
||||||
// spawn.orbitalBoss(1600, -500)
|
// spawn.orbitalBoss(1600, -500)
|
||||||
// spawn.cellBossCulture(1600, -500)
|
// spawn.cellBossCulture(1600, -500)
|
||||||
spawn.shieldingBoss(1600, -500)
|
// spawn.shieldingBoss(1600, -500)
|
||||||
// spawn.beamer(1200, -500)
|
// spawn.beamer(1200, -500)
|
||||||
// spawn.shield(mob[mob.length - 1], 1800, -120, 1);
|
// spawn.shield(mob[mob.length - 1], 1800, -120, 1);
|
||||||
|
|
||||||
|
|||||||
@@ -478,7 +478,7 @@ const m = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
addHealth(heal) {
|
addHealth(heal) {
|
||||||
if (!tech.isEnergyHealth) {
|
if (!tech.isEnergyHealth && !tech.isNoHeals) {
|
||||||
m.health += heal * simulation.healScale;
|
m.health += heal * simulation.healScale;
|
||||||
if (m.health > m.maxHealth) m.health = m.maxHealth;
|
if (m.health > m.maxHealth) m.health = m.maxHealth;
|
||||||
m.displayHealth();
|
m.displayHealth();
|
||||||
@@ -633,7 +633,7 @@ const m = {
|
|||||||
if (tech.isDroneOnDamage) { //chance to build a drone on damage from tech
|
if (tech.isDroneOnDamage) { //chance to build a drone on damage from tech
|
||||||
const len = Math.min((dmg - 0.06 * Math.random()) * 40, 40) / tech.droneEnergyReduction
|
const len = Math.min((dmg - 0.06 * Math.random()) * 40, 40) / tech.droneEnergyReduction
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
if (Math.random() < 0.5) b.drone() //spawn drone
|
if (Math.random() < 0.5) b.drone({ x: m.pos.x + 30 * Math.cos(m.angle) + 100 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 100 * (Math.random() - 0.5) }) //spawn drone
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -735,9 +735,6 @@ const m = {
|
|||||||
// document.getElementById("health").style.transition = "width 1s ease-out"
|
// document.getElementById("health").style.transition = "width 1s ease-out"
|
||||||
// }
|
// }
|
||||||
},
|
},
|
||||||
hitMob(i, dmg) {
|
|
||||||
//prevents damage happening too quick
|
|
||||||
},
|
|
||||||
buttonCD: 0, //cool down for player buttons
|
buttonCD: 0, //cool down for player buttons
|
||||||
drawLeg(stroke) {
|
drawLeg(stroke) {
|
||||||
// if (simulation.mouseInGame.x > m.pos.x) {
|
// if (simulation.mouseInGame.x > m.pos.x) {
|
||||||
@@ -1567,7 +1564,7 @@ const m = {
|
|||||||
b.iceIX(1)
|
b.iceIX(1)
|
||||||
} else {
|
} else {
|
||||||
m.energy -= 0.45 * tech.droneEnergyReduction;
|
m.energy -= 0.45 * tech.droneEnergyReduction;
|
||||||
b.drone(1)
|
b.drone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -680,6 +680,7 @@ const powerUps = {
|
|||||||
if (
|
if (
|
||||||
(!tech.isSuperDeterminism || (target === 'tech' || target === 'heal' || target === 'ammo')) &&
|
(!tech.isSuperDeterminism || (target === 'tech' || target === 'heal' || target === 'ammo')) &&
|
||||||
!(tech.isEnergyNoAmmo && target === 'ammo') &&
|
!(tech.isEnergyNoAmmo && target === 'ammo') &&
|
||||||
|
!(tech.isNoHeals || target === 'heal') &&
|
||||||
(!simulation.isNoPowerUps || (target === 'research' || target === 'heal' || target === 'ammo'))
|
(!simulation.isNoPowerUps || (target === 'research' || target === 'heal' || target === 'ammo'))
|
||||||
) {
|
) {
|
||||||
powerUps.directSpawn(x, y, target, moving, mode, size)
|
powerUps.directSpawn(x, y, target, moving, mode, size)
|
||||||
|
|||||||
47
js/spawn.js
47
js/spawn.js
@@ -650,7 +650,7 @@ const spawn = {
|
|||||||
mobs.spawn(x, y, 8, radius, "rgb(255,150,100)"); //"#2c9790"
|
mobs.spawn(x, y, 8, radius, "rgb(255,150,100)"); //"#2c9790"
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
// Matter.Body.setDensity(me, 0.0007); //extra dense //normal is 0.001 //makes effective life much lower
|
// Matter.Body.setDensity(me, 0.0007); //extra dense //normal is 0.001 //makes effective life much lower
|
||||||
me.friction = 0;
|
me.friction = 0.1;
|
||||||
me.frictionAir = 0;
|
me.frictionAir = 0;
|
||||||
me.accelMag = 0.001 * Math.sqrt(simulation.accelScale);
|
me.accelMag = 0.001 * Math.sqrt(simulation.accelScale);
|
||||||
me.g = me.accelMag * 0.6; //required if using 'gravity'
|
me.g = me.accelMag * 0.6; //required if using 'gravity'
|
||||||
@@ -2537,7 +2537,7 @@ const spawn = {
|
|||||||
spawn.shield(me, x, y, 1);
|
spawn.shield(me, x, y, 1);
|
||||||
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
|
spawn.spawnOrbitals(me, radius + 50 + 200 * Math.random())
|
||||||
|
|
||||||
Matter.Body.setDensity(me, 0.01); //extra dense //normal is 0.001 //makes effective life much larger
|
Matter.Body.setDensity(me, 0.008); //extra dense //normal is 0.001 //makes effective life much larger
|
||||||
me.onDeath = function() {
|
me.onDeath = function() {
|
||||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||||
// this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed
|
// this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed
|
||||||
@@ -2727,6 +2727,49 @@ const spawn = {
|
|||||||
this.attraction();
|
this.attraction();
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
// exploder(x, y, radius = 40 + Math.ceil(Math.random() * 50)) {
|
||||||
|
// mobs.spawn(x, y, 4, radius, "rgb(255,0,0)");
|
||||||
|
// let me = mob[mob.length - 1];
|
||||||
|
// me.onHit = function() { //run this function on hitting player
|
||||||
|
// this.explode();
|
||||||
|
// };
|
||||||
|
// me.g = 0.0003; //required if using 'gravity'
|
||||||
|
// me.seePlayerFreq = 50 + Math.floor(Math.random() * 20)
|
||||||
|
// me.do = function() {
|
||||||
|
// this.gravity();
|
||||||
|
// if (!(simulation.cycle % this.seePlayerFreq)) {
|
||||||
|
// if (
|
||||||
|
// this.distanceToPlayer2() < this.seeAtDistance2 &&
|
||||||
|
// Matter.Query.ray(map, this.position, this.mPosRange()).length === 0 &&
|
||||||
|
// Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 &&
|
||||||
|
// !m.isCloak
|
||||||
|
// ) {
|
||||||
|
// this.foundPlayer();
|
||||||
|
// } else if (this.seePlayer.recall) {
|
||||||
|
// for (let i = 0; i < 20; i++) {
|
||||||
|
// let history = m.history[(m.cycle - 30 * i) % 600]
|
||||||
|
// if (Matter.Query.ray(map, this.position, history.position).length === 0) {
|
||||||
|
// this.seePlayer.recall = this.memory + Math.round(this.memory * Math.random()); //seconds before mob falls a sleep
|
||||||
|
// this.seePlayer.position.x = history.position.x;
|
||||||
|
// this.seePlayer.position.y = history.position.y;
|
||||||
|
|
||||||
|
// ctx.beginPath();
|
||||||
|
// ctx.moveTo(this.position.x, this.position.y);
|
||||||
|
// ctx.lineTo(history.position.x, history.position.y);
|
||||||
|
// ctx.lineWidth = 5;
|
||||||
|
// ctx.strokeStyle = "#000";
|
||||||
|
// ctx.stroke();
|
||||||
|
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// this.lostPlayer();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// this.checkStatus();
|
||||||
|
// this.attraction();
|
||||||
|
// };
|
||||||
|
// },
|
||||||
exploder(x, y, radius = 40 + Math.ceil(Math.random() * 50)) {
|
exploder(x, y, radius = 40 + Math.ceil(Math.random() * 50)) {
|
||||||
mobs.spawn(x, y, 4, radius, "rgb(255,0,0)");
|
mobs.spawn(x, y, 4, radius, "rgb(255,0,0)");
|
||||||
let me = mob[mob.length - 1];
|
let me = mob[mob.length - 1];
|
||||||
|
|||||||
178
js/tech.js
178
js/tech.js
@@ -417,7 +417,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isCrouchAmmo && !tech.isEnergyHealth
|
return tech.isCrouchAmmo && !tech.isEnergyHealth
|
||||||
},
|
},
|
||||||
requires: "desublimated ammunition<br>not mass-energy equivalence",
|
requires: "desublimated ammunition, not mass-energy",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isTurret = true
|
tech.isTurret = true
|
||||||
},
|
},
|
||||||
@@ -640,7 +640,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb
|
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb
|
||||||
},
|
},
|
||||||
requires: "drones, spores, missiles, foam<br>wave beam, neutron bomb",
|
requires: "drones, spores, missiles, foam, wave beam, neutron bomb",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isBulletsLastLonger += 0.3
|
tech.isBulletsLastLonger += 0.3
|
||||||
},
|
},
|
||||||
@@ -722,6 +722,7 @@
|
|||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
|
isBadRandomOption: true,
|
||||||
allowed() {
|
allowed() {
|
||||||
return !tech.isRewindGrenade && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField)
|
return !tech.isRewindGrenade && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField)
|
||||||
},
|
},
|
||||||
@@ -1329,9 +1330,9 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.throwChargeRate > 1
|
return tech.throwChargeRate > 1 && !tech.isNoHeals
|
||||||
},
|
},
|
||||||
requires: "mass driver",
|
requires: "mass driver, not ergodicity",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isBlockPowerUps = true
|
tech.isBlockPowerUps = true
|
||||||
},
|
},
|
||||||
@@ -1390,11 +1391,9 @@
|
|||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
name: "flip-flop",
|
name: "flip-flop",
|
||||||
description: `if <strong>flip-flop</strong> is <strong class="color-flop">ON</strong>, collisions set it to <strong class="color-flop">OFF</strong>
|
description: `unlock advanced <strong class='color-m'>tech</strong> that runs if flip-flop is <strong class="color-flop">ON</strong><br><strong>flip-flop</strong> toggles <strong class="color-flop">ON</strong> and <strong class="color-flop">OFF</strong> after a collision`,
|
||||||
<br>if <strong>flip-flop</strong> is <strong class="color-flop">OFF</strong>, collisions set it to <strong class="color-flop">ON</strong>`,
|
// description: `if <strong>flip-flop</strong> is <strong class="color-flop">ON</strong>, collisions set it to <strong class="color-flop">OFF</strong>
|
||||||
// description: `<strong>collisions</strong> toggle flip-flop <strong>ON</strong> and <strong>OFF</strong>
|
// <br>if <strong>flip-flop</strong> is <strong class="color-flop">OFF</strong>, collisions set it to <strong class="color-flop">ON</strong>`,
|
||||||
// <br><strong>ON</strong>: 0 collision <strong class='color-harm'>harm</strong>, <strong>OFF</strong>: <strong>25%</strong> extra <strong class='color-harm'>harm</strong>`,
|
|
||||||
// on your next <strong>collision</strong> take <strong>0</strong> <strong class='color-harm'>harm</strong>
|
|
||||||
nameInfo: "<span id = 'tech-flip-flop'></span>",
|
nameInfo: "<span id = 'tech-flip-flop'></span>",
|
||||||
addNameInfo() {
|
addNameInfo() {
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
@@ -1419,6 +1418,7 @@
|
|||||||
effect() {
|
effect() {
|
||||||
tech.isFlipFlop = true //do you have this tech?
|
tech.isFlipFlop = true //do you have this tech?
|
||||||
tech.isFlipFlopOn = true //what is the state of flip-Flop?
|
tech.isFlipFlopOn = true //what is the state of flip-Flop?
|
||||||
|
if (!m.isShipMode) {
|
||||||
m.draw = () => {
|
m.draw = () => {
|
||||||
ctx.fillStyle = m.fillColor;
|
ctx.fillStyle = m.fillColor;
|
||||||
m.walk_cycle += m.flipLegs * m.Vx;
|
m.walk_cycle += m.flipLegs * m.Vx;
|
||||||
@@ -1454,6 +1454,7 @@
|
|||||||
|
|
||||||
m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
|
m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.isFlipFlop = false
|
tech.isFlipFlop = false
|
||||||
@@ -1705,7 +1706,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return !tech.isEnergyHealth && (m.harmReduction() < 1 || tech.isFlipFlopHarm)
|
return !tech.isEnergyHealth && (m.harmReduction() < 1 || tech.isFlipFlopHarm)
|
||||||
},
|
},
|
||||||
requires: "not mass-energy equivalence, some harm reduction",
|
requires: "not mass-energy, some harm reduction",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isPiezo = true;
|
tech.isPiezo = true;
|
||||||
m.energy += 20.48;
|
m.energy += 20.48;
|
||||||
@@ -1767,9 +1768,9 @@
|
|||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.isEnergyHealth
|
return tech.isEnergyHealth && !tech.isNoHeals
|
||||||
},
|
},
|
||||||
requires: "mass-energy equivalence",
|
requires: "mass-energy equivalence, not ergodicity",
|
||||||
effect() {
|
effect() {
|
||||||
tech.healGiveMaxEnergy = true; //tech.healMaxEnergyBonus given from heal power up
|
tech.healGiveMaxEnergy = true; //tech.healMaxEnergyBonus given from heal power up
|
||||||
powerUps.heal.color = "#0ae"
|
powerUps.heal.color = "#0ae"
|
||||||
@@ -1945,9 +1946,9 @@
|
|||||||
frequency: 1,
|
frequency: 1,
|
||||||
isHealTech: true,
|
isHealTech: true,
|
||||||
allowed() {
|
allowed() {
|
||||||
return !tech.isEnergyHealth
|
return !tech.isEnergyHealth && !tech.isNoHeals
|
||||||
},
|
},
|
||||||
requires: "not mass-energy equivalence",
|
requires: "not mass-energy equivalence, ergodicity",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isHealthRecovery = true;
|
tech.isHealthRecovery = true;
|
||||||
},
|
},
|
||||||
@@ -2027,9 +2028,9 @@
|
|||||||
frequency: 1,
|
frequency: 1,
|
||||||
isHealTech: true,
|
isHealTech: true,
|
||||||
allowed() {
|
allowed() {
|
||||||
return !tech.isEnergyHealth && tech.damageFromTech() > 1
|
return !tech.isEnergyHealth && tech.damageFromTech() > 1 && !tech.isNoHeals
|
||||||
},
|
},
|
||||||
requires: "some increased damage, not mass-energy equivalence",
|
requires: "some increased damage, not mass-energy equivalence, ergodicity",
|
||||||
effect() {
|
effect() {
|
||||||
tech.healthDrain += 0.03;
|
tech.healthDrain += 0.03;
|
||||||
},
|
},
|
||||||
@@ -2059,9 +2060,9 @@
|
|||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
allowed() {
|
allowed() {
|
||||||
return !tech.isEnergyHealth
|
return !tech.isEnergyHealth && !tech.isNoHeals
|
||||||
},
|
},
|
||||||
requires: "not mass-energy equivalence",
|
requires: "not mass-energy equivalence, ergodicity",
|
||||||
effect() {
|
effect() {
|
||||||
tech.bonusHealth += 0.5
|
tech.bonusHealth += 0.5
|
||||||
m.addHealth(0.50)
|
m.addHealth(0.50)
|
||||||
@@ -2079,9 +2080,9 @@
|
|||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
allowed() {
|
allowed() {
|
||||||
return !tech.isEnergyHealth && !tech.isDroneGrab
|
return !tech.isEnergyHealth && !tech.isDroneGrab && !tech.isNoHeals
|
||||||
},
|
},
|
||||||
requires: "not mass-energy equivalence, not drone harvester",
|
requires: "not mass-energy equivalence, not drone harvester, ergodicity",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isArmorFromPowerUps = true; //tracked by tech.armorFromPowerUps
|
tech.isArmorFromPowerUps = true; //tracked by tech.armorFromPowerUps
|
||||||
},
|
},
|
||||||
@@ -2114,9 +2115,9 @@
|
|||||||
frequency: 1,
|
frequency: 1,
|
||||||
isHealTech: true,
|
isHealTech: true,
|
||||||
allowed() {
|
allowed() {
|
||||||
return m.health > 0.1 && (m.maxHealth > 1 || tech.isArmorFromPowerUps)
|
return m.health > 0.1 && (m.maxHealth > 1 || tech.isArmorFromPowerUps) && !tech.isNoHeals
|
||||||
},
|
},
|
||||||
requires: "increased max health",
|
requires: "increased max health, not ergodicity",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isHealLowHealth = true;
|
tech.isHealLowHealth = true;
|
||||||
},
|
},
|
||||||
@@ -2131,9 +2132,9 @@
|
|||||||
frequency: 1,
|
frequency: 1,
|
||||||
isHealTech: true,
|
isHealTech: true,
|
||||||
allowed() {
|
allowed() {
|
||||||
return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth
|
return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth && !tech.isNoHeals
|
||||||
},
|
},
|
||||||
requires: "not mass-energy equivalence",
|
requires: "not mass-energy equivalence, ergodicity",
|
||||||
effect() {
|
effect() {
|
||||||
tech.largerHeals++;
|
tech.largerHeals++;
|
||||||
},
|
},
|
||||||
@@ -2149,9 +2150,9 @@
|
|||||||
frequency: 1,
|
frequency: 1,
|
||||||
isNonRefundable: true,
|
isNonRefundable: true,
|
||||||
allowed() {
|
allowed() {
|
||||||
return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection)
|
return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isNoHeals
|
||||||
},
|
},
|
||||||
requires: "",
|
requires: "health > 70%, not ergodicity",
|
||||||
effect() {
|
effect() {
|
||||||
for (let i = 0; i < 12; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal");
|
for (let i = 0; i < 12; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal");
|
||||||
for (let i = 0, len = tech.tech.length; i < len; i++) {
|
for (let i = 0, len = tech.tech.length; i < len; i++) {
|
||||||
@@ -2335,7 +2336,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste
|
return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste
|
||||||
},
|
},
|
||||||
requires: "not superdeterminism or Ψ(t) collapse<br>no research",
|
requires: "not superdeterminism or Ψ(t) collapse, no research",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
tech.manyWorlds = true;
|
tech.manyWorlds = true;
|
||||||
},
|
},
|
||||||
@@ -2650,28 +2651,6 @@
|
|||||||
remove() {
|
remove() {
|
||||||
tech.isMineDrop = false;
|
tech.isMineDrop = false;
|
||||||
}
|
}
|
||||||
}, {
|
|
||||||
name: "dark patterns",
|
|
||||||
description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>18</strong> <strong class='color-j'>JUNK</strong> <strong class='color-m'>tech</strong> to the potential pool",
|
|
||||||
maxCount: 1,
|
|
||||||
count: 0,
|
|
||||||
frequency: 1,
|
|
||||||
allowed() {
|
|
||||||
return level.onLevel < 8 && level.onLevel > 0
|
|
||||||
},
|
|
||||||
requires: "between levels 1 and 7",
|
|
||||||
effect() {
|
|
||||||
level.difficultyDecrease(simulation.difficultyMode)
|
|
||||||
simulation.makeTextLog(`simulation.difficultyMode<span class='color-symbol'>--</span>`)
|
|
||||||
tech.addJunkTechToPool(18)
|
|
||||||
// for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i])
|
|
||||||
},
|
|
||||||
remove() {
|
|
||||||
if (this.count > 0) {
|
|
||||||
tech.removeJunkTechFromPool(18)
|
|
||||||
level.difficultyIncrease(simulation.difficultyMode)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
}, {
|
||||||
name: "unified field theory",
|
name: "unified field theory",
|
||||||
description: `in the <strong>pause</strong> menu, change your <strong class='color-f'>field</strong><br>by <strong>clicking</strong> on your <strong class='color-f'>field's</strong> box`,
|
description: `in the <strong>pause</strong> menu, change your <strong class='color-f'>field</strong><br>by <strong>clicking</strong> on your <strong class='color-f'>field's</strong> box`,
|
||||||
@@ -2792,6 +2771,50 @@
|
|||||||
for (let i = 0; i < 5; i++) powerUps.removeRandomTech()
|
for (let i = 0; i < 5; i++) powerUps.removeRandomTech()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "dark patterns",
|
||||||
|
description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>18</strong> <strong class='color-j'>JUNK</strong> <strong class='color-m'>tech</strong> to the potential pool",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 1,
|
||||||
|
allowed() {
|
||||||
|
return level.onLevel < 8 && level.onLevel > 0
|
||||||
|
},
|
||||||
|
requires: "between levels 1 and 7",
|
||||||
|
effect() {
|
||||||
|
level.difficultyDecrease(simulation.difficultyMode)
|
||||||
|
simulation.makeTextLog(`simulation.difficultyMode <span class='color-symbol'>--</span>`)
|
||||||
|
tech.addJunkTechToPool(18)
|
||||||
|
// for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i])
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
if (this.count > 0) {
|
||||||
|
tech.removeJunkTechFromPool(18)
|
||||||
|
level.difficultyIncrease(simulation.difficultyMode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: "ergodicity",
|
||||||
|
description: "reduce combat <strong>difficulty</strong> by <strong>2 levels</strong><br>all <strong class='color-h'>healing</strong> has <strong>no</strong> effect",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 1,
|
||||||
|
allowed() {
|
||||||
|
return level.onLevel > 1
|
||||||
|
},
|
||||||
|
requires: "past levels 1",
|
||||||
|
effect() {
|
||||||
|
tech.isNoHeals = true;
|
||||||
|
level.difficultyDecrease(simulation.difficultyMode * 2)
|
||||||
|
simulation.makeTextLog(`simulation.difficultyMode <span class='color-symbol'>-=</span> 2`)
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
tech.isNoHeals = false;
|
||||||
|
if (this.count > 0) {
|
||||||
|
level.difficultyIncrease(simulation.difficultyMode * 2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
//**************************************************
|
//**************************************************
|
||||||
//************************************************** gun
|
//************************************************** gun
|
||||||
//************************************************** tech
|
//************************************************** tech
|
||||||
@@ -3053,7 +3076,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + tech.isNailShot + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce)) * 2 > 1) && !tech.isIceCrystals
|
return (tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + tech.isNailShot + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce)) * 2 > 1) && !tech.isIceCrystals
|
||||||
},
|
},
|
||||||
requires: "nails, rivets, nonceramic needles, not ice crystals",
|
requires: "nails, rivets, not ceramic needles, not ice crystals",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isNailRadiation = true;
|
tech.isNailRadiation = true;
|
||||||
},
|
},
|
||||||
@@ -3606,7 +3629,7 @@
|
|||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
name: "reduced tolerances",
|
name: "reduced tolerances",
|
||||||
description: "reduce all <strong>drone</strong> production costs by <strong>66%</strong><br>reduce the average <strong>drone</strong> lifetime by <strong>45%</strong>",
|
description: "reduce all <strong>drone</strong> production costs by <strong>66%</strong><br>reduce the average <strong>drone</strong> lifetime by <strong>40%</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 3,
|
maxCount: 3,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -3616,7 +3639,7 @@
|
|||||||
},
|
},
|
||||||
requires: "drones",
|
requires: "drones",
|
||||||
effect() {
|
effect() {
|
||||||
tech.droneCycleReduction = Math.pow(0.55, 1 + this.count)
|
tech.droneCycleReduction = Math.pow(0.6, 1 + this.count)
|
||||||
tech.droneEnergyReduction = Math.pow(0.333, 1 + this.count)
|
tech.droneEnergyReduction = Math.pow(0.333, 1 + this.count)
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * Math.pow(3, this.count)
|
if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * Math.pow(3, this.count)
|
||||||
@@ -3923,7 +3946,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("laser") && tech.isWideLaser
|
return tech.haveGunCheck("laser") && tech.isWideLaser
|
||||||
},
|
},
|
||||||
requires: "laser, not specular reflection<br>not diffraction grating",
|
requires: "laser, not specular reflection, not diffraction grating",
|
||||||
effect() {
|
effect() {
|
||||||
tech.wideLaser += 2
|
tech.wideLaser += 2
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
@@ -4707,9 +4730,29 @@
|
|||||||
// },
|
// },
|
||||||
// remove() {}
|
// remove() {}
|
||||||
// },
|
// },
|
||||||
|
{
|
||||||
|
name: "disintegrated armament",
|
||||||
|
description: "spawn a <strong class='color-g'>gun</strong><br><strong>remove</strong> your active <strong class='color-g'>gun</strong>",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 0,
|
||||||
|
isNonRefundable: true,
|
||||||
|
isExperimentHide: true,
|
||||||
|
isJunk: true,
|
||||||
|
allowed() {
|
||||||
|
return b.inventory.length > 0
|
||||||
|
},
|
||||||
|
requires: "at least 1 gun",
|
||||||
|
effect() {
|
||||||
|
if (b.activeGun && b.inventory.length > 0) b.removeGun(b.guns[b.activeGun].name)
|
||||||
|
simulation.makeGunHUD()
|
||||||
|
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "gun");
|
||||||
|
},
|
||||||
|
remove() {}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "probability",
|
name: "probability",
|
||||||
description: "increase the <strong class='flicker'>frequency</strong><br>of a random <strong class='color-m'>tech</strong> by <strong>100</strong>",
|
description: "increase the <strong class='flicker'>frequency</strong><br>of one random <strong class='color-m'>tech</strong> by <strong>100</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 0,
|
frequency: 0,
|
||||||
@@ -4871,6 +4914,30 @@
|
|||||||
document.getElementById("health-bg").style.left = "86px"
|
document.getElementById("health-bg").style.left = "86px"
|
||||||
},
|
},
|
||||||
remove() {}
|
remove() {}
|
||||||
|
}, {
|
||||||
|
name: "repartitioning",
|
||||||
|
description: "set the <strong class='flicker'>frequency</strong> of finding normal <strong class='color-m'>tech</strong> to <strong>0</strong><br>spawn 5 <strong class='color-m'>tech</strong>",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 0,
|
||||||
|
isNonRefundable: true,
|
||||||
|
isExperimentHide: true,
|
||||||
|
isJunk: true,
|
||||||
|
allowed() {
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
requires: "",
|
||||||
|
effect() {
|
||||||
|
for (let i = 0, len = tech.tech.length; i < len; i++) {
|
||||||
|
if (tech.tech[i].isJunk) {
|
||||||
|
tech.tech[i].frequency = 1
|
||||||
|
} else {
|
||||||
|
tech.tech[i].frequency = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x, m.pos.y, "tech");
|
||||||
|
},
|
||||||
|
remove() {}
|
||||||
}, {
|
}, {
|
||||||
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",
|
||||||
@@ -5825,5 +5892,6 @@
|
|||||||
isMetaAnalysis: null,
|
isMetaAnalysis: null,
|
||||||
isFoamAttract: null,
|
isFoamAttract: null,
|
||||||
droneCycleReduction: null,
|
droneCycleReduction: null,
|
||||||
droneEnergyReduction: null
|
droneEnergyReduction: null,
|
||||||
|
isNoHeals: null
|
||||||
}
|
}
|
||||||
22
style.css
22
style.css
@@ -300,13 +300,29 @@ summary {
|
|||||||
.experiment-grid-disabled {
|
.experiment-grid-disabled {
|
||||||
/* opacity: 0.5; */
|
/* opacity: 0.5; */
|
||||||
background-color: var(--build-bg-color);
|
background-color: var(--build-bg-color);
|
||||||
color: rgba(0, 0, 0, 0.2);
|
/* color: rgba(0, 0, 0, 0.9); */
|
||||||
|
color: #000;
|
||||||
|
opacity: 0.25;
|
||||||
/* transition: background-color 1s, color 1s; */
|
/* transition: background-color 1s, color 1s; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.experiment-grid-disabled:hover {
|
.experiment-grid-disabled[data-descr] {
|
||||||
/* background-color: #fff; */
|
position: relative;
|
||||||
|
/* opacity: 0; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.experiment-grid-disabled[data-descr]:hover::after {
|
||||||
|
content: '\a \00a0 \00a0 \00a0 REQUIRES:\a''\00a0 \00a0 \00a0 'attr(data-descr);
|
||||||
|
white-space: pre-wrap;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
background-color: var(--build-bg-color);
|
background-color: var(--build-bg-color);
|
||||||
|
z-index: 1;
|
||||||
|
opacity: 1;
|
||||||
|
transition: opacity 0.5s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
#info {
|
#info {
|
||||||
|
|||||||
16
todo.txt
16
todo.txt
@@ -1,8 +1,8 @@
|
|||||||
******************************************************** NEXT PATCH ********************************************************
|
******************************************************** NEXT PATCH ********************************************************
|
||||||
|
|
||||||
fixed and renamed the new drone tech (it wasn't working right)
|
tech requirement info UI updated in experiment mode
|
||||||
|
|
||||||
level bosses will do about 50% less damage on collisions, but they will take about 33% more to kill
|
tech: ergodicity - remove heal power ups and heal tech, reduce difficulty by 2 levels
|
||||||
|
|
||||||
|
|
||||||
******************************************************** BUGS ********************************************************
|
******************************************************** BUGS ********************************************************
|
||||||
@@ -36,13 +36,22 @@ fix door.isOpen actually meaning isClosed?
|
|||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** TODO ********************************************************
|
||||||
|
|
||||||
damage circles when you have MEE should be field color
|
reset on experiment menu should clear power ups and bullets
|
||||||
|
|
||||||
|
|
||||||
|
give pulsars attraction if with in distance range
|
||||||
|
|
||||||
|
should blocks block mob vision?
|
||||||
|
mobs will attack player in the starting room though...
|
||||||
|
Matter.Query.ray(map, this.position, this.mPosRange()).length === 0 &&
|
||||||
|
Matter.Query.ray(body, this.position, this.mPosRange()).length === 0 &&
|
||||||
|
|
||||||
mob vision: look at player history
|
mob vision: look at player history
|
||||||
build a new type of attraction for mobs
|
build a new type of attraction for mobs
|
||||||
if mobs can't see player, they check to see if they can see where the player was in the history
|
if mobs can't see player, they check to see if they can see where the player was in the history
|
||||||
if mobs can't see player, they could check to see if they can find player in the past
|
if mobs can't see player, they could check to see if they can find player in the past
|
||||||
https://abitawake.com/news/articles/enemy-ai-chasing-a-player-without-navigation2d-or-a-star-pathfinding
|
https://abitawake.com/news/articles/enemy-ai-chasing-a-player-without-navigation2d-or-a-star-pathfinding
|
||||||
|
write find in spawn undo exploder, but commented out
|
||||||
|
|
||||||
tech: chitin - take 50% less damage, reduce harm reduction by 5% after each collision
|
tech: chitin - take 50% less damage, reduce harm reduction by 5% after each collision
|
||||||
|
|
||||||
@@ -308,7 +317,6 @@ n-gon outreach ideas
|
|||||||
|
|
||||||
possible names for tech
|
possible names for tech
|
||||||
strange loop
|
strange loop
|
||||||
perturbation theory
|
|
||||||
holonomy - parallel transport of a vector leads to movement (applies to curved space)
|
holonomy - parallel transport of a vector leads to movement (applies to curved space)
|
||||||
hypergolic - A hypergolic propellant combination used in a rocket engine is one whose components spontaneously ignite when they come into contact with each other.
|
hypergolic - A hypergolic propellant combination used in a rocket engine is one whose components spontaneously ignite when they come into contact with each other.
|
||||||
uncertainty principle
|
uncertainty principle
|
||||||
|
|||||||
Reference in New Issue
Block a user