diff --git a/mod-list.html b/mod-list.html
index b6c4c8cf..daa35cfe 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -182,6 +182,7 @@
| Machines & Technology |
| clone_liquid.js | Adds a liquid form of cloner | Alice |
| conveyance.js | Conveyors, operated with and without electricity | Melecie |
+| fine_tuned_cloner.js | Adds a cloner that can spawn at different rates and prevent unwated cloning | BatteRaquette58 |
| flipflop.js | Toggleable switches; Explanation | Flix |
| gameOfLife.js | Conway's Game of Life on a screen | ggod |
| logicgates.js | Adds predictable electricity and logic gates | nousernamefound |
diff --git a/mods/aircrafts.js b/mods/aircrafts.js
new file mode 100644
index 00000000..df5bb794
--- /dev/null
+++ b/mods/aircrafts.js
@@ -0,0 +1,225 @@
+//aircrafts
+elements.fast_bullet_left = {
+ color: "#4c4e42",
+ behavior: [
+ "XX|DL|XX",
+ "XX|XX|XX",
+ "XX|DL|XX",
+ ],
+tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x-3, pixel.y)) {
+ if (!isEmpty(pixel.x-3, pixel.y,true)) {
+ var newPixel = pixelMap[pixel.x-3][pixel.y];
+ if (newPixel.element === "fast_bullet_left") { break; }
+ if (elements[newPixel.element].state == "solid") {
+ if (Math.random() > (elements[newPixel.element].hardness || 0)) {
+ if (elements[newPixel.element].breakInto) {
+ breakPixel(newPixel);
+ }
+ else {
+ deletePixel(newPixel.x, newPixel.y);
+ }}}}
+ deletePixel(pixel.x,pixel.y);
+ break;
+ }}},
+ category: "ammunition",
+ state: "solid",
+ insulate: true,
+},
+elements.fast_bullet_right = {
+ color: "#4c4e42",
+ behavior: [
+ "XX|DL|XX",
+ "XX|XX|XX",
+ "XX|DL|XX",
+ ],
+ tick: function(pixel) {
+ for (var i=0; i<3; i++) {
+ if (!tryMove(pixel, pixel.x+3, pixel.y)) {
+ if (!isEmpty(pixel.x+3, pixel.y,true)) {
+ var newPixel = pixelMap[pixel.x+3][pixel.y];
+ if (newPixel.element === "fast_bullet_right") { break; }
+ if (elements[newPixel.element].state == "solid") {
+ if (Math.random() > (elements[newPixel.element].hardness || 0)) {
+ if (elements[newPixel.element].breakInto) {
+ breakPixel(newPixel);
+ }
+ else {
+ deletePixel(newPixel.x, newPixel.y);
+ }}}}
+ deletePixel(pixel.x,pixel.y);
+ break;
+ }}},
+ category: "ammunition",
+ state: "solid",
+ insulate: true,
+},
+elements.flak_cannon = {
+ color: "#C0C0C0",
+ behavior: behaviors.WALL,
+ behaviorOn: [
+ "XX|CR:flak|XX",
+ "XX|XX|XX",
+ "XX|XX|XX",
+ ],
+ category: "weapons",
+ state: "solid",
+ density: 1300,
+ conduct: 1,
+},
+ elements.flak = {
+ color: "#f0f0f0",
+ tick: function(pixel) {
+ if ((pixel.temp > 10 || pixel.charge) && !pixel.burning) {
+ pixel.burning = true;
+ pixel.burnStart = pixelTicks;
+ }
+ if (pixel.burning) {
+ if (!tryMove(pixel, pixel.x, pixel.y-1)) {
+ // tryMove again to the top left or top right
+ tryMove(pixel, pixel.x+(Math.random() < 0.5 ? -1 : 1), pixel.y-1);
+ }
+ if (pixelTicks-pixel.burnStart > 50 && Math.random() < 0.005) {
+ explodeAt(pixel.x, pixel.y, 10, "flak_shrapnel");
+ }
+ }
+ else {
+ if (!tryMove(pixel, pixel.x, pixel.y+1)) {
+ // tryMove again to the bottom left or bottom right
+ tryMove(pixel, pixel.x+(Math.random() < 0.5 ? -1 : 1), pixel.y+1);
+ }
+ }
+ doDefaults(pixel);
+ },
+ burn: 90,
+ burnTime: 100,
+ density: 2000,
+ conduct: 1,
+ state: "solid",
+ category: "ammunition"
+},
+ elements.flak_shrapnel = {
+ color: "#71797E",
+ behavior: [
+ "XX|XX|XX",
+ "XX|EX:5 %10|XX",
+ "M2|M1|M2",
+ ],
+ burn: 90,
+ burnTime: 100,
+ density: 2000,
+ conduct: 1,
+ state: "solid",
+ category: "ammunition"
+},
+elements.fighter_jet_left = {
+ color: "#bcc6cc",
+ behavior: [
+ "M1%0.2|M2%0.005 AND EX:5>metal_scrap|M2%0.005 AND EX:5>metal_scrap",
+ "M1 AND CR:fast_bullet_left|XX|CR:smoke AND EX:5>metal_scrap",
+ "M1%0.2|M2%0.005 AND EX:5>metal_scrap|M2%0.005 AND EX:5>metal_scrap",
+ ],
+tick: function(pixel) {
+ for (var i=0; i<2; i++) {
+ if (!tryMove(pixel, pixel.x-1, pixel.y)) {
+ if (!isEmpty(pixel.x-1, pixel.y,true)) {
+ var newPixel = pixelMap[pixel.x-1][pixel.y];
+ if (newPixel.element === "fast_bullet_left") { break; }
+ if (elements[newPixel.element].state == "solid") {
+ if (Math.random() > (elements[newPixel.element].hardness || 0)) {
+ if (elements[newPixel.element].breakInto) {
+ breakPixel(newPixel);
+ }
+ else {
+ deletePixel(newPixel.x, newPixel.y);
+ }}}}
+ deletePixel(pixel.x,pixel.y);
+ break;
+ }}},
+ category: "aircrafts",
+ breakInto: "metal_scrap"
+ },
+elements.fighter_jet_right = {
+ color: "#bcc6cc",
+ behavior: [
+ "M2%0.005 AND EX:5>metal_scrap|M2%0.005 AND EX:5>metal_scrap|M1%0.2",
+ "CR:smoke AND EX:5>metal_scrap|XX|M1 AND CR:fast_bullet_right",
+ "M2%0.005 AND EX:5>metal_scrap|M2%0.005 AND EX:5>metal_scrap|M1%0.2",
+ ],
+tick: function(pixel) {
+ for (var i=0; i<2; i++) {
+ if (!tryMove(pixel, pixel.x+1, pixel.y)) {
+ if (!isEmpty(pixel.x+1, pixel.y,true)) {
+ var newPixel = pixelMap[pixel.x+1][pixel.y];
+ if (newPixel.element === "fast_bullet_right") { break; }
+ if (elements[newPixel.element].state == "solid") {
+ if (Math.random() > (elements[newPixel.element].hardness || 0)) {
+ if (elements[newPixel.element].breakInto) {
+ breakPixel(newPixel);
+ }
+ else {
+ deletePixel(newPixel.x, newPixel.y);
+ }}}}
+ deletePixel(pixel.x,pixel.y);
+ break;
+ }}},
+ category: "aircrafts",
+ breakInto: "metal_scrap"
+ },
+elements.airliner_left = {
+ color: "#fafafa",
+ category: "aircrafts",
+ behavior: [
+ "M1%3 AND EX:7>fire,fire,fire,metal_scrap|XX|XX",
+ "M1 AND EX:7>fire,fire,fire,metal_scrap|XX|XX",
+ "M1%3 AND EX:7>fire,fire,fire,metal_scrap|XX|CR:smoke%10",
+ ],
+ burnTime: 1000,
+ burn: 40,
+ burnInto: "metal_scrap",
+ breakInto: "metal_scrap",
+ conduct: 1
+},
+elements.airliner_right = {
+ color: "#fafafa",
+ category: "aircrafts",
+ behavior: [
+ "XX|XX|M1%3 AND EX:7>fire,fire,fire,metal_scrap",
+ "XX|XX|M1 AND EX:7>fire,fire,fire,metal_scrap",
+ "CR:smoke%10|XX|M1%3 AND EX:7>fire,fire,fire,metal_scrap",
+ ],
+ burnTime: 1000,
+ burn: 40,
+ burnInto: "metal_scrap",
+ breakInto: "metal_scrap",
+ conduct: 1
+},
+elements.bomber_left = {
+ color: "#fafafa",
+ category: "aircrafts",
+ behavior: [
+ "M1%3 AND EX:7>fire,fire,fire,metal_scrap|XX|XX",
+ "M1 AND EX:7>fire,fire,fire,metal_scrap|XX|XX",
+ "M1%3 AND EX:7>fire,fire,fire,metal_scrap|XX|CR:smoke%10 AND CR:bomb",
+ ],
+ burnTime: 1000,
+ burn: 40,
+ burnInto: "metal_scrap",
+ breakInto: "metal_scrap",
+ conduct: 1
+},
+elements.bomber_right = {
+ color: "#fafafa",
+ category: "aircrafts",
+ behavior: [
+ "XX|XX|M1%3 AND EX:7>fire,fire,fire,metal_scrap",
+ "XX|XX|M1 AND EX:7>fire,fire,fire,metal_scrap",
+ "CR:smoke%10 AND CR:bomb|XX|M1%3 AND EX:7>fire,fire,fire,metal_scrap",
+ ],
+ burnTime: 1000,
+ burn: 40,
+ burnInto: "metal_scrap",
+ breakInto: "metal_scrap",
+ conduct: 1
+}
\ No newline at end of file
diff --git a/mods/weapons.js b/mods/weapons.js
index 99831ad9..3eef74c2 100644
--- a/mods/weapons.js
+++ b/mods/weapons.js
@@ -345,11 +345,11 @@ elements.gaster_blast_right = {
elements.fast_bullet_left = {
color: "#4c4e42",
behavior: [
- "DL|DL|XX",
- "DL|XX|XX",
- "DL|DL|XX",
+ "XX|DL|XX",
+ "XX|XX|XX",
+ "XX|DL|XX",
],
- tick: function(pixel) {
+tick: function(pixel) {
for (var i=0; i<3; i++) {
if (!tryMove(pixel, pixel.x-3, pixel.y)) {
if (!isEmpty(pixel.x-3, pixel.y,true)) {
@@ -373,9 +373,9 @@ elements.fast_bullet_left = {
elements.fast_bullet_right = {
color: "#4c4e42",
behavior: [
- "XX|DL|DL",
- "XX|XX|DL",
- "XX|DL|DL",
+ "XX|DL|XX",
+ "XX|XX|XX",
+ "XX|DL|XX",
],
tick: function(pixel) {
for (var i=0; i<3; i++) {
@@ -414,7 +414,7 @@ elements.flak_cannon = {
elements.flak = {
color: "#f0f0f0",
tick: function(pixel) {
- if ((pixel.temp > 1000 || pixel.charge) && !pixel.burning) {
+ if ((pixel.temp > 10 || pixel.charge) && !pixel.burning) {
pixel.burning = true;
pixel.burnStart = pixelTicks;
}
@@ -455,4 +455,58 @@ elements.flak_cannon = {
conduct: 1,
state: "solid",
category: "ammunition"
-}
\ No newline at end of file
+},
+elements.fighter_jet_left = {
+ color: "#bcc6cc",
+ behavior: [
+ "M1%0.2|M2%0.005 AND EX:5>metal_scrap|M2%0.005 AND EX:5>metal_scrap",
+ "M1 AND CR:fast_bullet_left|XX|CR:smoke AND EX:5>metal_scrap",
+ "M1%0.2|M2%0.005 AND EX:5>metal_scrap|M2%0.005 AND EX:5>metal_scrap",
+ ],
+tick: function(pixel) {
+ for (var i=0; i<2; i++) {
+ if (!tryMove(pixel, pixel.x-1, pixel.y)) {
+ if (!isEmpty(pixel.x-1, pixel.y,true)) {
+ var newPixel = pixelMap[pixel.x-1][pixel.y];
+ if (newPixel.element === "fast_bullet_left") { break; }
+ if (elements[newPixel.element].state == "solid") {
+ if (Math.random() > (elements[newPixel.element].hardness || 0)) {
+ if (elements[newPixel.element].breakInto) {
+ breakPixel(newPixel);
+ }
+ else {
+ deletePixel(newPixel.x, newPixel.y);
+ }}}}
+ deletePixel(pixel.x,pixel.y);
+ break;
+ }}},
+ category: "aircrafts",
+ breakInto: "metal_scrap"
+ },
+elements.fighter_jet_right = {
+ color: "#bcc6cc",
+ behavior: [
+ "M2%0.005 AND EX:5>metal_scrap|M2%0.005 AND EX:5>metal_scrap|M1%0.2",
+ "CR:smoke AND EX:5>metal_scrap|XX|M1 AND CR:fast_bullet_right",
+ "M2%0.005 AND EX:5>metal_scrap|M2%0.005 AND EX:5>metal_scrap|M1%0.2",
+ ],
+tick: function(pixel) {
+ for (var i=0; i<2; i++) {
+ if (!tryMove(pixel, pixel.x+1, pixel.y)) {
+ if (!isEmpty(pixel.x+1, pixel.y,true)) {
+ var newPixel = pixelMap[pixel.x+1][pixel.y];
+ if (newPixel.element === "fast_bullet_right") { break; }
+ if (elements[newPixel.element].state == "solid") {
+ if (Math.random() > (elements[newPixel.element].hardness || 0)) {
+ if (elements[newPixel.element].breakInto) {
+ breakPixel(newPixel);
+ }
+ else {
+ deletePixel(newPixel.x, newPixel.y);
+ }}}}
+ deletePixel(pixel.x,pixel.y);
+ break;
+ }}},
+ category: "aircrafts",
+ breakInto: "metal_scrap"
+ }
\ No newline at end of file