Skip to content

Project

Solar Hungarian Generator

szolaris-magyar.snowmaker.io

Hungarian is agglutinative: a word is a stem with suffixes stacked onto it, each one carrying a grammatical relation. Solar Hungarian makes that structure visible: the stem sits at the centre and its affixes arrange around it, so a word is drawn as a small solar system.

A Hungarian sentence drawn in Solar Hungarian: linked rings of stems with affixes orbiting them
Az alázatos könnyű léptekkel jár a bölcsesség útjánthe humble walk the path of wisdom with light steps.

It is Vilmos Horváth's. He published it in early 2023 after four months of work, and 444 picked it up within days of it reaching Reddit.

I saw it on that Reddit post and that was that. Before I had got as far as wondering whether I was allowed to use it, I was already sketching gameplay systems around it: in-world signage, set dressing, a whole visual grammar for a Furthest Frontiers spinoff where M. explores the abandoned sacred site of an extinct race.

So in August 2024 I wrote to him: could I use it, and — being something of a programmer myself — would a public generator be of any help. That got me an invitation to the Discord, and I started that week.

What I needed from it was specific: Hungarian text turned into SVG clean enough to import into Unreal as assets. What the system needed was to be writable rather than only drawable. Turned out I first had to relearn the Hungarian language.

Implementing the generators was fun. Because a word builds outward as a system of rings, every one of the source SVGs had to be definable by maths that scales. Every affix in the language needs a geometric form, and they attach and rearrange in funny ways. It grew into 267 SVG modules: noun, verb, participle and adjective derivational suffixes, verb and nominal inflections, modifier markers, question words, copula negation, and the letterforms themselves.

js
const arcLengthCache = new Map();

export function adjustAngleForConstantArcLength(baselineR, baselineDeg, newR) {
  const key = `${baselineR}_${baselineDeg}_${newR}`;
  if (arcLengthCache.has(key)) return arcLengthCache.get(key);

  const baselineRad = (baselineDeg * Math.PI) / 180;
  const arcLength   = baselineR * baselineRad;
  const newRad      = arcLength / newR;
  const newDeg      = (newRad * 180) / Math.PI;

  arcLengthCache.set(key, newDeg);
  if (arcLengthCache.size > MAX_CACHE_SIZE) {
    arcLengthCache.delete(arcLengthCache.keys().next().value);
  }
  return newDeg;
}

adjustAngleForConstantArcLength – an affix has to occupy the same arc whichever ring it lands on, so its angle shrinks as the radius grows. Memoised, because it is called for every form on every redraw.

It is a layout problem as much as a linguistic one. Affix forms attach at angles around the stem and must not collide or fold back through each other, so the arrangement is solved with d3-force rather than positioned by hand. Everything stays adjustable down to a single glyph: the angle enclosed by the arcs of an A is a setting.

A year passed quickly, fighting 2D geometry and the language itself. In its current form it is already capable of drawing complex sentences, but the UX feels more like a spaceship cockpit than a tool for a general audience.

The generator mid-build: construction circles, angle and line-weight sliders, grammar checkboxes, and the form drawn in debug colours
Mid-build, posted to the Discord. Construction circles still showing, a slider for element angle, checkboxes for the grammar, and every part in its own colour so you can tell which one moved.
Next.jsd3-forceSVG