← EquipamientoObjeto 3Dfogon/pocion-verde
Poción verde
Arrastrá para girarlo// «Poción verde» · gpt-6-sol (medium)
// A heart-shaped glass potion bottle standing on the floor with a short neck and a cork tied with string, filled with bubbling bright green liquid.
const glass = ["#65a6ac", "#83c3c3", "#a9dddd"];
const gold = "#d4a84d";
function heart(x, z) {
const X = (x - 24) / 16.5;
const Z = (z - 19) / 16.5;
const a = X * X + Z * Z - 1;
return a * a * a - X * X * Z * Z * Z <= 0;
}
function insetHeart(x, z, n) {
return heart(x - n, z) && heart(x + n, z) &&
heart(x, z - n) && heart(x, z + n);
}
// A broad, solid glass vessel with a pale back visible above the potion.
for (let z = 2; z <= 39; z++) {
for (let x = 4; x <= 44; x++) {
if (!heart(x, z)) continue;
for (let y = 17; y <= 31; y++) {
const c = y >= 29 ? "#57949c" :
z >= 27 ? "#83bfc0" : "#69a9ac";
set(x, y, z, rand() < 0.055 ? glass[1] : c);
}
if (z >= 26 && insetHeart(x, z, 2)) {
set(x, 16, z, rand() < 0.14 ? "#9bd2c9" : "#6bacaa");
}
}
}
// The potion is a separate, softly pulsing mass.
part("liquid", [24, 24, 17]);
for (let x = 5; x <= 43; x++) {
const surface = 25 + Math.round(Math.sin(x * 0.43) * 1.2);
for (let z = 5; z <= surface; z++) {
if (!insetHeart(x, z, 2)) continue;
for (let y = 16; y <= 28; y++) {
set(x, y, z, rand() < 0.12 ? "#9af13c" :
z >= surface - 1 ? "#a4ef43" : "#43c838");
}
}
}
animate("liquid", {
type: "colors",
palette: ["#36bd35", "#54d83a", "#85ea3e", "#a7f45a"],
pattern: "pulse",
glow: 0.6
});
part("body", [24, 24, 20]);
// Thick, bright glass edge remains visible around the green center.
for (let z = 2; z <= 39; z++) {
for (let x = 4; x <= 44; x++) {
if (!heart(x, z) || insetHeart(x, z, 2)) continue;
for (let y = 15; y <= 18; y++) {
set(x, y, z, z > 25 || x < 24 ? "#a8ded9" : "#75b9bb");
}
if (!insetHeart(x, z, 1) && (z > 21 || x < 12)) {
set(x, 15, z, "#cef1e5");
}
}
}
// Bold reflections on the curved front of the bottle.
line(11, 14, 19, 15, 14, 29, 1, "#d4f3dc");
line(15, 14, 29, 19, 14, 32, 1, "#d4f3dc");
line(36, 14, 11, 38, 14, 16, 1, "#c3eadd");
box(13, 14, 16, 14, 14, 20, "#edfae6");
box(32, 14, 28, 33, 14, 30, "#e3f7e5");
// Bright bubbles, large enough to read through the glass.
for (const [x, z, r] of [
[16, 22, 2], [21, 17, 1], [29, 21, 2],
[34, 14, 1], [25, 11, 2], [19, 9, 1],
[31, 8, 1], [25, 27, 1], [32, 28, 1]
]) {
sphere(x, 14, z, r, "#d3ff88");
set(x - 1, 13, z + 1, "#f0ffc1");
}
// A chunky brass foot keeps the pointed heart standing upright.
box(19, 19, 0, 29, 29, 1, "#90672d");
box(18, 18, 1, 30, 30, 2, gold);
box(20, 20, 2, 28, 28, 3, "#f3cf75");
box(21, 18, 1, 27, 18, 1, "#ffe494");
// Short glass neck and its brass collar.
box(20, 20, 32, 28, 28, 38, "#77b6b6");
box(21, 19, 33, 27, 19, 38, "#a9ded3");
box(22, 18, 34, 23, 18, 37, "#e4f5df");
box(19, 19, 32, 29, 29, 33, "#a97636");
box(19, 18, 33, 29, 19, 34, "#e8bd64");
box(20, 19, 38, 28, 29, 39, "#d3a348");
box(21, 18, 38, 27, 18, 39, "#f5d47b");
// A broad cork, with warm flecks and a darker top.
box(21, 21, 39, 27, 27, 43, "#aa7140");
box(20, 20, 41, 28, 28, 43, "#bd8750");
box(21, 21, 44, 27, 27, 44, "#87552f");
box(22, 19, 40, 26, 19, 43, "#d9a168");
for (let i = 0; i < 22; i++) {
set(21 + Math.floor(rand() * 6), 19,
40 + Math.floor(rand() * 4), "#916036");
}
// String wraps the cork, crosses at the front, and ends in a little knot.
box(20, 19, 41, 28, 20, 41, "#ead5a0");
box(20, 27, 41, 28, 28, 41, "#c4a975");
box(20, 20, 41, 20, 27, 41, "#dec38c");
box(28, 20, 41, 28, 27, 41, "#dec38c");
line(21, 18, 42, 27, 18, 40, 0, "#f2dea7");
line(21, 18, 40, 27, 18, 42, 0, "#f2dea7");
sphere(24, 17, 41, 1, "#ffe5aa");
line(24, 17, 40, 21, 16, 37, 0, "#e5c992");
line(25, 17, 40, 28, 16, 37, 0, "#e5c992");import { draw } from "./assets/voxel";
import { pocionVerde } from "./assets/pocion-verde";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, pocionVerde, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add pocion-verde
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["pocion-verde"] })
# Queda en client/assets/pocion-verde.ts
# https://fogon.page/object/pocion-verde