diff --git a/js/bullet.js b/js/bullet.js index b644127..57878ad 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -918,54 +918,55 @@ const b = { Composite.add(engine.world, bullet[me]); //add bullet to world bullet[me].endCycle = simulation.cycle + 70; bullet[me].frictionAir = 0.07; + bullet[me].suckCycles = 40 const MAG = 0.015 bullet[me].thrust = { x: bullet[me].mass * MAG * Math.cos(angle), y: bullet[me].mass * MAG * Math.sin(angle) } - bullet[me].do = function() { - const suckCycles = 40 - if (simulation.cycle > this.endCycle - suckCycles || Matter.Query.collides(this, map).length || Matter.Query.collides(this, body).length) { //suck - const that = this - - function suck(who, radius = that.explodeRad * 3.2) { - for (i = 0, len = who.length; i < len; i++) { - const sub = Vector.sub(that.position, who[i].position); - const dist = Vector.magnitude(sub); - if (dist < radius && dist > 150 && !who.isInvulnerable) { - knock = Vector.mult(Vector.normalise(sub), mag * who[i].mass / Math.sqrt(dist)); - who[i].force.x += knock.x; - who[i].force.y += knock.y; - } + bullet[me].suck = function() { + const suck = (who, radius = this.explodeRad * 3.2) => { + for (i = 0, len = who.length; i < len; i++) { + const sub = Vector.sub(this.position, who[i].position); + const dist = Vector.magnitude(sub); + if (dist < radius && dist > 150 && !who.isInvulnerable && who[i] !== this) { + knock = Vector.mult(Vector.normalise(sub), mag * who[i].mass / Math.sqrt(dist)); + who[i].force.x += knock.x; + who[i].force.y += knock.y; } } - let mag = 0.1 - if (simulation.cycle > this.endCycle - 5) { - mag = -0.22 - suck(mob, this.explodeRad * 3) - suck(body, this.explodeRad * 2) - suck(powerUp, this.explodeRad * 1.5) - suck(bullet, this.explodeRad * 1.5) - suck([player], this.explodeRad * 1.3) - } else { - mag = 0.11 - suck(mob, this.explodeRad * 3) - suck(body, this.explodeRad * 2) - suck(powerUp, this.explodeRad * 1.5) - suck(bullet, this.explodeRad * 1.5) - suck([player], this.explodeRad * 1.3) - } - //keep bomb in place - Matter.Body.setVelocity(this, { - x: 0, - y: 0 - }); - //draw suck - const radius = 2.75 * this.explodeRad * (this.endCycle - simulation.cycle) / suckCycles - ctx.fillStyle = "rgba(0,0,0,0.1)"; - ctx.beginPath(); - ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI); - ctx.fill(); + } + let mag = 0.1 + if (simulation.cycle > this.endCycle - 5) { + mag = -0.22 + suck(mob, this.explodeRad * 3) + suck(body, this.explodeRad * 2) + suck(powerUp, this.explodeRad * 1.5) + suck(bullet, this.explodeRad * 1.5) + suck([player], this.explodeRad * 1.3) + } else { + mag = 0.11 + suck(mob, this.explodeRad * 3) + suck(body, this.explodeRad * 2) + suck(powerUp, this.explodeRad * 1.5) + suck(bullet, this.explodeRad * 1.5) + suck([player], this.explodeRad * 1.3) + } + + Matter.Body.setVelocity(this, { x: 0, y: 0 }); //keep bomb in place + //draw suck + const radius = 2.75 * this.explodeRad * (this.endCycle - simulation.cycle) / this.suckCycles + ctx.fillStyle = "rgba(0,0,0,0.1)"; + ctx.beginPath(); + ctx.arc(this.position.x, this.position.y, radius, 0, 2 * Math.PI); + ctx.fill(); + } + bullet[me].do = function() { + if (simulation.cycle > this.endCycle - this.suckCycles) { //suck + this.do = this.suck + } else if (Matter.Query.collides(this, map).length || Matter.Query.collides(this, body).length) { + Matter.Body.setPosition(this, Vector.sub(this.position, this.velocity)) //undo last movement + this.do = this.suck } else { this.force.x += this.thrust.x; this.force.y += this.thrust.y; @@ -3787,7 +3788,7 @@ const b = { targetedBlock(who, speed = 50 - Math.min(20, who.mass * 2), range = 1600) { let closestMob, dist for (let i = 0, len = mob.length; i < len; i++) { - if (who !== mob[i]) { + if (who !== mob[i] && !mob[i].isBadTarget) { dist = Vector.magnitude(Vector.sub(who.position, mob[i].position)); if (dist < range && Matter.Query.ray(map, who.position, mob[i].position).length === 0) { //&& Matter.Query.ray(body, position, mob[i].position).length === 0 closestMob = mob[i] @@ -5704,8 +5705,8 @@ const b = { name: "matter wave", //3 description: "emit a wave packet of oscillating particles
that propagates through solids", ammo: 0, - ammoPack: 115, - defaultAmmoPack: 115, + ammoPack: 110, + defaultAmmoPack: 110, have: false, wavePacketCycle: 0, delay: 40, @@ -5776,17 +5777,24 @@ const b = { const dist = Vector.magnitude(Vector.sub(this.waves[i].position, body[j].position)) const r = 20 if (dist + r > this.waves[i].radius && dist - r < this.waves[i].radius) { + const who = body[j] //make them shake around - body[j].force.x += 0.01 * (Math.random() - 0.5) * body[j].mass - body[j].force.y += (0.01 * (Math.random() - 0.5) - simulation.g * 0.25) * body[j].mass //remove force of gravity + who.force.x += 0.01 * (Math.random() - 0.5) * who.mass + who.force.y += (0.01 * (Math.random() - 0.5) - simulation.g * 0.25) * who.mass //remove force of gravity //draw vibes - let vertices = body[j].vertices; + let vertices = who.vertices; const vibe = 25 ctx.moveTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5)); for (let k = 1; k < vertices.length; k++) { ctx.lineTo(vertices[k].x + vibe * (Math.random() - 0.5), vertices[k].y + vibe * (Math.random() - 0.5)); } ctx.lineTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5)); + + if (tech.isPhononBlock && !who.isNotHoldable && who.speed < 5 && who.angularSpeed < 0.1) { + if (Math.random() < 0.5) b.targetedBlock(who, 50 - Math.min(25, who.mass * 3)) // targetedBlock(who, speed = 50 - Math.min(20, who.mass * 2), range = 1600) { + // Matter.Body.setAngularVelocity(who, (0.25 + 0.1 * Math.random()) * (Math.random() < 0.5 ? -1 : 1)); + who.torque += who.inertia * 0.001 * (Math.random() - 0.5) + } } } this.waves[i].radius += 0.9 * tech.waveBeamSpeed * this.waves[i].expanding //expand / move @@ -5881,6 +5889,12 @@ const b = { ctx.lineTo(vertices[j].x + vibe * (Math.random() - 0.5), vertices[j].y + vibe * (Math.random() - 0.5)); } ctx.lineTo(vertices[0].x + vibe * (Math.random() - 0.5), vertices[0].y + vibe * (Math.random() - 0.5)); + + if (tech.isPhononBlock && !who.isNotHoldable && who.speed < 5 && who.angularSpeed < 0.1) { + if (Math.random() < 0.5) b.targetedBlock(who, 50 - Math.min(25, who.mass * 3)) // targetedBlock(who, speed = 50 - Math.min(20, who.mass * 2), range = 1600) { + // Matter.Body.setAngularVelocity(who, (0.25 + 0.12 * Math.random()) * (Math.random() < 0.5 ? -1 : 1)); + who.torque += who.inertia * 0.001 * (Math.random() - 0.5) + } } // ctx.stroke(); //draw vibes @@ -6005,7 +6019,7 @@ const b = { if (tech.isPhaseVelocity) { waveSpeedMap = 3.5 waveSpeedBody = 2 - bullet[me].dmg *= 1.2 + bullet[me].dmg *= 1.4 } if (tech.waveReflections) { bullet[me].reflectCycle = totalCycles / tech.waveReflections //tech.waveLengthRange diff --git a/js/level.js b/js/level.js index 0317036..3f85235 100644 --- a/js/level.js +++ b/js/level.js @@ -18,18 +18,18 @@ const level = { // simulation.isHorizontalFlipped = true // m.addHealth(Infinity) // m.setField("metamaterial cloaking") - // b.giveGuns("harpoon") + // b.giveGuns("matter wave") // b.giveGuns("shotgun") // b.guns[0].ammo = 10000 // // b.giveGuns("mine") - // tech.giveTech("boson composite") + // tech.giveTech("phonon") // for (let i = 0; i < 3; ++i) tech.giveTech("smelting") // for (let i = 0; i < 9; ++i) tech.giveTech("propagator") // for (let i = 0; i < 100; ++i) tech.giveTech("nail-bot") // for (let i = 0; i < 9; ++i) tech.giveTech("emergence") - // tech.giveTech("polyurethane foam") - // tech.giveTech("quantum eraser") - // tech.giveTech("MACHO") + // tech.giveTech("resonance") + // tech.giveTech("microtransactions") + // tech.giveTech("cross disciplinary") // m.maxHealth = 100 // m.health = m.maxHealth // for (let i = 0; i < 10; i++) tech.giveTech("tungsten carbide") @@ -46,13 +46,13 @@ const level = { // powerUps.research.changeRerolls(100) // spawn.starter(1900, -500, 100) // for (let i = 0; i < 20; ++i) spawn.exploder(1900, -500) - // spawn.timeSkipBoss(1900, -500) + spawn.slashBoss(1900, -500) // level.difficultyIncrease(20) //30 is near max on hard //60 is near max on why - // level.testing(); //not in rotation, used for testing + level.testing(); //not in rotation, used for testing // for (let i = 0; i < 7; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research"); // for (let i = 0; i < 4; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech"); - if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************ + // if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************ // powerUps.research.changeRerolls(3000) // for (let i = 0; i < 30; i++) powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "tech", false); // for (let i = 0; i < 3; i++) tech.giveTech("undefined") @@ -423,7 +423,7 @@ const level = { y += height / 2 const who = body[body.length] = Bodies.rectangle(x, y, width, height, { collisionFilter: { - category: cat.map, + category: cat.body, mask: cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet }, isNoSetCollision: true, @@ -455,7 +455,7 @@ const level = { y += height / 2 const who = body[body.length] = Bodies.rectangle(x, y, width, height, { collisionFilter: { - category: cat.map, + category: cat.body, mask: cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet }, isNoSetCollision: true, @@ -581,7 +581,7 @@ const level = { force += simulation.g const who = body[body.length] = Bodies.rectangle(x, isAtTop ? maxHeight : y, width, height, { collisionFilter: { - category: cat.map, + category: cat.body, //cat.map, mask: cat.map | cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet }, isNoSetCollision: true, diff --git a/js/mob.js b/js/mob.js index faee7a2..2b795a0 100644 --- a/js/mob.js +++ b/js/mob.js @@ -1391,8 +1391,11 @@ const mobs = { mob.splice(i, 1); if (tech.isMobBlockFling) { const who = body[body.length - 1] - b.targetedBlock(who) - Matter.Body.setAngularVelocity(who, (0.5 + 0.2 * Math.random()) * (Math.random() < 0.5 ? -1 : 1)); + if (!who.isNotHoldable) { + b.targetedBlock(who) + Matter.Body.setAngularVelocity(who, (0.5 + 0.2 * Math.random()) * (Math.random() < 0.5 ? -1 : 1)); + // who.torque += who.inertia * 0.002 * (Math.random() - 0.5) + } } } else { Matter.Composite.remove(engine.world, this); diff --git a/js/player.js b/js/player.js index 58539ad..798c554 100644 --- a/js/player.js +++ b/js/player.js @@ -2829,8 +2829,8 @@ const m = { if (inPlayer.length > 0) { for (let i = 0; i < inPlayer.length; i++) { if (m.energy > 0) { - if (inPlayer[i].isUnblockable) m.energy -= 0.003; - if (inPlayer[i].shield) m.energy -= 0.014; + if (!inPlayer[i].isUnblockable) m.energy -= 0.004; + if (inPlayer[i].shield) m.energy -= 0.012; } } } @@ -3333,7 +3333,7 @@ const m = { } } } - if (tech.isWormBullets) { + if (tech.isWormHoleBullets) { //teleport bullets for (let i = 0, len = bullet.length; i < len; ++i) { //teleport bullets from hole1 to hole2 if (!bullet[i].botType && !bullet[i].isInHole) { //don't teleport bots diff --git a/js/powerup.js b/js/powerup.js index 903b11b..17fd7e8 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -117,7 +117,6 @@ const powerUps = { } }, totalPowerUps: 0, //used for tech that count power ups at the end of a level - lastTechIndex: null, do() {}, setDupChance() { if (tech.duplicationChance() > 0 || tech.isAnthropicTech) { @@ -249,8 +248,6 @@ const powerUps = { m.setField(index) } else if (type === "tech") { // if (tech.isBanish && tech.tech[index].isBanished) tech.tech[index].isBanished = false - powerUps.tech.banishList - setTimeout(() => { powerUps.lastTechIndex = index }, 10); simulation.makeTextLog(`tech.giveTech("${tech.tech[index].name}")`); tech.giveTech(index) } @@ -873,7 +870,6 @@ const powerUps = { for (let i = 0; i < tech.tech.length; i++) tech.tech[i].isRecentlyShown = false //reset recently shown back to zero // powerUps.tech.lastTotalChoices = options.length //this is recorded so that banish can know how many tech were available // console.log(optionLengthNoDuplicates, options.length) - powerUps.tech.banishList = [] if (options.length > 0) { for (let i = 0; i < totalChoices; i++) { if (options.length < 1) break @@ -924,10 +920,19 @@ const powerUps = { for (let i = 1; i < m.fieldUpgrades.length; i++) { //skip field emitter if (i !== m.fieldMode) fieldOptions.push(i); } - const pick = options[Math.floor(Math.seededRandom(0, fieldOptions.length))] //pick an element from the array of options + const pick = fieldOptions[Math.floor(Math.seededRandom(0, fieldOptions.length))] //pick an element from the array of options text += `
  ${m.fieldUpgrades[pick].name}
