Skip to content

Writing Player Text

Kit Oliynyk edited this page Nov 2, 2026 · 2 revisions

TL;DR: Anything a player reads is written in all three languages, uses ASCII punctuation, keeps one alphabet per word, talks to the player as "you" (ты, ти), marks gender with {S tags, and stays inside the 18+ rating. English object names carry no articles. Use when: you write or edit room, mob and object text, help articles, social messages, quest lines, act/echo strings or catalog entries. Source of truth: dreamland_code/src/util/iconvmap.cpp, dreamland_code/src/xml/xmlparser.l++, dreamland_code/plug-ins/output/mudtags.cpp (sex_tag_parse), dreamland_code/src/l10n/flexer.cpp, dreamland_world/scripts/find-foreign-fragments.py Verified: 2026-11-02 against dreamland_code 88da8302, dreamland_world 43880467, dreamland_fenia_public c28874b

Markup tags are listed on Text-Markup. Translation workflow is on L10n-Translating-Content. Help article layout is on Help-Articles. This page is the short list of rules that apply to every piece of player text.

Languages

The game ships in English, Russian and Ukrainian. Russian is the source language and the fallback, because the engine falls back to Russian when a translation is missing. New text gets all three at once. English is complete for all existing player content, so a gap in English is a bug.

Each language block is written in that language only. A Ukrainian block holds no Russian sentences, and the reverse. Latin technical terms, command names and identifiers are the only foreign words allowed. Where a gloss helps, put full words side by side: дварфи (dwarves).

One alphabet per word

Never mix Latin and Cyrillic letters in one word. A Latin a, c, o, p, x or y inside a Cyrillic word looks right and breaks keyword search and KOI8 rendering. Check every word you type, and run the checker over your files:

python3 scripts/find-foreign-fragments.py

It runs from the dreamland_world checkout and reports Latin runs inside Cyrillic prose and single Latin letters hiding in Cyrillic words. Color codes, help anchors, command links and printf specs are stripped before the check.

The {Td, {Tn and {Tx day and night tags sit next to Cyrillic letters and can look like mixed words to a naive checker. They are valid.

ASCII punctuation only

Area XML is converted to KOI8-U on load, and a character that has no KOI8-U equivalent makes the conversion fail. Write plain ASCII punctuation:

Instead of Write
… ...
— and – --
space, hyphen, space (-) space, two hyphens, space (--)
curly quotes and «» straight "

A hyphen inside a compound word, with no spaces, stays as it is: north-east.

In element text, write raw characters. Do not use &quot;, &apos; or &gt;. Only &lt; and &amp; stay escaped, otherwise the XML parser breaks. The parser does decode them, but the server writes text back escaping only & and <, so any other entity is rewritten as the raw character on the next save and shows up as noise in every diff.

Ukrainian and Russian spelling

  • Ukrainian apostrophe is ʼ (U+02BC) inside a word: мʼязи, обʼєкт. The engine converts it to an ASCII apostrophe before output, so players see a normal apostrophe. Keep ʼ in the source, because it is the only thing that tells an in-word apostrophe from a quotation mark.
  • Fenia script files go through the same conversion when they load (plug-ins/feniaroot/codesourcerepo.cpp). A single-quoted Fenia string cannot hold that apostrophe, because after conversion it closes the string and the file fails to parse. Use double quotes for any Ukrainian text in Fenia code.
  • Russian text uses е, not ё.
  • Ukrainian has no э. A stray э in Ukrainian text is an error.
  • Canonical names for zones, gods, classes and races come from the game data. Look them up on World-Canon. Never transliterate a name on the spot.

Address the player as "you"

Talk to the player in the singular informal form: ты in Russian, ти in Ukrainian, you in English. Not вы or ви.

Instead of Write
Вы видите Ты видишь
Перед вами Перед тобой
Вас атакует Тебя атакует
Ви бачите Ти бачиш
Перед вами (Ukrainian) Перед тобою

An NPC addressing a group in dialogue may use the plural. Judge those case by case.

Gender

The player can be male or female, and Russian and Ukrainian past tense shows it. A male-only past form is a bug for female characters. Two fixes.

Rewrite in the present tense, which has no gender: Ты вошел becomes Ты входишь. In Ukrainian this works only with an imperfective verb. A perfective verb has no present tense, so take its imperfective pair or use a marker.

Or mark the ending with {Sf, {Sm and {Sx:

Ты попал{Sfа{Sx
Ты вош{Sfла{Smел{Sx
Ти бу{Sfла{Smв{Sx
  • {Sf starts text shown to female readers only.
  • {Sm starts text shown to male readers only.
  • {Sn starts text shown to neutral readers only.
  • {Sx ends the gated text.

The tag picks the sex of the reader, whoever caused the message, and works in any text sent to a player. It needs no function argument.

When the female form is the male form plus а, the short form is enough: попал{Sfа{Sx. When the stems differ, give both tails. Do not paste а blindly: the female form of вошел is вошла, not вошела. Say the female past tense aloud before you write it.

English text avoids gendered past tense, so it needs no markers.

Rating and tone

DreamLand is rated 18+. Sexual content exists in the game and is written directly, without euphemism. Swearing is allowed up to a medium level (shit, asshole, bitch, сука, говно, курва). The hardest profanity stays out: the Russian and Ukrainian words built on the three standard obscene roots, and the English cunt and fuck. Real-world slurs against ethnic or identity groups stay out too. Fantasy-race vulgarity follows the same ceiling.

The tone of the world is funny, dark and postmodern. Keep the author's voice when you fix text. Do not sterilize jokes, and do not add jokes to mechanics text.

Accessibility is separate from rating. See Accessibility.

English object names

An English object short description has no leading a, an or the. Write random pure metal ingot, not a random pure metal ingot. The name is dropped into sentences that add their own article or none, and a baked-in article doubles up. The rule covers area files, translation catalog entries for object names, and generated or crafted names.

English names carry no Flexer pad either. A pad is the Russian and Ukrainian declension string (королев|а|и|і|у|ою|і: stem, then six case endings). English words do not decline, so an English field holds plain text with no |.

Editing existing text

  • Fill empty English and Ukrainian fields. Never overwrite a non-empty one.
  • Never move a node between sections. Objects stay in the objects section, rooms in rooms, mobs in mobiles, helps in helps. A node that looks misplaced is a bug to report.
  • Vnums are not unique across sections. The same number can be a room, a mob and an object. Scope every search and edit to the section.
  • A one-line placeholder such as "Object is here." is not content. Rewrite it in the zone's voice.
  • A node for a deleted object is removed whole. Do not leave an empty shell.
  • Keyword fields are split per language for objects, mobs and exits. An extra description keeps one combined keyword blob with no language attribute, because the engine reads a single string there.
  • If a phrase looks like an author's joke or a mistake (???, shouting in capitals, a broken sentence), do not rewrite it and do not keep it silently. Ask a maintainer.

Help articles

  • No hard line breaks inside a paragraph. The client wraps text and the server never inserts a newline.
  • Write argument placeholders as _name_. Text in angle brackets disappears when the article renders, and raw < breaks the XML.
  • Use %FMT% and %SA% markers instead of the literal words "Format:", "Syntax:" and "See also".
  • Link anchor text must match how the target article names the thing in that language.

More on Help-Articles.

See also

Clone this wiki locally