From d1cdd4ad91ea59f5b04ad3d88503bacf77678cd6 Mon Sep 17 00:00:00 2001 From: Shane Celis Date: Wed, 4 Jan 2023 04:41:30 -0500 Subject: [PATCH] feature: Add font explorer tool. --- games/font-explorer.js | 134 ++++++++++++++++++++++++++++++++++++ games/img/font-explorer.png | Bin 0 -> 14637 bytes 2 files changed, 134 insertions(+) create mode 100644 games/font-explorer.js create mode 100644 games/img/font-explorer.png diff --git a/games/font-explorer.js b/games/font-explorer.js new file mode 100644 index 0000000000..02a9c15f24 --- /dev/null +++ b/games/font-explorer.js @@ -0,0 +1,134 @@ +/* + @title: Font Explorer + @author: Shane Celis + @shanecelis +*/ + +const cursor = "c"; + +const TEXT_WIDTH = 20; +const TEXT_HEIGHT = 16; + +setLegend( + [ cursor, bitmap` +9999999999999999 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9..............9 +9999999999999999`] +); + +const levels = [ + map` +.................... +.c.................. +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +....................`, +]; + +setMap(levels[0]); + +var begin = 0; + +const rowCount = 7; +const columnCount = 10; + +function _onInput(c) { + let sprite = getFirst(cursor); + switch (c) { + case 'w': + if (sprite.y - 2 > 0) + sprite.y -= 2; + break; + case 'a': + if (sprite.x - 2 < 0 && begin > 0) { + begin -= rowCount * columnCount; + sprite.x = columnCount * 2 - 1; + } else if (sprite.x - 2 > 0) { + sprite.x -= 2; + } + break; + case 's': + let j = (sprite.y - 1) / 2; + if (j < rowCount - 1) { + sprite.y += 2; + } + break; + case 'd': + if (sprite.x + 2 >= width() && begin < 210) { + begin += rowCount * columnCount; + sprite.x = 1; + } else { + sprite.x += 2; + } + break; + } +} + +function fromCodePoint(point) { + switch (point) { + case 10: + // I bet a backslash. (Oops.) + // return "\n"; + + // I raise you two backslashes. + // return "\\n"; + + // I raise you three backslashes! + return String.fromCodePoint(21) + "n"; + // (No backslash in character set. It shows up as pipe | actually. This uses a + // triple-backslash-like \\\ like glyph instead.) + case 32: + // Not sure what this is. ASCII says it's control Z. + return "^Z"; + default: + return String.fromCodePoint(Math.max(0, point)); + } +} + +function draw() { + clearText(); + let k = begin; + for (let i = 0; i < columnCount; i++) { + for (let j = 0; j < rowCount; j++) { + addText(String.fromCodePoint(k++), { x: 2 * i + 1, y: 2 * j + 1, color: 0 }); + } + } + let i = (getFirst(cursor).x - 1) / 2; + let j = (getFirst(cursor).y - 1) / 2; + let point = i * rowCount + j + begin; + if (point < 256) + addText("char " + fromCodePoint(point) + " int " + point, { x: 1, y: 15 }); +} + +onInput("w", () => _onInput('w')); +onInput("a", () => _onInput('a')); +onInput("s", () => _onInput('s')); +onInput("d", () => _onInput('d')); + +afterInput(draw); + +draw(); diff --git a/games/img/font-explorer.png b/games/img/font-explorer.png new file mode 100644 index 0000000000000000000000000000000000000000..09b4325fcb421d38c7df223a9e99284c9aedd336 GIT binary patch literal 14637 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 literal 0 HcmV?d00001