diff --git a/mod-list.html b/mod-list.html
index ccb88dd9..95c93260 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -126,6 +126,7 @@
| buildingreplicator.js | Scans and replicates builds anywhere on the screen, along with some preset submitted builds | nousernamefound |
| change.js | Adds a tool that only replaces existing pixels | Alice |
| color_tools.js | Adds tools that manipulate colors | Alice |
+| controllable_pixel.js | Adds a pixel controlled using WASD (keyboard required) | Jayd |
| controllable_pixel_test.js | Adds a pixel that can be controlled with the keyboard keys. Read the commit description for more info. [PC ONLY] | Alice |
| cpt_alt.js | Adds a more destructive variant of the controllable pixel | Alice |
| debugRework.js | Revamps the Debug tool | Fioushemastor |
@@ -219,6 +220,7 @@
| Weapons |
| aircrafts.js | Adds aircraft and aircraft part pixels | Jayd |
+| c_aircraft.js | Adds a controllable fighter jet, wasd to move, q+wasd to shoot, gvbn for missiles. | Jayd |
| icb.js | Adds various levels of nested cluster bombs | Alice |
| life_eater.js | Adds Warhammer 40,000’s Life-Eater Virus and Virus Bombs | Alice |
| liquid_void.js | Adds a liquid variant of Void | Alice |
diff --git a/mods/c_fighter_jet.js b/mods/c_fighter_jet.js
new file mode 100644
index 00000000..8ba67c73
--- /dev/null
+++ b/mods/c_fighter_jet.js
@@ -0,0 +1,449 @@
+document.onkeydown = function(ki)/*keyboard_input*/ {
+ //a
+ if (ki.keyCode == 65) {
+ KA = true;
+ }
+ //d
+ if (ki.keyCode == 68) {
+ KD = true;
+ }
+ //w
+ if (ki.keyCode == 87) {
+ KW = true;
+ }
+ //s
+ if (ki.keyCode == 83) {
+ KS = true;
+ }
+ if (ki.keyCode == 86) {
+ KJ = true;
+ }
+ if (ki.keyCode == 78) {
+ KL = true;
+ }
+ if (ki.keyCode == 71) {
+ KI = true;
+ }
+ if (ki.keyCode == 66) {
+ KK = true;
+ }
+ if (ki.keyCode == 81) {
+ KQ = true;
+ }
+ if (ki.keyCode == 90) {
+ ammo = 300;
+ missile = 20;
+ }
+}
+document.onkeyup = function(i2)/*input 2*/ {
+ //a
+ if (i2.keyCode == 65) {
+ KA = false;
+ ul = false;
+ dl = false;
+ }
+ //d
+ if (i2.keyCode == 68) {
+ KD = false;
+ ur = false;
+ dr = false;
+ }
+ //w
+ if (i2.keyCode == 87) {
+ KW = false;
+ ul = false;
+ ur = false;
+ }
+ //s
+ if (i2.keyCode == 83) {
+ KS = false;
+ dl = false;
+ dr = false;
+ }
+ if (i2.keyCode == 86) {
+ KJ = false;
+ }
+ if (i2.keyCode == 78) {
+ KL = false;
+ }
+ if (i2.keyCode == 71) {
+ KI = false;
+ }
+ if (i2.keyCode == 66) {
+ KK = false;
+ }
+ if (i2.keyCode == 81) {
+ KQ = false;
+ }
+}
+var KA = false;
+var KD = false;
+var KW = false;
+var KS = false;
+var KJ = false;
+var KL = false;
+var KI = false;
+var KK = false;
+var KQ = false;
+var vX = 2;
+var vY = 2;
+var ul = false;
+var ur = false;
+var dl = false;
+var dr = false;
+var ammo = 300;
+var missile = 20;
+elements.cfj = {
+ name: "c_fighter_jet",
+ tick: function(pixel) {
+ logMessage("|");
+ logMessage("|[Callsign: Box 1]");
+ logMessage("|[Codename: 'Player]'");
+ logMessage("|");
+ logMessage("|[Operation: 'Sandbox']");
+ logMessage("|['Box Squadron']");
+ logMessage("|");
+ logMessage("|[Ammo:" + ammo +"]");
+ logMessage("|[Missiles:" + missile +"]");
+ logMessage("|");
+ if (KA === true) {
+ tryMove (pixel,pixel.x-vX,pixel.y)
+ }
+ if (KD === true) {
+ tryMove (pixel,pixel.x+vX,pixel.y)
+ }
+ if (KW === true) {
+ tryMove (pixel,pixel.x,pixel.y-vY)
+ }
+ if (KS === true) {
+ tryMove (pixel,pixel.x,pixel.y+vY)
+ }
+ if (KJ === true && missile > 0) {
+ createPixel("cfj_missile_left",pixel.x-1,pixel.y);
+ missile--;
+ }
+ if (KL === true && missile > 0) {
+ createPixel("cfj_missile_right",pixel.x+1,pixel.y);
+ missile--;
+ }
+ if (KI === true && missile > 0) {
+ createPixel("cfj_missile_up",pixel.x,pixel.y-1);
+ missile--;
+ }
+ if (KK === true && missile > 0) {
+ createPixel("cfj_missile_down",pixel.x,pixel.y+1);
+ missile--;
+ }
+ if (KQ === true) {
+ if (KA === true && dl === false && ul === false && ammo > 0) {
+ createPixel("cfj_b_l",pixel.x-4,pixel.y);
+ ammo--;
+ }
+ if (KD === true && dr === false && ur === false && ammo > 0) {
+ createPixel("cfj_b_r",pixel.x+4,pixel.y);
+ ammo--;
+ }
+ if (KW === true && ul === false && ur === false && ammo > 0) {
+ createPixel("cfj_b_u",pixel.x,pixel.y-4);
+ ammo--;
+ }
+ if (KS === true && dl === false && dr === false && ammo > 0) {
+ createPixel("cfj_b_d",pixel.x,pixel.y+4);
+ ammo--;
+ }
+ if (KA === true && KW === true && ammo > 0) {
+ createPixel("cfj_b_ul",pixel.x-4,pixel.y-4);
+ ul = true;
+ ammo--;
+ }
+ if (KD === true && KW === true && ammo > 0) {
+ createPixel("cfj_b_ur",pixel.x+4,pixel.y-4);
+ ur = true;
+ ammo--;
+ }
+ if (KA === true && KS === true && ammo > 0) {
+ createPixel("cfj_b_dl",pixel.x-4,pixel.y-4);
+ dl = true;
+ ammo--;
+ }
+ if (KD === true && KS === true && ammo > 0) {
+ createPixel("cfj_b_dr",pixel.x+4,pixel.y+4);
+ dr = true;
+ ammo--;
+ }
+ }
+ },
+ category: "cfj",
+ states:"solid",
+ color:"#FFFFFF",
+},
+elements.cfj_missile_left = {
+ color: "#524c41",
+ category: "cfj",
+ state: "solid",
+ behavior: [
+ "XX|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|M2 AND EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|M1|XX|EX:20>missile_shrapnel|CR:smoke AND EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|M2 AND EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "XX|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x-1, pixel.y)) {
+ if (!isEmpty(pixel.x-1, pixel.y,true)) {
+ }
+ }
+ }
+ },
+ density: 1300,
+ excludeRandom: true,
+ cooldown: defaultCooldown,
+ ignore: "cfj",
+},
+elements.cfj_missile_right = {
+ color: "#524c41",
+ category: "cfj",
+ state: "solid",
+ behavior: [
+ "XX|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|M2 AND EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|CR:smoke AND EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX|M1|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|M2 AND EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "XX|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x+1, pixel.y)) {
+ if (!isEmpty(pixel.x+1, pixel.y,true)) {
+ }
+ }
+ }
+ },
+ density: 1300,
+ excludeRandom: true,
+ cooldown: defaultCooldown,
+ ignore: "cfj",
+},
+elements.cfj_missile_up = {
+ color: "#524c41",
+ category: "cfj",
+ state: "solid",
+ behavior: [
+ "XX|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|M2 AND EX:20>missile_shrapnel|M1 AND EX:20>missile_shrapnel|M2 AND EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|CR:smoke AND EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "XX|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x, pixel.y-1)) {
+ if (!isEmpty(pixel.x, pixel.y-1,true)) {
+ }
+ }
+ }
+ },
+ density: 1300,
+ excludeRandom: true,
+ cooldown: defaultCooldown,
+ ignore: "cfj",
+},
+elements.cfj_missile_down = {
+ color: "#524c41",
+ category: "cfj",
+ state: "solid",
+ behavior: [
+ "XX|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|CR:smoke AND EX:20>missile_shrapnel|M2 AND EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX||EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|M2 AND EX:20>missile_shrapnel|M1 AND EX:20>missile_shrapnel|M2 AND EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel",
+ "XX|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|EX:20>missile_shrapnel|XX",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x, pixel.y+1)) {
+ if (!isEmpty(pixel.x, pixel.y+1,true)) {
+ }
+ }
+ }
+ },
+ density: 1300,
+ excludeRandom: true,
+ cooldown: defaultCooldown,
+ ignore: "cfj",
+},
+elements.missile_shrapnel = {
+ color: "#71797E",
+ behavior: [
+ "XX|XX|XX",
+ "XX|EX:5 %20|XX",
+ "M2%20|M1%20|M2%20",
+ ],
+ burn: 90,
+ burnTime: 100,
+ density: 2000,
+ conduct: 1,
+ state: "solid",
+ category: "ammunition"
+},
+elements.cfj_b_l = {
+ color: "#4c4e42",
+ behavior: [
+ "DB|DB|DB",
+ "DB|XX|DB",
+ "DB|DB|DB",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x-3, pixel.y)) {
+ deletePixel(pixel.x,pixel.y)
+ }
+ }
+ },
+ category: "cfj",
+ state: "solid",
+ insulate: true,
+ ignore: "cfj",
+},
+elements.cfj_b_r = {
+ color: "#4c4e42",
+ behavior: [
+ "DB|DB|DB",
+ "DB|XX|DB",
+ "DB|DB|DB",
+ ],
+tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x+3, pixel.y)) {
+ deletePixel(pixel.x,pixel.y)
+ }
+ }
+ },
+ category: "cfj",
+ state: "solid",
+ insulate: true,
+ ignore: "cfj",
+},
+elements.cfj_b_u = {
+ color: "#4c4e42",
+ behavior: [
+ "DB|DB|DB",
+ "DB|XX|DB",
+ "DB|DB|DB",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x, pixel.y-3)) {
+ deletePixel(pixel.x,pixel.y)
+ }
+ }
+ },
+ category: "cfj",
+ state: "solid",
+ insulate: true,
+ ignore: "cfj",
+},
+elements.cfj_b_d = {
+ color: "#4c4e42",
+ behavior: [
+ "DB|DB|DB",
+ "DB|XX|DB",
+ "DB|DB|DB",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x, pixel.y+3)) {
+ deletePixel(pixel.x,pixel.y)
+ }
+ }
+ },
+ category: "cfj",
+ state: "solid",
+ insulate: true,
+ ignore: "cfj",
+},
+elements.cfj_b_ul = {
+ color: "#4c4e42",
+ behavior: [
+ "DB|DB|DB",
+ "DB|XX|DB",
+ "DB|DB|DB",
+ ],
+tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x-3, pixel.y-3)) {
+ deletePixel(pixel.x,pixel.y)
+ }
+ }
+ },
+ category: "cfj",
+ state: "solid",
+ insulate: true,
+ ignore: "cfj",
+},
+elements.cfj_b_dl = {
+ color: "#4c4e42",
+ behavior: [
+ "DB|DB|DB",
+ "DB|XX|DB",
+ "DB|DB|DB",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x-3, pixel.y+3)) {
+ deletePixel(pixel.x,pixel.y)
+ }
+ }
+ },
+ category: "cfj",
+ state: "solid",
+ insulate: true,
+ ignore: "cfj",
+},
+elements.cfj_b_ur = {
+ color: "#4c4e42",
+ behavior: [
+ "DB|DB|DB",
+ "DB|XX|DB",
+ "DB|DB|DB",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x+3, pixel.y-3)) {
+ deletePixel(pixel.x,pixel.y)
+ }
+ }
+ },
+ category: "cfj",
+ state: "solid",
+ insulate: true,
+ ignore: "cfj",
+},
+elements.cfj_b_dr = {
+ color: "#4c4e42",
+ behavior: [
+ "DB|DB|DB",
+ "DB|XX|DB",
+ "DB|DB|DB",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x+3, pixel.y+3)) {
+ deletePixel(pixel.x,pixel.y)
+ }
+ }
+ },
+ category: "cfj",
+ state: "solid",
+ insulate: true,
+ ignore: "cfj",
+}
\ No newline at end of file
diff --git a/mods/controllable_pixel.js b/mods/controllable_pixel.js
new file mode 100644
index 00000000..aa4bd0ac
--- /dev/null
+++ b/mods/controllable_pixel.js
@@ -0,0 +1,75 @@
+document.onkeydown = function(ki)/*keyboard_input*/ {
+ //a
+ if (ki.keyCode == 65) {
+ KA = true;
+ //vX ++;
+ }
+ //d
+ if (ki.keyCode == 68) {
+ KD = true;
+ //vX ++;
+ }
+ //w
+ if (ki.keyCode == 87) {
+ KW = true;
+ //vY ++;
+ }
+ //s
+ if (ki.keyCode == 83) {
+ KS = true;
+ //vY ++;
+ }
+}
+document.onkeyup = function(i2)/*keyboard_input*/ {
+ //a
+ if (i2.keyCode == 65) {
+ KA = false;
+ //vX --;
+ }
+ //d
+ if (i2.keyCode == 68) {
+ KD = false;
+ //vX --;
+ }
+ //w
+ if (i2.keyCode == 87) {
+ KW = false;
+ //vY = 0;
+ }
+ //s
+ if (i2.keyCode == 83) {
+ KS = false;
+ //vY = 0;
+ }
+}
+var KA = false;
+var KD = false;
+var KW = false;
+var KS = false;
+var vX = 1;
+var vY = 1;
+elements.c_pixel = {
+ tick: function(pixel) {
+ /*if (vX === 3) {
+ vX --;
+ }
+ if (vY === 3) {
+ vY --;
+ }*/
+ if (KA === true) {
+ tryMove (pixel,pixel.x-vX,pixel.y)
+ }
+ if (KD === true) {
+ tryMove (pixel,pixel.x+vX,pixel.y)
+ }
+ if (KW === true) {
+ tryMove (pixel,pixel.x,pixel.y-vY)
+ }
+ if (KS === true) {
+ tryMove (pixel,pixel.x,pixel.y+vY)
+ }
+ },
+ category: "special",
+ states:"solid",
+ color:"#FFFFFF",
+}
\ No newline at end of file