dripp
new community map: dripp! enable the 13 community maps in settings
This commit is contained in:
205
js/level.js
205
js/level.js
@@ -10,7 +10,7 @@ const level = {
|
||||
//see level.populateLevels: (intro, ... , reservoir, reactor, ... , gauntlet, final) added later
|
||||
playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion"],
|
||||
// playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"],
|
||||
communityLevels: ["stronghold", "basement", "crossfire", "vats", "run", "n-gon", "house", "perplex", "coliseum", "tunnel", "islands", "temple"],
|
||||
communityLevels: ["stronghold", "basement", "crossfire", "vats", "run", "n-gon", "house", "perplex", "coliseum", "tunnel", "islands", "temple", "dripp"],
|
||||
trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon"],
|
||||
levels: [],
|
||||
start() {
|
||||
@@ -20,7 +20,7 @@ const level = {
|
||||
// m.setField("time dilation")
|
||||
// b.giveGuns("laser")
|
||||
// tech.giveTech("closed timelike curve")
|
||||
// tech.giveTech("retrocausality")
|
||||
// tech.giveTech("translucent")
|
||||
// tech.giveTech("clock gating")
|
||||
// tech.giveTech("6s half-life")
|
||||
// for (let i = 0; i < 10; i++) tech.giveTech("replication")
|
||||
@@ -35,11 +35,12 @@ const level = {
|
||||
// powerUps.research.changeRerolls(100000)
|
||||
// tech.tech[297].frequency = 100
|
||||
// m.immuneCycle = Infinity //you can't take damage
|
||||
// level.difficultyIncrease(20) //30 is near max on hard //60 is near max on why
|
||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||
// simulation.enableConstructMode() //used to build maps in testing mode
|
||||
// level.testing();
|
||||
// spawn.starter(1900, -500, 200)
|
||||
// level.reactor(); //not in rotation, used for testing
|
||||
// spawn.cellBossCulture(1900, -500)
|
||||
// spawn.launcherBoss(1900, -500)
|
||||
// level.dripp(); //not in rotation, used for testing
|
||||
|
||||
if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************
|
||||
// powerUps.research.changeRerolls(3000)
|
||||
@@ -2683,7 +2684,7 @@ const level = {
|
||||
// spawn.shieldingBoss(1700, -500)
|
||||
|
||||
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
|
||||
for (let i = 0; i < 4; i++) spawn.starter(1900, -500)
|
||||
// for (let i = 0; i < 4; i++) spawn.starter(1900, -500)
|
||||
// spawn.pulsar(1900, -500)
|
||||
// spawn.shield(mob[mob.length - 1], 1900, -500, 1);
|
||||
// mob[mob.length - 1].isShielded = true
|
||||
@@ -10912,6 +10913,198 @@ const level = {
|
||||
DrawHandler.room2Top();
|
||||
};
|
||||
},
|
||||
dripp() {
|
||||
simulation.makeTextLog(`<strong>dripp</strong> by <span class='color-var'>M. B.</span>`);
|
||||
|
||||
const door = level.door(780, -350, 15, 400, 265);
|
||||
const buttonDoor = level.button(420, -10);
|
||||
const boost = level.boost(130, -445);
|
||||
const hazard = level.hazard(690, -1050, 10, 700, 0.4)
|
||||
const hazard2 = level.hazard(2470, -1515, 162, 14, 0.4)
|
||||
const hazard3 = level.hazard(740, -1050, 10, 700, 0.4)
|
||||
const hazard4 = level.hazard(3400, -380, 350, 6, 0.2)
|
||||
const hazard5 = level.hazard(3425, -1420, 400, 8, 0.2)
|
||||
const slimePit = level.hazard(2250, -100, 2700, 200, 0.004, "hsla(160, 100%, 35%,0.75)")
|
||||
const door2 = level.door(3131, -898, 40, 520, 522)
|
||||
const buttonDoor2 = level.button(2495, -270)
|
||||
const toggle = level.toggle(1463, -708, true)
|
||||
const elevator = level.elevator(4310, -150, 200, 50, -1443, 0.0025, { up: 0.1, down: 0.2 })
|
||||
const portal = level.portal({ //main portals
|
||||
x: 2117,
|
||||
y: -1560
|
||||
}, -2 * Math.PI, { //up
|
||||
x: -80,
|
||||
y: -475
|
||||
}, -Math.PI / 100) //up
|
||||
|
||||
const drip1 = level.drip(4100 + 1000 * Math.random(), -1900, 50, 100) // drip(x, yMin, yMax, period = 100, color = "hsla(160, 100%, 35%, 0.5)") {
|
||||
const drip2 = level.drip(4100 + 1000 * Math.random(), -1900, 50, 207) // drip(x, yMin, yMax, period = 100, color = "hsla(160, 100%, 35%, 0.5)") {
|
||||
const drip3 = level.drip(4100 + 1000 * Math.random(), -1900, 50, 133) // drip(x, yMin, yMax, period = 100, color = "hsla(160, 100%, 35%, 0.5)") {
|
||||
const drip4 = level.drip(4100 + 1000 * Math.random(), -1900, 50, 157) // drip(x, yMin, yMax, period = 100, color = "hsla(160, 100%, 35%, 0.5)") {
|
||||
|
||||
level.custom = () => {
|
||||
level.exit.drawAndCheck();
|
||||
|
||||
drip1.draw()
|
||||
drip2.draw()
|
||||
drip3.draw()
|
||||
drip4.draw()
|
||||
buttonDoor.query();
|
||||
buttonDoor.draw();
|
||||
if (buttonDoor.isUp) {
|
||||
door.isClosing = true
|
||||
} else {
|
||||
door.isClosing = false
|
||||
}
|
||||
door.openClose();
|
||||
|
||||
buttonDoor2.query();
|
||||
buttonDoor2.draw();
|
||||
if (buttonDoor2.isUp) {
|
||||
door2.isClosing = true
|
||||
} else {
|
||||
door2.isClosing = false
|
||||
}
|
||||
door2.openClose();
|
||||
|
||||
// shadow/shades builds
|
||||
ctx.fillStyle = "rgba(0, 0, 0, 0.05)"
|
||||
ctx.fillRect(3169, -900, 891, 580)
|
||||
ctx.fillRect(417, -1057, 380, 730)
|
||||
ctx.fillRect(930, -515, 207, 520)
|
||||
ctx.fillRect(930, -1280, 207, 760)
|
||||
ctx.fillRect(1220, -1280, 54, 800)
|
||||
ctx.fillRect(1221, -1394, 451, 1398)
|
||||
ctx.fillRect(1924, -800, 219, 674)
|
||||
ctx.fillRect(2264, -1488, 214, 1550)
|
||||
ctx.fillRect(2631, -1488, 201, 1550)
|
||||
ctx.fillRect(2889, -930, 237, 1090)
|
||||
ctx.fillRect(3124, -311, 957, 360)
|
||||
ctx.fillRect(1919, -1480, 220, 700)
|
||||
// ctx.fillRect(1768, -1200, 71, 500)
|
||||
level.enter.draw();
|
||||
elevator.move();
|
||||
toggle.query();
|
||||
};
|
||||
level.customTopLayer = () => {
|
||||
boost.query();
|
||||
hazard.opticalQuery();
|
||||
hazard2.opticalQuery();
|
||||
hazard3.opticalQuery();
|
||||
hazard4.opticalQuery();
|
||||
hazard5.opticalQuery();
|
||||
slimePit.query();
|
||||
// slimePit.draw();
|
||||
hazard.isOn = toggle.isOn
|
||||
hazard3.isOn = toggle.isOn
|
||||
portal[0].draw();
|
||||
portal[1].draw();
|
||||
portal[2].draw();
|
||||
portal[2].query()
|
||||
portal[3].query()
|
||||
};
|
||||
level.setPosToSpawn(0, -50); //normal spawn
|
||||
level.exit.x = 1400;
|
||||
level.exit.y = -1500;
|
||||
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
|
||||
level.defaultZoom = 1800
|
||||
simulation.zoomTransition(level.defaultZoom)
|
||||
document.body.style.backgroundColor = "#d8dadf";
|
||||
|
||||
//builds
|
||||
spawn.mapRect(-100, 0, 1485, 100);
|
||||
spawn.mapRect(-279, -750, 200, 850);
|
||||
spawn.mapRect(1781, -125, 375, 75);
|
||||
spawn.mapRect(1670, -100, 590, 200);
|
||||
spawn.mapRect(2261, 50, 3100, 50);
|
||||
spawn.mapRect(2420, -260, 300, 50);
|
||||
spawn.bodyRect(235, -240, 50, 50, 1, spawn.propSLide)
|
||||
spawn.mapRect(410, -1100, 400, 50);
|
||||
spawn.mapRect(1220, -1470, 420, 80)
|
||||
spawn.mapRect(927, -1325, 220, 50);
|
||||
spawn.mapRect(4950, -200, 425, 375);
|
||||
spawn.bodyRect(5200, -300, 100, 100);
|
||||
|
||||
//random builds
|
||||
spawn.mapRect(2150, 50, 225, 50);
|
||||
|
||||
//large border walls
|
||||
spawn.mapRect(-300, -2375, 6075, 475);
|
||||
spawn.mapRect(-951, -2374, 675, 2476);
|
||||
spawn.mapRect(-950, 100, 6950, 500);
|
||||
spawn.mapRect(5300, -2374, 700, 2700);
|
||||
|
||||
// create enemies
|
||||
spawn.randomMob(3000, -300, 0.5);
|
||||
spawn.randomMob(1900, -1000, 0.5);
|
||||
spawn.randomMob(2960, -800, 0.6)
|
||||
spawn.randomMob(3500, -1700, 0.4)
|
||||
spawn.randomMob(800, -1700, 0.6)
|
||||
spawn.randomMob(100, -1150, 0.6)
|
||||
spawn.randomMob(1095, -700, 0.6)
|
||||
|
||||
//powerUps
|
||||
powerUps.spawn(590, -200, "ammo")
|
||||
powerUps.spawn(600, -200, "heal")
|
||||
// powerUps.spawn(590, -200, "gun")
|
||||
powerUps.spawnStartingPowerUps(590, -200);
|
||||
|
||||
// more builds
|
||||
spawn.blockDoor(1230, -1490)
|
||||
// spawn.blockDoor(728, -1130);
|
||||
spawn.mapRect(-100, -380, 900, 50);
|
||||
spawn.mapRect(-279, -1400, 200, 650);
|
||||
spawn.mapRect(-279, -1900, 200, 650);
|
||||
// spawn.mapRect(-100, -1900, 2300, 75);
|
||||
// spawn.mapRect(2200, -1900, 1025, 75);
|
||||
// spawn.mapRect(2700, -1900, 2000, 75);
|
||||
spawn.mapRect(2270, -1530, 199, 50);
|
||||
spawn.mapRect(2633, -1530, 199, 50)
|
||||
// spawn.mapRect(4570, -1825, 125, 1925);
|
||||
spawn.mapRect(3106, -400, 300, 50)
|
||||
spawn.mapRect(3750, -400, 330, 50)
|
||||
spawn.mapRect(3130, -1030, 930, 130);
|
||||
spawn.mapRect(4015, -900, 46, 275);
|
||||
spawn.blockDoor(4016, -400)
|
||||
spawn.mapRect(3168, -1440, 290, 50);
|
||||
spawn.mapRect(3771, -1440, 294, 50);
|
||||
spawn.mapRect(3106, -355, 974, 42);
|
||||
spawn.mapRect(3228, -1395, 834, 380);
|
||||
spawn.mapRect(3129, -1350, 100, 325);
|
||||
spawn.mapRect(3129, -1400, 175, 100);
|
||||
spawn.mapRect(3129, -1437, 125, 75);
|
||||
spawn.mapRect(1382, 0, 295, 100);
|
||||
spawn.mapRect(1600, -50, 560, 85);
|
||||
spawn.mapRect(2264, -945, 220, 50);
|
||||
spawn.mapRect(1925, -800, 220, 50);
|
||||
spawn.mapRect(1390, -700, 260, 50);
|
||||
spawn.mapRect(927, -520, 220, 50);
|
||||
spawn.mapRect(2894, -948, 300, 50)
|
||||
spawn.mapRect(1230, -1825, 440, 81);
|
||||
spawn.mapRect(1616, -1750, 54, 360);
|
||||
spawn.mapRect(3128, -1440, 50, 50);
|
||||
spawn.mapRect(1705, -120, 125, 75);
|
||||
spawn.mapRect(1550, -25, 150, 50);
|
||||
spawn.mapRect(1628, -75, 100, 50);
|
||||
spawn.mapRect(1729, -130, 650, 75);
|
||||
//ground for blue portal
|
||||
spawn.mapRect(1917, -1484, 300, 50);
|
||||
spawn.mapRect(1917, -1950, 200, 325);
|
||||
spawn.mapRect(1917, -1825, 50, 375);
|
||||
|
||||
//split
|
||||
spawn.mapRect(1221, -1420, 57, 465);
|
||||
spawn.mapRect(1221, -634, 57, 450);
|
||||
spawn.bodyRect(1227, -105, 42, 189, 1, spawn.propSlide)
|
||||
// spawn.mapRect(1770, -1900, 70, 750);
|
||||
spawn.mapRect(1770, -780, 70, 400)
|
||||
spawn.bodyRect(1783, -289, 38, 250, 1, spawn.propSlide)
|
||||
if (simulation.difficulty > 1) spawn.randomLevelBoss(4800, -750);
|
||||
spawn.secondaryBossChance(4700, -1500)
|
||||
|
||||
powerUps.addResearchToLevel() //needs to run after mobs are spawned
|
||||
},
|
||||
|
||||
// ********************************************************************************************************
|
||||
// ********************************************************************************************************
|
||||
// ***************************************** training levels **********************************************
|
||||
|
||||
@@ -1051,7 +1051,7 @@ const simulation = {
|
||||
|
||||
if (!(m.cycle % 420)) { //once every 7 seconds
|
||||
if (tech.isZeno) {
|
||||
m.health *= 0.94 //remove 7%
|
||||
m.health *= 0.95 //remove 5%
|
||||
m.displayHealth();
|
||||
}
|
||||
if (tech.cyclicImmunity && m.immuneCycle < m.cycle + tech.cyclicImmunity) m.immuneCycle = m.cycle + tech.cyclicImmunity; //player is immune to damage for 60 cycles
|
||||
|
||||
@@ -958,13 +958,16 @@ const spawn = {
|
||||
me.cellID = cellID
|
||||
me.accelMag = 0.000165 * simulation.accelScale;
|
||||
me.memory = Infinity;
|
||||
me.leaveBody = false;
|
||||
me.isVerticesChange = true
|
||||
me.frictionAir = 0.012
|
||||
me.seePlayerFreq = Math.floor(11 + 7 * Math.random())
|
||||
me.seeAtDistance2 = 1400000;
|
||||
me.cellMassMax = 70
|
||||
me.collisionFilter.mask = cat.player | cat.bullet //| cat.body | cat.map
|
||||
Matter.Body.setDensity(me, 0.00035) // normal density is 0.001 // this reduces life by half and decreases knockback
|
||||
Matter.Body.setDensity(me, 0.0002 + 0.00001 * simulation.difficulty) // normal density is 0.001
|
||||
me.damageReduction = 0.17 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1); //me.damageReductionGoal
|
||||
|
||||
const k = 642 //k=r^2/m
|
||||
me.split = function() {
|
||||
Matter.Body.scale(this, 0.45, 0.45);
|
||||
@@ -979,7 +982,6 @@ const spawn = {
|
||||
me.onDamage = function(dmg) {
|
||||
if (Math.random() < 0.34 * dmg * Math.sqrt(this.mass) && this.health > dmg) this.split();
|
||||
}
|
||||
me.damageReduction = 0.17 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1); //me.damageReductionGoal
|
||||
me.do = function() {
|
||||
this.seePlayerByDistOrLOS();
|
||||
this.checkStatus();
|
||||
@@ -1016,7 +1018,6 @@ const spawn = {
|
||||
if (count < 1) { //only drop a power up if this is the last cell
|
||||
powerUps.spawnBossPowerUp(this.position.x, this.position.y)
|
||||
} else {
|
||||
this.leaveBody = false;
|
||||
this.isDropPowerUp = false;
|
||||
}
|
||||
}
|
||||
@@ -2462,7 +2463,6 @@ const spawn = {
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
|
||||
// ctx.beginPath();
|
||||
// ctx.arc(this.position.x, this.position.y, this.laserRange * 0.9, 0, 2 * Math.PI);
|
||||
// ctx.strokeStyle = "rgba(150,0,255,0.5)";
|
||||
|
||||
20
js/tech.js
20
js/tech.js
@@ -2579,7 +2579,7 @@ const tech = {
|
||||
},
|
||||
{
|
||||
name: "Zeno's paradox",
|
||||
description: "reduce <strong class='color-harm'>harm</strong> by <strong>85%</strong>, but every <strong>5</strong> seconds<br>remove <strong>6%</strong> of your current <strong class='color-h'>health</strong>",
|
||||
description: "reduce <strong class='color-harm'>harm</strong> by <strong>85%</strong>, but every <strong>5</strong> seconds<br>remove <strong>5%</strong> of your current <strong class='color-h'>health</strong>",
|
||||
// description: "every <strong>5</strong> seconds remove <strong>1/10</strong> of your <strong class='color-h'>health</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>90%</strong>",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
@@ -3679,12 +3679,11 @@ const tech = {
|
||||
{
|
||||
name: "strange attractor",
|
||||
descriptionFunction() { return `use ${powerUps.orb.research(2)} to spawn <strong>1</strong> <strong class='color-m'>tech</strong> with <strong>double</strong><br>your <strong class='color-dup'>duplication</strong> chance <em>(${(2*tech.duplicationChance()*100).toFixed(0)}%)</em>` },
|
||||
|
||||
// description: `use ${powerUps.orb.research(2)} to spawn <strong>1</strong> <strong class='color-m'>tech</strong> with <strong>double</strong><br>your <strong class='color-dup'>duplication</strong> chance <em>(${(2*tech.duplicationChance()*100).toFixed(0)}%)</em>`,
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 1000,
|
||||
frequencyDefault: 1000,
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
isNonRefundable: true,
|
||||
isBadRandomOption: true,
|
||||
allowed() {
|
||||
@@ -9623,17 +9622,15 @@ const tech = {
|
||||
remove() {}
|
||||
},
|
||||
{
|
||||
name: "re-arm",
|
||||
description: "remove all your <strong class='color-g'>guns</strong>,<br>and <strong>spawn</strong> new ones",
|
||||
maxCount: 9,
|
||||
name: "translucent",
|
||||
description: "remove your <strong class='color-g'>guns</strong> and <strong>spawn</strong> new ones<br>your <strong class='color-g'>bullets</strong> and bots are transparent",
|
||||
maxCount: 1,
|
||||
count: 0,
|
||||
frequency: 0,
|
||||
isNonRefundable: true,
|
||||
isJunk: true,
|
||||
allowed() {
|
||||
return b.inventory.length > 0
|
||||
},
|
||||
requires: "at least 1 gun",
|
||||
allowed() { return true },
|
||||
requires: "",
|
||||
effect() {
|
||||
for (let i = 0; i < b.inventory.length; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "gun");
|
||||
|
||||
@@ -9646,6 +9643,7 @@ const tech = {
|
||||
if (b.guns[i].ammo !== Infinity) b.guns[i].ammo = 0;
|
||||
}
|
||||
simulation.makeGunHUD(); //update gun HUD
|
||||
b.bulletDraw = () => {};
|
||||
},
|
||||
remove() {}
|
||||
},
|
||||
|
||||
27
todo.txt
27
todo.txt
@@ -1,27 +1,21 @@
|
||||
******************************************************** NEXT PATCH **************************************************
|
||||
|
||||
laser energy drain and damage now scale with fire delay effects
|
||||
no change for pulse since it already has a fire delay
|
||||
new community map: dripp!
|
||||
enable the 13 community maps in settings
|
||||
|
||||
explosion harm to player no longer scales with explosion radius
|
||||
explosion damage will treat all explosions the same as a basic grenade explosion
|
||||
large radius explosions are much safer
|
||||
acetone peroxide 80->70% increased radius, 100->50% increase in harm from explosions
|
||||
|
||||
CPT only triggers from damage above 1% per game cycle
|
||||
so no trigger from slime hazards or black holes or mob auras
|
||||
level: reactor has a horizontal flipped mode
|
||||
regression gives finalBoss(1.0005), Boss(1.0025), mob(1.05) increased damage taken
|
||||
|
||||
JUNK tech: return - go back to the intro level, but keep your tech
|
||||
|
||||
bug fixes
|
||||
|
||||
*********************************************************** TODO *****************************************************
|
||||
|
||||
|
||||
block manufacturing - molecular assembler tech
|
||||
Holding r-click will create a slowly increasing in size block, which will be thrown on release
|
||||
|
||||
double research
|
||||
|
||||
map ban option in settings
|
||||
dropdown list with checkboxes by each map
|
||||
|
||||
bullets that can target the player
|
||||
occurs if no mobs targets around
|
||||
worms? drones? missiles? spores?
|
||||
@@ -88,13 +82,14 @@ plasma ball
|
||||
plasma orb increases in size and power as it eats enemies
|
||||
while attached?
|
||||
|
||||
flashlight effect
|
||||
make level.do() graphic that only shows direction player is facing
|
||||
pattern it after cloaking field
|
||||
pattern it after cloaking field, or timeSkipBoss
|
||||
will it work with cloaking field at the same time
|
||||
|
||||
double jump?
|
||||
|
||||
tech coyote time
|
||||
tech: coyote time
|
||||
you can still jump for 2 seconds after falling off a ledge
|
||||
make it a JUNK tech? so you can keep the name
|
||||
some other benefit
|
||||
|
||||
Reference in New Issue
Block a user