#let schematic-extent = state("schematic-extent") #let color = ( white: , light-gray: , gray: , black: , brown: , red: , orange: , yellow: , lime: , green: , cyan: , light-blue: , blue: , purple: , magenta: , pink: , ) #let facing = () #let power = ( on: , off: , ) #let sub = #let lock = #let tile(path, x, y, z) = { context schematic-extent.update(it => (it.at(0) + x, it.at(1) + y, it.at(2) + z, it.at(3) + 1)) context { let extent-val = schematic-extent.at( query(selector().after(here())).first().location(), ) let center-val = ( extent-val.at(0) / extent-val.at(3), extent-val.at(1) / extent-val.at(3), extent-val.at(2) / extent-val.at(3), ) let cx = x - center-val.at(0) let cy = y - center-val.at(1) let cz = z - center-val.at(2) place( horizon + center, image(path, width: 2em), dx: 0.8952em * (-cx + cy), dy: -0.444em * (-cx - cy) - 1.09em * cz, ) } } #let schematic(blocks) = { context schematic-extent.update(it => (0, 0, 0, 0)) blocks [#metadata(none) ] } #let tileset(..tiles) = { show: schematic for (i, it) in tiles.pos().enumerate() { tile("img/slab-top.png", i, 0, -1) tile(it, i, 0, 0) } } #let dust(..args) = { let facing = args.filter(it => type(it) == str).pos().join() facing = upper(facing).codepoints().sorted(key: it => "NESWUD".position(it)).join() let powered = args.filter(it => (on, off).contains(it)).at(0, default: off) return ( "img/dust", if powered == on { "-on" } else { "-off" }, if facing != "" { "-" + facing }, ".png", ).join() } // #let dust(powered: false, facing: none) = ( // "img/dust", // if powered { "-on" } else { "-off" }, // "-" + upper(facing).codepoints().sorted(key: it => "NESW".position(it)).join(), // ".png", // ).join() #let cmp(powered: false, subtract: false, facing: "s") = { return ( "img/cmp", if powered { "-on" } else { "-off" }, if subtract { "-sub" }, "-" + upper(facing), ".png", ).join() } #let rep(delay, powered: false, locked: false, facing: "s") = { return ( "img/rep", "-" + str(delay), if powered { "-on" } else { "-off" }, if locked { "-lock" }, "-" + upper(facing), ".png", ).join() } #let slab(kind: "top") = { return ( "img/slab", "-" + kind, ".png", ).join() } #let solid(color: "white", ghost: false) = { return ( "img/", color + "-concrete", if ghost { "-ghost" }, ".png", ).join() } #let glass() = "img/glass.png" #let soulsand() = "img/soul-sand.png" #let trapdoor(facing: "d") = { return ( "img/trapdoor", "-" + upper(facing), ".png", ).join() } // , // , // , // , // , // , // , // , #block(stroke: gray, width: 100%, height: 3in, { set text(size: 40pt) tileset( dust("ns"), cmp(), rep(2, powered: true), solid(), trapdoor(), ) // tileset( // "img/cmp-off-S.png", // "img/rep-4-off-S.png", // "img/white-concrete.png", // "img/rep-1-off-S.png", // "img/rep-2-off-S.png", // "img/cmp-off-S.png", // ) }) #block(stroke: gray, width: 100%, height: 3in, { set text(size: 40pt) show: schematic tile("img/white-concrete.png", 0, -2, -1) tile("img/white-concrete.png", 0, -1, 0) tile("img/white-concrete.png", 0, 0, -1) tile("img/cmp-off-S.png", 0, 0, 0) tile("img/white-concrete-ghost.png", 1, 0, 0) // tile("img/glass.png", 1, 0, 0) // tile("img/white-concrete.png", 0, -3, 0) // tile("img/gray-concrete.png", 0, -3, -1) // // tile("img/white-concrete.png", 3, 0, -1) // tile("img/white-concrete.png", 2, 0, -1) // tile("img/white-concrete.png", 1, 0, -1) // tile("img/white-concrete.png", 0, 0, -1) // tile("img/white-concrete.png", -1, 0, -1) // tile("img/white-concrete.png", -2, 0, -1) // tile("img/white-concrete.png", -3, 0, -1) // // tile("img/cmp-off.png", 3, 0, 0) // tile("img/cmp-off.png", 2, 0, 0) // tile("img/cmp-off.png", 1, 0, 0) // tile("img/cmp-off.png", 0, 0, 0) // tile("img/cmp-off.png", -1, 0, 0) // tile("img/cmp-off.png", -2, 0, 0) // tile("img/cmp-off.png", -3, 0, 0) }) #block(stroke: gray, width: 100%, height: 3in, { set text(size: 40pt) show: schematic // tile("img/white-concrete.png", 0, -2, -1) // tile("img/white-concrete.png", 0, -1, -1) // tile("img/white-concrete.png", 1, 0, 0) // tile("img/white-concrete.png", 0, -1, 0) // tile("img/light-gray-concrete.png", 0, 0, -1) tile("img/light-gray-concrete.png", 0, 0, -1) // tile("img/white-concrete.png", 0, -3, 0) // tile("img/gray-concrete.png", 0, -3, -1) // // tile("img/white-concrete.png", 3, 0, -1) // tile("img/white-concrete.png", 2, 0, -1) // tile("img/white-concrete.png", 1, 0, -1) // tile("img/white-concrete.png", 0, 0, -1) // tile("img/white-concrete.png", -1, 0, -1) // tile("img/white-concrete.png", -2, 0, -1) // tile("img/white-concrete.png", -3, 0, -1) // // tile("img/cmp-off.png", 3, 0, 0) // tile("img/cmp-off.png", 2, 0, 0) // tile("img/cmp-off.png", 1, 0, 0) // tile("img/cmp-off.png", 0, 0, 0) // tile("img/cmp-off.png", -1, 0, 0) // tile("img/cmp-off.png", -2, 0, 0) // tile("img/cmp-off.png", -3, 0, 0) })