diff --git a/.DS_Store b/.DS_Store index 37acef0..cfe0883 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index 6f662fe..ede78cd 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -2023,13 +2023,13 @@ const b = { // 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 THRUST = tech.isFastDrones ? 0.0023 : 0.0015 // const FRICTION = tech.isFastDrones ? 0.008 : 0.0005 const dir = m.angle + 0.4 * (Math.random() - 0.5); 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, inertia: Infinity, friction: 0.05, @@ -2037,7 +2037,7 @@ const b = { restitution: 1, dmg: 0.24, //damage done in addition to the damage from momentum 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", collisionFilter: { category: cat.bullet, @@ -4034,10 +4034,10 @@ const b = { have: false, fire() { 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 } else { - b.drone(1) + b.drone() m.fireCDcycle = m.cycle + Math.floor(6 * b.fireCD); // cool down } } diff --git a/js/index.js b/js/index.js index 3b49285..1aad4dd 100644 --- a/js/index.js +++ b/js/index.js @@ -341,7 +341,9 @@ const build = { techID.setAttribute("onClick", `javascript: build.choosePowerUp(this,${i},'tech')`); } } else { - techID.innerHTML = `
${tech.tech[i].name}
requires: ${tech.tech[i].requires}` + // techID.innerHTML = `
${tech.tech[i].name}
requires: ${tech.tech[i].requires}` + // techID.innerHTML = `
${tech.tech[i].name}
requires: ${tech.tech[i].requires}` + techID.innerHTML = `
${tech.tech[i].name}
${tech.tech[i].description}` if (!techID.classList.contains("experiment-grid-disabled")) { techID.classList.add("experiment-grid-disabled"); techID.onclick = null @@ -403,7 +405,8 @@ const build = { text += `
  ${tech.tech[i].name}
${tech.tech[i].description}
` } } else { - text += `
${tech.tech[i].name}
requires: ${tech.tech[i].requires}
` + // text += `
${tech.tech[i].name}
requires: ${tech.tech[i].requires}
` + text += `
${tech.tech[i].name}
${tech.tech[i].description}
` } } } @@ -415,6 +418,14 @@ const build = { document.getElementById("difficulty-select").value = document.getElementById("difficulty-select-experiment").value 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() { build.isExperimentSelection = true; diff --git a/js/level.js b/js/level.js index 4557df8..762d70c 100644 --- a/js/level.js +++ b/js/level.js @@ -1102,7 +1102,7 @@ const level = { // simulation.difficulty = 30 // spawn.starter(1900, -500, 200) //big boy - // spawn.pulsar(1900, -500) + spawn.exploder(1900, -500) // spawn.pulsarBoss(1900, -500) // spawn.historyBoss(1900, -500) // spawn.ghoster(2900, -500) @@ -1115,7 +1115,7 @@ const level = { // spawn.streamBoss(1600, -500) // spawn.orbitalBoss(1600, -500) // spawn.cellBossCulture(1600, -500) - spawn.shieldingBoss(1600, -500) + // spawn.shieldingBoss(1600, -500) // spawn.beamer(1200, -500) // spawn.shield(mob[mob.length - 1], 1800, -120, 1); diff --git a/js/player.js b/js/player.js index 6a995da..91aba68 100644 --- a/js/player.js +++ b/js/player.js @@ -478,7 +478,7 @@ const m = { } }, addHealth(heal) { - if (!tech.isEnergyHealth) { + if (!tech.isEnergyHealth && !tech.isNoHeals) { m.health += heal * simulation.healScale; if (m.health > m.maxHealth) m.health = m.maxHealth; m.displayHealth(); @@ -633,7 +633,7 @@ const m = { 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 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" // } }, - hitMob(i, dmg) { - //prevents damage happening too quick - }, buttonCD: 0, //cool down for player buttons drawLeg(stroke) { // if (simulation.mouseInGame.x > m.pos.x) { @@ -1567,7 +1564,7 @@ const m = { b.iceIX(1) } else { m.energy -= 0.45 * tech.droneEnergyReduction; - b.drone(1) + b.drone() } } diff --git a/js/powerup.js b/js/powerup.js index a9a67a9..362033b 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -680,6 +680,7 @@ const powerUps = { if ( (!tech.isSuperDeterminism || (target === 'tech' || target === 'heal' || target === 'ammo')) && !(tech.isEnergyNoAmmo && target === 'ammo') && + !(tech.isNoHeals || target === 'heal') && (!simulation.isNoPowerUps || (target === 'research' || target === 'heal' || target === 'ammo')) ) { powerUps.directSpawn(x, y, target, moving, mode, size) diff --git a/js/spawn.js b/js/spawn.js index adb89f6..861ed30 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -650,7 +650,7 @@ const spawn = { mobs.spawn(x, y, 8, radius, "rgb(255,150,100)"); //"#2c9790" let me = mob[mob.length - 1]; // 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.accelMag = 0.001 * Math.sqrt(simulation.accelScale); me.g = me.accelMag * 0.6; //required if using 'gravity' @@ -2537,7 +2537,7 @@ const spawn = { spawn.shield(me, x, y, 1); 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() { 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 @@ -2727,6 +2727,49 @@ const spawn = { 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)) { mobs.spawn(x, y, 4, radius, "rgb(255,0,0)"); let me = mob[mob.length - 1]; diff --git a/js/tech.js b/js/tech.js index a5c2a97..01a6db7 100644 --- a/js/tech.js +++ b/js/tech.js @@ -417,7 +417,7 @@ allowed() { return tech.isCrouchAmmo && !tech.isEnergyHealth }, - requires: "desublimated ammunition
not mass-energy equivalence", + requires: "desublimated ammunition, not mass-energy", effect() { tech.isTurret = true }, @@ -640,7 +640,7 @@ 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 }, - requires: "drones, spores, missiles, foam
wave beam, neutron bomb", + requires: "drones, spores, missiles, foam, wave beam, neutron bomb", effect() { tech.isBulletsLastLonger += 0.3 }, @@ -722,6 +722,7 @@ maxCount: 1, count: 0, frequency: 1, + isBadRandomOption: true, allowed() { 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, frequencyDefault: 2, allowed() { - return tech.throwChargeRate > 1 + return tech.throwChargeRate > 1 && !tech.isNoHeals }, - requires: "mass driver", + requires: "mass driver, not ergodicity", effect() { tech.isBlockPowerUps = true }, @@ -1390,11 +1391,9 @@ } }, { name: "flip-flop", - description: `if flip-flop is ON, collisions set it to OFF -
if flip-flop is OFF, collisions set it to ON`, - // description: `collisions toggle flip-flop ON and OFF - //
ON: 0 collision harm, OFF: 25% extra harm`, - // on your next collision take 0 harm + description: `unlock advanced tech that runs if flip-flop is ON
flip-flop toggles ON and OFF after a collision`, + // description: `if flip-flop is ON, collisions set it to OFF + //
if flip-flop is OFF, collisions set it to ON`, nameInfo: "", addNameInfo() { setTimeout(function() { @@ -1419,40 +1418,42 @@ effect() { tech.isFlipFlop = true //do you have this tech? tech.isFlipFlopOn = true //what is the state of flip-Flop? - m.draw = () => { - ctx.fillStyle = m.fillColor; - m.walk_cycle += m.flipLegs * m.Vx; + if (!m.isShipMode) { + m.draw = () => { + 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); + //draw body + 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"); + 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); - let grd = ctx.createLinearGradient(-30, 0, 30, 0); - grd.addColorStop(0, m.fillColorDark); - grd.addColorStop(1, m.fillColor); - ctx.fillStyle = grd; - ctx.fill(); - ctx.arc(15, 0, 4, 0, 2 * Math.PI); - ctx.strokeStyle = "#333"; - ctx.lineWidth = 2; - ctx.stroke(); - //draw eye - ctx.beginPath(); - ctx.arc(15, 0, 3.5, 0, 2 * Math.PI); - ctx.fillStyle = m.eyeFillColor; - ctx.fill() - ctx.restore(); + ctx.rotate(m.angle); + ctx.beginPath(); + ctx.arc(0, 0, 30, 0, 2 * Math.PI); + let grd = ctx.createLinearGradient(-30, 0, 30, 0); + grd.addColorStop(0, m.fillColorDark); + grd.addColorStop(1, m.fillColor); + ctx.fillStyle = grd; + ctx.fill(); + ctx.arc(15, 0, 4, 0, 2 * Math.PI); + ctx.strokeStyle = "#333"; + ctx.lineWidth = 2; + ctx.stroke(); + //draw eye + ctx.beginPath(); + ctx.arc(15, 0, 3.5, 0, 2 * Math.PI); + ctx.fillStyle = m.eyeFillColor; + ctx.fill() + ctx.restore(); - 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() { @@ -1705,7 +1706,7 @@ allowed() { return !tech.isEnergyHealth && (m.harmReduction() < 1 || tech.isFlipFlopHarm) }, - requires: "not mass-energy equivalence, some harm reduction", + requires: "not mass-energy, some harm reduction", effect() { tech.isPiezo = true; m.energy += 20.48; @@ -1767,9 +1768,9 @@ count: 0, frequency: 1, allowed() { - return tech.isEnergyHealth + return tech.isEnergyHealth && !tech.isNoHeals }, - requires: "mass-energy equivalence", + requires: "mass-energy equivalence, not ergodicity", effect() { tech.healGiveMaxEnergy = true; //tech.healMaxEnergyBonus given from heal power up powerUps.heal.color = "#0ae" @@ -1945,9 +1946,9 @@ frequency: 1, isHealTech: true, allowed() { - return !tech.isEnergyHealth + return !tech.isEnergyHealth && !tech.isNoHeals }, - requires: "not mass-energy equivalence", + requires: "not mass-energy equivalence, ergodicity", effect() { tech.isHealthRecovery = true; }, @@ -2027,9 +2028,9 @@ frequency: 1, isHealTech: true, 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() { tech.healthDrain += 0.03; }, @@ -2059,9 +2060,9 @@ count: 0, frequency: 1, allowed() { - return !tech.isEnergyHealth + return !tech.isEnergyHealth && !tech.isNoHeals }, - requires: "not mass-energy equivalence", + requires: "not mass-energy equivalence, ergodicity", effect() { tech.bonusHealth += 0.5 m.addHealth(0.50) @@ -2079,9 +2080,9 @@ count: 0, frequency: 1, 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() { tech.isArmorFromPowerUps = true; //tracked by tech.armorFromPowerUps }, @@ -2114,9 +2115,9 @@ frequency: 1, isHealTech: true, 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() { tech.isHealLowHealth = true; }, @@ -2131,9 +2132,9 @@ frequency: 1, isHealTech: true, 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() { tech.largerHeals++; }, @@ -2149,9 +2150,9 @@ frequency: 1, isNonRefundable: true, 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() { 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++) { @@ -2335,7 +2336,7 @@ allowed() { return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste }, - requires: "not superdeterminism or Ψ(t) collapse
no research", + requires: "not superdeterminism or Ψ(t) collapse, no research", effect: () => { tech.manyWorlds = true; }, @@ -2650,28 +2651,6 @@ remove() { tech.isMineDrop = false; } - }, { - name: "dark patterns", - description: "reduce combat difficulty by 1 level
add 18 JUNK tech 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--`) - 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", description: `in the pause menu, change your field
by clicking on your field's box`, @@ -2792,6 +2771,50 @@ for (let i = 0; i < 5; i++) powerUps.removeRandomTech() } }, + { + name: "dark patterns", + description: "reduce combat difficulty by 1 level
add 18 JUNK tech 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 --`) + 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 difficulty by 2 levels
all healing has no 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 -= 2`) + }, + remove() { + tech.isNoHeals = false; + if (this.count > 0) { + level.difficultyIncrease(simulation.difficultyMode * 2) + } + } + }, //************************************************** //************************************************** gun //************************************************** tech @@ -3053,7 +3076,7 @@ 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 }, - requires: "nails, rivets, nonceramic needles, not ice crystals", + requires: "nails, rivets, not ceramic needles, not ice crystals", effect() { tech.isNailRadiation = true; }, @@ -3606,7 +3629,7 @@ } }, { name: "reduced tolerances", - description: "reduce all drone production costs by 66%
reduce the average drone lifetime by 45%", + description: "reduce all drone production costs by 66%
reduce the average drone lifetime by 40%", isGunTech: true, maxCount: 3, count: 0, @@ -3616,7 +3639,7 @@ }, requires: "drones", 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) 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) @@ -3923,7 +3946,7 @@ allowed() { return tech.haveGunCheck("laser") && tech.isWideLaser }, - requires: "laser, not specular reflection
not diffraction grating", + requires: "laser, not specular reflection, not diffraction grating", effect() { tech.wideLaser += 2 for (i = 0, len = b.guns.length; i < len; i++) { //find which gun @@ -4707,9 +4730,29 @@ // }, // remove() {} // }, + { + name: "disintegrated armament", + description: "spawn a gun
remove your active gun", + 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", - description: "increase the frequency
of a random tech by 100", + description: "increase the frequency
of one random tech by 100", maxCount: 1, count: 0, frequency: 0, @@ -4871,6 +4914,30 @@ document.getElementById("health-bg").style.left = "86px" }, remove() {} + }, { + name: "repartitioning", + description: "set the frequency of finding normal tech to 0
spawn 5 tech", + 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", description: "set the frequency of finding JUNK tech to zero", @@ -5825,5 +5892,6 @@ isMetaAnalysis: null, isFoamAttract: null, droneCycleReduction: null, - droneEnergyReduction: null + droneEnergyReduction: null, + isNoHeals: null } \ No newline at end of file diff --git a/style.css b/style.css index 88ae013..57021ee 100644 --- a/style.css +++ b/style.css @@ -300,13 +300,29 @@ summary { .experiment-grid-disabled { /* opacity: 0.5; */ 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; */ } -.experiment-grid-disabled:hover { - /* background-color: #fff; */ +.experiment-grid-disabled[data-descr] { + 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); + z-index: 1; + opacity: 1; + transition: opacity 0.5s ease; } #info { diff --git a/todo.txt b/todo.txt index 0bf10d1..176ddaa 100644 --- a/todo.txt +++ b/todo.txt @@ -1,8 +1,8 @@ ******************************************************** NEXT PATCH ******************************************************** + +tech requirement info UI updated in experiment mode -fixed and renamed the new drone tech (it wasn't working right) - -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 ******************************************************** @@ -36,13 +36,22 @@ fix door.isOpen actually meaning isClosed? ******************************************************** 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 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 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 + write find in spawn undo exploder, but commented out 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 strange loop - perturbation theory 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. uncertainty principle