${m.fieldUpgrades[pick].description}
` } } + if (tech.isMicroTransactions && powerUps.research.count > 0) { + const skins = [] //find skins + for (let i = 0; i < tech.tech.length; i++) { + if (tech.tech[i].isSkin) skins.push(i) + } + const choose = skins[Math.floor(Math.seededRandom(0, skins.length))] //pick an element from the array of options + + text += `
microtransaction: ${tech.tech[choose].name}
${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}
` + } if (tech.isBrainstorm && !tech.isBrainstormActive && !simulation.isChoosing) { tech.isBrainstormActive = true let count = 0 diff --git a/js/spawn.js b/js/spawn.js index a1407b3..c7d4b33 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -50,9 +50,13 @@ const spawn = { if (tech.isQuantumEraser && tech.quantumEraserCount > 0) { for (let i = 0, len = mob.length; i < len; i++) { if (mob[i].isDropPowerUp && mob[i].alive) { //&& !mob[i].isBoss - tech.isQuantumEraserDuplication = true - mob[i].death() - tech.isQuantumEraserDuplication = false + if (mob[i].isFinalBoss) { + mob[i].health = 0.66 + } else { + tech.isQuantumEraserDuplication = true + mob[i].death() + tech.isQuantumEraserDuplication = false + } //graphics const color = 'rgba(255,255,255, 0.8)' @@ -4123,6 +4127,7 @@ const spawn = { this.seePlayer.recall && this.cd < simulation.cycle && this.distanceToPlayer2() < seeDistance2 && + !m.isCloak && Matter.Query.ray(map, this.position, this.playerPosRandomY()).length === 0 && Matter.Query.ray(body, this.position, this.playerPosRandomY()).length === 0 ) { diff --git a/js/tech.js b/js/tech.js index 9a74664..90b3657 100644 --- a/js/tech.js +++ b/js/tech.js @@ -134,6 +134,7 @@ const tech = { tech.giveTech(name) simulation.makeTextLog(`tech.giveTech("${name}")`); }, + giveTech(index = 'random') { if (index === 'random') { let options = []; @@ -255,7 +256,7 @@ const tech = { return dmg * tech.slowFire * tech.aimDamage }, duplicationChance() { - return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication) + return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + 0.05 * tech.isExtraGunField + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication) }, isScaleMobsWithDuplication: false, maxDuplicationEvent() { @@ -2985,15 +2986,15 @@ const tech = { }, { name: "cross disciplinary", - description: "tech have an extra field or gun choice", + description: "tech have an extra field or gun choice
+5% chance to duplicate spawned power ups", maxCount: 1, count: 0, frequency: 1, frequencyDefault: 1, allowed() { - return !tech.isDeterminism + return !tech.isDeterminism && tech.duplicationChance() < 1 }, - requires: "not determinism", + requires: "below 100% duplication chance not determinism", effect: () => { tech.isExtraGunField = true; }, @@ -3360,9 +3361,9 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return tech.duplicationChance() < 1 && !tech.isSuperDeterminism + return tech.duplicationChance() < 1.11 && !tech.isSuperDeterminism }, - requires: "below 100% duplication chance, not superdeterminism", + requires: "below 111% duplication chance, not superdeterminism", effect() { tech.isCancelDuplication = true //search for tech.cancelCount to balance powerUps.setDupChance(); //needed after adjusting duplication chance @@ -3380,9 +3381,9 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return tech.duplicationChance() < 1 + return tech.duplicationChance() < 1.11 }, - requires: "below 100% duplication chance", + requires: "below 111% duplication chance", effect() { tech.duplicateChance += 0.1 powerUps.setDupChance(); //needed after adjusting duplication chance @@ -3407,9 +3408,9 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return tech.duplicationChance() < 1 + return tech.duplicationChance() < 1.11 }, - requires: "below 100% duplication chance", + requires: "below 111% duplication chance", effect: () => { tech.isStimulatedEmission = true powerUps.setDupChance(); //needed after adjusting duplication chance @@ -3428,9 +3429,9 @@ const tech = { frequency: 1, frequencyDefault: 1, allowed() { - return tech.duplicationChance() < 1 + return tech.duplicationChance() < 1.11 }, - requires: "below 100% duplication chance", + requires: "below 111% duplication chance", effect: () => { tech.isPowerUpsVanish = true powerUps.setDupChance(); //needed after adjusting duplication chance @@ -4422,7 +4423,7 @@ const tech = { // { name: "phase velocity", - description: "matter wave propagates faster through solids
+20% matter wave damage", + description: "matter wave propagates faster through solids
+40% matter wave damage", // description: "matter wave propagates faster through solids
up by 3000% in the map and 760% in blocks", isGunTech: true, maxCount: 1, @@ -4518,8 +4519,8 @@ const tech = { for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "matter wave") { b.guns[i].chooseFireMethod() - b.guns[i].ammoPack = b.guns[i].defaultAmmoPack / 9 - b.guns[i].ammo = Math.ceil(b.guns[i].ammo / 9); + b.guns[i].ammoPack = b.guns[i].defaultAmmoPack / 10 + b.guns[i].ammo = Math.ceil(b.guns[i].ammo / 10); simulation.updateGunHUD(); break } @@ -4532,7 +4533,7 @@ const tech = { tech.isLongitudinal = false; b.guns[i].chooseFireMethod() b.guns[i].ammoPack = b.guns[i].defaultAmmoPack - b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 9); + b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 10); simulation.updateGunHUD(); break } @@ -4550,7 +4551,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.isLongitudinal + return tech.isLongitudinal && tech.haveGunCheck("matter wave") }, requires: "matter wave, phonon", effect() { @@ -4572,6 +4573,25 @@ const tech = { } } }, + { + name: "resonance", + description: "after a block gets vibrated by a phonon
there is a chance it's flung at nearby mobs", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isLongitudinal && tech.haveGunCheck("matter wave") + }, + requires: "matter wave, phonon", + effect() { + tech.isPhononBlock = true + }, + remove() { + tech.isPhononBlock = false + } + }, { name: "cruise missile", description: "+100% missile explosive damage, radius
–50% missiles speed", @@ -7428,7 +7448,7 @@ const tech = { }, { name: "geodesics", - description: `your projectiles can traverse wormholes
spawn 2 guns and ${powerUps.orb.ammo(2)}`, + description: `your projectiles can traverse wormholes
spawn 2 guns and ${powerUps.orb.ammo(4)}`, isFieldTech: true, maxCount: 1, count: 0, @@ -7439,18 +7459,16 @@ const tech = { }, requires: "wormhole", effect() { - tech.isWormBullets = true - for (let i = 0; i < 2; i++) { - powerUps.spawn(m.pos.x, m.pos.y, "gun"); - powerUps.spawn(m.pos.x, m.pos.y, "ammo"); - } + tech.isWormHoleBullets = true + for (let i = 0; i < 2; i++) powerUps.spawn(m.pos.x + 200 * (Math.random() - 0.5), m.pos.y + 200 * (Math.random() - 0.5), "gun"); + for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 200 * (Math.random() - 0.5), m.pos.y + 200 * (Math.random() - 0.5), "ammo"); }, remove() { - if (tech.isWormBullets) { + if (tech.isWormHoleBullets) { for (let i = 0; i < 2; i++) { if (b.inventory.length) b.removeGun(b.guns[b.inventory[b.inventory.length - 1]].name) //remove your last gun } - tech.isWormBullets = false; + tech.isWormHoleBullets = false; } } }, @@ -8564,44 +8582,6 @@ const tech = { }, remove() {} }, - { - name: "posture", - description: "stand a bit taller", - maxCount: 1, - count: 0, - frequency: 0, - isJunk: true, - allowed() { - return !m.isShipMode - }, - requires: "", - effect() { - m.yOffWhen.stand = 70 - }, - remove() { - m.yOffWhen.stand = 49 - } - }, - { - name: "rhythm", - description: "you oscillate up and down", - maxCount: 1, - count: 0, - frequency: 0, - isJunk: true, - isNonRefundable: true, - allowed() { - return !m.isShipMode - }, - requires: "", - effect() { - setInterval(() => { - m.yOffWhen.stand = 53 + 28 * Math.sin(simulation.cycle * 0.2) - if (m.onGround && !m.crouch) m.yOffGoal = m.yOffWhen.stand - }, 100); - }, - remove() {} - }, { name: "spinor", description: "the direction you aim is determined by your position", @@ -8798,21 +8778,6 @@ const tech = { }, remove() {} }, - { - name: "transparency", - description: "become invisible to yourself
mobs can still see you", - maxCount: 1, - count: 0, - frequency: 0, - isNonRefundable: true, - isJunk: true, - allowed() { return true }, - requires: "", - effect() { - m.draw = () => {} - }, - remove() {} - }, { name: "quantum leap", description: "become an alternate version of yourself
every 20 seconds", @@ -8950,24 +8915,6 @@ const tech = { }, remove() {} }, - { - name: "ship", - description: "fly around with no legs
reduce combat difficulty by 1 level", - maxCount: 1, - count: 0, - frequency: 0, - isNonRefundable: true, - isJunk: true, - allowed() { - return !m.isShipMode && m.fieldUpgrades[m.fieldMode].name !== "negative mass" - }, - requires: "", - effect() { - m.shipMode() - level.difficultyDecrease(simulation.difficultyMode) - }, - remove() {} - }, // { // name: "lubrication", // description: "reduce block density and friction for this level", @@ -9258,11 +9205,10 @@ const tech = { maxCount: 1, count: 0, frequency: 0, + isSkin: true, isNonRefundable: true, isJunk: true, - allowed() { - return !m.isShipMode - }, + allowed() { return !m.isShipMode }, requires: "", effect() { m.draw = function() { @@ -9303,11 +9249,10 @@ const tech = { maxCount: 1, count: 0, frequency: 0, + isSkin: true, isNonRefundable: true, isJunk: true, - allowed() { - return !m.isShipMode - }, + allowed() { return !m.isShipMode }, requires: "", effect() { m.draw = function() { @@ -9343,6 +9288,7 @@ const tech = { maxCount: 1, count: 0, frequency: 0, + isSkin: true, isNonRefundable: true, isJunk: true, allowed() { @@ -9418,12 +9364,69 @@ const tech = { }, remove() {} }, + { + name: "transparency", + description: "become invisible to yourself
mobs can still see you", + maxCount: 1, + count: 0, + frequency: 0, + isSkin: true, + isNonRefundable: true, + isJunk: true, + allowed() { return true }, + requires: "", + effect() { + m.draw = () => {} + }, + remove() {} + }, + { + name: "posture", + description: "stand a bit taller", + maxCount: 1, + count: 0, + frequency: 0, + isSkin: true, + isJunk: true, + allowed() { + return !m.isShipMode + }, + requires: "", + effect() { + m.yOffWhen.stand = 70 + }, + remove() { + m.yOffWhen.stand = 49 + } + }, + { + name: "rhythm", + description: "you oscillate up and down", + maxCount: 1, + count: 0, + frequency: 0, + isSkin: true, + isJunk: true, + isNonRefundable: true, + allowed() { + return !m.isShipMode + }, + requires: "", + effect() { + setInterval(() => { + m.yOffWhen.stand = 53 + 28 * Math.sin(simulation.cycle * 0.2) + if (m.onGround && !m.crouch) m.yOffGoal = m.yOffWhen.stand + }, 100); + }, + remove() {} + }, { name: "pareidolia", description: "don't", maxCount: 1, count: 0, frequency: 0, + isSkin: true, isNonRefundable: true, isJunk: true, allowed() { @@ -9492,6 +9495,7 @@ const tech = { maxCount: 1, count: 0, frequency: 0, + isSkin: true, isNonRefundable: true, isJunk: true, allowed() { return true }, @@ -9509,6 +9513,40 @@ const tech = { }, remove() {} }, + { + name: "microtransactions", + description: `when you choose a tech you can
use ${powerUps.orb.research(1)} to buy a free in game skin`, + maxCount: 1, + count: 0, + frequency: 0, + isJunk: true, + allowed() { return true }, + requires: "", + effect() { + tech.isMicroTransactions = true + }, + remove() { + tech.isMicroTransactions = false + } + }, + { + name: "ship", + description: "fly around with no legs
reduce combat difficulty by 1 level", + maxCount: 1, + count: 0, + frequency: 0, + isNonRefundable: true, + isJunk: true, + allowed() { + return !m.isShipMode && m.fieldUpgrades[m.fieldMode].name !== "negative mass" + }, + requires: "", + effect() { + m.shipMode() + level.difficultyDecrease(simulation.difficultyMode) + }, + remove() {} + }, { name: "assimilation", description: "all your bots are converted to the same random model", @@ -10213,7 +10251,7 @@ const tech = { isNailCrit: null, isFlechetteExplode: null, isWormholeWorms: null, - isWormBullets: null, + isWormHoleBullets: null, isWideLaser: null, wideLaser: null, isPulseLaser: null, @@ -10389,5 +10427,7 @@ const tech = { isCritKill: null, isQuantumEraser: null, isQuantumEraserDuplication: null, - quantumEraserCount: null + quantumEraserCount: null, + isPhononBlock: null, + isMicroTransactions: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index 1e16029..d4e8077 100644 --- a/todo.txt +++ b/todo.txt @@ -1,31 +1,27 @@ ******************************************************** NEXT PATCH ************************************************** -tech: quantum eraser - for each mob left alive after you exit a level - kill a spawning mob with 100% duplication -symbiosis: bosses spawn a tech and also an ammo, research, and heal - when mobs dies lose 0.45 -> 0.5 max health -boson composite - when you move through mobs they drain a little bit of energy -incendiary ammunition makes bullets explode on impact with map -polyurethane foam now works for harpoons -reactor level: timeBoss is much faster, mineBoss does 50% mine more damage - all bosses spawn fewer numbers - spawning all 4 bosses spawns much fewer numbers +tech: resonance - when a block gets vibrated by phonon, it has a chance to spin towards mobs +cross disciplinary gives 4% duplication +boson composite lets you move through elevators again + +JUNK tech: microtransactions - buy in-game skins for 1 research anytime you choose a tech bug fixes - loaded a patch to matter.js physics engine 0.18 to fix issues with time dilation + *********************************************************** TODO ***************************************************** -Tech: Resonant Frequency -Whenever a block gets vibrated by phonon, it has a chance to split and flywheel towards mobs +make buying skins from microtransactions have a lasting effect with a local storage list + add a dropdown menu to choose in settings + maybe just one at a time -JUNK tech: doctorate -You don't need an explanation of techs! Just look at the title and your scientific knowledge should come into place -Remove all tech descriptions +JUNK tech micro transactions + all tech selection menus include the option to buy skins for 1 research improve mob invincible graphic opacity oscillates from 100% to 0%? + make different from stun hopBossMom spawns lots of small hopBullets