dark patterns

tech cloning requires > 25% dup chance, and is now only 2x (was 3x) your dup chance for a second boss
playing with the 4 community levels now removes 4 random levels from the level list

tech: dark patterns - reduce combat difficulty by 1 level and add 16 junk tech to the potential tech pool
This commit is contained in:
landgreen
2021-01-31 07:55:01 -08:00
parent 20a36f44c3
commit 774fa44b81
7 changed files with 1204 additions and 851 deletions

View File

@@ -2281,8 +2281,9 @@ const b = {
botType: "dynamo", botType: "dynamo",
friction: 0, friction: 0,
frictionStatic: 0, frictionStatic: 0,
frictionAir: 1, frictionAir: 0.02,
isStatic: true, spin: 0.07 * (Math.random() < 0.5 ? -1 : 1),
// isStatic: true,
isSensor: true, isSensor: true,
restitution: 0, restitution: 0,
dmg: 0, // 0.14 //damage done in addition to the damage from momentum dmg: 0, // 0.14 //damage done in addition to the damage from momentum
@@ -2308,7 +2309,7 @@ const b = {
// } // }
if (!((m.cycle + this.phase) % 30)) { //twice a second if (!((m.cycle + this.phase) % 30)) { //twice a second
if (Vector.magnitude(Vector.sub(this.position, m.pos)) < 250) { //give energy if (Vector.magnitude(Vector.sub(this.position, m.pos)) < 250) { //give energy
// Matter.Body.setAngularVelocity(this, 10) Matter.Body.setAngularVelocity(this, this.spin)
if (this.isUpgraded) { if (this.isUpgraded) {
m.energy += 0.06 m.energy += 0.06
simulation.drawList.push({ //add dmg to draw queue simulation.drawList.push({ //add dmg to draw queue
@@ -2344,6 +2345,7 @@ const b = {
} }
}) })
for (let i = 0; i < q.length; i++) { for (let i = 0; i < q.length; i++) {
Matter.Body.setAngularVelocity(this, this.spin)
// mobs.statusStun(q[i], 180) // mobs.statusStun(q[i], 180)
// const dmg = 0.5 * b.dmgScale * (this.isUpgraded ? 2.5 : 1) // const dmg = 0.5 * b.dmgScale * (this.isUpgraded ? 2.5 : 1)
const dmg = 0.5 * b.dmgScale const dmg = 0.5 * b.dmgScale

View File

@@ -65,6 +65,7 @@ window.addEventListener('load', (event) => {
//add experimental selections based on url //add experimental selections based on url
for (const property in set) { for (const property in set) {
set[property] = set[property].replace(/%20/g, " ") set[property] = set[property].replace(/%20/g, " ")
set[property] = set[property].replace(/%27/g, "'")
set[property] = set[property].replace(/%CE%A8/g, "Ψ") set[property] = set[property].replace(/%CE%A8/g, "Ψ")
if (property === "field") { if (property === "field") {
let found = false let found = false
@@ -744,45 +745,45 @@ window.addEventListener("keydown", function(event) {
tech.removeLoreTechFromPool(); tech.removeLoreTechFromPool();
} }
simulation.makeTextLog( simulation.makeTextLog(
`<table id="control-table"> `<table class="pause-table">
<tr> <tr>
<td class='key-input'>T</td> <td class='key-input-pause'>T</td>
<td class='key-used'><strong>enter / exit testing mode</strong></td> <td class='key-used'><strong>toggle testing</strong></td>
</tr> </tr>
<tr> <tr>
<td class='key-input'>R</td> <td class='key-input-pause'>R</td>
<td class='key-used'>teleport to mouse</td> <td class='key-used'>teleport to mouse</td>
</tr> </tr>
<tr> <tr>
<td class='key-input'>F</td> <td class='key-input-pause'>F</td>
<td class='key-used'>cycle field</td> <td class='key-used'>cycle field</td>
</tr> </tr>
<tr> <tr>
<td class='key-input'>G</td> <td class='key-input-pause'>G</td>
<td class='key-used'>all guns</td> <td class='key-used'>all guns</td>
</tr> </tr>
<tr> <tr>
<td class='key-input'>H</td> <td class='key-input-pause'>H</td>
<td class='key-used'>fill health and energy</td> <td class='key-used'>fill health, energy</td>
</tr> </tr>
<tr> <tr>
<td class='key-input'>Y</td> <td class='key-input-pause'>Y</td>
<td class='key-used'>random tech</td> <td class='key-used'>random tech</td>
</tr> </tr>
<tr> <tr>
<td class='key-input'>U</td> <td class='key-input-pause'>U</td>
<td class='key-used'>next level</td> <td class='key-used'>next level</td>
</tr> </tr>
<tr> <tr>
<td class='key-input'>I/O</td> <td class='key-input-pause'>I/O</td>
<td class='key-used'>zoom in / out</td> <td class='key-used'>zoom in / out</td>
</tr> </tr>
<tr> <tr>
<td class='key-input'>1-8</td> <td class='key-input-pause'>1-8</td>
<td class='key-used'>spawn things</td> <td class='key-used'>spawn things</td>
</tr> </tr>
<tr> <tr>
<td class='key-input'>⇧X</td> <td class='key-input-pause'>⇧X</td>
<td class='key-used'>restart</td> <td class='key-used'>restart</td>
</tr> </tr>
</table>`, Infinity); </table>`, Infinity);

File diff suppressed because it is too large Load Diff

View File

@@ -515,6 +515,7 @@ const simulation = {
level.levels.push("basement"); level.levels.push("basement");
level.levels.push("detours"); level.levels.push("detours");
level.levels.push("house"); level.levels.push("house");
level.levels.splice(0, 4); //remove 4 random levels to make up for adding the 4 community levels
} }
level.levels = shuffle(level.levels); //shuffles order of maps level.levels = shuffle(level.levels); //shuffles order of maps
level.levels.unshift("intro"); //add level to the start of the randomized levels list level.levels.unshift("intro"); //add level to the start of the randomized levels list

View File

@@ -7,6 +7,7 @@ const tech = {
tech.tech[i].count = 0 tech.tech[i].count = 0
} }
lore.techCount = 0; lore.techCount = 0;
tech.removeJunkTechFromPool();
tech.removeLoreTechFromPool(); tech.removeLoreTechFromPool();
tech.addLoreTechToPool(); tech.addLoreTechToPool();
tech.armorFromPowerUps = 0; tech.armorFromPowerUps = 0;
@@ -19,18 +20,15 @@ const tech = {
simulation.updateTechHUD(); simulation.updateTechHUD();
}, },
removeLoreTechFromPool() { removeLoreTechFromPool() {
// for (let i = 0, len = tech.tech.length; i < len; i++) {
// if (tech.tech[i].isLore) {
// console.log('found one')
// tech.tech.splice(i, 1)
// tech.removeLoreTechFromPool();
// return;
// }
// }
for (let i = tech.tech.length - 1; i > 0; i--) { for (let i = tech.tech.length - 1; i > 0; i--) {
if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1) if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1)
} }
}, },
removeJunkTechFromPool() {
for (let i = tech.tech.length - 1; i > 0; i--) {
if (tech.tech[i].isJunk && tech.tech[i].count === 0) tech.tech.splice(i, 1)
}
},
giveTech(index = 'random') { giveTech(index = 'random') {
if (index === 'random') { if (index === 'random') {
let options = []; let options = [];
@@ -935,7 +933,7 @@ const tech = {
}, },
{ {
name: "dynamo-bot upgrade", name: "dynamo-bot upgrade",
description: "dynamo-bots <strong>regen</strong> <strong>12</strong> <strong class='color-f'>energy</strong> per second<br><em>applies to all current and future orbit-bots</em>", description: "dynamo-bots <strong>regen</strong> <strong>12</strong> <strong class='color-f'>energy</strong> per second<br><em>applies to all current and future dynamo-bots</em>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1782,7 +1780,7 @@ const tech = {
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return tech.duplicationChance() > 0 return tech.duplicationChance() > 0.15
}, },
requires: "some duplication chance", requires: "some duplication chance",
effect() { effect() {
@@ -1794,11 +1792,11 @@ const tech = {
}, },
{ {
name: "cloning", name: "cloning",
description: "each level has a chance to spawn a <strong>level boss</strong><br>equal to <strong>triple</strong> your <strong class='color-dup'>duplication</strong> chance", description: "each level has a chance to spawn a <strong>level boss</strong><br>equal to <strong>double</strong> your <strong class='color-dup'>duplication</strong> chance",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return tech.duplicationChance() > 0 return tech.duplicationChance() > 0.25
}, },
requires: "some duplication chance", requires: "some duplication chance",
effect() { effect() {
@@ -1974,6 +1972,23 @@ const tech = {
} }
} }
}, },
{
name: "dark patterns",
description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>16</strong> junk <strong class='color-m'>tech</strong> to the potential pool",
maxCount: 1,
isNonRefundable: true,
isCustomHide: true,
count: 0,
allowed() {
return powerUps.research.count === 0 && level.onLevel < 6
},
requires: "no research, and in the first 5 levels",
effect() {
level.difficultyDecrease(simulation.difficultyMode)
for (let i = 0; i < 160; i++) tech.tech.push(tech.junk[Math.floor(Math.random() * tech.junk.length)])
},
remove() {}
},
{ {
name: "cardinality", name: "cardinality",
description: "<strong class='color-m'>tech</strong>, <strong class='color-f'>fields</strong>, and <strong class='color-g'>guns</strong> have <strong>5</strong> <strong>choices</strong>", description: "<strong class='color-m'>tech</strong>, <strong class='color-f'>fields</strong>, and <strong class='color-g'>guns</strong> have <strong>5</strong> <strong>choices</strong>",
@@ -2002,9 +2017,8 @@ const tech = {
requires: "not cardinality, not futures or commodities exchanges", requires: "not cardinality, not futures or commodities exchanges",
effect: () => { effect: () => {
tech.isDeterminism = true; tech.isDeterminism = true;
for (let i = 0; i < 5; i++) { //if you change the six also change it in Born rule //if you change the six also change it in Born rule
powerUps.spawn(m.pos.x, m.pos.y, "tech"); for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x, m.pos.y, "tech");
}
}, },
remove() { remove() {
tech.isDeterminism = false; tech.isDeterminism = false;
@@ -3311,7 +3325,7 @@ const tech = {
}, },
remove() { remove() {
if (tech.isWideLaser) { if (tech.isWideLaser) {
tech.wideLaser = 0 // tech.wideLaser = 0
tech.isWideLaser = false; tech.isWideLaser = false;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
@@ -4034,9 +4048,7 @@ const tech = {
}, },
requires: "", requires: "",
effect() { effect() {
for (let i = 0; i < 6; i++) { for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x, m.pos.y, "heal");
powerUps.spawn(m.pos.x, m.pos.y, "heal");
}
this.count-- this.count--
}, },
remove() {} remove() {}
@@ -4053,9 +4065,7 @@ const tech = {
}, },
requires: "not exciton lattice", requires: "not exciton lattice",
effect() { effect() {
for (let i = 0; i < 6; i++) { for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo");
powerUps.spawn(m.pos.x, m.pos.y, "ammo");
}
this.count-- this.count--
}, },
remove() {} remove() {}
@@ -4072,9 +4082,7 @@ const tech = {
}, },
requires: "not superdeterminism", requires: "not superdeterminism",
effect() { effect() {
for (let i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "research");
powerUps.spawn(m.pos.x, m.pos.y, "research");
}
this.count-- this.count--
}, },
remove() {} remove() {}
@@ -4143,6 +4151,348 @@ const tech = {
remove() {} remove() {}
}) })
}, },
junk: [
// {
// name: "junk",
// description: "",
// maxCount: 9,
// count: 0,
// isNonRefundable: true,
// isCustomHide: true,
// isJunk: true,
// allowed() {
// return true
// },
// requires: "",
// effect() {
// },
// remove() {}
// },
{
name: "Sleipnir",
description: "grow more legs",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
m.draw = function() {
ctx.fillStyle = m.fillColor;
m.walk_cycle += m.flipLegs * m.Vx;
//draw body
ctx.save();
ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5
ctx.translate(m.pos.x, m.pos.y);
for (let i = 0; i < 16; i++) {
m.calcLeg(Math.PI * i / 8, -3 * i / 16)
m.drawLeg("#444")
}
ctx.rotate(m.angle);
ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI);
let grd = ctx.createLinearGradient(-30, 0, 30, 0);
grd.addColorStop(0, m.fillColorDark);
grd.addColorStop(1, m.fillColor);
ctx.fillStyle = grd;
ctx.fill();
ctx.arc(15, 0, 4, 0, 2 * Math.PI);
ctx.strokeStyle = "#333";
ctx.lineWidth = 2;
ctx.stroke();
// ctx.beginPath();
// ctx.arc(15, 0, 3, 0, 2 * Math.PI);
// ctx.fillStyle = '#0cf';
// ctx.fill()
ctx.restore();
m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
}
},
remove() {}
},
{
name: "pareidolia",
description: "don't",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
m.draw = function() {
ctx.fillStyle = m.fillColor;
m.walk_cycle += m.flipLegs * m.Vx;
ctx.save();
ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.7
ctx.translate(m.pos.x, m.pos.y);
m.calcLeg(Math.PI, -3);
m.drawLeg("#4a4a4a");
m.calcLeg(0, 0);
m.drawLeg("#333");
ctx.rotate(m.angle);
ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI);
let grd = ctx.createLinearGradient(-30, 0, 30, 0);
grd.addColorStop(0, m.fillColorDark);
grd.addColorStop(1, m.fillColor);
ctx.fillStyle = grd;
ctx.fill();
ctx.strokeStyle = "#333";
ctx.lineWidth = 2;
if (!(m.angle > -Math.PI / 2 && m.angle < Math.PI / 2)) ctx.scale(1, -1); //here is the flip
ctx.stroke();
ctx.beginPath();
ctx.arc(2, -6, 7, 0, 2 * Math.PI);
ctx.stroke();
ctx.beginPath();
ctx.arc(25, -6, 7, 0.25 * Math.PI, 1.6 * Math.PI);
ctx.stroke();
ctx.beginPath();
ctx.arc(2, -10, 9, 1.25 * Math.PI, 1.75 * Math.PI);
ctx.stroke();
ctx.beginPath();
ctx.arc(25, -10, 9, 1.25 * Math.PI, 1.4 * Math.PI);
ctx.stroke();
ctx.beginPath();
ctx.arc(18, 13, 10, 0, 2 * Math.PI);
ctx.fillStyle = grd;
ctx.fill();
ctx.stroke();
ctx.beginPath();
ctx.arc(18, 13, 6, 0, 2 * Math.PI);
ctx.fillStyle = "#555";
ctx.fill();
ctx.stroke();
ctx.beginPath();
ctx.arc(3, -6, 3, 0, 2 * Math.PI);
ctx.fill();
ctx.stroke();
ctx.beginPath();
ctx.arc(26, -6, 3, 0, 2 * Math.PI);
ctx.fill();
ctx.stroke();
ctx.restore();
m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15;
}
},
remove() {}
},
{
name: "prism",
description: "you cycle through different <strong>colors</strong>",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
m.color = {
hue: 0,
sat: 100,
light: 50
}
setInterval(function() {
m.color.hue++
m.setFillColors()
}, 10);
},
remove() {}
},
{
name: "assimilation",
description: "all your <strong>bots</strong> are converted to the <strong>same</strong> random model",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return tech.totalBots() > 2
},
requires: "at least 3 bots",
effect() {
const total = tech.totalBots();
tech.dynamoBotCount = 0;
tech.nailBotCount = 0;
tech.laserBotCount = 0;
tech.orbitBotCount = 0;
tech.foamBotCount = 0;
tech.boomBotCount = 0;
tech.plasmaBotCount = 0;
tech.missileBotCount = 0;
for (let i = 0; i < bullet.length; i++) {
if (bullet[i].botType) bullet[i].endCycle = 0
}
const bots = [
() => {
b.nailBot();
tech.nailBotCount++;
},
() => {
b.foamBot();
tech.foamBotCount++;
},
() => {
b.boomBot();
tech.boomBotCount++;
},
() => {
b.laserBot();
tech.laserBotCount++;
},
() => {
b.orbitBot();
tech.orbitBotCount++
},
() => {
b.dynamoBot();
tech.dynamoBotCount++
}
]
const index = Math.floor(Math.random() * bots.length)
for (let i = 0; i < total; i++) bots[index]()
},
remove() {}
},
{
name: "growth hacking",
description: "increase combat <strong>difficulty</strong> by <strong>1 level</strong>",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
level.difficultyIncrease(simulation.difficultyMode)
},
remove() {}
},
{
name: "stun",
description: "<strong>stun</strong> all mobs for up to <strong>10</strong> seconds",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 600)
},
remove() {}
},
{
name: "re-arm",
description: "<strong>eject</strong> all your <strong class='color-g'>guns</strong>",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return b.inventory.length > 0
},
requires: "at least 1 gun",
effect() {
for (let i = 0; i < b.inventory.length; i++) powerUps.spawn(m.pos.x, m.pos.y, "gun");
//removes guns and ammo
b.inventory = [];
b.activeGun = null;
b.inventoryGun = 0;
for (let i = 0, len = b.guns.length; i < len; ++i) {
b.guns[i].have = false;
if (b.guns[i].ammo !== Infinity) b.guns[i].ammo = 0;
}
simulation.makeGunHUD(); //update gun HUD
},
remove() {}
},
{
name: "re-research",
description: "<strong>eject</strong> all your <strong class='color-r'>research</strong>",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return powerUps.research.count > 3
},
requires: "at least 4 research",
effect() {
for (let i = 0; i < powerUps.research.count; i++) powerUps.spawn(m.pos.x, m.pos.y, "research");
powerUps.research.count = 0
},
remove() {}
},
{
name: "quantum black hole",
description: "use all your <strong class='color-f'>energy</strong> to<br><strong>spawn</strong> inside the event horizon of a <strong>black hole boss</strong>",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
m.energy = 0
spawn.suckerBoss(m.pos.x, m.pos.y - 1000)
},
remove() {}
},
{
name: "black hole cluster",
description: "spawn <strong>2</strong> <strong class='color-r'>research</strong><br><strong>spawn</strong> 40 nearby <strong>black holes</strong>",
maxCount: 1,
count: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < 2; i++) powerUps.spawn(m.pos.x, m.pos.y, "research");
const unit = {
x: 1,
y: 0
}
for (let i = 0; i < 40; i++) {
const where = Vector.add(m.pos, Vector.mult(Vector.rotate(unit, Math.random() * 2 * Math.PI), 600 + 800 * Math.random()))
spawn.sucker(where.x, where.y)
}
},
remove() {}
},
],
//variables use for gun tech upgrades //variables use for gun tech upgrades
fireRate: null, fireRate: null,
bulletSize: null, bulletSize: null,
@@ -4337,5 +4687,5 @@ const tech = {
isGunSwitchField: null, isGunSwitchField: null,
isNeedleShieldPierce: null, isNeedleShieldPierce: null,
isDuplicateBoss: null, isDuplicateBoss: null,
isDynamoBotUpgrade: null isDynamoBotUpgrade: null,
} }

