diff --git a/index.html b/index.html index 04fcedf3..750b14ce 100644 --- a/index.html +++ b/index.html @@ -15060,12 +15060,12 @@ behaviorRules = { categoryButton.setAttribute("current", true); } function setView(n) { - if (viewInfo[n]) { - view = n; - } - else { // reset view + if (!viewInfo[n] || n === 1) { // reset view view = null; } + else { + view = n; + } } function centerMouse() { mousePos = {x:width/2,y:height/2}; diff --git a/lang/zh_hant.json b/lang/zh_hant.json index 0d402dfe..4cfe2415 100644 --- a/lang/zh_hant.json +++ b/lang/zh_hant.json @@ -545,5 +545,9 @@ "freeze_ray":"冷雷", "kelp":"海帶", "mixer":"混合機", -"grinder":"混合機" +"grinder":"混合機", +"rice":"米", +"galvanized_steel":"鍍鋅鋼", +"midas_touch":"點石成金", +"liquid_ozone":"液臭氧" } diff --git a/mod-list.html b/mod-list.html index 683ca4f8..74cdac83 100644 --- a/mod-list.html +++ b/mod-list.html @@ -347,6 +347,7 @@ food_mods.jsA mod combining most food modsstefanblox, moss, Tisquares, SquareScreamYT, Adora, pixelegend4, Alice, Nubo318, Clide4, rottenEgghead Technical Libraries & Tests +1.10example.jsExamples for modern rendering modding and moreR74n a_bundle_of_tests.jsSeveral test functionsAlice all_stain.jsMakes every element stain solidsstefanblox betterMenuScreens.jsLibrary for mods to create their own menusggod diff --git a/mods/betterMenuScreens.js b/mods/betterMenuScreens.js index d150d814..61300345 100644 --- a/mods/betterMenuScreens.js +++ b/mods/betterMenuScreens.js @@ -214,6 +214,11 @@ class MenuScreen { return this; } + setMenuTextId(id) { + this.menuTextId = id; + return this; + } + /** * Adds a node to the menu screen content * @param {Node|Node[]} node Any HTML node/element or array of HTML nodes/elements @@ -262,12 +267,13 @@ class MenuScreen { parent.style.display = "none"; const inner = document.createElement("div"); inner.className = this.innerDivClass ?? "menuScreen"; + inner.id = this.innerDivId; inner.innerHTML = `${this.showCloseButton ? ` - ${this.title ?? "Menu Screen"}

"; + ${this.title ?? "Menu Screen"}

"; this.nodes.forEach(n => inner.querySelector(".menuText").appendChild(n)); parent.appendChild(inner); document.getElementById(id).appendChild(parent); } } -runAfterLoadList.push(inject); +runAfterLoadList.push(inject); \ No newline at end of file diff --git a/mods/circuitcore.js b/mods/circuitcore.js index 41903bd4..d5edbfdc 100644 --- a/mods/circuitcore.js +++ b/mods/circuitcore.js @@ -98,15 +98,23 @@ function createCircuitFrame(pixel, width_, height_, center=true, rotation=0) { var [rx, ry] = rotateCoordinate(x, y, rotation); var px = pixel.x + rx; var py = pixel.y + ry; + if (!(0 <= px && px < width && 0 <= py && py < height)) {continue;} + // Create the pixel if (!pixelMap[px] || pixelMap[px][py] === undefined) { createPixel("circuit_material", px, py); } + + // Set the core position property + if (pixelMap[px] && pixelMap[px][py] && pixelMap[px][py].element === "circuit_material") { + pixelMap[px][py].corePosition = { x: pixel.x, y: pixel.y }; + } } } } + function createPins(pixel, pins, rotation=0) { for (var i = 0; i < pins.length; i++) { var [rx, ry] = rotateCoordinate(pins[i][0], pins[i][1], rotation); @@ -691,75 +699,75 @@ elements.four_bit_SIPO_shift_register_circuit = { }; elements.four_bit_program_counter_circuit = { - tick: function(pixel) { - var pins = [ - // Data inputs (D0-D3) - [-3, -3, true], // D0 - [-1, -3, true], // D1 - [1, -3, true], // D2 - [3, -3, true], // D3 + tick: function(pixel) { + var pins = [ + // Data inputs (D0-D3) + [-3, -3, true], // D0 + [-1, -3, true], // D1 + [1, -3, true], // D2 + [3, -3, true], // D3 - // Control inputs (Increment, Write Enable) - [5, -1, true], // Increment - [5, 1, true], // Write Enable + // Control inputs (Increment, Write Enable) + [5, -1, true], // Increment + [5, 1, true], // Write Enable - // Outputs (Q0-Q3) - [-3, 3, false], // Q0 - [-1, 3, false], // Q1 - [1, 3, false], // Q2 - [3, 3, false], // Q3 - ]; + // Outputs (Q0-Q3) + [-3, 3, false], // Q0 + [-1, 3, false], // Q1 + [1, 3, false], // Q2 + [3, 3, false], // Q3 + ]; - initializeCircuit(pixel, pins, 9, 5); + initializeCircuit(pixel, pins, 9, 5); - // Read data inputs - var D = [ - checkPin(pixel, pins, 0), - checkPin(pixel, pins, 1), - checkPin(pixel, pins, 2), - checkPin(pixel, pins, 3) - ]; + // Read data inputs + var D = [ + checkPin(pixel, pins, 0), + checkPin(pixel, pins, 1), + checkPin(pixel, pins, 2), + checkPin(pixel, pins, 3) + ]; - // Read control inputs - var Increment = checkPin(pixel, pins, 4); - var WriteEnable = checkPin(pixel, pins, 5); + // Read control inputs + var Increment = checkPin(pixel, pins, 4); + var WriteEnable = checkPin(pixel, pins, 5); - // Initialize the state if not already done - if (pixel._state === undefined) { - pixel._state = [false, false, false, false]; - pixel.prevIncrement = false; // Previous state of Increment pin - } + // Initialize the state if not already done + if (pixel._state === undefined) { + pixel._state = [false, false, false, false]; + pixel.prevIncrement = false; // Previous state of Increment pin + } - // Convert the state to a 4-bit binary number - var stateValue = binaryArrayToNumber(pixel._state); + // Convert the state to a 4-bit binary number + var stateValue = binaryArrayToNumber(pixel._state); - // Detect the positive edge on the Increment pin - if (Increment && !pixel.prevIncrement) { - stateValue = (stateValue + 1) % 16; // Ensure the value wraps around at 4 bits - } + // Detect the positive edge on the Increment pin + if (Increment && !pixel.prevIncrement) { + stateValue = (stateValue + 1) % 16; // Ensure the value wraps around at 4 bits + } - // Update the register state if WriteEnable is active - if (WriteEnable) { - stateValue = binaryArrayToNumber(D); // Load data inputs into state - } + // Update the register state if WriteEnable is active + if (WriteEnable) { + stateValue = binaryArrayToNumber(D); // Load data inputs into state + } - // Update the state - pixel._state = [ - (stateValue & 8) !== 0, - (stateValue & 4) !== 0, - (stateValue & 2) !== 0, - (stateValue & 1) !== 0 - ]; + // Update the state + pixel._state = [ + (stateValue & 8) !== 0, + (stateValue & 4) !== 0, + (stateValue & 2) !== 0, + (stateValue & 1) !== 0 + ]; - // Output the register state - setPin(pixel, pins, 6, pixel._state[0]); // Q0 - setPin(pixel, pins, 7, pixel._state[1]); // Q1 - setPin(pixel, pins, 8, pixel._state[2]); // Q2 - setPin(pixel, pins, 9, pixel._state[3]); // Q3 + // Output the register state + setPin(pixel, pins, 6, pixel._state[0]); // Q0 + setPin(pixel, pins, 7, pixel._state[1]); // Q1 + setPin(pixel, pins, 8, pixel._state[2]); // Q2 + setPin(pixel, pins, 9, pixel._state[3]); // Q3 - // Update previous state of Increment pin - pixel.prevIncrement = Increment; - } + // Update previous state of Increment pin + pixel.prevIncrement = Increment; + } }; elements.four_bit_register_circuit = { @@ -1200,6 +1208,11 @@ elements.very_fast_clock = { tick: general_clock(8, 4), } +elements.fast_clock = { + color: "#FFAAFF", + tick: general_clock(16, 8), +} + var addDisplayCallback = function(pixel, pins, w, h) { for (var y = 1; y < h - 1; y++) { for (var x = 1; x < w - 1; x++) { @@ -1324,15 +1337,84 @@ elements.simple_double_seven_segment_display = { } }; +function malfunction_chip(pixel) { + var emptySpaces = []; + + // Search in a 5x5 neighborhood for empty spaces + for (var dy = -2; dy <= 2; dy++) { + for (var dx = -2; dx <= 2; dx++) { + var neighborX = pixel.x + dx; + var neighborY = pixel.y + dy; + if (pixelMap[neighborX] && pixelMap[neighborX][neighborY] === undefined) { + emptySpaces.push({ x: neighborX, y: neighborY }); + } + } + } + + if (emptySpaces.length > 0) { + // Randomly select one of the empty spaces + var randomSpace = emptySpaces[Math.floor(Math.random() * emptySpaces.length)]; + + // Determine what to spawn based on probability + var rand = Math.random(); + if (rand < 0.7) { + createPixel("electric", randomSpace.x, randomSpace.y); + } else if (rand < 0.99) { + createPixel("fire", randomSpace.x, randomSpace.y); + } else { + createPixel("explosion", randomSpace.x, randomSpace.y); + } + } +} + elements.circuit_material = { color: "#444444", - category: "logic" + category: "logic", + state: "solid", + behavior: behaviors.WALL, + hoverStat: function(pixel) { + return `Circuit: ${pixel.corePosition}`; + }, + tick: function(pixel) { + // Make it that extreme temperatures can stop the chip from working (for realism) + if (Math.random() < 0.003) { // Chance to check for temperature or nearby particles + // Check temperature + if (pixel.temp > 120) { + // Replace the circuit core with lead if overheating + if (pixel.corePosition && Math.random() < (0.00015) * (pixel.temp - 120)) { + var corePos = pixel.corePosition; + if (pixelMap[corePos.x] && pixelMap[corePos.x][corePos.y]) { + deletePixel(corePos.x, corePos.y); + createPixel("lead", corePos.x, corePos.y); + } + } + + // Randomly trigger malfunction if overheating + if (Math.random() < 0.001 * (pixel.temp - 120)) { + malfunction_chip(pixel); + } + + // Break the circuit material itself if overheating + if (Math.random() < 0.001 * (pixel.temp - 120)) { + var px = pixel.x; + var py = pixel.y; + deletePixel(px, py); + if (Math.random() < 0.5) {createPixel("lead", px, py);} + } + } + } + } }; + elements.input_pin = { color: "#DDAA33", category: "logic", + state: "solid", active: false, + stateHigh: "lead", + tempHigh: 570, + behavior: behaviors.WALL, tick: function(pixel) { pixel.active = false; var neighbors = getNeighbors(pixel); @@ -1349,7 +1431,11 @@ elements.input_pin = { elements.output_pin = { color: "#AAAAAA", category: "logic", + state: "solid", active: false, + stateHigh: "lead", + tempHigh: 570, + behavior: behaviors.WALL, tick: function(pixel) { var neighbors = getNeighbors(pixel); for (var i = 0;i < neighbors.length;i++) { @@ -1486,6 +1572,7 @@ var circuits = [ { circuit: elements.medium_clock }, { circuit: elements.fast_clock }, { circuit: elements.very_fast_clock }, + { circuit: elements.very_fast_clock }, // Displays/visual circuits: white { circuit: elements.simple_seven_segment_display, color: cc_WHITE, size: [5, 9, false] }, { circuit: elements.simple_double_seven_segment_display, color: cc_WHITE, size: [9, 9, false] }, @@ -1497,6 +1584,32 @@ circuits.forEach(circuitInfo => { circuitInfo.circuit.maxSize = 1; circuitInfo.circuit.isCircuitCore = true; circuitInfo.circuit.previewSize = circuitInfo.size; + + // Exclude circuits without a frame + if (circuitInfo.size) { + var previousCircuitTick = circuitInfo.circuit.tick; + circuitInfo.circuit.tick = function(pixel) { + previousCircuitTick(pixel); + + // Don't constantly check + if (Math.random() < 0.1) { + // If there aren't 4 neighboring circuit_material elements then remove the circuit's core + var neighbors = getNeighbors(pixel); + var circuitMaterialCount = 0; + for (var i = 0;i < neighbors.length;i++) { + if (neighbors[i].element == "circuit_material") { + circuitMaterialCount++; + } + } + + if (circuitMaterialCount < 2) { + deletePixel(pixel.x, pixel.y); + } + + pixel.temp += Math.random(0, 5); + } + } + } }); var circuitRotation = 0; @@ -1508,41 +1621,41 @@ document.addEventListener('keydown', function(event) { }); function drawCircuitExtras() { - if (elements[currentElement].isCircuitCore && elements[currentElement].previewSize) { - var circuitWidth = elements[currentElement].previewSize[0]; - var circuitHeight = elements[currentElement].previewSize[1]; - var centered = elements[currentElement].previewSize[2]; - var rotation = circuitRotation; + if (elements[currentElement].isCircuitCore && elements[currentElement].previewSize) { + var circuitWidth = elements[currentElement].previewSize[0]; + var circuitHeight = elements[currentElement].previewSize[1]; + var centered = elements[currentElement].previewSize[2]; + var rotation = circuitRotation; - var startX = 0; - var startY = 0; - var endX = circuitWidth - 1; - var endY = circuitHeight - 1; + var startX = 0; + var startY = 0; + var endX = circuitWidth - 1; + var endY = circuitHeight - 1; - if (centered) { - startX = -Math.floor(circuitWidth / 2); - startY = -Math.floor(circuitHeight / 2); - endX = Math.floor(circuitWidth / 2); - endY = Math.floor(circuitHeight / 2); - } + if (centered) { + startX = -Math.floor(circuitWidth / 2); + startY = -Math.floor(circuitHeight / 2); + endX = Math.floor(circuitWidth / 2); + endY = Math.floor(circuitHeight / 2); + } - for (var y = startY; y <= endY; y++) { - for (var x = startX; x <= endX; x++) { -// if (!(0 <= x && x < width && 0 <= y && y < height)) {continue;} + for (var y = startY; y <= endY; y++) { + for (var x = startX; x <= endX; x++) { +// if (!(0 <= x && x < width && 0 <= y && y < height)) {continue;} - var [rx, ry] = rotateCoordinate(x, y, rotation); - var px = mousePos.x + rx; - var py = mousePos.y + ry; + var [rx, ry] = rotateCoordinate(x, y, rotation); + var px = mousePos.x + rx; + var py = mousePos.y + ry; - ctx.fillStyle = "rgba(255, 255, 255, 0.1)"; + ctx.fillStyle = "rgba(255, 255, 255, 0.1)"; if ((rotation != 0 && !centered) || (0 <= px && px < width && 0 <= py && py < height) && pixelMap[px][py]) { ctx.fillStyle = "rgba(255, 0, 0, 0.3)"; } - ctx.fillRect(px * pixelSize, py * pixelSize, pixelSize, pixelSize); - } - } - } + ctx.fillRect(px * pixelSize, py * pixelSize, pixelSize, pixelSize); + } + } + } } runAfterLoad(() => { @@ -1550,6 +1663,7 @@ runAfterLoad(() => { drawPixels = function(forceTick=false) { originalDrawPixels3(forceTick); drawCircuitExtras(); + return true; }; }); resetInterval(tps); diff --git a/mods/fossils.js b/mods/fossils.js index d8e97c67..324c0993 100644 --- a/mods/fossils.js +++ b/mods/fossils.js @@ -1,3 +1,5 @@ +/* code by nekonico aka doobienecoarc */ + elements.fossil = { color: ["#bbb3ae","#b4b4b4","#c0c0c0"], behavior: [ @@ -6,12 +8,12 @@ elements.fossil = { "M2%75|M1|M2%75", ], reactions: { - "water": {elem1: "wet_sand", chance: 0.00035}, - "salt_water": {elem1: "wet_sand", chance: 0.0005}, - "sugar_water": {elem1: "wet_sand", chance: 0.0004}, - "seltzer": {elem1: "wet_sand", chance: 0.0004}, - "dirty_water": {elem1: "wet_sand", chance: 0.0004}, - "soda": {elem1: "wet_sand", chance: 0.0004}, + "water": {elem1: ["wet_sand","fossil_sand"], chance: 0.00035}, + "salt_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0005}, + "sugar_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "seltzer": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "dirty_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "soda": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, "lichen": {elem1: "dirt", chance: 0.0025}, "bone": {elem2: "fossil", chance: 0.000025}, "bone_marrow": {elem2: "marrow_fossil", chance: 0.00002}, @@ -20,7 +22,7 @@ elements.fossil = { "tree_branch": {elem2: "petrified_wood", chance: 0.000015}, "grape": {elem2: "juice", chance: 0.1, color2: "#291824"}, "wheat": {elem2: "flour"}, - "primordial_soup": {elem1: "wet_sand", chance: 0.001} + "primordial_soup": {elem1: ["wet_sand","fossil_sand"], chance: 0.001} }, tempHigh: 950, stateHigh: "magma", @@ -31,10 +33,9 @@ elements.fossil = { breakInto: ["rock","gravel","gravel","gravel","sand"], }; -elements.marrow_fossil = { - color: ["#cbb2b3","#c1a8a8","#d0b0b0"], - hidden:true, - behavior: behaviors.SUPPORTPOWDER, +elements.fossil_sand = { + color: ["#bbb3ae","#b4b4b4","#c0c0c0"], + behavior: behaviors.POWDER, reactions: { "water": {elem1: "wet_sand", chance: 0.00035}, "salt_water": {elem1: "wet_sand", chance: 0.0005}, @@ -42,6 +43,32 @@ elements.marrow_fossil = { "seltzer": {elem1: "wet_sand", chance: 0.0004}, "dirty_water": {elem1: "wet_sand", chance: 0.0004}, "soda": {elem1: "wet_sand", chance: 0.0004}, + "bone": {elem2: "fossil", chance: 0.0000025}, + "bone_marrow": {elem2: "marrow_fossil", chance: 0.000002}, + "skull": {elem2: ["human_fossil","human_fossil","fossil"], chance: 0.0000025}, + "wood": {elem2: "petrified_wood", chance: 0.0000015}, + "tree_branch": {elem2: "petrified_wood", chance: 0.0000015}, + "primordial_soup": {elem1: "wet_sand", chance: 0.001} + }, + tempHigh: 1700, + stateHigh: "molten_glass", + category: "land", + state: "solid", + density: 2000, + breakInto: ["gravel","gravel","sand"], +}; + +elements.marrow_fossil = { + color: ["#cbb2b3","#c1a8a8","#d0b0b0"], + hidden:true, + behavior: behaviors.SUPPORTPOWDER, + reactions: { + "water": {elem1: ["wet_sand","fossil_sand"], chance: 0.00035}, + "salt_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0005}, + "sugar_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "seltzer": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "dirty_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "soda": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, "lichen": {elem1: "dirt", chance: 0.0025}, "bone": {elem2: "fossil", chance: 0.000025}, "bone_marrow": {elem2: "marrow_fossil", chance: 0.00002}, @@ -70,12 +97,12 @@ elements.human_fossil = { "M2%50|M1|M2%50", ], reactions: { - "water": {elem1: "wet_sand", chance: 0.00035}, - "salt_water": {elem1: "wet_sand", chance: 0.0005}, - "sugar_water": {elem1: "wet_sand", chance: 0.0004}, - "seltzer": {elem1: "wet_sand", chance: 0.0004}, - "dirty_water": {elem1: "wet_sand", chance: 0.0004}, - "soda": {elem1: "wet_sand", chance: 0.0004}, + "water": {elem1: ["wet_sand","fossil_sand"], chance: 0.00035}, + "salt_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0005}, + "sugar_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "seltzer": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "dirty_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "soda": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, "lichen": {elem1: "dirt", chance: 0.0025}, "bone": {elem2: "fossil", chance: 0.000025}, "bone_marrow": {elem2: "marrow_fossil", chance: 0.00002}, @@ -103,12 +130,12 @@ elements.dino_fossil = { "M2%75|M1|M2%75", ], reactions: { - "water": {elem1: "wet_sand", chance: 0.00035}, - "salt_water": {elem1: "wet_sand", chance: 0.0005}, - "sugar_water": {elem1: "wet_sand", chance: 0.0004}, - "seltzer": {elem1: "wet_sand", chance: 0.0004}, - "dirty_water": {elem1: "wet_sand", chance: 0.0004}, - "soda": {elem1: "wet_sand", chance: 0.0004}, + "water": {elem1: ["wet_sand","fossil_sand"], chance: 0.00035}, + "salt_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0005}, + "sugar_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "seltzer": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "dirty_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "soda": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, "lichen": {elem1: "dirt", chance: 0.0025}, "bone": {elem2: "fossil", chance: 0.000025}, "bone_marrow": {elem2: "marrow_fossil", chance: 0.00002}, @@ -133,12 +160,12 @@ elements.petrified_wood = { hidden:true, behavior: behaviors.STURDYPOWDER, reactions: { - "water": {elem1: "wet_sand", chance: 0.00035}, - "salt_water": {elem1: "wet_sand", chance: 0.0005}, - "sugar_water": {elem1: "wet_sand", chance: 0.0004}, - "seltzer": {elem1: "wet_sand", chance: 0.0004}, - "dirty_water": {elem1: "wet_sand", chance: 0.0004}, - "soda": {elem1: "wet_sand", chance: 0.0004}, + "water": {elem1: ["wet_sand","fossil_sand"], chance: 0.00035}, + "salt_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0005}, + "sugar_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "seltzer": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "dirty_water": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, + "soda": {elem1: ["wet_sand","fossil_sand"], chance: 0.0004}, "lichen": {elem1: "dirt", chance: 0.0025}, "bone": {elem2: "fossil", chance: 0.000025}, "bone_marrow": {elem2: "marrow_fossil", chance: 0.00002}, @@ -189,10 +216,47 @@ elements.skull = { state: "solid", density: 1000, hardness: 0.5, + breakInto: ["quicklime","bone","human_bones","bone_marrow"] +}, + +elements.human_bones = { + name: "bone", + color: "#d9d9d9", + hidden:true, + behavior: behaviors.SUPPORT, + reactions: { + "water": { elem2:"broth", tempMin:70, color2:"#d7db69" }, + "salt_water": { elem2:"broth", tempMin:70, color2:"#d7db69" }, + "sugar_water": { elem2:"broth", tempMin:70, color2:"#d7db69" }, + "seltzer": { elem2:"broth", tempMin:70, color2:"#d7db69" }, + "rock": { "elem1": "human_fossil", chance:0.00005 }, + "sand": { "elem1": "human_fossil", chance:0.000035 }, + "dirt": { "elem1": "human_fossil", chance:0.00003 }, + "tuff": { "elem1": "human_fossil", chance:0.00005 }, + "basalt": { "elem1": "human_fossil", chance:0.00004 }, + "mudstone": { "elem1": "human_fossil", chance:0.00004 }, + "packed_sand": { "elem1": "human_fossil", chance:0.00004 }, + "gravel": { "elem1": "human_fossil", chance:0.000035 }, + "clay": { "elem1": "human_fossil", chance:0.00003 }, + "clay_soil": { "elem1": "human_fossil", chance:0.00003 }, + "permafrost": { "elem1": "human_fossil", chance:0.000035 }, + "mulch": { "elem1": "human_fossil", chance:0.00003 }, + "ant_wall": { "elem1": "human_fossil", chance:0.00002 }, + "limestone": { "elem1": "human_fossil", chance:0.00005 }, + "quicklime": { "elem1": "human_fossil", chance:0.000045 }, + "slaked_lime": { "elem1": "human_fossil", chance:0.000035 }, + }, + category:"life", + tempHigh: 760, + stateHigh: "quicklime", + state: "solid", + density: 1000, + hardness: 0.5, breakInto: ["quicklime","bone","bone","bone_marrow"] }, elements.dino_bones = { + name: "bone", color: "#d9d9d9", hidden:true, behavior: behaviors.SUPPORT, @@ -242,17 +306,19 @@ elements.coal = { }, burn: 28, burnTime: 1000, - burnInto: ["fire","fire","fire","fire","ash","carbon_dioxide"], + burnInto: ["fire","fire","fire","fire","dust","carbon_dioxide"], tempHigh: 6000, stateHigh: "fire", category: "powders", state: "solid", density: 250, - breakInto: ["ash","ash","carbon_dioxide"], + breakInto: ["dust","ash","carbon_dioxide"], hardness: 0.5, }, elements.bug_amber = { + hidden:true, + name: "amber", color: ["#ffc000","#b67f18","#c86305","#cf7a19","#e4ae3a"], temp: 20, tempHigh: 345, @@ -262,6 +328,8 @@ elements.bug_amber = { }, elements.hive_amber = { + hidden:true, + name: "amber", color: "#ffc000", temp: 20, tempHigh: 345, @@ -271,6 +339,7 @@ elements.hive_amber = { }, elements.dinosaur = { + hidden:true, color: ["#7F2B0A","#808080","#006400"], behavior: [ "XX|M2%5|XX", @@ -308,31 +377,130 @@ elements.dinosaur = { "glass": { elem2: "glass_shard", chance: 0.05 }, "concrete": { elem2: "dust", chance: 0.03 }, } +}, + +elements.trilobite = { + hidden:true, + color: "#808080", + behavior: [ + "XX|M2%5|SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water,primordial_soup%05", + "XX|FX%0.5|M2%50 AND SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water,primordial_soup%10 AND BO", + "M2%50|M1|M2%50 AND SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water,primordial_soup%10", + ], + reactions: { + "algae": { elem2:null, chance:0.25, func:behaviors.FEEDPIXEL }, + "kelp": { elem2:"water", chance:0.25 }, + "plant": { elem2:null, chance:0.125, func:behaviors.FEEDPIXEL }, + "fly": { elem2:null, chance:0.4, func:behaviors.FEEDPIXEL }, + "firefly": { elem2:null, chance:0.6, func:behaviors.FEEDPIXEL }, + "worm": { elem2:null, chance:0.25, func:behaviors.FEEDPIXEL }, + "tadpole": { elem2:null, chance:0.25, func:behaviors.FEEDPIXEL }, + "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, + "broth": { elem2:"water", chance:0.2, func:behaviors.FEEDPIXEL }, + "slug": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "herb": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "lettuce": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "dead_plant": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "lichen": { elem2:null, chance:0.1, func:behaviors.FEEDPIXEL }, + "yeast": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "yogurt": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "tea": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "yolk": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "cell": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "crumb": { elem2:null, chance:0.1, func:behaviors.FEEDPIXEL }, + "alcohol": { elem1:"dead_bug", chance:0.001 }, + "water": { elem2:"bubble", attr2:{"clone":"water"}, chance:0.002, oneway:true }, + "salt_water": { elem2:"bubble", attr2:{"clone":"salt_water"}, chance:0.002, oneway:true }, + "pool_water": { elem1:"dead_bug", chance:0.001 }, + "chlorine": { elem1:"dead_bug", chance:0.1 }, + "vinegar": { elem1:"dead_bug", chance:0.001 }, + }, + foodNeed: 10, + temp: 20, + tempHigh: 150, + stateHigh: "meat", + tempLow: -20, + stateLow: ["dead_bug","frozen_meat"], + category:"life", + breakInto: ["dead_bug","blood"], + burn:25, + burnTime:250, + state: "solid", + density: 1080, + conduct: 0.2, + eggColor: ["#211316","#2C1A1D","#503734"] +}, + +elements.extracted_dna = { + hidden:true, + name: "artificial_egg", + color: ["#211316","#2C1A1D","#503734","#e0d3ab","#d1c6be","#b5c0ad","#b9b8bc"], + behavior: behaviors.POWDER, + tick: function(pixel) { + if (Math.random() < 0.00025 || (pixel.dna && pixel.temp > 40 && pixel.temp < 150)) { + if (pixel.dna) { + changePixel(pixel,pixel.dna); + } + else changePixel(pixel,"cell") + } + }, + innerColor: "#ffffff", + tempHigh: 1200, + stateHigh: ["steam","dna","calcium","carbon_dioxide","sulfur_gas"], + breakInto: ["yolk","yolk","dna","cell"], + category:"life", + conduct: 1, }; -elements.head.breakInto = ["blood","meat","skull"] +elements.extractor = { + name: "dna-extractor", + color: ["#d1c6be","#b5c0ad","#b9b8bc"], + behavior: behaviors.STURDYPOWDER, + reactions: { + "hive_amber": { elem2:"extracted_dna", chance:0.2 }, + "bug_amber": { elem2:"extracted_dna", chance:0.2 }, + "dino_bones": { elem2:"extracted_dna", attr1:{"dna":"dinosaur"}, chance:0.2 }, + "skull": { elem2:"extracted_dna", attr1:{"dna":"human"}, chance:0.2 }, + "dino_fossil": { elem2:"extracted_dna", attr1:{"dna":"dinosaur"}, chance:0.02 }, + "human_fossil": { elem2:"extracted_dna", attr1:{"dna":"human"}, chance:0.02 }, + }, + category:"machines", + conduct: 1, + hardness: 1, +}; -elements.head.burnInto = ["ash","cooked_meat","skull"] +elements.head.breakInto = ["blood","meat","human_bones","skull"] -elements.head.stateHigh = ["cooked_meat","cooked_meat","skull"] +elements.head.burnInto = ["ash","cooked_meat","human_bones","skull","skull"] -elements.head.stateLow = ["frozen_meat","frozen_meat","skull"] +elements.head.stateHigh = ["cooked_meat","human_bones","skull","skull"] + +elements.head.stateLow = ["frozen_meat","human_bones","skull","skull","skull"] + +elements.body.breakInto = ["blood","meat","human_bones","bone"] + +elements.body.burnInto = ["ash","cooked_meat","human_bones"] + +elements.body.stateHigh = ["cooked_meat","human_bones"] + +elements.body.stateLow = ["frozen_meat","human_bones","human_bones"] elements.dead_bug.breakInto = ["calcium","calcium","calcium","quicklime"] if (!elements.sap.reactions) { elements.sap.reactions = {} } elements.sap.reactions.dead_bug = { elem1:"bug_amber", elem2:null, chance:0.1 }; - elements.sap.reactions.hive = { elem1:null, elem2:"hive_amber", chance:0.01 }; - elements.sap.reactions.ant = { elem1:"bug_amber", elem2:null, chance:0.1 }; - elements.sap.reactions.fly = { elem1:"bug_amber", elem2:null, chance:0.1 }; - elements.sap.reactions.flea = { elem1:"bug_amber", elem2:null, chance:0.1 }; - elements.sap.reactions.termite = { elem1:"bug_amber", elem2:null, chance:0.1 }; - elements.sap.reactions.worm = { elem1:"bug_amber", elem2:null, chance:0.1 }; - elements.sap.reactions.bee = { elem1:"bug_amber", elem2:null, chance:0.1 }; - elements.sap.reactions.firefly = { elem1:"bug_amber", elem2:null, chance:0.1 }; - elements.sap.reactions.stinkbug = { elem1:"bug_amber", elem2:null, chance:0.1 }; - elements.sap.reactions.slug = { elem1:"bug_amber", elem2:null, chance:0.08 }; - elements.sap.reactions.snail = { elem1:"bug_amber", elem2:null, chance:0.05 }; + elements.sap.reactions.hive = { elem1:null, elem2:"hive_amber", attr2:{"dna":"bee"}, chance:0.01 }; + elements.sap.reactions.ant = { elem1:"bug_amber", attr1:{"dna":"ant"}, elem2:null, chance:0.1 }; + elements.sap.reactions.fly = { elem1:"bug_amber", attr1:{"dna":"fly"}, elem2:null, chance:0.1 }; + elements.sap.reactions.flea = { elem1:"bug_amber", attr1:{"dna":"flea"}, elem2:null, chance:0.1 }; + elements.sap.reactions.termite = { elem1:"bug_amber", attr1:{"dna":"termite"}, elem2:null, chance:0.1 }; + elements.sap.reactions.worm = { elem1:"bug_amber", attr1:{"dna":"worm"}, elem2:null, chance:0.1 }; + elements.sap.reactions.bee = { elem1:"bug_amber", attr1:{"dna":"bee"}, elem2:null, chance:0.1 }; + elements.sap.reactions.firefly = { elem1:"bug_amber", attr1:{"dna":"firefly"}, elem2:null, chance:0.1 }; + elements.sap.reactions.stinkbug = { elem1:"bug_amber", attr1:{"dna":"stinkbug"}, elem2:null, chance:0.1 }; + elements.sap.reactions.slug = { elem1:"bug_amber", attr1:{"dna":"slug"}, elem2:null, chance:0.08 }; + elements.sap.reactions.snail = { elem1:"bug_amber", attr1:{"dna":"snail"}, elem2:null, chance:0.05 }; + elements.sap.reactions.trilobite = { elem1:"bug_amber", attr1:{"dna":"trilobite"}, elem2:null, chance:0.1 }; if (!elements.bone.reactions) { elements.bone.reactions = {} } diff --git a/mods/scp.js b/mods/scp.js index 55e23bd3..9703ac3d 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -1116,16 +1116,16 @@ elements.shy_body = { } if (pixel.dir == 1) { if (!isEmpty(pixel.x+2, pixel.y-1, true) && pixelMap[pixel.x+2][pixel.y-1].element == "head") { - pixel.panic += 0.1; + pixel.panic += 0.2; } else if (!isEmpty(pixel.x+3, pixel.y-1, true) && pixelMap[pixel.x+2][pixel.y-1].element == "head") { - pixel.panic += 0.1; + pixel.panic += 0.2; } else if (!isEmpty(pixel.x+4, pixel.y-1, true) && pixelMap[pixel.x+4][pixel.y-1].element == "head") { - pixel.panic += 0.1; + pixel.panic += 0.2; } else if (!isEmpty(pixel.x+5, pixel.y-1, true) && pixelMap[pixel.x+5][pixel.y-1].element == "head") { - pixel.panic += 0.1; + pixel.panic += 0.2; } else if (!isEmpty(pixel.x+5, pixel.y-1, true) && pixelMap[pixel.x+5][pixel.y-1].element == "head") { pixel.panic += 0.1; @@ -1139,19 +1139,31 @@ elements.shy_body = { else if (!isEmpty(pixel.x+8, pixel.y-1, true) && pixelMap[pixel.x+8][pixel.y-1].element == "head") { pixel.panic += 0.1; } + else if (!isEmpty(pixel.x+9, pixel.y-1, true) && pixelMap[pixel.x+9][pixel.y-1].element == "head") { + pixel.panic += 0.1; + } + else if (!isEmpty(pixel.x+10, pixel.y-1, true) && pixelMap[pixel.x+10][pixel.y-1].element == "head") { + pixel.panic += 0.1; + } + else if (!isEmpty(pixel.x+11, pixel.y-1, true) && pixelMap[pixel.x+11][pixel.y-1].element == "head") { + pixel.panic += 0.1; + } + else if (!isEmpty(pixel.x+12, pixel.y-1, true) && pixelMap[pixel.x+12][pixel.y-1].element == "head") { + pixel.panic += 0.1; + } } else if (pixel.dir == -1) { if (!isEmpty(pixel.x-2, pixel.y-1, true) && pixelMap[pixel.x-2][pixel.y-1].element == "head") { - pixel.panic += 0.1; + pixel.panic += 0.2; } else if (!isEmpty(pixel.x-3, pixel.y-1, true) && pixelMap[pixel.x-3][pixel.y-1].element == "head") { - pixel.panic += 0.1; + pixel.panic += 0.2; } else if (!isEmpty(pixel.x-4, pixel.y-1, true) && pixelMap[pixel.x-4][pixel.y-1].element == "head") { - pixel.panic += 0.1; + pixel.panic += 0.2; } else if (!isEmpty(pixel.x-5, pixel.y-1, true) && pixelMap[pixel.x-5][pixel.y-1].element == "head") { - pixel.panic += 0.1; + pixel.panic += 0.2; } else if (!isEmpty(pixel.x-5, pixel.y-1, true) && pixelMap[pixel.x-5][pixel.y-1].element == "head") { pixel.panic += 0.1; @@ -1165,6 +1177,18 @@ elements.shy_body = { else if (!isEmpty(pixel.x-8, pixel.y-1, true) && pixelMap[pixel.x-8][pixel.y-1].element == "head") { pixel.panic += 0.1; } + else if (!isEmpty(pixel.x-9, pixel.y-1, true) && pixelMap[pixel.x-9][pixel.y-1].element == "head") { + pixel.panic += 0.1; + } + else if (!isEmpty(pixel.x-10, pixel.y-1, true) && pixelMap[pixel.x-10][pixel.y-1].element == "head") { + pixel.panic += 0.1; + } + else if (!isEmpty(pixel.x-11, pixel.y-1, true) && pixelMap[pixel.x-11][pixel.y-1].element == "head") { + pixel.panic += 0.1; + } + else if (!isEmpty(pixel.x-12, pixel.y-1, true) && pixelMap[pixel.x-12][pixel.y-1].element == "head") { + pixel.panic += 0.1; + } } }, density: 1080, diff --git a/mods/texture_pack_by_jayd.js b/mods/texture_pack_by_jayd.js new file mode 100644 index 00000000..7c3ced5f --- /dev/null +++ b/mods/texture_pack_by_jayd.js @@ -0,0 +1,29 @@ +//texture_pack_by_jayd +document.body.style.backgroundImage = 'url("https://jayd-rubies.github.io/1236951076024877107.png")'; +gameDiv.style.border = "0px solid #ffffff"; +function drawCursor() { + canvas.style.backgroundColor = "#00000000"; + var layerCtx = canvasLayers.gui.getContext('2d'); + var mouseOffset = Math.trunc(mouseSize/2); + var topLeft = [mousePos.x-mouseOffset,mousePos.y-mouseOffset]; + var bottomRight = [mousePos.x+mouseOffset,mousePos.y+mouseOffset]; + // Draw a square around the mouse + layerCtx.strokeStyle = "#FFFFFF80"; + layerCtx.strokeRect(topLeft[0]*pixelSize,topLeft[1]*pixelSize,(bottomRight[0]-topLeft[0]+1)*pixelSize,(bottomRight[1]-topLeft[1]+1)*pixelSize); + // draw one transparent pixel in the center + if (settings.precision) { + layerCtx.fillStyle = "#ffffffc8"; + layerCtx.fillRect(mousePos.x*pixelSize,mousePos.y*pixelSize,pixelSize,pixelSize); + } + if (shaping) { + if (shaping === 1) { // Draw a white line from shapeStart.x to shapeStart.y + layerCtx.beginPath(); + layerCtx.strokeStyle = "#FFFFFF80"; + layerCtx.lineWidth = 2; + layerCtx.moveTo(shapeStart.x*pixelSize+pixelSizeHalf, shapeStart.y*pixelSize+pixelSizeHalf); + layerCtx.lineTo(mousePos.x*pixelSize+pixelSizeHalf, mousePos.y*pixelSize+pixelSizeHalf); + layerCtx.stroke(); + layerCtx.lineWidth = 1; + } + } +} \ No newline at end of file