diff --git a/.DS_Store b/.DS_Store
index 29517ca..237e5dc 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/index.js b/js/index.js
index 596a02e..bbb08e6 100644
--- a/js/index.js
+++ b/js/index.js
@@ -300,6 +300,7 @@ const build = {
} else if (type === "tech") {
if (tech.tech[index].count < tech.tech[index].maxCount) {
if (!tech.tech[index].isLore && !tech.tech[index].isNonRefundable && !who.classList.contains("build-tech-selected")) who.classList.add("build-tech-selected");
+ tech.giveTech(index)
} else if (!tech.tech[index].isNonRefundable) {
tech.totalCount -= tech.tech[index].count
tech.removeTech(index);
@@ -311,6 +312,27 @@ const build = {
}, 50);
}
}
+
+
+ // } else if (type === "tech") { //remove tech if you have too many
+ // if (tech.tech[index].count < tech.tech[index].maxCount) {
+ // if (!who.classList.contains("build-tech-selected")) who.classList.add("build-tech-selected");
+ // tech.giveTech(index)
+ // } else if (!tech.tech[index].isNonRefundable) {
+ // tech.totalCount -= tech.tech[index].count
+ // tech.removeTech(index);
+ // who.classList.remove("build-tech-selected");
+ // } else {
+ // who.classList.remove("build-tech-selected")
+ // setTimeout(() => { //return energy
+ // who.classList.add("build-tech-selected")
+ // }, 50);
+
+ // }
+ // }
+
+
+
//update tech text //disable not allowed tech
for (let i = 0, len = tech.tech.length; i < len; i++) {
const techID = document.getElementById("tech-" + i)
diff --git a/js/level.js b/js/level.js
index b9d66df..a2e6fa7 100644
--- a/js/level.js
+++ b/js/level.js
@@ -16,7 +16,7 @@ const level = {
// level.difficultyIncrease(30)
// simulation.zoomScale = 1000;
// simulation.setZoom();
- // m.setField("pilot wave")
+ // m.setField("metamaterial cloaking")
// b.giveGuns("laser")
// tech.isExplodeRadio = true
// tech.giveTech("WIMPs")
@@ -52,7 +52,7 @@ const level = {
// level.coliseum() //community level
// level.crossfire() //community level
// level.vats() //community level
- // level.n_gon() //community level
+ // level["n-gon"]() //community level
// powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "tech");
// tech.giveTech("undefined")
@@ -2934,46 +2934,77 @@ const level = {
// spawn.mapRect(-1950, -400, 100, 25);
spawn.mapRect(-3150, 50, 775, 100);
spawn.mapRect(-2600, -250, 775, 100);
- spawn.bodyRect(-1450, -125, 125, 125, 1, spawn.propsSlide); //weight
- spawn.bodyRect(-1800, 0, 300, 100, 1, spawn.propsHoist); //hoist
- cons[cons.length] = Constraint.create({
- pointA: {
- x: -1650,
- y: -500
- },
- bodyB: body[body.length - 1],
- stiffness: 0.0001815,
- length: 1
- });
- World.add(engine.world, cons[cons.length - 1]);
- spawn.bodyRect(600, 525, 125, 125, 1, spawn.propsSlide); //weight
- spawn.bodyRect(800, 600, 300, 100, 1, spawn.propsHoist); //hoist
- cons[cons.length] = Constraint.create({
- pointA: {
- x: 950,
- y: 100
- },
- bodyB: body[body.length - 1],
- stiffness: 0.0001815,
- length: 1
- });
- World.add(engine.world, cons[cons.length - 1]);
+ if (Math.random() < 0.5) {
+ const elevator1 = level.elevator(-1780, 500, 260, 40, 7, 0.0003)
+ const elevator2 = level.elevator(820, 1300, 260, 40, 607, 0.0003)
+ const elevator3 = level.elevator(-2755, 1260, 160, 40, 1000, 0.006)
+ spawn.bodyRect(-2375, 1300, 100, 100);
+ spawn.bodyRect(-2325, 1250, 50, 50);
+ spawn.bodyRect(-2275, 1350, 125, 50);
- spawn.bodyRect(-2700, 1150, 100, 160, 1, spawn.propsSlide); //weight
- spawn.bodyRect(-2550, 1150, 200, 100, 1, spawn.propsSlide); //weight
- spawn.bodyRect(-2775, 1300, 400, 100, 1, spawn.propsHoist); //hoist
- cons[cons.length] = Constraint.create({
- pointA: {
- x: -2575,
- y: 150
- },
- bodyB: body[body.length - 1],
- stiffness: 0.0005,
- length: 566
- });
- World.add(engine.world, cons[cons.length - 1]);
+ level.custom = () => {
+ elevator1.move();
+ elevator1.drawTrack();
+ elevator2.move();
+ elevator2.drawTrack();
+ elevator3.move();
+ elevator3.drawTrack();
+ ctx.fillStyle = "#444" //light fixtures
+ ctx.fillRect(-920, -505, 40, 10)
+ ctx.fillRect(-920, 95, 40, 10)
+ ctx.fillRect(180, 95, 40, 10)
+ ctx.fillRect(-20, 695, 40, 10)
+ ctx.fillRect(-2320, 945, 40, 10)
+
+ ctx.fillStyle = "#cff" //exit
+ ctx.fillRect(300, -250, 350, 250)
+ level.playerExitCheck();
+ level.exit.draw();
+ level.enter.draw();
+ };
+ } else {
+ spawn.bodyRect(-1450, -125, 125, 125, 1, spawn.propsSlide); //weight
+ spawn.bodyRect(-1800, 0, 300, 100, 1, spawn.propsHoist); //hoist
+ cons[cons.length] = Constraint.create({
+ pointA: {
+ x: -1650,
+ y: -500
+ },
+ bodyB: body[body.length - 1],
+ stiffness: 0.0001815,
+ length: 1
+ });
+ World.add(engine.world, cons[cons.length - 1]);
+
+ spawn.bodyRect(600, 525, 125, 125, 1, spawn.propsSlide); //weight
+ spawn.bodyRect(800, 600, 300, 100, 1, spawn.propsHoist); //hoist
+ cons[cons.length] = Constraint.create({
+ pointA: {
+ x: 950,
+ y: 100
+ },
+ bodyB: body[body.length - 1],
+ stiffness: 0.0001815,
+ length: 1
+ });
+ World.add(engine.world, cons[cons.length - 1]);
+
+ spawn.bodyRect(-2700, 1150, 100, 160, 1, spawn.propsSlide); //weight
+ spawn.bodyRect(-2550, 1150, 200, 100, 1, spawn.propsSlide); //weight
+ spawn.bodyRect(-2775, 1300, 400, 100, 1, spawn.propsHoist); //hoist
+ cons[cons.length] = Constraint.create({
+ pointA: {
+ x: -2575,
+ y: 150
+ },
+ bodyB: body[body.length - 1],
+ stiffness: 0.0005,
+ length: 566
+ });
+ World.add(engine.world, cons[cons.length - 1]);
+ }
@@ -5418,7 +5449,7 @@ const level = {
portal2[2].draw()
}
},
- n_gon() { // Made by Oranger on Discord
+ "n-gon"() { // Made by Oranger on Discord
let needGravity = [];
let s = { //mech statue
x: -200,
diff --git a/js/player.js b/js/player.js
index e5d555b..792da85 100644
--- a/js/player.js
+++ b/js/player.js
@@ -943,7 +943,8 @@ const m = {
isFieldActive: false,
fieldRange: 155,
fieldShieldingScale: 1,
- fieldDamage: 1,
+ // fieldDamage: 1,
+ isSneakAttack: false,
duplicateChance: 0,
energy: 0,
fieldRegen: 0,
@@ -976,7 +977,7 @@ const m = {
m.fieldShieldingScale = 1;
m.fieldBlockCD = 10;
m.fieldHarmReduction = 1;
- m.fieldDamage = 1
+ m.isSneakAttack = false
m.duplicateChance = 0
powerUps.setDo();
m.grabPowerUpRange2 = 156000;
@@ -1952,7 +1953,7 @@ const m = {
},
{
name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency"
- description: "cloak after not using your gun or field
while cloaked mobs can't see you
increase damage by 146%",
+ description: "when not firing activate a cloaking effect
if a mob has not died in the last 4 seconds
increase damage by 300%",
effect: () => {
m.fieldFire = true;
m.fieldMeterColor = "#333";
@@ -1960,8 +1961,9 @@ const m = {
// m.eyeFillColor = '#333'
m.fieldPhase = 0;
m.isCloak = false
- m.fieldDamage = 2.46 // 1 + 146/100
+ // m.fieldDamage = 2.46 // 1 + 146/100
m.fieldDrawRadius = 0
+ m.isSneakAttack = true;
const drawRadius = 1000
m.hold = function() {
@@ -2080,9 +2082,9 @@ const m = {
if (m.energy < 0) m.energy = 0
const xOff = m.pos.x - m.radius * m.maxEnergy
const yOff = m.pos.y - 50
- ctx.fillStyle = "rgba(0, 0, 0, 0.3)";
+ ctx.fillStyle = "rgba(0, 0, 0, 0.3)" //
ctx.fillRect(xOff, yOff, 60 * m.maxEnergy, 10);
- ctx.fillStyle = "#fff";
+ ctx.fillStyle = "#fff" //m.cycle > m.lastKillCycle + 300 ? "#000" : "#fff" //"#fff";
ctx.fillRect(xOff, yOff, 60 * m.energy, 10);
ctx.beginPath()
ctx.rect(xOff, yOff, 60 * m.maxEnergy, 10);
@@ -2090,6 +2092,15 @@ const m = {
ctx.lineWidth = 1;
ctx.stroke();
}
+ //show sneak attack status
+
+ if (m.cycle > m.lastKillCycle + 300) {
+ ctx.strokeStyle = "rgba(0,0,0,0.4)" //m.fieldMeterColor; //"rgba(255,255,0,0.2)" //ctx.strokeStyle = `rgba(0,0,255,${0.5+0.5*Math.random()})`
+ ctx.beginPath();
+ ctx.arc(m.pos.x, m.pos.y, 28, 0, 2 * Math.PI);
+ ctx.lineWidth = 2
+ ctx.stroke();
+ }
}
}
},
diff --git a/js/simulation.js b/js/simulation.js
index f72b54c..193ab50 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -525,7 +525,7 @@ const simulation = {
level.levels.push("basement");
level.levels.push("crossfire");
level.levels.push("vats")
- level.levels.push("n_gon")
+ level.levels.push("n-gon")
level.levels.push("house");
level.levels.push("perplex");
level.levels.push("coliseum");
diff --git a/js/tech.js b/js/tech.js
index ca7da8c..978d1aa 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -147,11 +147,11 @@
return false
},
damageFromTech() {
- let dmg = m.fieldDamage
+ let dmg = 1 //m.fieldDamage
if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.45
if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599
if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.85
- if (tech.isSneakAttack && m.cycle > m.lastKillCycle + 300) dmg *= 1.66
+ if (m.isSneakAttack && m.cycle > m.lastKillCycle + 240) dmg *= 4
if (tech.isTechDamage) dmg *= 1.9
if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance())
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
@@ -170,7 +170,6 @@
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 1.9
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.43, player.speed * 0.015)
if (tech.isBotDamage) dmg *= 1 + 0.05 * b.totalBots()
-
return dmg * tech.slowFire * tech.aimDamage
},
duplicationChance() {
@@ -5106,24 +5105,24 @@
tech.isCloakStun = false;
}
},
- {
- name: "combinatorial optimization",
- description: "increase damage by 66%
if a mob has not died in the last 5 seconds",
- isFieldTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
- },
- requires: "metamaterial cloaking or pilot wave",
- effect() {
- tech.isSneakAttack = true;
- },
- remove() {
- tech.isSneakAttack = false;
- }
- },
+ // {
+ // name: "combinatorial optimization",
+ // description: "increase damage by 66%
if a mob has not died in the last 5 seconds",
+ // isFieldTech: true,
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 2,
+ // allowed() {
+ // return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
+ // },
+ // requires: "metamaterial cloaking or pilot wave",
+ // effect() {
+ // tech.isSneakAttack = true;
+ // },
+ // remove() {
+ // tech.isSneakAttack = false;
+ // }
+ // },
{
name: "discrete optimization",
description: "increase damage by 50%
50% increased delay after firing",
diff --git a/todo.txt b/todo.txt
index b511c2a..be615dc 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,12 +1,11 @@
******************************************************** NEXT PATCH ********************************************************
-"cloak" and "alternate reality" now have styled text
+added 50% chance for elevators on warehouse level
-metamaterial field damage increased to 146% (was 121%)
-tech: combinatorial optimization - increase damage by 66% if a mob hasn't died in the last 5 seconds
+metamaterial cloaking now does 300% more damage if a mob has not died in the last 4 seconds
+ removed: tech: combinatorial optimization - increase damage by 66% if a mob hasn't died in the last 5 seconds
-fix bugs where some shared build URLs were crashing on some unusual tech, like lore tech and nonrefundable tech
-junk tech: not a bug - crashes the game
+fixed bug with experiment not loading tech
******************************************************** BUGS ********************************************************
@@ -36,6 +35,24 @@ is there a way to check if the player is stuck inside the map or block
******************************************************** TODO ********************************************************
+MACHOs might clash with cloaking field graphic
+
+
+ things to avoid when designing a map:
+avoid a single path through the map
+ instead have multiple paths through the map
+ or randomize parts of the map
+avoid isolated floating rectangles
+ instead imagine what story you are trying to tell about the buildings and tell that story
+ draw: shadows, color inside of buildings, structural support, pillars, ...
+avoid simple repetitive platforms
+ instead of - -- - try -:_-L -_
+avoid large flat areas; this doesn't produce fun combat
+ instead produce complex places for the player to hide
+break these rules when its important to make a statement in your level
+
+
+
flip left right on some maps
some mobs use the original x parameter in their loop, but it doesn't get flipped
manually edit each mob's logic