201 lines
5.8 KiB
JavaScript
201 lines
5.8 KiB
JavaScript
const adjectives = ["shiny", "glowing", "dark", "bright", "heavy", "light", "hot", "cold", "hard", "soft", "smooth", "rough", "round", "sharp", "sweet", "sour", "bitter", "salty", "savory"];
|
|
|
|
const nouns = ["metal", "crystal", "stone", "powder", "liquid", "gas", "plasma", "slime", "sand", "dust", "rock", "lava", "ice", "vapor", "ash", "soot", "sludge"];
|
|
|
|
const elementNames = [];
|
|
|
|
while (elementNames.length < 300) {
|
|
|
|
const adjective = adjectives[Math.floor(Math.random() * adjectives.length)];
|
|
const noun = nouns[Math.floor(Math.random() * nouns.length)];
|
|
|
|
const name = `${adjective}_${noun}`;
|
|
|
|
if (!elementNames.includes(name)) {
|
|
elementNames.push(name);
|
|
}
|
|
}
|
|
|
|
const nounTemperatures = {
|
|
metal: {tempLow: 1000, tempHigh: 1800},
|
|
crystal: {tempLow: 500, tempHigh: 1000},
|
|
stone: {tempLow: 600, tempHigh: 1200},
|
|
powder: {tempLow: 100, tempHigh: 500},
|
|
liquid: {tempLow: -100, tempHigh: 100},
|
|
gas: {tempLow: -200, tempHigh: -100},
|
|
plasma: {tempLow: 8000, tempHigh: 20000},
|
|
slime: {tempLow: -10, tempHigh: 30},
|
|
sand: {tempLow: 100, tempHigh: 500},
|
|
dust: {tempLow: 50, tempHigh: 200},
|
|
rock: {tempLow: 500, tempHigh: 1000},
|
|
lava: {tempLow: 700, tempHigh: 1200},
|
|
ice: {tempLow: -50, tempHigh: 0},
|
|
vapor: {tempLow: -50, tempHigh: 100},
|
|
ash: {tempLow: 200, tempHigh: 500},
|
|
soot: {tempLow: 200, tempHigh: 500},
|
|
sludge: {tempLow: -10, tempHigh: 100}
|
|
}
|
|
|
|
const nounColors = {
|
|
metal: ["#999999", "#bbbbbb", "#cccccc", "#dddddd", "#eeeeee"],
|
|
crystal: ["#77ffff", "#88eeff", "#99ddff", "#aaccff", "#bbbbff"],
|
|
stone: ["#888888", "#999999", "#aaaaaa", "#bbbbbb", "#cccccc"],
|
|
powder: ["#eeeeee", "#ffffff", "#dddddd", "#cccccc", "#bbbbbb"],
|
|
liquid: ["#336699", "#4477aa", "#5588bb", "#6699cc", "#77aadd"],
|
|
gas: ["#ffffff", "#eeeeee", "#dddddd", "#cccccc", "#bbbbbb"],
|
|
plasma: ["#ff9966", "#ffaa77", "#ffbb88", "#ffcc99", "#ffddaa"],
|
|
slime: ["#88cc88", "#99dd99", "#aaddaa", "#bbeebb", "#ccffcc"],
|
|
sand: ["#D2B48C", "#E8D5A9", "#F0E3C4", "#DCD0BF", "#EBE4D6"],
|
|
dust: ["#aaaaaa", "#bbbbbb", "#cccccc", "#dddddd", "#eeeeee"],
|
|
rock: ["#777777", "#888888", "#999999", "#aaaaaa", "#bbbbbb"],
|
|
lava: ["#ff4400", "#ff5511", "#ff6622", "#ff7733", "#ff8844"],
|
|
ice: ["#66cccc", "#77dddd", "#88eeee", "#99ffff", "#aaffff"],
|
|
vapor: ["#ffffff", "#eeeeee", "#dddddd", "#cccccc", "#bbbbbb"],
|
|
ash: ["#cccccc", "#dddddd", "#eeeeee", "#ffffff", "#eeeeee"],
|
|
soot: ["#333333", "#444444", "#555555", "#666666", "#777777"],
|
|
sludge: ["#886633", "#997733", "#a98844", "#bb9944", "#ccaa55"]
|
|
};
|
|
|
|
|
|
const nounStates = {
|
|
metal: "solid",
|
|
crystal: "solid",
|
|
stone: "solid",
|
|
powder: "liquid",
|
|
liquid: "liquid",
|
|
gas: "gas",
|
|
plasma: "gas",
|
|
slime: "liquid",
|
|
sand: "liquid",
|
|
dust: "liquid",
|
|
rock: "solid",
|
|
lava: "liquid",
|
|
ice: "solid",
|
|
vapor: "gas",
|
|
ash: "liquid",
|
|
soot: "liquid",
|
|
sludge: "liquid"
|
|
};
|
|
|
|
// Map noun to behavior
|
|
const nounBehaviors = {
|
|
metal: behaviors.WALL,
|
|
crystal: behaviors.WALL,
|
|
stone: behaviors.WALL,
|
|
powder: behaviors.POWDER,
|
|
liquid: behaviors.LIQUID,
|
|
gas: behaviors.GAS,
|
|
plasma: behaviors.GAS,
|
|
slime: behaviors.LIQUID,
|
|
sand: behaviors.POWDER,
|
|
dust: behaviors.POWDER,
|
|
rock: behaviors.WALL,
|
|
lava: behaviors.LIQUID,
|
|
ice: behaviors.WALL,
|
|
vapor: behaviors.GAS,
|
|
ash: behaviors.POWDER,
|
|
soot: behaviors.POWDER,
|
|
sludge: behaviors.LIQUID
|
|
};
|
|
|
|
const adjectiveBreakInto = {
|
|
sweet: "sugar",
|
|
salty: "salt",
|
|
};
|
|
|
|
const nounBreakInto = {
|
|
crystal: "glass_shard",
|
|
ice: "snow",
|
|
rock: ["sand", "gravel"],
|
|
};
|
|
|
|
const adjectiveColorModifiers = {
|
|
dark: 0.8, // darker
|
|
shiny: 1.2, // brighter
|
|
glowing: 1.5 // brightest
|
|
};
|
|
|
|
// Generate elements
|
|
for (const name of elementNames) {
|
|
|
|
const [adjective, noun] = name.split("_");
|
|
|
|
let baseColor = nounColors[noun];
|
|
|
|
const {tempLow, tempHigh} = nounTemperatures[noun];
|
|
|
|
let temp = Math.random() * (tempHigh - tempLow) + tempLow;
|
|
|
|
if (adjective === "hot") {
|
|
temp *= 1.5;
|
|
} else if (adjective === "cold") {
|
|
temp /= 2;
|
|
}
|
|
|
|
if (adjective in adjectiveColorModifiers) {
|
|
const modifier = adjectiveColorModifiers[adjective];
|
|
baseColor = modifyColor(baseColor, modifier);
|
|
}
|
|
|
|
elements[name] = {
|
|
color: baseColor,
|
|
behavior: nounBehaviors[noun],
|
|
category: "random elements",
|
|
state: nounStates[noun],
|
|
temp: temp,
|
|
breakInto: adjectiveBreakInto[adjective] || nounBreakInto[noun],
|
|
density: Math.random() * 100,
|
|
viscosity: Math.random() * 100
|
|
};
|
|
|
|
function modifyColor(color, modifier) {
|
|
if (color[0] === '#') {
|
|
color = color.slice(1);
|
|
}
|
|
|
|
color = String(color);
|
|
|
|
// Check for '#'
|
|
const match = color.match(/^#?(.*)$/);
|
|
if (match) {
|
|
color = match[1];
|
|
}
|
|
|
|
// Convert to RGB
|
|
let [r, g, b] = color.match(/.{1,2}/g).map(x => parseInt(x, 16));
|
|
|
|
// Apply modifier
|
|
r = Math.round(r * modifier);
|
|
g = Math.round(g * modifier);
|
|
b = Math.round(b * modifier);
|
|
|
|
// Constrain RGB values to 0-255
|
|
r = Math.max(0, Math.min(255, r));
|
|
g = Math.max(0, Math.min(255, g));
|
|
b = Math.max(0, Math.min(255, b));
|
|
|
|
// Convert back to hex
|
|
return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
changelog only count importtant stuff and not the small details
|
|
|
|
0.1
|
|
added the mod
|
|
|
|
0.2
|
|
elements have breakInto's
|
|
elements with the adjectives "dark, shiny and glowing" are darker or brighter
|
|
elements with the nouns "crystal, ice, rock" can break into other elements like "glass_shard, snow, sand"
|
|
fixed some elements having wrong states
|
|
|
|
todo:
|
|
elements have reactions
|
|
gases dont have breakintos
|
|
|
|
what a silly little changelog! i made it literally right here!!
|
|
*/
|