← AsiáticoObjeto 3Dfogon/templo-chino
Templo chino
Arrastrá para girarlo// «Templo chino» · gpt-6-sol (medium)
// A Chinese temple hall on a raised white stone platform with front stairs, red columns, carved gold and blue beams under the eaves, and a big double-curved roof of glazed yellow-orange tiles with small dragon ornaments on the ridge ends.
// White-stone terrace and broad front stair
box(5, 10, 0, 42, 41, 3, "#b7b9b1");
box(5, 10, 4, 42, 41, 4, "#eee9d9");
box(5, 10, 2, 42, 10, 2, "#d9d8ce");
box(5, 41, 2, 42, 41, 2, "#d9d8ce");
for (let y = 2; y <= 9; y++) {
const height = Math.floor((y - 2) / 2);
box(17, y, 0, 30, y, height, "#c9c9be");
box(17, y, height, 30, y, height, "#eeeade");
set(17, y, height, "#faf5e7");
set(30, y, height, "#faf5e7");
}
// Stair-side stone rails
for (const x of [15, 32]) {
for (let y = 3; y <= 10; y++) {
const h = Math.min(4, Math.floor((y - 2) / 2));
box(x, y, 0, x, y, h + 1, "#b9bab1");
set(x, y, h + 1, "#f0ede0");
}
box(x - 1, 3, 1, x + 1, 4, 2, "#e6e3d7");
sphere(x, 3, 3, 1, "#f4efdf");
}
// Terrace balustrade, with an opening at the stairs
for (let y = 12; y <= 39; y += 5) {
for (const x of [6, 41]) {
box(x, y, 5, x, y, 7, "#e4e1d6");
set(x, y, 8, "#f8f2e4");
}
}
for (let x = 7; x <= 40; x++) {
if (x < 16 || x > 31) {
box(x, 10, 5, x, 10, 6, "#d9d8ce");
if (x % 5 === 2) set(x, 10, 7, "#f6f0e2");
}
}
// Recessed timber hall and raised porch
box(8, 15, 5, 39, 37, 21, "#5b3029");
box(9, 15, 6, 38, 15, 20, "#783b2d");
box(8, 11, 5, 39, 15, 5, "#e2d8bf");
for (let y = 13; y <= 37; y += 5) {
box(8, y, 6, 8, y, 20, "#a43429");
box(39, y, 6, 39, y, 20, "#a43429");
}
// Jade lattice windows on the front
for (const [a, b] of [[10, 16], [32, 38]]) {
box(a, 14, 8, b, 14, 18, "#341f23");
box(a + 1, 13, 9, b - 1, 13, 17, "#345d51");
for (let x = a + 2; x < b; x += 2)
box(x, 12, 9, x, 12, 17, "#b88436");
for (let z = 11; z <= 17; z += 3)
box(a + 1, 12, z, b - 1, 12, z, "#c79743");
box(a, 12, 8, b, 12, 8, "#d9a347");
box(a, 12, 18, b, 12, 18, "#d9a347");
}
for (const x of [18, 29]) {
box(x, 13, 7, x, 13, 20, "#a33328");
box(x, 12, 9, x, 12, 17, "#d6a044");
}
// Tall central double doors
box(20, 14, 6, 27, 14, 19, "#281e21");
box(21, 13, 7, 23, 13, 18, "#654035");
box(24, 13, 7, 26, 13, 18, "#654035");
for (const x of [21, 24]) {
box(x, 12, 9, x + 2, 12, 10, "#30584e");
box(x, 12, 14, x + 2, 12, 16, "#30584e");
box(x, 12, 18, x + 2, 12, 18, "#c99b48");
}
set(23, 11, 12, "#f5cf68");
set(24, 11, 12, "#f5cf68");
box(19, 12, 19, 28, 13, 20, "#d6a044");
box(20, 11, 20, 27, 11, 20, "#254f56");
// Visible side-wall lattice bays
for (const x of [8, 39]) {
for (const y of [20, 28]) {
box(x, y, 9, x, y + 4, 17, "#31544c");
for (let yy = y; yy <= y + 4; yy += 2)
box(x + (x === 8 ? -1 : 1), yy, 9,
x + (x === 8 ? -1 : 1), yy, 17, "#c38c3c");
for (const z of [10, 14, 17])
box(x + (x === 8 ? -1 : 1), y, z,
x + (x === 8 ? -1 : 1), y + 4, z, "#bd903e");
}
}
// Lacquer columns, gold bases and capitals
for (const y of [12, 36]) {
for (const x of [9, 17, 31, 39]) {
box(x - 1, y - 1, 5, x + 1, y + 1, 6, "#d5aa55");
box(x, y, 7, x + 1, y + 1, 22, "#ae2d24");
box(x, y, 8, x, y, 21, "#da5032");
box(x - 1, y - 1, 22, x + 2, y + 2, 23, "#e2ac43");
box(x - 1, y - 1, 24, x + 2, y + 2, 24, "#255466");
}
}
// Layered, painted bracket-work beneath all four eaves
box(6, 10, 22, 41, 10, 23, "#86362d");
box(6, 11, 24, 41, 11, 25, "#24556a");
box(7, 38, 23, 40, 39, 25, "#25586b");
for (const y of [10, 39]) {
for (let x = 7; x <= 40; x += 4) {
box(x, y, 21, x + 1, y, 23, "#d9a844");
set(x, y - (y === 10 ? 1 : -1), 23, "#efc45c");
set(x + 2, y, 24, "#f2c864");
}
}
for (const x of [6, 41]) {
box(x, 11, 24, x, 39, 25, "#245568");
for (let y = 13; y < 39; y += 4)
box(x, y, 22, x, y + 1, 23, "#e8b54d");
}
for (let x = 8; x <= 39; x++) {
if (x % 4 === 0) {
box(x, 9, 24, x + 1, 11, 25, "#e5ad40");
set(x, 9, 23, "#285b69");
}
}
box(8, 9, 26, 39, 10, 26, "#71382d");
// Curving hip roof: low sweeping slopes, then sharply upturned eaves.
const across = [30, 29, 27, 27, 28, 28, 29, 30, 31, 33, 34, 35, 36, 38, 39];
const slope = [39, 39, 38, 37, 36, 35, 35, 34, 33, 32,
31, 30, 29, 29, 28, 28, 27, 27, 29, 30];
function roofZ(x, y) {
const edge = Math.min(x - 2, 45 - x);
return Math.min(across[Math.min(14, edge)], slope[Math.abs(y - 24)]);
}
for (let x = 2; x <= 45; x++) {
for (let y = 6; y <= 43; y++) {
const z = roofZ(x, y);
box(x, y, z - 2, x, y, z - 1, "#69402d");
const row = Math.floor(y / 3);
let tile = "#e7a335";
if (x % 3 === 0) tile = "#f7c555";
else if (row % 2 === 0) tile = "#d88529";
if (rand() < 0.075) tile = "#f8d16d";
set(x, y, z, tile);
if (x % 3 === 0 && y % 3 === 1)
set(x, y, z + 1, "#ffd46a");
if (y % 3 === 0 && x % 3 !== 0)
set(x, y, z + 1, "#a95a27");
}
}
// Dark-green glazed underside and gilded lip
for (let x = 2; x <= 45; x++) {
for (const y of [6, 43]) {
const z = roofZ(x, y);
set(x, y, z - 2, "#244d49");
set(x, y, z + 1, "#efb84a");
}
}
for (let y = 6; y <= 43; y++) {
for (const x of [2, 45]) {
const z = roofZ(x, y);
set(x, y, z - 2, "#244d49");
set(x, y, z + 1, "#f5bd4f");
}
}
// Four strong diagonal hip ridges
for (const side of [-1, 1]) {
for (const back of [-1, 1]) {
for (let i = 0; i <= 13; i++) {
const x = side < 0 ? 16 - i : 31 + i;
const y = 24 + back * Math.round(i * 1.2);
const z = roofZ(x, y);
box(x, y, z + 1, x, y, z + 2, "#d17b2a");
set(x, y, z + 2, "#f9ca58");
}
}
}
// High ornamental ridge and end dragons
box(15, 23, 39, 32, 25, 40, "#ae5e25");
box(16, 24, 41, 31, 24, 41, "#f8cf63");
for (let x = 17; x <= 30; x += 3)
set(x, 24, 42, "#efb744");
for (const side of [-1, 1]) {
const tip = side < 0 ? 8 : 39;
const inward = side < 0 ? 1 : -1;
// Arched body and curling tail
box(tip + inward, 23, 36, tip + inward * 3, 25, 37, "#b66b29");
line(tip + inward * 2, 24, 38, tip + inward * 5, 24, 40, 0, "#e6aa42");
set(tip + inward * 5, 24, 41, "#f7d16a");
// Raised snout, crest, horns and a dark eye
box(tip - inward, 23, 37, tip, 25, 39, "#e2a23b");
set(tip - inward * 2, 24, 38, "#f6c65a");
set(tip - inward, 23, 40, "#f5c955");
set(tip, 25, 41, "#f5c955");
set(tip - inward, 22, 39, "#2b3832");
set(tip - inward * 2, 24, 36, "#ebba55");
}
// Finials at the four lifted roof corners
for (const x of [2, 45]) {
for (const y of [6, 43]) {
const z = roofZ(x, y);
box(x, y, z + 1, x, y, z + 3, "#dd973c");
set(x, y, z + 4, "#ffdc72");
}
}import { draw } from "./assets/voxel";
import { temploChino } from "./assets/templo-chino";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, temploChino, 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 templo-chino
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["templo-chino"] })
# Queda en client/assets/templo-chino.ts
# https://fogon.page/object/templo-chino