From ef8ae4259162eaec1caadaca558efd1cd3a222b3 Mon Sep 17 00:00:00 2001 From: landgreen Date: Sun, 10 Jan 2021 05:19:13 -0800 Subject: [PATCH] wide laser tech: antiscience - 100% damage, but lose 11 health when you pick up a tech tech: laser widebeam + output coupler can now stack up to 9x (was 1x) but it not longer works with tech: slow light propagation --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 224 +++++++++++++++++++++++------------------------ js/level.js | 13 ++- js/lore.js | 64 ++++++++------ js/player.js | 25 +++--- js/powerup.js | 17 ++-- js/simulation.js | 56 ++++++------ js/tech.js | 47 ++++++---- todo.txt | 15 ++-- 9 files changed, 239 insertions(+), 222 deletions(-) diff --git a/.DS_Store b/.DS_Store index b364452fe8195c3085d42b6ee9c1d334bf6b4fd7..20686d108dc12b77bc51a0a45fb7bbf7bc780791 100644 GIT binary patch delta 94 zcmZoMXffEJ#T@96$-uzC#E`{MoSX0Bl9ZF51mtsEboUl|a{iDbLM{cTTtS9maB_Zb Q0Z=UigTR8#)y$nD0MBO`@&Et; delta 94 zcmZoMXffEJ#T>|YlYxPOi6M)jI5*$LB`GIA3CQPY`MElL`{_fD2)PuTas?TN!O8i# Q1wge73<3e0tC>4R05i-Rk^lez diff --git a/js/bullet.js b/js/bullet.js index 89302cb..b5e71b3 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1358,6 +1358,81 @@ const b = { ctx.globalAlpha = 1; } }, + laserMine(position, velocity = { x: 0, y: -8 }) { + const me = bullet.length; + bullet[me] = Bodies.polygon(position.x, position.y, 3, 25, { + bulletType: "mine", + angle: mech.angle, + friction: 0, + frictionAir: 0.05, + restitution: 0.5, + dmg: 0, // 0.14 //damage done in addition to the damage from momentum + minDmgSpeed: 2, + lookFrequency: 60 + Math.floor(7 * Math.random()), + drain: tech.isLaserDiode * tech.laserFieldDrain, + isArmed: false, + torqueMagnitude: 0.000003 * (Math.round(Math.random()) ? 1 : -1), + range: 1500, + endCycle: Infinity, + classType: "bullet", + collisionFilter: { + category: cat.bullet, + mask: cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield + }, + beforeDmg() {}, + onEnd() { + if (tech.isMineAmmoBack && (!this.isArmed || Math.random() < 0.2)) { //get ammo back from tech.isMineAmmoBack + for (i = 0, len = b.guns.length; i < len; i++) { //find which gun + if (b.guns[i].name === "mine") { + b.guns[i].ammo++ + simulation.updateGunHUD(); + break; + } + } + } + }, + do() { + if (!(simulation.cycle % this.lookFrequency) && mech.energy > this.drain) { //find mob targets + for (let i = 0, len = mob.length; i < len; ++i) { + if ( + Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 2000000 && + mob[i].dropPowerUp && + Matter.Query.ray(map, this.position, mob[i].position).length === 0 && + Matter.Query.ray(body, this.position, mob[i].position).length === 0 + ) { + this.do = this.laserSpin + this.endCycle = simulation.cycle + 300 + // if (this.angularSpeed < 0.01) this.torque += this.inertia * this.torqueMagnitude * 5 //spin + this.isArmed = true + } + } + } + }, + reflections: Math.max(0, tech.laserReflections - 2), + laserSpin() { + //drain energy + if (mech.energy > this.drain) { + mech.energy -= this.drain + if (this.angularSpeed < 0.02) this.torque += this.inertia * this.torqueMagnitude //spin + + //fire lasers + ctx.strokeStyle = "#f00"; + ctx.lineWidth = 1.5 + // ctx.globalAlpha = 1; + ctx.beginPath(); + for (let i = 0; i < 3; i++) { + const where = this.vertices[i] + const endPoint = Vector.add(where, Vector.mult(Vector.normalise(Vector.sub(where, this.position)), 2500)) + b.laser(where, endPoint, tech.laserDamage * 10, this.reflections, true) + } + ctx.stroke(); + // ctx.globalAlpha = 1; + } + } + }) + Matter.Body.setVelocity(bullet[me], velocity); + World.add(engine.world, bullet[me]); //add bullet to world + }, mine(where, velocity, angle = 0, isAmmoBack = false) { const bIndex = bullet.length; bullet[bIndex] = Bodies.rectangle(where.x, where.y, 45, 16, { @@ -1530,7 +1605,7 @@ const b = { friction: 0, frictionAir: 0.025, thrust: (tech.isFastSpores ? 0.001 : 0.0004) * (1 + 0.3 * (Math.random() - 0.5)), - dmg: tech.isMutualism ? 8 : 4, //2x bonus damage from tech.isMutualism + dmg: tech.isMutualism ? 10 : 4, //2x bonus damage from tech.isMutualism lookFrequency: 100 + Math.floor(117 * Math.random()), classType: "bullet", collisionFilter: { @@ -1793,7 +1868,7 @@ const b = { ) { //pick up nearby power ups if (Vector.magnitudeSquared(Vector.sub(this.position, powerUp[i].position)) < 60000 && !simulation.isChoosing) { - powerUps.onPickUp(this.position); + powerUps.onPickUp(powerUp[i]); powerUp[i].effect(); Matter.World.remove(engine.world, powerUp[i]); powerUp.splice(i, 1); @@ -3312,91 +3387,9 @@ const b = { have: false, fire() { if (tech.isLaserMine) { //laser mine - const me = bullet.length; - const position = mech.pos - bullet[me] = Bodies.polygon(position.x, position.y, 3, 25, { - bulletType: "mine", - angle: mech.angle, - friction: 0, - frictionAir: 0.05, - restitution: 0.5, - dmg: 0, // 0.14 //damage done in addition to the damage from momentum - minDmgSpeed: 2, - lookFrequency: 60 + Math.floor(7 * Math.random()), - drain: tech.isLaserDiode * tech.laserFieldDrain, - isArmed: false, - torqueMagnitude: 0.000003 * (Math.round(Math.random()) ? 1 : -1), - range: 1500, - endCycle: Infinity, - classType: "bullet", - collisionFilter: { - category: cat.bullet, - mask: cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield - }, - beforeDmg() {}, - onEnd() { - if (tech.isMineAmmoBack && (!this.isArmed || Math.random() < 0.2)) { //get ammo back from tech.isMineAmmoBack - for (i = 0, len = b.guns.length; i < len; i++) { //find which gun - if (b.guns[i].name === "mine") { - b.guns[i].ammo++ - simulation.updateGunHUD(); - break; - } - } - } - }, - do() { - if (!(simulation.cycle % this.lookFrequency) && mech.energy > this.drain) { //find mob targets - for (let i = 0, len = mob.length; i < len; ++i) { - if ( - Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 2000000 && - mob[i].dropPowerUp && - Matter.Query.ray(map, this.position, mob[i].position).length === 0 && - Matter.Query.ray(body, this.position, mob[i].position).length === 0 - ) { - this.do = this.laserSpin - this.endCycle = simulation.cycle + 300 - // if (this.angularSpeed < 0.01) this.torque += this.inertia * this.torqueMagnitude * 5 //spin - this.isArmed = true - } - } - } - }, - reflections: Math.max(0, tech.laserReflections - 2), - laserSpin() { - //drain energy - if (mech.energy > this.drain) { - mech.energy -= this.drain - if (this.angularSpeed < 0.02) this.torque += this.inertia * this.torqueMagnitude //spin - - //fire lasers - ctx.strokeStyle = "#f00"; - ctx.lineWidth = 1.5 - // ctx.globalAlpha = 1; - ctx.beginPath(); - for (let i = 0; i < 3; i++) { - const where = this.vertices[i] - const endPoint = Vector.add(where, Vector.mult(Vector.normalise(Vector.sub(where, this.position)), 2500)) - b.laser(where, endPoint, tech.laserDamage * 10, this.reflections, true) - } - ctx.stroke(); - // ctx.globalAlpha = 1; - } - } - }) - - // if (tech.isMineSentry) { - // bullet[me].endCycle = simulation.cycle + 480 - // bullet[me].do = bullet[me].laserSpin - // bullet[me].isArmed = true - // Matter.Body.setAngularVelocity(bullet[me], 3000 * bullet[me].torqueMagnitude); - // } - let speed = mech.crouch ? 50 : 20 - Matter.Body.setVelocity(bullet[me], { - x: speed * Math.cos(mech.angle), - y: speed * Math.sin(mech.angle) - }); - World.add(engine.world, bullet[me]); //add bullet to world + const speed = mech.crouch ? 50 : 20 + const velocity = { x: speed * Math.cos(mech.angle), y: speed * Math.sin(mech.angle) } + b.laserMine(mech.pos, velocity) } else { //normal mines const pos = { x: mech.pos.x + 30 * Math.cos(mech.angle), @@ -4008,9 +4001,13 @@ const b = { mech.fireCDcycle = mech.cycle mech.energy -= mech.fieldRegen + tech.laserFieldDrain * tech.isLaserDiode const dmg = 0.55 * tech.laserDamage // 3.5 * 0.55 = 200% more damage + const eye = { + x: mech.pos.x + 16 * Math.cos(mech.angle), + y: mech.pos.y + 16 * Math.sin(mech.angle) + } const wideLaser = function(where = { - x: mech.pos.x + 20 * Math.cos(mech.angle), - y: mech.pos.y + 20 * Math.sin(mech.angle) + x: mech.pos.x + 30 * Math.cos(mech.angle), + y: mech.pos.y + 30 * Math.sin(mech.angle) }, angle = mech.angle) { ctx.strokeStyle = "#f00"; ctx.lineWidth = 8 @@ -4018,26 +4015,35 @@ const b = { ctx.beginPath(); const off = 7.5 b.laser(where, { - x: where.x + 3000 * Math.cos(angle), - y: where.y + 3000 * Math.sin(angle) + x: eye.x + 3000 * Math.cos(angle), + y: eye.y + 3000 * Math.sin(angle) }, dmg, 0, true, 0.3) + for (let i = 1; i < tech.wideLaser; i++) { let whereOff = Vector.add(where, { x: i * off * Math.cos(angle + Math.PI / 2), y: i * off * Math.sin(angle + Math.PI / 2) }) - b.laser(whereOff, { - x: whereOff.x + 3000 * Math.cos(angle), - y: whereOff.y + 3000 * Math.sin(angle) - }, dmg, 0, true, 0.3) + if (Matter.Query.ray(map, eye, whereOff).length === 0) { + ctx.moveTo(eye.x, eye.y) + ctx.lineTo(whereOff.x, whereOff.y) + b.laser(whereOff, { + x: whereOff.x + 3000 * Math.cos(angle), + y: whereOff.y + 3000 * Math.sin(angle) + }, dmg, 0, true, 0.3) + } whereOff = Vector.add(where, { x: i * off * Math.cos(angle - Math.PI / 2), y: i * off * Math.sin(angle - Math.PI / 2) }) - b.laser(whereOff, { - x: whereOff.x + 3000 * Math.cos(angle), - y: whereOff.y + 3000 * Math.sin(angle) - }, dmg, 0, true, 0.3) + if (Matter.Query.ray(map, eye, whereOff).length === 0) { + ctx.moveTo(eye.x, eye.y) + ctx.lineTo(whereOff.x, whereOff.y) + b.laser(whereOff, { + x: whereOff.x + 3000 * Math.cos(angle), + y: whereOff.y + 3000 * Math.sin(angle) + }, dmg, 0, true, 0.3) + } } ctx.stroke(); ctx.globalAlpha = 1; @@ -4052,21 +4058,7 @@ const b = { mech.fireCDcycle = mech.cycle mech.energy -= mech.fieldRegen + tech.laserFieldDrain * tech.isLaserDiode const dmg = 0.4 * tech.laserDamage // 3.5 * 0.55 = 200% more damage - ctx.strokeStyle = "#f00"; - let spacing, len - if (tech.wideLaser === 3) { - ctx.lineWidth = 2 - spacing = 2 - len = 10 + tech.historyLaser * 5 - } else if (tech.wideLaser === 4) { - ctx.lineWidth = 3 - spacing = 1 - len = 15 + tech.historyLaser * 5 - } else { - ctx.lineWidth = 1 - spacing = 5 - len = 5 + tech.historyLaser * 5 - } + const spacing = Math.ceil(5.2 - 0.2 * tech.historyLaser) ctx.beginPath(); b.laser({ x: mech.pos.x + 20 * Math.cos(mech.angle), @@ -4075,7 +4067,7 @@ const b = { x: mech.pos.x + 3000 * Math.cos(mech.angle), y: mech.pos.y + 3000 * Math.sin(mech.angle) }, dmg, 0, true, 0.2); - for (let i = 1; i < len; i++) { + for (let i = 1, len = 5 + tech.historyLaser * 5; i < len; i++) { const history = mech.history[(mech.cycle - i * spacing) % 600] b.laser({ x: history.position.x + 20 * Math.cos(history.angle), @@ -4085,6 +4077,8 @@ const b = { y: history.position.y + 3000 * Math.sin(history.angle) - mech.yPosDifference }, dmg, 0, true, 0.2); } + ctx.strokeStyle = "#f00"; + ctx.lineWidth = 1 ctx.stroke(); } }, diff --git a/js/level.js b/js/level.js index a2566e3..6e24bd8 100644 --- a/js/level.js +++ b/js/level.js @@ -19,14 +19,14 @@ const level = { // mech.setField("plasma torch") // b.giveGuns("laser") // tech.isMineSentry = true - // tech.giveTech("foam fractionation") + // tech.giveTech("diffuse beam") // tech.giveTech("missile-bot") // tech.giveTech("nail-bot") // for (let i = 0; i < 15; i++) tech.giveTech("plasma jet") level.intro(); //starting level // level.testing(); //not in rotation - // level.escape() //after the final boss, ending + // level.null() //after the final boss, ending // level.final() //final boss level // level.gauntlet(); //before final boss level // level.testChamber() //less mobs, more puzzle @@ -61,11 +61,8 @@ const level = { b.respawnBots(); mech.resetHistory(); if (tech.isArmorFromPowerUps) { - const gain = Math.min(0.03 * powerUps.totalPowerUps, 0.42) - tech.armorFromPowerUps += gain + tech.armorFromPowerUps += Math.min(0.03 * powerUps.totalPowerUps, 0.42) mech.setMaxHealth(); - // if (powerUps.totalPowerUps) simulation.makeTextLog(" max health increased by " + (gain * 100).toFixed(0) + "%", 300) - simulation.makeTextLog(`mech.maxHealth += ${(gain).toFixed(2)}`) } if (tech.isHealLowHealth) { const len = Math.floor((mech.maxHealth - mech.health) / 0.5) @@ -98,7 +95,7 @@ const level = { //****************************************************************************************************************** //****************************************************************************************************************** //****************************************************************************************************************** - escape() { + null() { const hazardSlime = level.hazard(-1775, 150, 3575, 650, 0.01, "hsla(160, 100%, 35%,0.75)") // const hazardLaser1 = level.hazard(-475, -800, 1, 800, 0.4, "#50f", true) //laser // const hazardLaser2 = level.hazard(475, -800, 1, 800, 0.4, "#50f", true) //laser @@ -165,7 +162,7 @@ const level = { // spawn.mapRect(450, -820, 50, 25); //edge shelf ceiling // spawn.bodyRect(1540, -1110, 300, 25, 0.9); - setTimeout(() => { simulation.makeTextLog(`test`) }, 3000); + // setTimeout(() => { simulation.makeTextLog(`test`) }, 3000); diff --git a/js/lore.js b/js/lore.js index cb57bb1..b584c59 100644 --- a/js/lore.js +++ b/js/lore.js @@ -1,5 +1,28 @@ const lore = { - + alfie: { + color: "#e06", + text: function(say, isSpeech = false) { + simulation.makeTextLog(`input.audio(${Date.now()} ms): "${say}"`, Infinity); + if (isSpeech) this.speech(say) + }, + speech: function(say) { + var utterance = new SpeechSynthesisUtterance(say); + utterance.lang = "en-GB"; + speechSynthesis.speak(utterance); + } + }, + zoe: { + color: "#f50", + text: function(say, isSpeech = false) { + simulation.makeTextLog(`input.audio(${Date.now()} ms): "${say}"`, Infinity); + if (isSpeech) this.speech(say) + }, + speech: function(say) { + var utterance = new SpeechSynthesisUtterance(say); + utterance.lang = "en-AU"; + speechSynthesis.speak(utterance); + } + }, dialogue: [ ``, ``, @@ -8,27 +31,18 @@ const lore = { } } -/* ending outline - if no cheats - after final boss is cleared, player enters a level with no mobs - level maybe has some environmental damage, so player has an option to die at any time - player can see text output between two colors of text strings (scientists) - audio.ambient(current time and date)
"text" - player reads a conversation between the two colors of text - first time win on east or normal they talk about: - how many runs the player has done - they guess why - player is asked to stand on an in game button to enable the vocoder - they reveal the player is running simulations, and it isn't real - they ask the player to communicate - jump twice if you understand - they ask the player to enter console commands - give ammo or tech or something - They tell the play a console command to permanently enable custom and testing mode (in local storage) - players can use this command in the future to enable custom and testing without beating the game even if local storage is wiped - they then tell the player the command to increase the difficulty and the command to restart the game. - If you win on hard or why: - they give the player and option to exit the simulation and entre the real world - simulation.exit() - This wipes all local storage, and closes the browser tab -*/ \ No newline at end of file + + +// speech: function(say) { +// var utterance = new SpeechSynthesisUtterance(say); +// //msg.voice = voices[10]; // Note: some voices don't support altering params +// //msg.voiceURI = 'native'; +// //utterance.volume = 1; // 0 to 1 +// //utterance.rate = 1; // 0.1 to 10 +// //utterance.pitch = 1; //0 to 2 +// //utterance.text = 'Hello World'; +// //http://stackoverflow.com/questions/14257598/what-are-language-codes-for-voice-recognition-languages-in-chromes-implementati +// //de-DE en-GB fr-FR en-US en-AU +// utterance.lang = "en-GB"; +// speechSynthesis.speak(utterance); +// } \ No newline at end of file diff --git a/js/player.js b/js/player.js index f2e6539..6dc5531 100644 --- a/js/player.js +++ b/js/player.js @@ -481,10 +481,9 @@ const mech = { }, baseHealth: 1, setMaxHealth() { - const set = mech.baseHealth + tech.bonusHealth + tech.armorFromPowerUps - simulation.makeTextLog(`mech.maxHealth = ${set}`) - mech.maxHealth = set - if(mech.health > mech.maxHealth) mech.health = mech.maxHealth; + mech.maxHealth = mech.baseHealth + tech.bonusHealth + tech.armorFromPowerUps + simulation.makeTextLog(`mech.maxHealth = ${mech.maxHealth.toFixed(2)}`) + if (mech.health > mech.maxHealth) mech.health = mech.maxHealth; mech.displayHealth(); }, @@ -900,19 +899,19 @@ const mech = { }, setMaxEnergy() { mech.maxEnergy = (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus - simulation.makeTextLog(`mech.maxEnergy = ${mech.maxEnergy}`) + simulation.makeTextLog(`mech.maxEnergy = ${(mech.maxEnergy.toFixed(2))}`) }, fieldMeterColor: "#0cf", drawFieldMeter(bgColor = "rgba(0, 0, 0, 0.4)", range = 60) { if (mech.energy < mech.maxEnergy) { mech.energy += mech.fieldRegen; + if (mech.energy < 0) mech.energy = 0 ctx.fillStyle = bgColor; const xOff = mech.pos.x - mech.radius * mech.maxEnergy const yOff = mech.pos.y - 50 ctx.fillRect(xOff, yOff, range * mech.maxEnergy, 10); ctx.fillStyle = mech.fieldMeterColor; ctx.fillRect(xOff, yOff, range * mech.energy, 10); - if (mech.energy < 0) mech.energy = 0 } else if (mech.energy > mech.maxEnergy + 0.05) { ctx.fillStyle = bgColor; const xOff = mech.pos.x - mech.radius * mech.energy @@ -1142,7 +1141,7 @@ const mech = { y: powerUp[i].velocity.y * 0.11 }); if (dist2 < 5000 && !simulation.isChoosing) { //use power up if it is close enough - powerUps.onPickUp(mech.pos); + powerUps.onPickUp(powerUp[i]); Matter.Body.setVelocity(player, { //player knock back, after grabbing power up x: player.velocity.x + powerUp[i].velocity.x / player.mass * 5, y: player.velocity.y + powerUp[i].velocity.y / player.mass * 5 @@ -1502,11 +1501,12 @@ const mech = { mech.hold = function() { if (mech.energy > mech.maxEnergy - 0.02 && mech.fieldCDcycle < mech.cycle && !input.field && bullet.length < 200) { if (tech.isSporeField) { - const len = Math.floor(5 + 4 * Math.random()) - mech.energy -= len * 0.105; + // const len = Math.floor(5 + 4 * Math.random()) + const len = Math.ceil(mech.energy * 10) + mech.energy = 0; for (let i = 0; i < len; i++) b.spore(mech.pos) } else if (tech.isMissileField) { - mech.energy -= 0.55; + mech.energy -= 0.5; b.missile({ x: mech.pos.x, y: mech.pos.y - 40 }, -Math.PI / 2, 0, 1) } else if (tech.isIceField) { mech.energy -= 0.057; @@ -1926,6 +1926,7 @@ const mech = { if (mech.energy < mech.maxEnergy) { // replaces mech.drawFieldMeter() with custom code mech.energy += mech.fieldRegen; + if (mech.energy < 0) mech.energy = 0 const xOff = mech.pos.x - mech.radius * mech.maxEnergy const yOff = mech.pos.y - 50 ctx.fillStyle = "rgba(0, 0, 0, 0.3)"; @@ -2145,7 +2146,7 @@ const mech = { y: powerUp[i].velocity.y * 0.11 }); if (dist2 < 5000 && !simulation.isChoosing) { //use power up if it is close enough - powerUps.onPickUp(powerUp[i].position); + powerUps.onPickUp(powerUp[i]); powerUp[i].effect(); Matter.World.remove(engine.world, powerUp[i]); powerUp.splice(i, 1); @@ -2388,7 +2389,7 @@ const mech = { }); if (dist2 < 1000 && !simulation.isChoosing) { //use power up if it is close enough mech.fieldRange *= 0.8 - powerUps.onPickUp(powerUp[i].position); + powerUps.onPickUp(powerUp[i]); powerUp[i].effect(); Matter.World.remove(engine.world, powerUp[i]); powerUp.splice(i, 1); diff --git a/js/powerup.js b/js/powerup.js index 4af1827..a9bd482 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -461,15 +461,16 @@ const powerUps = { } } }, - onPickUp(where) { + onPickUp(who) { + if (tech.isTechDamage && who.name === "tech") mech.damage(0.11) if (tech.isMassEnergy) mech.energy += 2.5; - if (tech.isMineDrop) b.mine({ - x: where.x, - y: where.y - }, { - x: 0, - y: 0 - }, 0, tech.isMineAmmoBack) + if (tech.isMineDrop) { + if (tech.isLaserMine) { //laser mine + b.laserMine(who.position) + } else { + b.mine(who.position, { x: 0, y: 0 }, 0, tech.isMineAmmoBack) + } + } }, giveRandomAmmo() { const ammoTarget = Math.floor(Math.random() * (b.guns.length)); diff --git a/js/simulation.js b/js/simulation.js index bc0ec47..d7e7c4e 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -514,7 +514,6 @@ const simulation = { input.endKeySensing(); b.removeAllGuns(); simulation.isNoPowerUps = false; - tech.setupAllTech(); //sets tech to default values tech.laserBotCount = 0; tech.orbitBotCount = 0; @@ -529,23 +528,23 @@ const simulation = { powerUps.totalPowerUps = 0; powerUps.research.research = 0; mech.setFillColors(); - mech.maxHealth = 1 - mech.maxEnergy = 1 - mech.energy = 1 + // mech.maxHealth = 1 + // mech.maxEnergy = 1 + // mech.energy = 1 mech.hole.isOn = false simulation.paused = false; engine.timing.timeScale = 1; simulation.fpsCap = simulation.fpsCapDefault; simulation.isAutoZoom = true; simulation.makeGunHUD(); - mech.drop(); - mech.holdingTarget = null - mech.health = 0.25; - mech.displayHealth(); - mech.alive = true; + simulation.lastLogTime = 0; + + + + + level.onLevel = 0; level.levelsCleared = 0; - //resetting difficulty simulation.dmgScale = 0; //increases in level.difficultyIncrease b.dmgScale = 1; //decreases in level.difficultyIncrease @@ -560,6 +559,14 @@ const simulation = { document.getElementById("text-log").style.opacity = 0; document.getElementById("fade-out").style.opacity = 0; document.title = "n-gon"; + + mech.alive = true; + mech.setMaxHealth() + mech.health = 0; + mech.addHealth(0.25) + mech.drop(); + mech.holdingTarget = null + //set to default field mech.fieldMode = 0; // simulation.makeTextLog(`${simulation.SVGrightMouse} ${mech.fieldUpgrades[mech.fieldMode].name}

