resonance
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
This commit is contained in:
110
js/bullet.js
110
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 <strong>wave packet</strong> of oscillating particles<br>that propagates through <strong>solids</strong>",
|
||||
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
|
||||
|
||||
22
js/level.js
22
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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(`<span class='color-var'>tech</span>.giveTech("<span class='color-text'>${tech.tech[index].name}</span>")`);
|
||||
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 += `<div class="choose-grid-module" onclick="powerUps.choose('field',${pick})"><div class="grid-title"><div class="circle-grid field"></div> ${m.fieldUpgrades[pick].name}</div> ${m.fieldUpgrades[pick].description}</div>`
|
||||
}
|
||||
}
|
||||
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 += `<div class="choose-grid-module" onclick="tech.giveTech(${choose});powerUps.research.changeRerolls(-1);powerUps.endDraft('tech');powerUps.tech.effect();"><div class="grid-title"><div class="circle-grid research"></div> <span style = 'font-size:90%; font-weight: 100; letter-spacing: -1.5px;'>microtransaction:</span> ${tech.tech[choose].name}</div>${tech.tech[choose].descriptionFunction ? tech.tech[choose].descriptionFunction() : tech.tech[choose].description}</div>`
|
||||
}
|
||||
if (tech.isBrainstorm && !tech.isBrainstormActive && !simulation.isChoosing) {
|
||||
tech.isBrainstormActive = true
|
||||
let count = 0
|
||||
|
||||
11
js/spawn.js
11
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
|
||||
) {
|
||||
|
||||
248
js/tech.js
248
js/tech.js
@@ -134,6 +134,7 @@ const tech = {
|
||||
tech.giveTech(name)
|
||||
simulation.makeTextLog(`<span class='color-var'>tech</span>.giveTech("<span class='color-text'>${name}</span>")<em>`);
|
||||
},
|
||||
|
||||
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: "<strong class='color-m'>tech</strong> have an extra <strong class='color-f'>field</strong> or <strong class='color-g'>gun</strong> <strong>choice</strong>",
|
||||
description: "<strong class='color-m'>tech</strong> have an extra <strong class='color-f'>field</strong> or <strong class='color-g'>gun</strong> <strong>choice</strong><br><strong>+5%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>",
|
||||
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 <strong>propagates</strong> faster through <strong>solids</strong><br><strong>+20%</strong> matter wave <strong class='color-d'>damage</strong>",
|
||||
description: "matter wave <strong>propagates</strong> faster through <strong>solids</strong><br><strong>+40%</strong> matter wave <strong class='color-d'>damage</strong>",
|
||||
// description: "matter wave <strong>propagates</strong> faster through <strong>solids</strong><br>up by <strong>3000%</strong> in the map and <strong>760%</strong> in <strong class='color-block'>blocks</strong>",
|
||||
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 <strong class='color-block'>block</strong> gets vibrated by a <strong>phonon</strong><br>there is a chance it's <strong>flung</strong> 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: "<strong>+100%</strong> <strong>missile</strong> <strong class='color-e'>explosive</strong> <strong class='color-d'>damage</strong>, radius<br><strong>–50%</strong> <strong>missiles</strong> speed",
|
||||
@@ -7428,7 +7448,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "geodesics",
|
||||
description: `your <strong>projectiles</strong> can traverse <strong class='color-worm'>wormholes</strong><br>spawn 2 <strong class='color-g'>guns</strong> and ${powerUps.orb.ammo(2)}`,
|
||||
description: `your <strong>projectiles</strong> can traverse <strong class='color-worm'>wormholes</strong><br>spawn 2 <strong class='color-g'>guns</strong> 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<br><em>mobs can still see you</em>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 0,
|
||||
isNonRefundable: true,
|
||||
isJunk: true,
|
||||
allowed() { return true },
|
||||
requires: "",
|
||||
effect() {
|
||||
m.draw = () => {}
|
||||
},
|
||||
remove() {}
|
||||
},
|
||||
{
|
||||
name: "quantum leap",
|
||||
description: "become an <strong class='alt'>alternate</strong> version of yourself<br>every <strong>20</strong> seconds",
|
||||
@@ -8950,24 +8915,6 @@ const tech = {
|
||||
},
|
||||
remove() {}
|
||||
},
|
||||
{
|
||||
name: "ship",
|
||||
description: "fly around with no legs<br>reduce combat <strong>difficulty</strong> by <strong>1 level</strong>",
|
||||
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<br><em>mobs can still see you</em>",
|
||||
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 <strong class='color-m'>tech</strong> you can<br>use ${powerUps.orb.research(1)} to buy a free in game <strong>skin</strong>`,
|
||||
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<br>reduce combat <strong>difficulty</strong> by <strong>1 level</strong>",
|
||||
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 <strong class='color-bot'>bots</strong> are converted to the <strong>same</strong> 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
|
||||
}
|
||||
28
todo.txt
28
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
|
||||
|
||||
Reference in New Issue
Block a user