diff --git a/ac-electron/main.js b/ac-electron/main.js index dfa2fc2815..55e053ab34 100644 --- a/ac-electron/main.js +++ b/ac-electron/main.js @@ -1230,9 +1230,10 @@ function rebuildTrayMenu() { } // 🟒 The nom muncher games. - menuItems.push({ label: 'mathnom β€” numbers', click: () => navigateToPiece('mathnom') }); + menuItems.push({ label: 'numbnom β€” numbers', click: () => navigateToPiece('numbnom') }); menuItems.push({ label: 'engnom β€” english', click: () => navigateToPiece('engnom') }); menuItems.push({ label: 'mexinom β€” espaΓ±ol', click: () => navigateToPiece('mexinom') }); + menuItems.push({ label: 'dannom β€” dansk', click: () => navigateToPiece('dannom') }); menuItems.push({ label: 'notenom β€” music', click: () => navigateToPiece('notenom') }); menuItems.push({ type: 'separator' }); diff --git a/papers/SCORE.md b/papers/SCORE.md index 938e1a857b..b2957defee 100644 --- a/papers/SCORE.md +++ b/papers/SCORE.md @@ -153,7 +153,7 @@ Sorted by most recently edited/added. | Paper | Format | PDF | Source | |-------|--------|-----|--------| -| The nom Games: A Muncher Arcade for Aesthetic Computer (mathnom / engnom / mexinom / notenom; one shared engine + virtual synth controller) | arXiv (LaTeX, ~5pp first-pass) | `arxiv-nom/nom.pdf` | `arxiv-nom/nom.tex` | +| The nom Games: A Muncher Arcade for Aesthetic Computer (numbnom / engnom / mexinom / notenom; one shared engine + virtual synth controller) | arXiv (LaTeX, ~5pp first-pass) | `arxiv-nom/nom.pdf` | `arxiv-nom/nom.tex` | | MicroVision: A Dossier (Genealogy, Products, People, Money, Dilution Mechanics, Takeover Theory, 1993–2026) | arXiv (LaTeX, dossier, 7pp first-pass) | `arxiv-microvision/microvision.pdf` | `arxiv-microvision/microvision.tex` | | Comp Strats: Compositional Strategies in AC --- Aphorisms for a Shielded Media-Arts Practice | arXiv (LaTeX, ~7pp first-pass) | `arxiv-comp-strats/comp-strats.pdf` | `arxiv-comp-strats/comp-strats.tex` | | A Fraserin' Art + Tech (methodology essay + prior-art survey, labor-folk register) | arXiv (LaTeX, 7pp first-pass) | `arxiv-fraserin/fraserin.pdf` | `arxiv-fraserin/fraserin.tex` | diff --git a/papers/arxiv-nom/nom.tex b/papers/arxiv-nom/nom.tex index 366851a091..87e7292e02 100644 --- a/papers/arxiv-nom/nom.tex +++ b/papers/arxiv-nom/nom.tex @@ -131,7 +131,7 @@ {\small\color{acgray} Aesthetic.Computer}\par {\small\color{acgray} ORCID: \href{https://orcid.org/0009-0007-4460-4913}{0009-0007-4460-4913}}\par \vspace{0.3em} -{\small\color{acpurple} \url{https://aesthetic.computer/mathnom} \enspace$\cdot$\enspace \url{https://aesthetic.computer/notenom}}\par +{\small\color{acpurple} \url{https://aesthetic.computer/numbnom} \enspace$\cdot$\enspace \url{https://aesthetic.computer/notenom}}\par \vspace{0.6em} \rule{\textwidth}{1.5pt} \vspace{0.5em} @@ -144,7 +144,7 @@ \begin{quote} \small\noindent\textbf{Abstract.} -The \texttt{nom} family is a set of muncher arcade pieces built inside \ac{}~\citep{scudder2026ac} in June 2026: \texttt{mathnom} (numbers), \texttt{engnom} (english words), \texttt{mexinom} (spanish, Mexican-flavored), and \texttt{notenom} (musical notes). They descend directly from MECC's \emph{Word Munchers} (1985) and \emph{Number Munchers} (1986)---a green creature eats grid squares that satisfy a rule (multiples, primes, rhymes) while dodging purple Troggles~\citep{mecc1986number}. Three of the four are thin wrappers over a single shared engine, \texttt{lib/nom.mjs}: the muncher, the 5$\times$5 board, the beat-measured timer, the troggles, and the per-mode board generator all live in one place, so a new subject or a new language is a content table, not a new game. The audio runs through a reusable \emph{virtual synth controller} (\texttt{lib/synth.mjs}) that wraps note synthesis and the shared 12-drum notepat kit~\citep{scudder2026notepat} into one instrument---which is why the metronome is a real kick, a held square sustains a chord, and \texttt{notenom} plays the actual pitch you eat. I describe what the games are, how the engine separates mechanics from content, and where the seam invites the next language, the next subject, and the next instrument. +The \texttt{nom} family is a set of muncher arcade pieces built inside \ac{}~\citep{scudder2026ac} in June 2026: \texttt{numbnom} (numbers), \texttt{engnom} (english words), \texttt{mexinom} (spanish, Mexican-flavored), and \texttt{notenom} (musical notes). They descend directly from MECC's \emph{Word Munchers} (1985) and \emph{Number Munchers} (1986)---a green creature eats grid squares that satisfy a rule (multiples, primes, rhymes) while dodging purple Troggles~\citep{mecc1986number}. Three of the four are thin wrappers over a single shared engine, \texttt{lib/nom.mjs}: the muncher, the 5$\times$5 board, the beat-measured timer, the troggles, and the per-mode board generator all live in one place, so a new subject or a new language is a content table, not a new game. The audio runs through a reusable \emph{virtual synth controller} (\texttt{lib/synth.mjs}) that wraps note synthesis and the shared 12-drum notepat kit~\citep{scudder2026notepat} into one instrument---which is why the metronome is a real kick, a held square sustains a chord, and \texttt{notenom} plays the actual pitch you eat. I describe what the games are, how the engine separates mechanics from content, and where the seam invites the next language, the next subject, and the next instrument. \end{quote} \vspace{0.5em} }] @@ -153,7 +153,7 @@ The \texttt{nom} family is a set of muncher arcade pieces built inside \ac{}~\ci Edutainment had one good idea that everyone remembers and almost no one rebuilt: make the right answer something you eat. In \emph{Number Munchers}, a small green creature roams a grid of numbers, and you steer it onto the squares that are multiples of 3, or prime, or even---and only those squares---before a purple monster walks into you~\citep{mecc1986number}. The drill is real arithmetic. The wrapper is an arcade game. The kid playing it is doing a worksheet and does not notice. -The \texttt{nom} games are that idea, rebuilt as \ac{} pieces and addressed the way everything in \ac{} is addressed---by typing a memorable noun. \texttt{aesthetic.computer/mathnom} is the number drill. \texttt{engnom} is english words. \texttt{mexinom} is spanish, flavored with Mexican street food and loterΓ­a animals. \texttt{notenom} is music: the grid is notes, and eating one plays it. They were all built in a few days of June 2026, and that speed is the point of the paper. After the first one, none of them were really a new game. They were a new column in a table. +The \texttt{nom} games are that idea, rebuilt as \ac{} pieces and addressed the way everything in \ac{} is addressed---by typing a memorable noun. \texttt{aesthetic.computer/numbnom} is the number drill. \texttt{engnom} is english words. \texttt{mexinom} is spanish, flavored with Mexican street food and loterΓ­a animals. \texttt{notenom} is music: the grid is notes, and eating one plays it. They were all built in a few days of June 2026, and that speed is the point of the paper. After the first one, none of them were really a new game. They were a new column in a table. This is not a paper about a novel mechanic---the mechanic is forty years old and was good then. It is a paper about a seam. \ac{} pieces usually grow by accretion, one piece pulling infrastructure into existence around itself, the way \texttt{notepat} did~\citep{scudder2026notepat}. \texttt{nom} grew the other way: one engine, written once, then sliced into four games by swapping the content and the voice. The interesting object is the cut. @@ -173,11 +173,11 @@ What \texttt{nom} keeps is the one idea worth keeping. \citet{habgood2011motivat There are four pieces. All open on a title card and wait for a key or a tap. -\subsection{mathnom --- numbers} +\subsection{numbnom --- numbers} The original drill, faithfully. Each board picks a numeric rule and a number range. Rules: \emph{multiples} of $n$ (shown as \texttt{X3}), \emph{factors} of a target (\texttt{F24}), \emph{primes}, \emph{evens}, \emph{odds}. The range varies per board---some boards stay in the friendly 0--9 zone, others climb to 40, 60, or 80, so the same rule (``evens'') is a different difficulty depending on the numbers on offer. The board generator builds the correct cells from the rule directly (a multiple of $n$ is $kn$; a factor of $n$ is pulled from $n$'s actual divisor list) and then re-tests every cell against the live predicate, so a board can never accidentally lie about which squares are correct. -\texttt{mathnom} also accepts the other modes through colon params---\texttt{mathnom:words}, \texttt{mathnom:spanish}---but defaults to numbers, so navigating to it always resets to arithmetic. +\texttt{numbnom} also accepts the other modes through colon params---\texttt{numbnom:words}, \texttt{numbnom:spanish}---but defaults to numbers, so navigating to it always resets to arithmetic. \subsection{engnom --- english words} @@ -195,7 +195,7 @@ The departure. \texttt{notenom} is self-contained rather than a wrapper, but it \subsection{The shared engine} -\texttt{lib/nom.mjs} is the entire game for three of the four pieces. It owns the 5$\times$5 grid, the muncher and its smoothed display position, the troggles and their patrol, the lives, the beat-based timer, the dynamic camera, every animation, and the board generator. \texttt{mathnom}, \texttt{engnom}, and \texttt{mexinom} are each about a dozen lines: +\texttt{lib/nom.mjs} is the entire game for three of the four pieces. It owns the 5$\times$5 grid, the muncher and its smoothed display position, the troggles and their patrol, the lives, the beat-based timer, the dynamic camera, every animation, and the board generator. \texttt{numbnom}, \texttt{engnom}, and \texttt{mexinom} are each about a dozen lines: \begin{quote}\small\ttfamily import \{ boot as nomBoot, sim,\\ diff --git a/papers/cli.mjs b/papers/cli.mjs index 08e89a365e..8867d95d7b 100755 --- a/papers/cli.mjs +++ b/papers/cli.mjs @@ -921,7 +921,7 @@ function updateIndex(entries) { "nom-games-26-arxiv": { detail: "Muncher Arcade for Aesthetic Computer · arXiv", abstract: - "The nom games rebuild MECC's Word and Number Munchers as Aesthetic Computer pieces --- mathnom, engnom, mexinom, and notenom. The paper shows how one shared engine and a reusable virtual synth controller turn each new subject or language into a content table rather than a new game, with the answer key in notenom doubling as a playable instrument.", + "The nom games rebuild MECC's Word and Number Munchers as Aesthetic Computer pieces --- numbnom, engnom, mexinom, and notenom. The paper shows how one shared engine and a reusable virtual synth controller turn each new subject or language into a content table rather than a new game, with the answer key in notenom doubling as a playable instrument.", }, "aesthetic-may-26-essay": { detail: "Essay · ~5pp", diff --git a/system/netlify/functions/docs.js b/system/netlify/functions/docs.js index acf09731d2..108bd3f4a7 100644 --- a/system/netlify/functions/docs.js +++ b/system/netlify/functions/docs.js @@ -4250,18 +4250,18 @@ void draw() { hidden: true, //TODO: shouldnt this go to nopaint site? nopaint.art }, - mathnom: { - sig: "mathnom[:words|:spanish]", + numbnom: { + sig: "numbnom[:words|:spanish]", desc: "Number Munchers-style grid game: munch squares that match the math rule (odds, evens, primes, multiples, factors) on a beat, dodge troggles.", colon: [ { name: "mode", type: "enum", values: ["words", "spanish"], required: false, desc: "play the word edition (engnom) or spanish edition (mexinom) instead of numbers" }, ], - examples: ["mathnom", "mathnom:words", "mathnom:spanish"], + examples: ["numbnom", "numbnom:words", "numbnom:spanish"], done: true, }, engnom: { sig: "engnom", - desc: "Word Munchers-style grid game: munch squares matching the word rule (animals, colors, fruits, rhymes, doubles). English word edition of mathnom.", + desc: "Word Munchers-style grid game: munch squares matching the word rule (animals, colors, fruits, rhymes, doubles). English word edition of numbnom.", examples: ["engnom"], done: true, }, @@ -4271,6 +4271,12 @@ void draw() { examples: ["mexinom"], done: true, }, + dannom: { + sig: "dannom", + desc: "Danish word Munchers: mad, dyr, farver, frugt, hygge β€” speaks the English translation aloud as you munch.", + examples: ["dannom"], + done: true, + }, notenom: { sig: "notenom", desc: "Musical Munchers-style grid game: munch the note squares that match the rule (C major, A minor, sharps, C chord, high, low) on the beat β€” each bite plays its note.", diff --git a/system/public/aesthetic.computer/disks/dannom.mjs b/system/public/aesthetic.computer/disks/dannom.mjs new file mode 100644 index 0000000000..309029bb6f --- /dev/null +++ b/system/public/aesthetic.computer/disks/dannom.mjs @@ -0,0 +1,12 @@ +// Dannom, 2026.06.08 +// The Danish word edition of nom (shared lib/nom.mjs) β€” mad, dyr, farver, frugt, +// hygge. Reuses lib/nom.mjs and forces Danish word mode at boot. Each munch +// speaks the English translation aloud, so it doubles as a vocab drill. + +import { boot as nomBoot, sim, paint, act, meta } from "../lib/nom.mjs"; + +function boot(api) { + nomBoot({ ...api, params: ["danish"] }); +} + +export { boot, sim, paint, act, meta }; diff --git a/system/public/aesthetic.computer/disks/mexinom.mjs b/system/public/aesthetic.computer/disks/mexinom.mjs index 3de928dbdf..281c90002a 100644 --- a/system/public/aesthetic.computer/disks/mexinom.mjs +++ b/system/public/aesthetic.computer/disks/mexinom.mjs @@ -3,10 +3,10 @@ // animales, colores, frutas, fiesta. Reuses lib/nom.mjs and forces Spanish // word mode at boot. -import { boot as mathnomBoot, sim, paint, act, meta } from "../lib/nom.mjs"; +import { boot as nomBoot, sim, paint, act, meta } from "../lib/nom.mjs"; function boot(api) { - mathnomBoot({ ...api, params: ["spanish"] }); + nomBoot({ ...api, params: ["spanish"] }); } export { boot, sim, paint, act, meta }; diff --git a/system/public/aesthetic.computer/disks/notenom.mjs b/system/public/aesthetic.computer/disks/notenom.mjs index 180dafb401..64268b83ed 100644 --- a/system/public/aesthetic.computer/disks/notenom.mjs +++ b/system/public/aesthetic.computer/disks/notenom.mjs @@ -4,7 +4,7 @@ import { Synth } from "../lib/synth.mjs"; // shared virtual synth + perc kit /* #region πŸ“š README - A music edition of the "nom" grid game (sibling to mathnom / engnom). + A music edition of the "nom" grid game (sibling to numbnom / engnom). A green muncher hops a 5x5 grid of note squares. Eat every square that satisfies the musical rule shown up top before the beat-timer runs out. Each munch plays its note; the scale plays on board start, an arpeggio on diff --git a/system/public/aesthetic.computer/disks/mathnom.mjs b/system/public/aesthetic.computer/disks/numbnom.mjs similarity index 86% rename from system/public/aesthetic.computer/disks/mathnom.mjs rename to system/public/aesthetic.computer/disks/numbnom.mjs index f951e9555a..069a3934e8 100644 --- a/system/public/aesthetic.computer/disks/mathnom.mjs +++ b/system/public/aesthetic.computer/disks/numbnom.mjs @@ -1,4 +1,4 @@ -// mathnom, 2026.06.08 +// numbnom, 2026.06.08 // Number edition of the "nom" muncher game β€” eat grid squares that match the // math rule (odds, evens, primes, multiples, factors) on a beat, dodge troggles. // Shares the engine in ../lib/nom.mjs with engnom (words) and mexinom (espaΓ±ol). @@ -6,7 +6,7 @@ import { boot as nomBoot, sim, paint, act, meta } from "../lib/nom.mjs"; function boot(api) { - // Pass colon params through (mathnom:words / mathnom:spanish still work); + // Pass colon params through (numbnom:words / numbnom:spanish still work); // default to numbers so navigating here always resets to number mode. nomBoot({ ...api, params: api.params?.length ? api.params : ["numbers"] }); } diff --git a/system/public/aesthetic.computer/lib/nom.mjs b/system/public/aesthetic.computer/lib/nom.mjs index 79f6f983e2..52fc65ac3b 100644 --- a/system/public/aesthetic.computer/lib/nom.mjs +++ b/system/public/aesthetic.computer/lib/nom.mjs @@ -1,6 +1,6 @@ -// nom β€” shared engine for the muncher games (mathnom / engnom / mexinom), 2026.06.07 +// nom β€” shared engine for the muncher games (numbnom / engnom / mexinom / dannom), 2026.06.07 // Move the muncher around a 5Γ—5 grid and eat every square that satisfies the -// rule at the top β€” but dodge the Troggles. `mathnom` = numbers, `engnom` = words. +// rule at the top β€” but dodge the Troggles. `numbnom` = numbers, `engnom` = words. import { Synth } from "./synth.mjs"; // shared virtual synth + perc kit @@ -29,7 +29,7 @@ const START_LIVES = 3; // 🌐 Game state let mode = "number"; // "number" | "word" -let lang = "en"; // word language: "en" (engnom) | "es" (mexinom) +let lang = "en"; // word language: "en" (engnom) | "es" (mexinom) | "da" (dannom) let state = "title"; // title | play | clear | over | win let grid = []; // [{ value, correct, eaten, flash }] let ruleLabel = ""; // short on-screen token (e.g. "X3") @@ -91,6 +91,9 @@ function boot({ params, hud, num: { randInt } }) { if (p === "spanish" || p === "es" || p === "mexi" || p === "mexinom") { mode = "word"; lang = "es"; + } else if (p === "danish" || p === "da" || p === "dansk" || p === "dannom") { + mode = "word"; + lang = "da"; } else if (p === "words" || p === "word" || p === "english" || p === "en") { mode = "word"; lang = "en"; @@ -151,6 +154,10 @@ const COLOR_WORDS = { purple: [160, 90, 220], morado: [160, 90, 220], tan: [210, 180, 140], lime: [160, 230, 90], teal: [80, 200, 190], navy: [60, 80, 170], cyan: [90, 220, 230], rose: [230, 120, 140], + // πŸ‡©πŸ‡° Danish color words (ASCII-romanized æøΓ₯ β†’ ae/o/aa). + rod: [230, 60, 60], blaa: [70, 120, 240], gron: [70, 200, 90], + gul: [240, 210, 70], sort: [35, 35, 44], hvid: [235, 235, 245], + graa: [150, 150, 160], brun: [150, 90, 50], }; function luma(c) { return 0.3 * c[0] + 0.59 * c[1] + 0.11 * c[2]; @@ -175,6 +182,23 @@ const TRANSLATE = { clavo: "nail", papel: "paper", caja: "box", }; +// πŸ‡©πŸ‡° Danish β†’ English (spoken on each munch in dannom). Keys are ASCII-romanized +// (Γ¦β†’ae, ΓΈβ†’o, Γ₯β†’aa) to match the bitmap-font-safe words used on the board. +const TRANSLATE_DA = { + brod: "bread", ost: "cheese", polse: "sausage", kage: "cake", suppe: "soup", + smor: "butter", fisk: "fish", salt: "salt", sukker: "sugar", grod: "porridge", aeg: "egg", + kat: "cat", hund: "dog", ko: "cow", gris: "pig", hest: "horse", and: "duck", + ravn: "raven", ulv: "wolf", bjorn: "bear", raev: "fox", mus: "mouse", faar: "sheep", + rod: "red", blaa: "blue", gron: "green", gul: "yellow", sort: "black", + hvid: "white", graa: "gray", brun: "brown", + aeble: "apple", paere: "pear", blomme: "plum", banan: "banana", drue: "grape", + fersken: "peach", citron: "lemon", melon: "melon", baer: "berry", blomster: "flowers", + lys: "candle", te: "tea", bog: "book", sofa: "sofa", taeppe: "blanket", + ild: "fire", ven: "friend", kaffe: "coffee", hus: "house", sten: "stone", + tog: "train", stol: "chair", bord: "table", ur: "clock", glas: "glass", + sko: "shoe", dor: "door", vej: "road", regn: "rain", vind: "wind", +}; + function shuffle(arr, rnd) { for (let i = arr.length - 1; i > 0; i -= 1) { const j = rnd(i + 1); @@ -248,6 +272,37 @@ const ES_WORD_ROUNDS = [ }, ]; +// πŸ‡©πŸ‡° Dannom β€” Danish word categories (mad, dyr, farver, frugt, hygge). Words are +// ASCII-romanized (Γ¦β†’ae, ΓΈβ†’o, Γ₯β†’aa) so the bitmap font renders cleanly; each munch +// speaks the English translation aloud (see TRANSLATE_DA). +const DA_WORD_ROUNDS = [ + { + label: "MAD", say: "danish food", + correct: ["brod", "ost", "polse", "kage", "suppe", "smor", "fisk", "salt", "sukker", "grod", "aeg"], + wrong: ["bord", "stol", "ur", "bog", "tog", "sko", "glas", "sten", "vej", "dor"], + }, + { + label: "DYR", say: "danish animals", + correct: ["kat", "hund", "ko", "gris", "hest", "and", "ravn", "ulv", "bjorn", "raev", "mus", "faar"], + wrong: ["hus", "taeppe", "ur", "bog", "tog", "stol", "glas", "sten", "vej", "dor"], + }, + { + label: "FARVER", say: "danish colors", + correct: ["rod", "blaa", "gron", "gul", "sort", "hvid", "graa", "brun"], + wrong: ["kat", "bord", "regn", "vind", "hus", "sten", "sko", "glas", "vej", "ur"], + }, + { + label: "FRUGT", say: "danish fruit", + correct: ["aeble", "paere", "blomme", "banan", "drue", "fersken", "citron", "melon", "baer"], + wrong: ["bord", "stol", "ur", "bog", "tog", "sko", "glas", "sten", "vej", "dor"], + }, + { + label: "HYGGE", say: "cozy danish things", + correct: ["lys", "te", "bog", "sofa", "taeppe", "ild", "ven", "kaffe"], + wrong: ["regn", "vind", "sten", "tog", "ur", "glas", "sko", "dor", "vej", "hus"], + }, +]; + function newRound({ randInt }) { // AC's randInt(n) is inclusive (0..n); wrap it to a 0..n-1 index helper. const rnd = (n) => randInt(Math.max(1, n) - 1); @@ -257,7 +312,7 @@ function newRound({ randInt }) { const cells = []; if (mode === "word") { - const rounds = lang === "es" ? ES_WORD_ROUNDS : WORD_ROUNDS; + const rounds = lang === "es" ? ES_WORD_ROUNDS : lang === "da" ? DA_WORD_ROUNDS : WORD_ROUNDS; const round = rounds[rnd(rounds.length)]; ruleLabel = round.label; ruleSpeech = round.say; @@ -633,8 +688,8 @@ function munch() { }); if (remaining === 1) flash("LAST ONE!"); - // Speak the English translation (mexinom), else announce the last one. - if (mode === "word" && lang === "es") sayTranslation(v); + // Speak the English translation (mexinom / dannom), else announce the last one. + if (mode === "word" && lang !== "en") sayTranslation(v); else if (remaining === 1) say("last one"); if (remaining <= 0) { state = "clear"; @@ -648,7 +703,7 @@ function munch() { } else { cell.flash = 14; cell.failed = true; // X it out β€” can't be tried again - if (mode === "word" && lang === "es") sayTranslation(cell.value); + if (mode === "word" && lang !== "en") sayTranslation(cell.value); chompBad(); loseLife(); } @@ -705,9 +760,10 @@ function stepToward(t) { else if (rowDist > 0) move(0, drF <= drB ? 1 : -1); } -// πŸ‡²πŸ‡½ Speak the English translation of a Spanish answer. +// πŸ‡²πŸ‡½ / πŸ‡©πŸ‡° Speak the English translation of a Spanish or Danish answer. function sayTranslation(v) { - say(TRANSLATE[v] || String(v)); + const table = lang === "da" ? TRANSLATE_DA : TRANSLATE; + say(table[v] || String(v)); } // πŸ”Š Sound ─────────────────────────────────────────────────────────────────── @@ -1469,12 +1525,12 @@ function paintTroggle({ ink, box, line }, cx, cy, cell, hue) { } function gameName() { - if (mode !== "word") return "MATHNOM"; - return lang === "es" ? "MEXINOM" : "ENGNOM"; + if (mode !== "word") return "NUMBNOM"; + return lang === "es" ? "MEXINOM" : lang === "da" ? "DANNOM" : "ENGNOM"; } function editionText() { if (mode !== "word") return "number edition"; - return lang === "es" ? "edicion mexicana" : "english edition"; + return lang === "es" ? "edicion mexicana" : lang === "da" ? "dansk udgave" : "english edition"; } function paintTitle({ ink, screen, write }) { @@ -1505,10 +1561,10 @@ function overlay({ ink, screen, write }, title, sub) { // πŸ“° Meta function meta() { - const title = mode !== "word" ? "Mathnom" : lang === "es" ? "Mexinom" : "Engnom"; + const title = mode !== "word" ? "Numbnom" : lang === "es" ? "Mexinom" : lang === "da" ? "Dannom" : "Engnom"; return { title, - desc: "Eat the squares that match the rule β€” mathnom (numbers), engnom (words), mexinom (espaΓ±ol).", + desc: "Eat the squares that match the rule β€” numbnom (numbers), engnom (words), mexinom (espaΓ±ol), dannom (dansk).", }; }