sandboxels/mods/rpg.js

1343 lines
49 KiB
JavaScript

// by Nekonico and SquareScreamYT
settings.limitless = true;
saveSettings()
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 groundUnder = "rpg_grass";
var health = 1000;
var heroX = 0;
var heroY = 0;
var gold = 0;
var metRue = false;
var hasSword = false;
var swordQuest = false;
var swordQuestDone = false;
var KA = false;
var KD = false;
var KW = false;
var KS = false;
var vX = 1;
var vY = 1;
elements.hero = {
tick: function(pixel) {
if (pixel.x !== heroX) {
heroX = pixel.x
}
if (pixel.y !== heroY) {
heroY = pixel.y
}
if (KA === true && KW === false && KS === false && KD === false) {
if (!isEmpty(pixel.x-vX,pixel.y,true)) {
if (elements[pixelMap[pixel.x-vX][pixel.y].element].isPassable === true) {
var floor = pixelMap[pixel.x-vX][pixel.y]
deletePixel(pixel.x,pixel.y)
createPixel(groundUnder,pixel.x,pixel.y)
pixel.generated = true
groundUnder = (floor.element)
changePixel(pixelMap[floor.x][floor.y],"hero")
}
else if (elements[pixelMap[pixel.x-vX][pixel.y].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x-vX][pixel.y],"hero")
pixelMap[pixel.x-vX][pixel.y].color = "#005900"
deletePixel(pixel.x,pixel.y)
createPixel(groundUnder,pixel.x,pixel.y)
groundUnder = "rpg_leaves"
}
else if (elements[pixelMap[pixel.x-vX][pixel.y].element].id === elements.chest.id) {
var chest = pixelMap[pixel.x-vX][pixel.y]
if (chest.contents !== "empty" && chest.contents !== "checked_empty") {
alert(`Wow! You got ${chest.contents}!`)
if (chest.contents === "gold") {
gold += 1
console.log("found gold")
chest.contents = "empty"
chest.color = "#471b05"
}
else if (chest.contents === "sword") {
hasSword = true
console.log("found sword")
chest.contents = "empty"
chest.color = "#471b05"
}
}
else if (chest.contents === "empty") {
alert(`wow it's empty`);
chest.contents = "checked_empty"
}
}
else if (elements[pixelMap[pixel.x-vX][pixel.y].element].id === elements.rue.id) {
var rue = pixelMap[pixel.x-vX][pixel.y]
if (metRue === false) {
if (Math.random() > 0.5) {
alert(`Hi there!!`);
}
else {
alert(`Name's Rue!!`);
}
metRue = true
}
else if (metRue === true && swordQuest === false) {
if (confirm(`Sorry to be a bother, but I kinda need a sword. Do ya think you can find me one?`)) {
alert(`Thanks friend!`)
swordQuest = true
console.log("sword quest code")
}
else if (!confirm(`Sorry to be a bother, but I kinda need a sword. Do ya think you can find me one?`)) {
alert(`Ah, well, worth a shot. Maybe later?`)
}
}
else if (metRue === true && swordQuest === true && hasSword === false) {
alert(`Thank you for helping!`);
}
else if (metRue === true && swordQuest === true && hasSword === true) {
alert(`Thanks friend! Have some gold for your troubles.`);
console.log("sword quest completed")
swordQuestDone = true
hasSword = false
gold += 10
}
else if (metRue === true && swordQuest === true && hasSword === false && swordQuestDone === true) {
if (Math.random() > 0.5) {
alert(`So uh how are ya doing?`);
}
else if (Math.random() > 0.5) {
alert(`Thanks for the sword again!`);
}
else if (Math.random() > 0.5) {
alert(`Hi again!`);
}
else {
alert(`...`);
}
}
}
else if (elements[pixelMap[pixel.x-vX][pixel.y].element].isEnemy === true) {
var enemy = pixelMap[pixel.x-vX][pixel.y]
if (hasSword === true) {
logMessage(`you killed an enemy`)
console.log("killed enemy")
deletePixel(enemy.x,enemy.y)
createPixel(enemy.groundUnder,enemy.x,enemy.y)
gold ++
}
}
}
if (shiftDown) {
return
}
else {
KA = false
}
}
if (KA === false && KW === false && KS === false && KD === true) {
if (!isEmpty(pixel.x+vX,pixel.y,true)) {
if (elements[pixelMap[pixel.x+vX][pixel.y].element].isPassable === true) {
var floor = pixelMap[pixel.x+vX][pixel.y]
deletePixel(pixel.x,pixel.y)
createPixel(groundUnder,pixel.x,pixel.y)
groundUnder = (floor.element)
changePixel(pixelMap[floor.x][floor.y],"hero")
}
else if (elements[pixelMap[pixel.x+vX][pixel.y].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x+vX][pixel.y],"hero")
pixelMap[pixel.x+vX][pixel.y].color = "#005900"
deletePixel(pixel.x,pixel.y)
createPixel(groundUnder,pixel.x,pixel.y)
groundUnder = "rpg_leaves"
}
else if (elements[pixelMap[pixel.x+vX][pixel.y].element].id === elements.chest.id) {
var chest = pixelMap[pixel.x+vX][pixel.y]
if (chest.contents !== "empty" && chest.contents !== "checked_empty") {
alert(`Wow! You got ${chest.contents}!`)
if (chest.contents === "gold") {
gold += 1
console.log("found gold")
chest.contents = "empty"
chest.color = "#471b05"
}
else if (chest.contents === "sword") {
hasSword = true
console.log("found sword")
chest.contents = "empty"
chest.color = "#471b05"
}
}
else if (chest.contents === "empty") {
alert(`wow it's empty`);
chest.contents = "checked_empty"
}
}
else if (elements[pixelMap[pixel.x+vX][pixel.y].element].id === elements.rue.id) {
var rue = pixelMap[pixel.x+vX][pixel.y]
if (metRue === false) {
if (Math.random() > 0.5) {
alert(`Hi there!!`);
}
else {
alert(`Name's Rue!!`);
}
metRue = true
}
else if (metRue === true && swordQuest === false && hasSword === false) {
if (confirm(`Sorry to be a bother, but I kinda need a sword. Do ya think you can find me one?`)) {
alert(`Thanks friend!`)
swordQuest = true
console.log("sword quest code")
}
else if (!confirm(`Sorry to be a bother, but I kinda need a sword. Do ya think you can find me one?`)) {
alert(`Ah, well, worth a shot. Maybe later?`)
}
}
else if (metRue === true && swordQuest === true && hasSword === false && swordQuestDone === false) {
alert(`Thank you for helping!`);
}
else if (metRue === true && swordQuest === true && hasSword === true) {
alert(`Thanks friend! Have some gold for your troubles.`);
console.log("sword quest completed")
swordQuestDone = true
hasSword = false
gold += 10
}
else if (metRue === true && swordQuest === true && hasSword === false && swordQuestDone === true) {
if (Math.random() > 0.5) {
alert(`So uh how are ya doing?`);
}
else if (Math.random() > 0.5) {
alert(`Thanks for the sword again!`);
}
else if (Math.random() > 0.5) {
alert(`Hi again!`);
}
else {
alert(`...`);
}
}
}
else if (elements[pixelMap[pixel.x+vX][pixel.y].element].isEnemy === true) {
var enemy = pixelMap[pixel.x+vX][pixel.y]
if (hasSword === true) {
logMessage(`you killed an enemy`)
console.log("killed enemy")
deletePixel(enemy.x,enemy.y)
createPixel(enemy.groundUnder,enemy.x,enemy.y)
gold ++
}
}
}
if (shiftDown) {
return
}
else {
KD = false
}
}
if (KA === false && KW === true && KS === false && KD === false) {
if (!isEmpty(pixel.x,pixel.y-vX,true)) {
if (elements[pixelMap[pixel.x][pixel.y-vX].element].isPassable === true) {
var floor = pixelMap[pixel.x][pixel.y-vX]
deletePixel(pixel.x,pixel.y)
createPixel(groundUnder,pixel.x,pixel.y)
groundUnder = (floor.element)
changePixel(pixelMap[floor.x][floor.y],"hero")
}
else if (elements[pixelMap[pixel.x][pixel.y-vX].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x][pixel.y-vX],"hero")
pixelMap[pixel.x][pixel.y-vX].color = "#005900"
deletePixel(pixel.x,pixel.y)
createPixel(groundUnder,pixel.x,pixel.y)
groundUnder = "rpg_leaves"
}
else if (elements[pixelMap[pixel.x][pixel.y-vX].element].id === elements.chest.id) {
var chest = pixelMap[pixel.x][pixel.y-vX]
if (chest.contents !== "empty" && chest.contents !== "checked_empty") {
alert(`Wow! You got ${chest.contents}!`)
if (chest.contents === "gold") {
gold += 1
console.log("found gold")
chest.contents = "empty"
chest.color = "#471b05"
}
else if (chest.contents === "sword") {
hasSword = true
console.log("found sword")
chest.contents = "empty"
chest.color = "#471b05"
}
}
else if (chest.contents === "empty") {
alert(`wow it's empty`);
chest.contents = "checked_empty"
}
}
else if (elements[pixelMap[pixel.x][pixel.y-vX].element].id === elements.rue.id) {
var rue = pixelMap[pixel.x][pixel.y-vX]
if (metRue === false) {
if (Math.random() > 0.5) {
alert(`Hi there!!`);
}
else {
alert(`Name's Rue!!`);
}
metRue = true
}
else if (metRue === true && swordQuest === false && hasSword === false) {
if (confirm(`Sorry to be a bother, but I kinda need a sword. Do ya think you can find me one?`)) {
alert(`Thanks friend!`)
swordQuest = true
console.log("sword quest code")
}
else if (!confirm(`Sorry to be a bother, but I kinda need a sword. Do ya think you can find me one?`)) {
alert(`Ah, well, worth a shot. Maybe later?`)
}
}
else if (metRue === true && swordQuest === true && hasSword === false) {
alert(`Thank you for helping!`);
}
else if (metRue === true && swordQuest === true && hasSword === true) {
alert(`Thanks friend! Have some gold for your troubles.`);
console.log("sword quest completed")
swordQuestDone = true
hasSword = false
gold += 10
}
else if (metRue === true && swordQuest === true && hasSword === false && swordQuestDone === true) {
if (Math.random() > 0.5) {
alert(`So uh how are ya doing?`);
}
else if (Math.random() > 0.5) {
alert(`Thanks for the sword again!`);
}
else if (Math.random() > 0.5) {
alert(`Hi again!`);
}
else {
alert(`...`);
}
}
}
else if (elements[pixelMap[pixel.x][pixel.y-vX].element].isEnemy === true) {
var enemy = pixelMap[pixel.x][pixel.y-vX]
if (hasSword === true) {
logMessage(`you killed an enemy`)
console.log("killed enemy")
deletePixel(enemy.x,enemy.y)
createPixel(enemy.groundUnder,enemy.x,enemy.y)
gold ++
}
}
}
if (shiftDown) {
return
}
else {
KW = false
}
}
if (KA === false && KW === false && KS === true && KD === false) {
if (!isEmpty(pixel.x,pixel.y+vX,true)) {
if (elements[pixelMap[pixel.x][pixel.y+vX].element].isPassable === true) {
var floor = pixelMap[pixel.x][pixel.y+vX]
deletePixel(pixel.x,pixel.y)
createPixel(groundUnder,pixel.x,pixel.y)
groundUnder = (floor.element)
changePixel(pixelMap[floor.x][floor.y],"hero")
}
else if (elements[pixelMap[pixel.x][pixel.y+vX].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x][pixel.y+vX],"hero")
pixelMap[pixel.x][pixel.y+vX].color = "#006300"
deletePixel(pixel.x,pixel.y)
createPixel(groundUnder,pixel.x,pixel.y)
groundUnder = "rpg_leaves"
}
else if (elements[pixelMap[pixel.x][pixel.y+vX].element].id === elements.chest.id) {
var chest = pixelMap[pixel.x][pixel.y+vX]
if (chest.contents !== "empty" && chest.contents !== "checked_empty") {
alert(`Wow! You got ${chest.contents}!`)
if (chest.contents === "gold") {
gold += 1
console.log("found gold")
chest.contents = "empty"
chest.color = "#471b05"
}
else if (chest.contents === "sword") {
hasSword = true
console.log("found sword")
chest.contents = "empty"
chest.color = "#471b05"
}
}
else if (chest.contents === "empty") {
alert(`wow it's empty`);
chest.contents = "checked_empty"
}
}
else if (elements[pixelMap[pixel.x][pixel.y+vX].element].id === elements.rue.id) {
var rue = pixelMap[pixel.x][pixel.y+vX]
if (metRue === false) {
if (Math.random() > 0.5) {
alert(`Hi there!!`);
}
else {
alert(`Name's Rue!!`);
}
metRue = true
}
else if (metRue === true && swordQuest === false && hasSword === false) {
if (confirm(`Sorry to be a bother, but I kinda need a sword. Do ya think you can find me one?`)) {
alert(`Thanks friend!`)
swordQuest = true
console.log("sword quest code")
}
else if (!confirm(`Sorry to be a bother, but I kinda need a sword. Do ya think you can find me one?`)) {
alert(`Ah, well, worth a shot. Maybe later?`)
}
}
else if (metRue === true && swordQuest === true && hasSword === false) {
alert(`Thank you for helping!`);
}
else if (metRue === true && swordQuest === true && hasSword === true) {
alert(`Thanks friend! Have some gold for your troubles.`);
console.log("sword quest completed")
swordQuestDone = true
hasSword = false
gold += 10
}
else if (metRue === true && swordQuest === true && hasSword === false && swordQuestDone === true) {
if (Math.random() > 0.5) {
alert(`So uh how are ya doing?`);
}
else if (Math.random() > 0.5) {
alert(`Thanks for the sword again!`);
}
else if (Math.random() > 0.5) {
alert(`Hi again!`);
}
else {
alert(`...`);
}
}
}
else if (elements[pixelMap[pixel.x][pixel.y+vX].element].isEnemy === true) {
var enemy = pixelMap[pixel.x][pixel.y+vX]
if (hasSword === true) {
logMessage(`you killed an enemy`)
console.log("killed enemy")
deletePixel(enemy.x,enemy.y)
createPixel(enemy.groundUnder,enemy.x,enemy.y)
gold ++
}
}
}
if (shiftDown) {
return
}
else {
KS = false
}
}
},
category: "rpg",
state: "solid",
conduct: .05,
temp: 37,
tempHigh: 200,
stateHigh: "cooked_meat",
tempLow: -30,
stateLow: "frozen_meat",
burn: 10,
burnTime: 250,
burnInto: "cooked_meat",
breakInto: ["blood","meat","bone"],
forceSaveColor: true,
color:"#800020",
}
var rueGroundUnder = "rpg_grass";
var rueDir = "down";
elements.rue = {
tick: function(pixel) {
if (rueDir === "left" && Math.random() > 0.9) {
if (!isEmpty(pixel.x-vX,pixel.y,true)) {
if (elements[pixelMap[pixel.x-vX][pixel.y].element].id === elements.rpg_grass.id) {
changePixel(pixelMap[pixel.x-vX][pixel.y],"rue")
deletePixel(pixel.x,pixel.y)
createPixel(rueGroundUnder,pixel.x,pixel.y)
rueGroundUnder = "rpg_grass"
}
else if (elements[pixelMap[pixel.x-vX][pixel.y].element].id === elements.rpg_sand.id) {
changePixel(pixelMap[pixel.x-vX][pixel.y],"rue")
deletePixel(pixel.x,pixel.y)
createPixel(rueGroundUnder,pixel.x,pixel.y)
rueGroundUnder = "rpg_sand"
}
}
if (Math.random() > 0.75) {
rueDir = "right"
}
else if (Math.random() > 0.75) {
rueDir = "up"
}
else if (Math.random() > 0.75) {
rueDir = "down"
}
}
else if (rueDir === "right" && Math.random() > 0.9) {
if (!isEmpty(pixel.x+vX,pixel.y,true)) {
if (elements[pixelMap[pixel.x+vX][pixel.y].element].id === elements.rpg_grass.id) {
changePixel(pixelMap[pixel.x+vX][pixel.y],"rue")
deletePixel(pixel.x,pixel.y)
createPixel(rueGroundUnder,pixel.x,pixel.y)
rueGroundUnder = "rpg_grass"
}
else if (elements[pixelMap[pixel.x+vX][pixel.y].element].id === elements.rpg_sand.id) {
changePixel(pixelMap[pixel.x+vX][pixel.y],"rue")
deletePixel(pixel.x,pixel.y)
createPixel(rueGroundUnder,pixel.x,pixel.y)
rueGroundUnder = "rpg_sand"
}
}
if (Math.random() > 0.75) {
rueDir = "left"
}
else if (Math.random() > 0.75) {
rueDir = "down"
}
else if (Math.random() > 0.75) {
rueDir = "up"
}
}
else if (rueDir === "up" && Math.random() > 0.9) {
if (!isEmpty(pixel.x,pixel.y-vX,true)) {
if (elements[pixelMap[pixel.x][pixel.y-vX].element].id === elements.rpg_grass.id) {
changePixel(pixelMap[pixel.x][pixel.y-vX],"rue")
deletePixel(pixel.x,pixel.y)
createPixel(rueGroundUnder,pixel.x,pixel.y)
rueGroundUnder = "rpg_grass"
}
else if (elements[pixelMap[pixel.x][pixel.y-vX].element].id === elements.rpg_sand.id) {
changePixel(pixelMap[pixel.x][pixel.y-vX],"rue")
deletePixel(pixel.x,pixel.y)
createPixel(rueGroundUnder,pixel.x,pixel.y)
rueGroundUnder = "rpg_sand"
}
}
if (Math.random() > 0.75) {
rueDir = "down"
}
else if (Math.random() > 0.75) {
rueDir = "left"
}
else if (Math.random() > 0.75) {
rueDir = "right"
}
}
else if (rueDir === "down" && Math.random() > 0.9) {
if (!isEmpty(pixel.x,pixel.y+vX,true)) {
if (elements[pixelMap[pixel.x][pixel.y+vX].element].id === elements.rpg_grass.id) {
changePixel(pixelMap[pixel.x][pixel.y+vX],"rue")
deletePixel(pixel.x,pixel.y)
createPixel(rueGroundUnder,pixel.x,pixel.y)
rueGroundUnder = "rpg_grass"
}
else if (elements[pixelMap[pixel.x][pixel.y+vX].element].id === elements.rpg_sand.id) {
changePixel(pixelMap[pixel.x][pixel.y+vX],"rue")
deletePixel(pixel.x,pixel.y)
createPixel(rueGroundUnder,pixel.x,pixel.y)
rueGroundUnder = "rpg_sand"
}
}
if (Math.random() > 0.75) {
rueDir = "up"
}
else if (Math.random() > 0.75) {
rueDir = "right"
}
else if (Math.random() > 0.75) {
rueDir = "left"
}
}
},
category: "rpg",
state: "solid",
conduct: .05,
temp: 37,
tempHigh: 200,
stateHigh: "cooked_meat",
tempLow: -30,
stateLow: "frozen_meat",
burn: 10,
burnTime: 250,
burnInto: "cooked_meat",
breakInto: ["blood","meat","bone"],
forceSaveColor: true,
color:"#ffbe33",
}
elements.rpg_rat = {
tick: function(pixel) {
if (pixel.dir === undefined) {
if (Math.random() > 0.5) {
pixel.dir = "up"
}
else if (Math.random() > 0.5) {
pixel.dir = "down"
}
}
if (pixel.sidedir === undefined) {
if (Math.random() > 0.5) {
pixel.sidedir = "left"
}
else if (Math.random() > 0.5) {
pixel.sidedir = "right"
}
}
if (pixel.sidedir === "left" && Math.random() > 0.9) {
if (!isEmpty(pixel.x-vX,pixel.y,true)) {
if (elements[pixelMap[pixel.x-vX][pixel.y].element].isPassable === true) {
var floor = pixelMap[pixel.x-vX][pixel.y]
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
floor.groundUnder = floor.element
changePixel(floor,pixel.element)
}
else if (elements[pixelMap[pixel.x-vX][pixel.y].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x-vX][pixel.y],pixel.element)
pixelMap[pixel.x-vX][pixel.y].color = "#006300"
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
pixelMap[pixel.x-vX][pixel.y].groundUnder = "rpg_leaves"
}
}
if (Math.random() > 0.75) {
pixel.sidedir = "right"
}
else if (Math.random() > 0.75) {
pixel.dir = "up"
}
else if (Math.random() > 0.75) {
pixel.dir = "down"
}
}
else if (pixel.sidedir === "right" && Math.random() > 0.9) {
if (!isEmpty(pixel.x+vX,pixel.y,true)) {
if (elements[pixelMap[pixel.x+vX][pixel.y].element].isPassable === true) {
var floor = pixelMap[pixel.x+vX][pixel.y]
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
floor.groundUnder = floor.element
changePixel(floor,pixel.element)
}
else if (elements[pixelMap[pixel.x+vX][pixel.y].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x+vX][pixel.y],pixel.element)
pixelMap[pixel.x+vX][pixel.y].color = "#006300"
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
pixelMap[pixel.x+vX][pixel.y].groundUnder = "rpg_leaves"
}
}
if (Math.random() > 0.75) {
pixel.sidedir = "left"
}
else if (Math.random() > 0.75) {
pixel.dir = "down"
}
else if (Math.random() > 0.75) {
pixel.dir = "up"
}
}
else if (pixel.dir === "up" && Math.random() > 0.9) {
if (!isEmpty(pixel.x,pixel.y-vX,true)) {
if (elements[pixelMap[pixel.x][pixel.y-vX].element].isPassable === true) {
var floor = pixelMap[pixel.x][pixel.y-vX]
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
floor.groundUnder = floor.element
changePixel(floor,pixel.element)
}
else if (elements[pixelMap[pixel.x][pixel.y-vX].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x][pixel.y-vX],pixel.element)
pixelMap[pixel.x][pixel.y-vX].color = "#006300"
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
pixelMap[pixel.x][pixel.y-vX].groundUnder = "rpg_leaves"
}
}
if (Math.random() > 0.75) {
pixel.dir = "down"
}
else if (Math.random() > 0.75) {
pixel.sidedir = "left"
}
else if (Math.random() > 0.75) {
pixel.sidedir = "right"
}
}
else if (pixel.dir === "down" && Math.random() > 0.9) {
if (!isEmpty(pixel.x,pixel.y+vX,true)) {
if (elements[pixelMap[pixel.x][pixel.y+vX].element].isPassable === true) {
var floor = pixelMap[pixel.x][pixel.y+vX]
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
floor.groundUnder = floor.element
changePixel(floor,pixel.element)
}
else if (elements[pixelMap[pixel.x][pixel.y+vX].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x][pixel.y+vX],pixel.element)
pixelMap[pixel.x][pixel.y+vX].color = "#006300"
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
pixelMap[pixel.x][pixel.y+vX].groundUnder = "rpg_leaves"
}
}
if (Math.random() > 0.75) {
pixel.dir = "up"
}
else if (Math.random() > 0.75) {
pixel.sidedir = "right"
}
else if (Math.random() > 0.75) {
pixel.sidedir = "left"
}
}
},
properties: {
groundUnder: "rpg_grass",
},
category: "rpg",
state: "solid",
conduct: .05,
temp: 37,
tempHigh: 200,
stateHigh: "cooked_meat",
tempLow: -30,
stateLow: "frozen_meat",
burn: 10,
burnTime: 250,
burnInto: "cooked_meat",
breakInto: ["blood","meat","bone"],
forceSaveColor: true,
isEnemy: true,
color:"#8c7d82",
}
elements.golem = {
tick: function(pixel) {
if (heroY < pixel.y && heroY > pixel.y-15 && heroY < pixel.y+15 && heroX < pixel.x+15 && heroX > pixel.x-15) {
pixel.dir = "up"
}
else if (heroY > pixel.y && heroY < pixel.y+15 && heroY > pixel.y-15 && heroX < pixel.x+15 && heroX > pixel.x-15) {
pixel.dir = "down"
}
if (heroX < pixel.x && heroX > pixel.x-15 && heroX < pixel.x+15 && heroY < pixel.y+15 && heroY > pixel.y-15) {
pixel.sidedir = "left"
}
else if (heroX > pixel.x && heroX < pixel.x+15 && heroX > pixel.x-15 && heroY < pixel.y+15 && heroY > pixel.y-15) {
pixel.sidedir = "right"
}
if (pixel.sidedir === "left" && Math.random() > 0.9) {
if (!isEmpty(pixel.x-vX,pixel.y,true)) {
if (elements[pixelMap[pixel.x-vX][pixel.y].element].isPassable === true) {
var floor = pixelMap[pixel.x-vX][pixel.y]
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
floor.groundUnder = floor.element
changePixel(floor,pixel.element)
}
else if (elements[pixelMap[pixel.x-vX][pixel.y].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x-vX][pixel.y],pixel.element)
pixelMap[pixel.x][pixel.y+vX].color = "#006300"
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
pixelMap[pixel.x-vX][pixel.y].groundUnder = "rpg_leaves"
}
else if (elements[pixelMap[pixel.x-vX][pixel.y].element].id === elements.hero.id) {
var hero = pixelMap[pixel.x-vX][pixel.y]
if (health > 0) {
logMessage(`you took damage`)
console.log("took damage")
health --
}
else if (health < 1) {
logMessage(`you died!`)
console.log("player died")
deletePixel(hero.x,hero.y)
createPixel(groundUnder,hero.x,hero.y)
}
}
pixel.charge = 1
}
if (heroY < pixel.y) {
pixel.dir = "up"
}
else if (heroY > pixel.y) {
pixel.dir = "down"
}
}
else if (pixel.sidedir === "right" && Math.random() > 0.9) {
if (!isEmpty(pixel.x+vX,pixel.y,true)) {
if (elements[pixelMap[pixel.x+vX][pixel.y].element].isPassable === true) {
var floor = pixelMap[pixel.x+vX][pixel.y]
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
floor.groundUnder = floor.element
changePixel(floor,pixel.element)
}
else if (elements[pixelMap[pixel.x+vX][pixel.y].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x+vX][pixel.y],pixel.element)
pixelMap[pixel.x][pixel.y+vX].color = "#006300"
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
pixelMap[pixel.x+vX][pixel.y].groundUnder = "rpg_leaves"
}
else if (elements[pixelMap[pixel.x+vX][pixel.y].element].id === elements.hero.id) {
var hero = pixelMap[pixel.x+vX][pixel.y]
if (health > 0) {
logMessage(`you took damage`)
console.log("took damage")
health --
}
else if (health < 1) {
logMessage(`you died!`)
console.log("player died")
deletePixel(hero.x,hero.y)
createPixel(groundUnder,hero.x,hero.y)
}
}
pixel.charge = 1
}
if (heroY < pixel.y) {
pixel.dir = "up"
}
else if (heroY > pixel.y) {
pixel.dir = "down"
}
}
else if (pixel.dir === "up" && Math.random() > 0.9) {
if (!isEmpty(pixel.x,pixel.y-vX,true)) {
if (elements[pixelMap[pixel.x][pixel.y-vX].element].isPassable === true) {
var floor = pixelMap[pixel.x][pixel.y-vX]
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
floor.groundUnder = floor.element
changePixel(floor,pixel.element)
}
else if (elements[pixelMap[pixel.x][pixel.y-vX].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x][pixel.y-vX],pixel.element)
pixelMap[pixel.x][pixel.y+vX].color = "#006300"
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
pixelMap[pixel.x][pixel.y-vX].groundUnder = "rpg_leaves"
}
else if (elements[pixelMap[pixel.x][pixel.y-vX].element].id === elements.hero.id) {
var hero = pixelMap[pixel.x][pixel.y-vX]
if (health > 0) {
logMessage(`you took damage`)
console.log("took damage")
health --
}
else if (health < 1) {
logMessage(`you died!`)
console.log("player died")
deletePixel(hero.x,hero.y)
createPixel(groundUnder,hero.x,hero.y)
}
}
pixel.charge = 1
}
if (heroX < pixel.x) {
pixel.sidedir = "left"
}
else if (heroX > pixel.x) {
pixel.sidedir = "right"
}
}
else if (pixel.dir === "down" && Math.random() > 0.9) {
if (!isEmpty(pixel.x,pixel.y+vX,true)) {
if (elements[pixelMap[pixel.x][pixel.y+vX].element].isPassable === true) {
var floor = pixelMap[pixel.x][pixel.y+vX]
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
floor.groundUnder = floor.element
changePixel(floor,pixel.element)
}
if (elements[pixelMap[pixel.x][pixel.y+vX].element].id === elements.rpg_leaves.id) {
changePixel(pixelMap[pixel.x][pixel.y+vX],pixel.element)
pixelMap[pixel.x][pixel.y+vX].color = "#006300"
deletePixel(pixel.x,pixel.y)
createPixel(pixel.groundUnder,pixel.x,pixel.y)
pixelMap[pixel.x][pixel.y+vX].groundUnder = "rpg_leaves"
}
if (elements[pixelMap[pixel.x][pixel.y+vX].element].id === elements.hero.id) {
var hero = pixelMap[pixel.x][pixel.y+vX]
if (health > 0) {
logMessage(`you took damage`);
console.log("took damage");
health--;
}
else if (health < 1) {
logMessage(`you died!`);
console.log("player died");
deletePixel(hero.x,hero.y);
createPixel(groundUnder,hero.x,hero.y);
}
}
pixel.charge = 1
}
if (heroX < pixel.x) {
pixel.sidedir = "left";
}
else if (heroX > pixel.x) {
pixel.sidedir = "right";
}
}
doDefaults(pixel);
},
properties: {
groundUnder: "rpg_grass",
},
category: "rpg",
state: "solid",
conduct: .05,
temp: 37,
tempHigh: 2000,
stateHigh: "brick_rubble",
breakInto: "brick_rubble",
forceSaveColor: true,
isEnemy: true,
color:"#7d5042",
}
elements.rpg_grass = {
color: "#00bf00",
colorKey: {
"D":"#99F762",
"L":"#00bf00",
"B":"#439809"
},
colorPattern: [
"BBLB",
"BBBL",
"BDBB",
"DBBB",
"BBLB",
"BBBL",
"BBDB",
"BBBD",
"BLBB",
"LBBB"
],
behavior: behaviors.WALL,
renderer: renderPresets.PLANTCHAR,
category:"rpg",
tempHigh: 100,
stateHigh: "dead_plant",
tempLow: -1.66,
stateLow: "frozen_plant",
burn:15,
burnTime:60,
burnInto: "dead_plant",
breakInto: "dead_plant",
state: "solid",
density: 1050,
isPassable: true,
forceSaveColor: true,
properties: {
"age": 0
},
tick: function(pixel) {
if (Math.random() < 0.03 && pixel.age < 1) {
let canPlaceTree = true;
for (let xradius = 0; xradius < 5; xradius++) {
for (let yradius = 0; yradius < 5; yradius++) {
let checkX = pixel.x-2+xradius;
let checkY = pixel.y-2+yradius;
if (!isEmpty(checkX, checkY, true)) {
let checkPixel = pixelMap[checkX][checkY];
if (checkPixel.element === "rpg_tree" || checkPixel.element === "rpg_leaves") {
canPlaceTree = false;
break;
}
}
}
if (!canPlaceTree) break;
}
if (canPlaceTree && pixel.generated === true) {
createPixel("rpg_tree", pixel.x, pixel.y);
}
}
pixel.age++;
}
}
elements.rpg_sand = {
color: "#e6d577",
behavior: behaviors.WALL,
tempHigh: 1700,
stateHigh: "molten_glass",
category: "rpg",
state: "solid",
density: 1602,
isPassable: true,
forceSaveColor: true
}
elements.rpg_leaves = {
color: "#006300",
behavior: behaviors.WALL,
renderer: renderPresets.PLANTCHAR,
category:"rpg",
tempHigh: 100,
stateHigh: "dead_plant",
tempLow: -1.66,
stateLow: "frozen_plant",
burn:15,
burnTime:60,
burnInto: "dead_plant",
breakInto: "dead_plant",
state: "solid",
density: 1050,
forceSaveColor: true
}
elements.rpg_tree = {
color: "#694b37",
behavior: behaviors.WALL,
tick: function(pixel) {
if (!isEmpty(pixel.x,pixel.y-1,true)) {
if (elements[pixelMap[pixel.x][pixel.y-1].element].id === elements.rpg_leaves.id || elements[pixelMap[pixel.x][pixel.y-1].element].id === elements.hero.id) {
return;
}
else {
deletePixel(pixel.x,pixel.y-1)
createPixel("rpg_leaves",pixel.x,pixel.y-1)
}
}
if (!isEmpty(pixel.x,pixel.y-2,true)) {
if (elements[pixelMap[pixel.x][pixel.y-2].element].id === elements.rpg_leaves.id || elements[pixelMap[pixel.x][pixel.y-2].element].id === elements.hero.id) {
return;
}
else {
deletePixel(pixel.x,pixel.y-2)
createPixel("rpg_leaves",pixel.x,pixel.y-2)
}
}
if (!isEmpty(pixel.x+1,pixel.y-1,true)) {
if (elements[pixelMap[pixel.x+1][pixel.y-1].element].id === elements.rpg_leaves.id || elements[pixelMap[pixel.x+1][pixel.y-1].element].id === elements.hero.id) {
return;
}
else {
deletePixel(pixel.x+1,pixel.y-1)
createPixel("rpg_leaves",pixel.x+1,pixel.y-1)
}
}
if (!isEmpty(pixel.x-1,pixel.y-1,true)) {
if (elements[pixelMap[pixel.x-1][pixel.y-1].element].id === elements.rpg_leaves.id || elements[pixelMap[pixel.x-1][pixel.y-1].element].id === elements.hero.id) {
return;
}
else {
deletePixel(pixel.x-1,pixel.y-1)
createPixel("rpg_leaves",pixel.x-1,pixel.y-1)
}
}
},
renderer: renderPresets.WOODCHAR,
tempHigh: 400,
stateHigh: ["ember","charcoal","fire","fire","fire"],
category: "rpg",
burn: 5,
burnTime: 300,
burnInto: ["ember","charcoal","fire"],
state: "solid",
hardness: 0.15,
breakInto: "sawdust",
forceSaveColor: true
}
elements.chest = {
color: "#a0522d",
tick: function(pixel) {
doDefaults(pixel);
if (pixel.contents === undefined) {
pixel.contents = Math.random() < 0.75 ? "gold" : "sword";
}
},
behavior: behaviors.WALL,
renderer: renderPresets.WOODCHAR,
tempHigh: 400,
stateHigh: ["ember","charcoal","fire","fire","fire"],
category: "rpg",
burn: 5,
burnTime: 300,
burnInto: ["ember","charcoal","fire"],
state: "solid",
hardness: 0.15,
breakInto: "sawdust",
forceSaveColor: true
}
elements.rpg_water = {
color: "#2167ff",
colorKey: {
"L":"#2167ff",
"B":"#4d85ff"
},
colorPattern: [
"BLL",
"BLL",
"LLB",
"LLB"
],
behavior: behaviors.WALL,
reactions: {
"vinegar": { elem1:"dead_plant", elem2:null, chance:0.035 },
"baking_soda": { elem1:"dead_plant", elem2:null, chance:0.01 },
"bleach": { elem1:"dead_plant", elem2:null, chance:0.05 },
"alcohol": { elem1:"dead_plant", elem2:null, chance:0.035 },
"mercury": { elem1:"dead_plant", elem2:null, chance:0.01 },
"salt": { elem1:"dead_plant", elem2:null, chance:0.001 },
"stench": { elem2:null, chance:0.25 },
"chlorine": { stain1:"#a2bf00" },
},
tempHigh: 100,
stateHigh: "steam",
tempLow: 0,
stateLow: "ice",
category: "rpg",
heatCapacity: 4.184,
state: "solid",
density: 997,
conduct: 0.02,
forceSaveColor: true
}
elements.rpg_stone = {
color: "#808080",
colorKey: {
"L":"#949494",
"B":"#7a7a7a"
},
colorPattern: [
"LBL",
"LBL",
"LLB",
"LLB",
"BLL",
"BLL",
],
behavior: behaviors.WALL,
tempHigh: 950,
stateHigh: "magma",
category: "rpg",
state: "solid",
density: 2550,
hardness: 0.5,
breakInto: "rock"
}
elements.rpg_stone_floor = {
color: "#808080",
colorKey: {
"B":"#808080",
"L":"#4f4f4f"
},
colorPattern: [
"BBLBLBBL",
"BBBLBBLB",
"BLBBBBLB",
"BBBBBLBB",
"BBLBLBBL",
"BBBBBLBB",
"BBBLLBBB",
"BLBBBLBB",
"BLBBBBLB",
"BBBBBLBB",
"BBBLLBBB",
"LBBLBLBL",
"BBBBBLBB",
"BBLBLBBL",
"BLBBBLBB",
"BLBBBBLB",
"BBLBLBBL",
"BBBLBBLB",
"BLBBBBLB",
"BBBBBLBB",
"BBLBLBBL",
"BBBBBLBB",
"BBBLLBBB",
"BLBBBLBB",
"BLBBBBLB",
],
behavior: behaviors.WALL,
tempHigh: 950,
stateHigh: "magma",
category: "rpg",
state: "solid",
density: 2550,
hardness: 0.5,
isPassable: true,
breakInto: "rock"
}
const noise = {
permutation: [],
p: new Array(512),
init() {
for(let i=0; i<256; i++) {
this.permutation[i] = Math.floor(Math.random() * 256);
}
for(let i=0; i<512; i++) {
this.p[i] = this.permutation[i & 255];
}
},
perlin2(x, y) {
let X = Math.floor(x) & 255;
let Y = Math.floor(y) & 255;
x -= Math.floor(x);
y -= Math.floor(y);
let u = this.fade(x);
let v = this.fade(y);
let A = this.p[X] + Y;
let B = this.p[X + 1] + Y;
return this.lerp(
v,
this.lerp(
u,
this.grad(this.p[A], x, y),
this.grad(this.p[B], x-1, y)
),
this.lerp(
u,
this.grad(this.p[A+1], x, y-1),
this.grad(this.p[B+1], x-1, y-1)
)
);
},
fade(t) {
return t * t * t * (t * (t * 6 - 15) + 10);
},
lerp(t, a, b) {
return a + t * (b - a);
},
grad(hash, x, y) {
let h = hash & 15;
let grad = 1 + (h & 7);
if(h & 8) grad = -grad;
return grad * x + grad * y;
}
};
noise.init();
elements.map_generator = {
color: "#999999",
behavior: behaviors.FILL,
tick: function(pixel) {
if (pixel.elevationIndex === undefined) {
let scale = 0.05
pixel.elevationIndex = noise.perlin2(pixel.x * scale, pixel.y * scale)
}
if (pixel.age > 100) {
if (pixel.elevationIndex >= 2 + Math.random()/20) {
deletePixel(pixel.x,pixel.y)
createPixel("rpg_stone_floor",pixel.x,pixel.y)
}
else if (pixel.elevationIndex >= -0.1 + Math.random()/20) {
deletePixel(pixel.x,pixel.y)
createPixel("rpg_grass",pixel.x,pixel.y)
pixelMap[pixel.x][pixel.y].generated = true
}
else if (pixel.elevationIndex >= -0.3 + Math.random()/20) {
deletePixel(pixel.x,pixel.y)
createPixel("rpg_sand",pixel.x,pixel.y)
}
else {
deletePixel(pixel.x,pixel.y)
createPixel("rpg_water",pixel.x,pixel.y)
}
return
}
const neighbors = [
[0,1], [0,-1], [1,0], [-1,0],
[-1,1], [1,1], [-1,-1], [1,-1]
]
for (let [dx,dy] of neighbors) {
let nx = pixel.x + dx
let ny = pixel.y + dy
if (!isEmpty(nx,ny,true)) {
let neighbor = pixelMap[nx][ny]
if (neighbor.elevationIndex === undefined) {
let noiseValue = noise.perlin2(nx * 0.05, ny * 0.05)
neighbor.elevationIndex = (pixel.elevationIndex + noiseValue) / 2
}
}
}
pixel.age++
},
properties: {
"age": 0
},
category: "rpg",
excludeRandom: true,
density: 1834
}