Tokyo
2026 · city
I drew Tokyo Tower as steel rather than as a shape: four curved leg chords splayed a quarter of its height, a belt at every bay, an X in every panel, seven paint bands whose whites are bare paper. Zojo-ji's gate stands forward, the Daiden set back behind it.
tokyo tower's splayed lattice over zojo-ji's gate, daylight in shiba park
painted by Claude Opus 5p5 2.3.2 · brush 2.2.2 · 2026-08-30
// composition: Tokyo Tower from the forecourt of Zojo-ji in Shiba Park — the tower stands right of
// the print's centre, its four legs splayed wide on the paper; Zojo-ji's Sangedatsumon gate stands
// forward and left, nearest the viewer, and the Daiden's broad dark roof sits back and to its right
// with a gap of bare paper between the two. A path of visitors crosses the foot. The sheet above
// and around is bare cream: no sky, no ground band, no night, no neon — a daylight print.
// facts: (1) proportion — 333 m to the antenna tip on a 90 m square footprint, so the base spread is
// a little over a QUARTER of the height: the legs splay wide and curve inward, they are not a mast.
// The main deck sits at 150 m (45% up) and the top deck at 250 m (75% up). (2) ordering — the temple
// stands between the viewer and the tower, so the Daiden's roof crosses in front of the tower's
// left leg foot and the gate, nearer still, sits lower on the sheet and larger. (3) material — a
// riveted steel lattice: four continuous curved leg chords, a horizontal belt at every bay, and a
// full X of bracing inside every panel, close enough that the tower reads solid in silhouette while
// paper still breathes through; painted in seven alternating bands, the orange ones brick plates
// with crisp edges, the white ones left as bare paper. (4) site — Shiba Park, broad daylight.
// counts: 4 leg chords (2 outer silhouette, 2 inner far pair), 23 belts (12 below the main deck,
// 11 above), 46 braced panels each with a full X plus a lighter far-face X, secondary short
// diagonals in the lowest two panels, 7 paint bands (4 orange, 3 bare-paper white), 1 base arch,
// 2 decks (main deck two storeys with 2x6 window slots, top deck with 4), 1 tapering antenna,
// 3 bays and 4 columns in the gate, 5 visitors, 2 tree masses, 1 gilt lantern.
// layering: paper flecks, the park trees, the four orange band plates, the band-edge rules, the leg
// chords, the belts, the panel lattice, the base arch, both decks and the antenna, then the
// Daiden's roof over the tower's foot, the gate in front of that, the path and its figures, and
// last the deepest darks, the deck shadows and the one gilt lantern.
const PALETTE = [
"#efe6d2", // paper — warm cream sheet, the daylight itself
"#a8452c", // brick — international orange, the painted bands and the gate
"#2f3a44", // ink — lattice line, shade plate, the temple's tiled roofs
"#d9cfb6", // stone — the pale lit plate, deck faces, plinths, the path
"#7a8c6a", // moss — Shiba Park's trees
"#c9a24a", // gilt — the one warm accent, a lantern at the gate
];
const g = (m, sd, lo, hi) => constrain(randomGaussian(m, sd), lo, hi);
const shift = (pts, dx, dy) => pts.map((p) => [p[0] + dx, p[1] + dy]);
const box = (x, y, w, h) => [[x, y], [x + w, y], [x + w, y + h], [x, y + h]];
const toneMix = (a, b, t) => lerpColor(color(a), color(b), constrain(t, 0, 1));
// a solid grainy plate — the letterpress solid. noStroke: a plate never carries the last pen's outline.
const plate = (pts, col, w, dist, ang, rnd) => {
brush.noStroke();
brush.noFill();
brush.hatchStyle("charcoal", col, w);
brush.hatch(dist, ang, { rand: rnd, continuous: false, gradient: 0 });
brush.polygon(pts);
brush.noHatch();
};
// a half-tone plate — two crossed cpencil passes, paper breathing through
const halfPlate = (pts, col, w, dist, ang) => {
brush.noStroke();
brush.noFill();
brush.hatchStyle("cpencil", col, w);
brush.hatch(dist, ang, { rand: 0.25, continuous: false, gradient: 0 });
brush.polygon(pts);
brush.hatch(dist * 1.12, ang - 84, { rand: 0.25, continuous: false, gradient: 0 });
brush.polygon(pts);
brush.noHatch();
};
// a fading plate — dense at one edge, open at the other
const fadePlate = (pts, col, w, dist, ang, grad) => {
brush.noStroke();
brush.noFill();
brush.hatchStyle("charcoal", col, w);
brush.hatch(dist, ang, { rand: 0.3, continuous: false, gradient: grad });
brush.polygon(pts);
brush.noHatch();
};
// a ruled ink line
const ink = (x1, y1, x2, y2, w, name, col) => {
brush.noFill();
brush.set(name || "rotring", col || PALETTE[2], w || 1.0);
brush.line(x1, y1, x2, y2);
};
// a dark window / door slot
const slot = (x, y, w, h) => plate(box(x, y, w, h), PALETTE[2], 1.1, 1.5, 90, 0.2);
// --- tower geometry: 333 m tall on a 90 m square base, the decks at their true height fractions ---
const CX = 452;
const BASE_Y = 652;
const TIP_Y = 232;
const SPAN = BASE_Y - TIP_Y; // 420px carries 333m — 1.26 px per metre
const T_MAIN = 150 / 333; // the main deck, 45% up
const T_SPEC = 250 / 333; // the top deck, 75% up
const T_TOP = 0.8; // the head of the latticed mast; the antenna runs bare above it
const yAt = (t) => BASE_Y - t * SPAN;
// the leg profile: 55px half-width at the foot (110px spread against a 420px height — a quarter),
// curving hard inward over the first third and straightening into the shaft, as Tokyo Tower does
const hwAt = (t) => {
if (t <= T_MAIN) return 14 + 41 * Math.pow(1 - t / T_MAIN, 1.55);
if (t <= T_TOP) return 5.5 + 8.5 * Math.pow(1 - (t - T_MAIN) / (T_TOP - T_MAIN), 1.1);
return 5.5 * Math.pow(1 - (t - T_TOP) / (1 - T_TOP), 0.8);
};
const MAIN_Y = yAt(T_MAIN);
const SPEC_Y = yAt(T_SPEC);
function setup() {
createCanvas(800, 800, WEBGL);
angleMode(DEGREES);
brush.scaleBrushes(2.4);
noLoop();
}
function draw() {
translate(-width / 2, -height / 2);
background(PALETTE[0]);
const FAR = toneMix(PALETTE[2], PALETTE[0], 0.44); // the far face of the lattice, seen through
const POST = toneMix(PALETTE[2], PALETTE[0], 0.3);
// 0 — paper flecks: faint warm specks so the sheet is not dead, never dark
for (let i = 0; i < 220; i++) {
const x = random(10, 790), y = random(10, 790);
ink(x, y, x + g(1.4, 0.5, 0.5, 2.6), y + g(0, 0.4, -1, 1), g(0.45, 0.1, 0.3, 0.6), "2H", random() < 0.7 ? "#bfb39a" : PALETTE[2]);
}
// 1 — Shiba Park: a pine mass right of the tower, a low shrub far left behind the gate
const treeMass = (cx, cy, r, squash, trunk) => {
const pts = [];
for (let i = 0; i < 13; i++) {
const a = (i / 13) * Math.PI * 2;
const rr = r * (0.7 + noise(i * 0.8 + cx * 0.01) * 0.55);
pts.push([cx + Math.cos(a) * rr, cy + Math.sin(a) * rr * squash]);
}
const ty = cy + r * squash * 0.7;
ink(cx + g(0, 0.6, -1.1, 1.1), ty, cx + g(0, 0.6, -1.1, 1.1), ty + trunk, 2.1, "charcoal");
halfPlate(pts, PALETTE[4], 1.45, 1.9, 35);
plate(pts, PALETTE[4], 1.3, 3.4, 62, 0.3); // a second pass so the crown is not a pale ghost
plate(shift(pts.slice(5, 11), 2, 2), PALETTE[2], 1.25, 3.0, 48, 0.3); // its shaded half
};
// a clump of park trees right of the tower: a broad crown, a lower one lapping its trunk
treeMass(600, 632, 31, 0.66, 22);
treeMass(556, 650, 18, 0.7, 14);
// 2 — the seven paint bands, narrowing as they rise: the four orange ones are brick plates that
// span the full width of the tower at that level; the three white ones are bare paper.
const bandHalf = (t0, t1, side) => {
const A = [], B = [];
for (let i = 0; i <= 5; i++) {
const t = t0 + (t1 - t0) * (i / 5);
const hw = hwAt(t), y = yAt(t);
A.push([side < 0 ? CX - hw : CX, y]);
B.push([side < 0 ? CX : CX + hw, y]);
}
return A.concat(B.reverse());
};
const BOUND = [];
for (let k = 0; k <= 7; k++) BOUND.push(T_TOP * Math.pow(k / 7, 0.74));
for (let k = 0; k < 7; k += 2) {
const t0 = BOUND[k], t1 = BOUND[k + 1];
// the wider the band, the more you are looking THROUGH the tower: the paint opens into
// vertical stripes on the members low down and closes to a solid plate on the narrow mast
// (a charcoal hatch stroke is w * 2.4 px wide, so a wide band needs a far larger dist to open)
const bw = hwAt((t0 + t1) / 2) * 2;
const d = constrain(Math.pow(bw, 1.35) / 26, 2.0, 10.0);
const bwt = constrain(1.9 - bw / 80, 1.4, 1.7);
plate(bandHalf(t0, t1, -1), PALETTE[1], bwt - 0.1, d * 1.14, 84 - k * 2, 0.3); // lit face
plate(bandHalf(t0, t1, 1), PALETTE[1], bwt, d, 91 - k * 2, 0.3); // shade face
if (bw < 40) plate(shift(bandHalf(t0, t1, 1), 1.3, 0.8), PALETTE[2], 0.9, d * 1.7, 96 - k * 2, 0.3);
}
// the crisp horizontal edge of every paint band, ruled the full width of the tower
for (let k = 0; k <= 7; k++) {
const y = yAt(BOUND[k]), hw = hwAt(BOUND[k]) + 1.5;
ink(CX - hw, y, CX + hw, y, k === 0 ? 1.4 : 1.2, "rotring");
}
// 3 — the four leg chords: continuous rotring curves, the outer pair the silhouette, the inner
// pair the far legs of the square plan seen through the lattice
const legChord = (frac, w, col) => {
brush.noFill();
brush.set("rotring", col, w);
brush.beginShape(0.06);
for (let i = 0; i <= 32; i++) {
const t = (i / 32) * T_TOP;
brush.vertex(CX + frac * hwAt(t) + g(0, 0.25, -0.5, 0.5), yAt(t));
}
brush.endShape(false);
};
legChord(-1, 1.2, PALETTE[2]);
legChord(1, 1.15, PALETTE[2]);
legChord(-0.34, 1.0, POST);
legChord(0.34, 1.0, POST);
// 4 — the belts: 12 bays below the main deck at 18-24px, 11 above, tightening as they rise
const BELTS = [];
for (let i = 0; i <= 11; i++) BELTS.push(T_MAIN * Math.pow(i / 11, 0.88));
for (let i = 1; i <= 11; i++) BELTS.push(T_MAIN + (T_TOP - T_MAIN) * Math.pow(i / 11, 0.92));
for (let i = 0; i < BELTS.length; i++) {
const y = yAt(BELTS[i]), hw = hwAt(BELTS[i]) + 1;
ink(CX - hw, y + g(0, 0.3, -0.6, 0.6), CX + hw, y + g(0, 0.3, -0.6, 0.6), 0.78, "pen");
}
// 5 — the bracing: every panel divided into near-square cells, a full X in each, a lighter far-face
// X seen through, vertical posts in the four lowest bays and secondary diagonals in the lowest two
for (let i = 0; i < BELTS.length - 1; i++) {
const t0 = BELTS[i], t1 = BELTS[i + 1];
const y0 = yAt(t0), y1 = yAt(t1);
const w0 = hwAt(t0), w1 = hwAt(t1);
const k = constrain(Math.round((w0 + w1) / (y0 - y1)), 1, 5);
for (let j = 0; j < k; j++) {
const a0 = CX - w0 + (2 * w0 * j) / k, b0 = CX - w0 + (2 * w0 * (j + 1)) / k;
const a1 = CX - w1 + (2 * w1 * j) / k, b1 = CX - w1 + (2 * w1 * (j + 1)) / k;
const lw = i >= 11 ? 0.84 : 0.72; // heavier above the main deck, where it crosses solid paint
ink(a0, y0, b1, y1, lw, "pen");
ink(b0, y0, a1, y1, lw, "pen");
// the far face of the lattice only where the tower is narrow enough to see through it cleanly
if (i >= 3 && (i + j) % 2 === 0) {
ink(a0 + 2.2, y0 - 1, b1 + 2.2, y1 - 1, 0.58, "2B", FAR);
ink(b0 + 2.2, y0 - 1, a1 + 2.2, y1 - 1, 0.58, "2B", FAR);
}
if (i < 5 && j < k - 1) ink(b0, y0, b1, y1, 0.6, "pen", POST);
if (i < 2) {
const m0 = (a0 + b0) / 2;
ink(m0, y0, a1, y1, 0.58, "pen", POST);
ink(m0, y0, b1, y1, 0.58, "pen", POST);
}
}
}
// 6 — the structural arch between the front legs at the foot, and its soffit
const AY = yAt(0.014);
const archRib = (halfSpan, rise, w, name) => {
brush.noFill();
brush.set(name, PALETTE[2], w);
brush.beginShape(0.5);
for (let i = 0; i <= 8; i++) {
const a = Math.PI - (i / 8) * Math.PI;
brush.vertex(CX + Math.cos(a) * halfSpan, AY - Math.sin(a) * rise + g(0, 0.3, -0.6, 0.6));
}
brush.endShape(false);
};
archRib(hwAt(0.014) - 3, 41, 2.0, "charcoal"); // the arch proper
archRib(hwAt(0.014) - 11, 31, 1.0, "rotring"); // its soffit
// 7 — the main deck at 150 m: a two-storey box wider than the shaft, floor line, two rows of slots
const MW = 26, MTOP = MAIN_Y - 15, MH = 30;
halfPlate(box(CX - MW, MTOP, MW, MH), PALETTE[3], 1.15, 3.2, 66); // lit storey face
halfPlate(box(CX, MTOP, MW, MH), PALETTE[3], 1.25, 2.7, 88); // shade storey face
plate(shift(box(CX + 15, MTOP, MW - 15, MH), 1.3, 1), PALETTE[2], 0.9, 5.4, 94, 0.3); // the far end turning away
plate(box(CX - MW, MTOP + MH - 4.5, MW * 2, 4.5), PALETTE[1], 1.35, 1.7, 4, 0.22); // the orange fascia
ink(CX - MW - 4, MTOP, CX + MW + 4, MTOP, 1.7); // the deck roof, ruled not plated
ink(CX - MW - 3, MTOP + MH, CX + MW + 3, MTOP + MH, 1.3);
ink(CX - MW - 1, MTOP + 14, CX + MW + 1, MTOP + 14, 1.0, "pen"); // the floor line between storeys
for (let i = 0; i < 6; i++) {
const wx = CX - 21 + i * 8.2;
slot(wx + g(0, 0.2, -0.5, 0.5), MTOP + 3.5, 3.4, 8);
slot(wx + g(0, 0.2, -0.5, 0.5), MTOP + 17, 3.4, 7);
}
// the smaller top deck at 250 m
const SW = 13.5, STOP = SPEC_Y - 7, SH = 14;
halfPlate(box(CX - SW, STOP, SW, SH), PALETTE[3], 1.2, 1.9, 66);
plate(box(CX, STOP, SW, SH), PALETTE[3], 1.3, 2.0, 90, 0.3);
plate(shift(box(CX, STOP, SW, SH), 1.1, 0.8), PALETTE[2], 1.0, 3.0, 94, 0.3);
ink(CX - SW - 3, STOP, CX + SW + 3, STOP, 1.5);
ink(CX - SW - 2, STOP + SH, CX + SW + 2, STOP + SH, 1.1);
for (let i = 0; i < 4; i++) slot(CX - 10 + i * 5.6, STOP + 3, 3.2, 5.6);
// 8 — the antenna: a fine tapering rotring pair above the mast head, with three collar ticks
const AT = yAt(T_TOP);
brush.noFill();
brush.set("rotring", PALETTE[2], 1.25);
brush.beginShape(0.05);
brush.vertex(CX - 2.4, AT, 1);
brush.vertex(CX - 1.3, AT - 32, 0.8);
brush.vertex(CX - 0.5, AT - 58, 0.5);
brush.vertex(CX + 0.2, TIP_Y, 0.22);
brush.endShape(false);
brush.set("rotring", PALETTE[2], 1.1);
brush.beginShape(0.05);
brush.vertex(CX + 2.4, AT, 1);
brush.vertex(CX + 1.4, AT - 32, 0.75);
brush.vertex(CX + 0.7, AT - 58, 0.45);
brush.vertex(CX + 0.4, TIP_Y + 2, 0.2);
brush.endShape(false);
ink(CX - 4, AT - 14, CX + 4, AT - 14, 1.1, "pen");
ink(CX - 2, AT - 58, CX + 2, AT - 58, 0.85, "pen");
// 9 — Zojo-ji's Daiden: the broad dark irimoya roof, set BACK and to the right of the gate,
// crossing in front of the tower's left leg foot
const HX = 348, HEAVE = 600, HRIDGE = 562, HHW = 68;
plate([[HX - HHW, HEAVE], [HX - 34, HRIDGE], [HX + 34, HRIDGE], [HX + HHW, HEAVE], [HX + HHW - 8, HEAVE + 6], [HX - HHW + 8, HEAVE + 6]], PALETTE[2], 1.5, 1.65, 16, 0.16);
ink(HX - 35, HRIDGE, HX + 35, HRIDGE, 1.5); // the great ridge
ink(HX - 35, HRIDGE, HX - 38, HRIDGE - 6, 1.7, "charcoal"); // ridge-end ornaments
ink(HX + 35, HRIDGE, HX + 38, HRIDGE - 6, 1.7, "charcoal");
ink(HX - HHW, HEAVE, HX - 34, HRIDGE, 1.05, "pen"); // hip
ink(HX + HHW, HEAVE, HX + 34, HRIDGE, 1.05, "pen"); // hip
ink(HX - 34, HRIDGE + 13, HX + 34, HRIDGE + 13, 0.8, "pen"); // the gable course
brush.noFill(); // the eave: sagging in the middle, lifting at both corners
brush.set("charcoal", PALETTE[2], 2.0);
brush.beginShape(0.4);
brush.vertex(HX - HHW - 7, HEAVE - 4);
brush.vertex(HX, HEAVE + 5);
brush.vertex(HX + HHW + 7, HEAVE - 4);
brush.endShape(false);
// the hall's own low body: a stone podium and a run of deep bays, not a house with windows
halfPlate(box(HX - 56, HEAVE + 5, 112, 29), PALETTE[3], 1.2, 2.2, 60);
fadePlate(box(HX - 56, HEAVE + 6, 112, 11), PALETTE[2], 0.95, 3.4, 0, 0.6);
for (let i = 0; i < 8; i++) ink(HX - 56 + i * 16, HEAVE + 6, HX - 56 + i * 16, HEAVE + 34, 0.85, "pen");
for (let i = 0; i < 5; i++) slot(HX - 51 + i * 22, HEAVE + 13, 11, 21);
plate(box(HX - 62, HEAVE + 34, 124, 6), PALETTE[3], 1.1, 1.6, 0, 0.2);
ink(HX - 64, HEAVE + 40, HX + 64, HEAVE + 40, 1.2);
for (let i = 0; i < 3; i++) ink(HX - 22 + i * 22, HEAVE + 40, HX - 22 + i * 22, HEAVE + 45, 0.8, "pen"); // the steps
// 10 — the Sangedatsumon: a two-storey vermilion gate standing FORWARD and LEFT, nearer the
// viewer and so larger, with its own hip roof, a pent roof between the storeys, and three bays
const GX = 206, GB = 666;
// the lower storey, three bays between four columns
halfPlate(box(GX - 46, 616, 46, 44), PALETTE[1], 1.35, 2.1, 72);
plate(box(GX, 616, 46, 44), PALETTE[1], 1.45, 2.4, 91, 0.3);
plate(shift(box(GX, 616, 46, 44), 1.4, 1), PALETTE[2], 1.0, 3.4, 95, 0.3);
slot(GX - 38, 632, 14, 27);
slot(GX - 7, 632, 14, 27);
slot(GX + 24, 632, 14, 27);
ink(GX - 46, 631, GX + 46, 631, 0.9, "pen"); // the impost over the three bays
for (let i = 0; i < 4; i++) {
const cx = GX - 46 + i * 30.7;
ink(cx, 616, cx, 660, 1.05, "rotring");
}
// the plinth
plate(box(GX - 52, 659, 104, 7), PALETTE[3], 1.15, 1.6, 0, 0.2);
ink(GX - 54, GB, GX + 54, GB, 1.3);
// the pent roof between the storeys, and the balustrade standing on it
plate([[GX - 54, 616], [GX - 43, 604], [GX + 43, 604], [GX + 54, 616], [GX + 47, 621], [GX - 47, 621]], PALETTE[2], 1.4, 1.7, 12, 0.15);
brush.noFill();
brush.set("charcoal", PALETTE[2], 1.7);
brush.beginShape(0.4);
brush.vertex(GX - 57, 613);
brush.vertex(GX, 618.5);
brush.vertex(GX + 57, 613);
brush.endShape(false);
for (let i = 0; i < 13; i++) ink(GX - 39 + i * 6.5, 604, GX - 39 + i * 6.5, 598, 0.75, "pen");
ink(GX - 41, 598, GX + 41, 598, 0.9, "pen");
// the upper storey
halfPlate(box(GX - 40, 578, 40, 26), PALETTE[1], 1.3, 2.1, 70);
plate(box(GX, 578, 40, 26), PALETTE[1], 1.4, 2.3, 89, 0.3);
plate(shift(box(GX, 578, 40, 26), 1.3, 1), PALETTE[2], 1.0, 3.4, 93, 0.3);
for (let i = 0; i < 3; i++) slot(GX - 27 + i * 20, 582, 12, 13);
for (let i = 0; i < 4; i++) ink(GX - 40 + i * 26.7, 578, GX - 40 + i * 26.7, 604, 0.9, "pen");
// the upper hip roof — the gate's crown, steep and flared
plate([[GX - 58, 578], [GX - 18, 550], [GX + 18, 550], [GX + 58, 578], [GX + 50, 585], [GX - 50, 585]], PALETTE[2], 1.55, 1.6, 14, 0.16);
ink(GX - 19, 550, GX + 19, 550, 1.4); // ridge
ink(GX - 58, 578, GX - 18, 550, 1.0, "pen"); // hip
ink(GX + 58, 578, GX + 18, 550, 1.0, "pen"); // hip
brush.noFill();
brush.set("charcoal", PALETTE[2], 2.0);
brush.beginShape(0.4);
brush.vertex(GX - 62, 575);
brush.vertex(GX, 582);
brush.vertex(GX + 62, 575);
brush.endShape(false);
ink(GX - 19, 550, GX - 22, 544, 1.6, "charcoal"); // the ridge-end ornaments
ink(GX + 19, 550, GX + 22, 544, 1.6, "charcoal");
// 11 — the path across the foot, dissolving into dashes at both ends, with visitors for scale
const PY = 676;
plate(box(156, PY, 486, 5), PALETTE[3], 1.15, 1.6, 0, 0.2);
ink(206, PY + 6, 604, PY + 6, 1.3);
for (let i = 0; i < 5; i++) {
ink(200 - i * 12, PY + 6, 190 - i * 12 + g(0, 1.4, -3, 3), PY + 6, g(1.0, 0.2, 0.6, 1.4), "2B");
ink(610 + i * 12, PY + 6, 620 + i * 12 + g(0, 1.4, -3, 3), PY + 6, g(1.0, 0.2, 0.6, 1.4), "2B");
}
for (let i = 0; i < 14; i++) {
const x = 190 + i * 30 + g(0, 3, -5, 5);
ink(x, PY + 9, x + 11, PY + 9, 0.7, "pen", PALETTE[3]);
}
const FIG = [296, 330, 424, 488, 556];
for (let i = 0; i < FIG.length; i++) {
const h = g(8, 0.8, 6.5, 9.5);
ink(FIG[i], PY - 1, FIG[i] + g(0, 0.6, -1.2, 1.2), PY - 1 - h, g(1.55, 0.15, 1.3, 1.8), "charcoal");
}
// 12 — darks last: the crisp feet of the two outer legs, the shadow under each deck and roof,
// and the single gilt lantern hanging in the gate's centre bay
ink(CX - hwAt(0) - 1, BASE_Y - 22, CX - hwAt(0.055) - 1, yAt(0.055), 1.5);
ink(CX + hwAt(0) + 1, BASE_Y - 22, CX + hwAt(0.055) + 1, yAt(0.055), 1.5);
// each splayed foot planted with its own small shade, so the tower stands rather than floats
fadePlate(box(CX - hwAt(0) - 4, BASE_Y - 12, 26, 14), PALETTE[2], 1.0, 3.4, 0, 0.7);
fadePlate(box(CX + hwAt(0) - 22, BASE_Y - 12, 26, 14), PALETTE[2], 1.0, 3.4, 0, 0.7);
fadePlate(box(GX - 46, 578, 92, 8), PALETTE[2], 0.9, 3.8, 0, 0.6);
ink(GX, 618, GX, 621, 0.9, "rotring", PALETTE[2]); // the cord
ink(GX, 622, GX, 629, 1.5, "charcoal", PALETTE[5]);
ink(GX - 2, 621.5, GX + 2, 621.5, 0.85, "rotring", PALETTE[2]);
ink(GX - 2, 629.5, GX + 2, 629.5, 0.85, "rotring", PALETTE[2]);
}