View File

@@ -84,6 +84,19 @@ td {
text-align: center; text-align: center;
} }
.pause-table {
width: auto;
}
.key-input-pause {
width: 15px;
padding: 0px 2px;
border: 2px solid #333;
/* border-radius: 50px; */
background-color: #fff;
text-align: center;
}
.key-used { .key-used {
color: #777; color: #777;
font-size: 80%; font-size: 80%;

View File

@@ -1,5 +1,9 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
tech cloning requires > 25% dup chance, and is now only 2x (was 3x) your dup chance for a second boss
playing with the 4 community levels now removes 4 random levels from the level list
tech: dark patterns - reduce combat difficulty by 1 level and add 16 junk tech to the potential tech pool
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
@@ -27,7 +31,23 @@
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
smooth history following for dynamo-bot? reduce 3 difficulty, randomize all mods when you...
take damage
switch guns
pick up a tech
add back in gamepad support
https://github.com/landgreen/landgreen.github.io/search?q=gamepadconnected
mechanic: gain damage when there are fewer bullets
mechanic: untested tech
negative effect (one time effects are better to avoid code clutter)
change the player draw to some of the dumb stuff in discord console
convert your bots to research (requires you to have some bots)
your bots are changed to random bots
rename intro level to something lore related
give undefined tech different effects at different localSettings.loreCount values give undefined tech different effects at different localSettings.loreCount values
or just random effects or just random effects
@@ -52,11 +72,6 @@ bot: ice blast, long CD AOE freeze
RPG default or tech: grenades detonate on your cursor / where your cursor was when they were fired RPG default or tech: grenades detonate on your cursor / where your cursor was when they were fired
tech: double your research
set your duplication chance to zero
requires 5 rerolls and 20% duplication chance
might want to use a single variable for all duplication
tech: dodge chance for cloaking, harmonic fields, also pilot wave tech: dodge chance for cloaking, harmonic fields, also pilot wave
20% chance up to 3 stacks, not additive 20% chance up to 3 stacks, not additive
0.8^count 0.8^count
@@ -74,25 +89,6 @@ tech: time dilation - when you exit time dilation rewind to the state you entere
mob ability bombs/bullets that suck in player mob ability bombs/bullets that suck in player
mechanic: technological dead end - add tech to the tech pool with a dumb effect
don't show up in custom?
negative effect (one time effects are better to avoid code clutter)
make the player rainbow colors
m.color = {
hue: 0,
sat: 100,
light: 50
}
setInterval(function(){
m.color.hue++
m.setFillColors()
}, 10);
remove all your energy
eject all your rerolls (not bad with dup)
teleport to the start of the level
remove your bots (requires you to have some bots)
your bots are changed to random bots
tech that requires integrated armament tech that requires integrated armament
mechanic - Your energy regen is only active when field and gun have not been used for 5 seconds. mechanic - Your energy regen is only active when field and gun have not been used for 5 seconds.
@@ -109,8 +105,6 @@ tech power up magnetism - power ups drift towards player
super balls start at 3, not 4 super balls start at 3, not 4
have to balance damage have to balance damage
RPG might need a buff, now that it disables the other cool grenade tech
make different move methods make different move methods
tech crouch charge jump tech crouch charge jump
tech double jump tech double jump
@@ -143,8 +137,6 @@ mob vision: look at player history
wormhole - make it clear when the wormhole can and can't teleport to a location before the player clicks wormhole - make it clear when the wormhole can and can't teleport to a location before the player clicks
time dilation - slow down the game engine by 1/2, but run an extra player cycle to simulate slow motion
flavor - your bullets destroy blocks flavor - your bullets destroy blocks
this isn't really a bonus, so maybe just add this as flavor to another tech field/gun this isn't really a bonus, so maybe just add this as flavor to another tech field/gun
a chance for destroyed blocks to drop stuff a chance for destroyed blocks to drop stuff