${mech.fieldUpgrades[mech.fieldMode].description}`, 600); @@ -573,45 +580,36 @@ const simulation = { //
input.key.field = ["${input.key.field}", "right mouse"] //
mech.field.description = "${mech.fieldUpgrades[mech.fieldMode].description}" // `, 800); + + let delay = 500 const step = 150 setTimeout(function() { simulation.makeTextLog(`input.key.up: ["${input.key.up}", "ArrowUp"]`); - }, delay); - delay += step + }, delay += step); setTimeout(function() { simulation.makeTextLog(`input.key.left: ["${input.key.left}", "ArrowLeft"]`); - }, delay); - delay += step + }, delay += step); setTimeout(function() { simulation.makeTextLog(`input.key.down: ["${input.key.down}", "ArrowDown"]`); - }, delay); - delay += step + }, delay += step); setTimeout(function() { simulation.makeTextLog(`input.key.right: ["${input.key.right}", "ArrowRight"]`); - }, delay); - delay += 1000 + }, delay += step); setTimeout(function() { simulation.makeTextLog(`
mech.fieldMode = "${mech.fieldUpgrades[mech.fieldMode].name}"`); - }, delay); - delay += step + }, delay += step); setTimeout(function() { simulation.makeTextLog(`input.key.field: ["${input.key.field}", "MouseRight"]`); - }, delay); - // delay += step - // setTimeout(function() { - // simulation.makeTextLog(`mech.field.description
"${mech.fieldUpgrades[mech.fieldMode].description}"`); - // }, delay); - + }, delay += step); mech.setField(mech.fieldMode) + // mech.energy = 0; //exit testing if (simulation.testing) { simulation.testing = false; simulation.loop = simulation.normalLoop - if (simulation.isConstructionMode) { - document.getElementById("construct").style.display = 'none' - } + if (simulation.isConstructionMode) document.getElementById("construct").style.display = 'none' } simulation.isCheating = false simulation.firstRun = false; diff --git a/js/tech.js b/js/tech.js index 6dfd1e2..8a668cc 100644 --- a/js/tech.js +++ b/js/tech.js @@ -77,6 +77,7 @@ const tech = { }, damageFromTech() { let dmg = mech.fieldDamage + if (tech.isTechDamage) dmg *= 2 if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance()) if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - mech.energy) * 0.5 if (tech.isMaxEnergyTech) dmg *= 1.4 @@ -185,7 +186,7 @@ const tech = { count: 0, isNonRefundable: true, allowed() { - return tech.isDamageForGuns || tech.isFireRateForGuns + return (tech.isDamageForGuns || tech.isFireRateForGuns) && (b.inventory.length + 5) < b.guns.length }, requires: "arsenal or cyclic rate boost", effect() { @@ -1181,9 +1182,9 @@ const tech = { maxCount: 1, count: 0, allowed() { - return !tech.isEnergyLoss && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isRewindGun && !tech.isSpeedHarm && mech.fieldUpgrades[mech.fieldMode].name !== "negative mass field" && !tech.isHealLowHealth + return !tech.isEnergyLoss && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isRewindGun && !tech.isSpeedHarm && mech.fieldUpgrades[mech.fieldMode].name !== "negative mass field" && !tech.isHealLowHealth && !tech.isTechDamage }, - requires: "not exothermic process, piezoelectricity, CPT, 1st law, negative mass", + requires: "not exothermic process, piezoelectricity, CPT, 1st law, negative mass , ...", effect: () => { mech.health = 0 // mech.displayHealth(); @@ -1282,9 +1283,9 @@ const tech = { maxCount: 1, count: 0, allowed() { - return tech.isEnergyLoss && mech.maxEnergy < 1.1 && !tech.isMissileField && !tech.isSporeField && !tech.isRewindAvoidDeath + return tech.isEnergyLoss && mech.maxEnergy < 1.1 && !tech.isSporeField && !tech.isRewindAvoidDeath }, - requires: "exothermic process, not max energy increase, CPT, missile or spore nano-scale", + requires: "exothermic process, not max energy increase, CPT, or spore nano-scale", effect() { tech.isMaxEnergyTech = true; mech.setMaxEnergy() @@ -1400,7 +1401,7 @@ const tech = { maxCount: 1, count: 0, allowed() { - return mech.health < 0.6 || build.isCustomSelection + return mech.health < 0.5 || build.isCustomSelection }, requires: "health below 60", effect() { @@ -1409,6 +1410,21 @@ const tech = { remove() { tech.isLowHealthDmg = false; } + }, { + name: "antiscience", + description: "increase damage by 100%
lose 11 health when you pick up a tech", + maxCount: 1, + count: 0, + allowed() { + return (mech.harmReduction() < 1 || tech.healthDrain || tech.isLowHealthDmg || tech.isHealthRecovery || tech.isHealLowHealth || tech.largerHeals > 1 || tech.isPerpetualHeal) && !tech.isEnergyHealth + }, + requires: "negative feedback or extra healing tech or harm reduction, not mass-energy", + effect() { + tech.isTechDamage = true; + }, + remove() { + tech.isTechDamage = false; + } }, { name: "entropy exchange", @@ -2822,7 +2838,7 @@ const tech = { }, { name: "mutualism", - description: "increase spore damage by 100%
spores borrow 0.5 health until they die", + description: "increase spore damage by 150%
spores borrow 0.5 health until they die", isGunTech: true, maxCount: 1, count: 0, @@ -3093,9 +3109,9 @@ const tech = { maxCount: 1, count: 0, allowed() { - return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser + return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser && !tech.historyLaser }, - requires: "laser, not specular reflection
not diffraction grating", + requires: "laser, not specular reflection, diffraction grating, slow light", effect() { if (tech.wideLaser === 0) tech.wideLaser = 3 tech.isWideLaser = true; @@ -3115,14 +3131,14 @@ const tech = { name: "output coupler", description: "widen diffuse laser beam by 40%
increase full beam damage by 40%", isGunTech: true, - maxCount: 1, + maxCount: 9, count: 0, allowed() { return tech.haveGunCheck("laser") && tech.isWideLaser }, requires: "laser, not specular reflection
not diffraction grating", effect() { - tech.wideLaser = 4 + tech.wideLaser += 2 for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() } @@ -3145,9 +3161,9 @@ const tech = { maxCount: 9, count: 0, allowed() { - return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser + return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser && !tech.isWideLaser }, - requires: "laser, not specular reflection
not diffraction grating", + requires: "laser, not specular reflection, diffraction grating, diffuse beam", effect() { // this.description = `add 5 more laser beams into into your past` tech.historyLaser++ @@ -3434,7 +3450,7 @@ const tech = { maxCount: 1, count: 0, allowed() { - return mech.maxEnergy > 0.99 && mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) + return mech.maxEnergy > 0.5 && mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) }, requires: "nano-scale manufacturing", effect() { @@ -4057,5 +4073,6 @@ const tech = { isIceIX: null, isDupDamage: null, isFireRateForGuns: null, - cyclicImmunity: null + cyclicImmunity: null, + isTechDamage: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index 6fd4a09..1664c62 100644 --- a/todo.txt +++ b/todo.txt @@ -1,12 +1,8 @@ ******************************************************** NEXT PATCH ******************************************************** -tech: active cooling - 15% faster fire rate for each gun in your inventory -tech: specialist - spawn a random power up for each gun in your inventory - (not available in custom, requires tech: generalist) -tech: complex spin-statistics - become immune to harm for 1s every 7s - requires Pauli exclusion - -even less difficulty ramp after killing final boss +tech: antiscience - 100% damage, but lose 11 health when you pick up a tech +tech: laser widebeam + output coupler can now stack up to 9x (was 1x) + but it not longer works with tech: slow light propagation ******************************************************** BUGS ******************************************************** @@ -27,8 +23,7 @@ CPT check for crouch after rewind ******************************************************** TODO ******************************************************** -tech "Circadian Rhythm": Become immune to harm for 1 second every 10 seconds while playing. - +tech: can't fire while moving, get attack speed and damage bot that follows the players history could have the same shape as the mech circle head @@ -437,7 +432,7 @@ ending outline jump twice if you understand they ask the player to enter console commands give ammo or tech or something - They tell the play a console command to permanently enable custom and testing mode (in local storage) + They tell the player a console command to permanently enable custom and testing mode (in local storage) players can use this command in the future to enable custom and testing without beating the game even if local storage is wiped they then tell the player the command to increase the difficulty and the command to restart the game. If you win on hard or why: