baby steps towards deltarune in toki pona
  • Game Maker Language 85.3%
  • Python 13.6%
  • Shell 1.1%
Find a file
2026-07-24 15:40:35 +03:00
etc initial commit 2026-07-24 15:32:46 +03:00
lang initial commit 2026-07-24 15:32:46 +03:00
src initial commit 2026-07-24 15:32:46 +03:00
tools initial commit 2026-07-24 15:32:46 +03:00
.gitignore initial commit 2026-07-24 15:32:46 +03:00
build.sh initial commit 2026-07-24 15:32:46 +03:00
LICENSE initial commit 2026-07-24 15:32:46 +03:00
README.md NOT initial commit 2026-07-24 15:40:35 +03:00
run.sh initial commit 2026-07-24 15:32:46 +03:00

deltarune in toki pona (sort of)

this project contains some amount of work i did for adding a Toki Pona localization to Deltarune. in particular, it allows for Latin as well as Sitelen Pona modes in-game from a single source language file.

this fucking sucks

what do i do with this

umm idk really but you can try this

VANILLA_DIR='path to vanilla deltarune' ./build.sh

then use UTMT to build the wad into build/chapter1_windows/data.win, or you can pass BUILD_UTMT_PROJECT=1 UTMT_CLI_PATH='...' to have the script do it

the language stuff

the root language file is in lang/lang_tok.json, but the game cannot use it by itself. tools/build_lang.py processes it and generates two files, lang_tok_latin.json and lang_tok_sp.json, which is what is actually fed to the game.

the most important thing it does is translate Latin text to Private Use Area codepoints in Plane 0 (starting from \ue000), shown as SP characters in the game. (i would just use the UCSUR codepoints for this but for some reason GameMaker font assets cannot encode characters past Plane 0. the order they're in should correspond to UCSUR though)

also, since the Latin and SP outputs need to be vastly different in structure (e.g. SP often doesn't need the amount of newlines that Latin does), i introduced some new preprocessing syntax alongside Deltarune's own escape codes. these never end up in the two files mentioned earlier that are read by the game. (some experience with the vanilla dialogue codes is assumed here!)

  • ={...} or = followed by one character: outputs only for Latin
  • @{...} or @ followed by one character: outputs only for SP
  • `{...} or ` followed by one character: outputs verbatim, i.e. don't process contents at all
  • ; followed by one character X: outputs a middle dot in SP, or X in Latin
  • > followed by one character X: inserts ^X before the previous character (...because in practice, ^ codes apply the delay one character after they occur anyway, and this makes = and @ conditionals less redundant)
  • <... (until a word boundary): reads from an internal table of proper nouns and outputs the appropriate form for the script (e.g. <Kris is Kuwi for Latin and smth like [kulupu. wile.] for SP) (also you can do <kris or <KRIS and it will transform it to the right case in Latin)

for a more nuanced explanation either consult the script itself or just ask me lol

the font stuff

there is no separate font for SP, i just extended fnt_main. tools/build_font.py adds character entries to the font asset according to a map

the horrors (GML)

since the game pretty much assumes global.lang is either "en" or "ja", i decided not to touch it so as to not refactor everything. instead, there are two global booleans global.tok and global.tok_sp, which are true if toki pona is on and sitelen pona is on respectively. lang stays as "en".

obj_writer is somewhat modified to make wrapping work.