Skip to content

Contributing Workflow

Kit Oliynyk edited this page Nov 3, 2026 · 6 revisions

TL;DR: Fork, branch, change, open a pull request, keep your fork in sync with upstream. Everything that goes into git is in English. How a change reaches a running game depends on what you touched: a plugin needs a rebuild and a reload, the core needs a restart, zone files load at boot, public Fenia hot-reloads. Use when: you are about to send your first pull request, or you changed something and need to see it in a local game. Source of truth: dreamland_code/plug-ins/admin/cplugin.cpp (plugin reload), dreamland_code/plug-ins/feniaroot/ccodesource.cpp (cs load), dreamland_code/README.md, dreamland_world/scripts/ Verified: 2026-11-02 against dreamland_code a7c4fd10, dreamland_world a35c62ce, dreamland_fenia_public c28874b

Build commands live in the repository README, next to configure.ac. This page covers what happens after you can build. Environments and ports are on Local-Setup.

Pull request cycle

  1. Fork the repository on GitHub and clone your fork.
  2. Add the main repository as a second remote right after cloning:
git remote add upstream https://github.com/dreamland-mud/dreamland_code.git
  1. Create a branch per change. Keep one topic per branch.
  2. Commit, push the branch to your fork, open a pull request against master.
  3. To catch up with the main repository:
git fetch upstream
git merge upstream/master

The same cycle applies to dreamland_world, dreamland_fenia_public, mudjs and dreamland_web. Substitute the repository name.

English in git

These are always English:

  • Commit messages.
  • Pull request titles and descriptions.
  • Issue and pull request comments.
  • Code comments in C++, Fenia, JSON and XML.
  • Any source string that no player reads.

Text a player reads is content, not code. It stays trilingual (English, Ukrainian, Russian) and follows Writing-Player-Text.

What to check before you push

Changed Check
C++ Build the plugin or core you touched. A header change breaks callers in other plugins, so grep for the symbol first and rebuild everything.
Fenia act, echo or fmt strings Every placeholder is numbered (%1$s), see Output-Format.
Help articles No duplicate help ids, see Help-Articles.
Any Cyrillic text One alphabet per word, ASCII punctuation, see Writing-Player-Text.

The dreamland_world/scripts/ folder holds checkers. Each script documents its arguments in its header.

Script Catches
lint-help-boot.py Duplicate help ids, and skills with a spell, affect or command but no help. Both crash the boot.
lint-catalog-coverage.py A wrapped _() string in a source file with no English or Ukrainian catalog entry. Players would see Russian.
lint-catalog-placeholders.py A translated catalog value whose placeholders differ from the Russian key.
lint-hc-command-lang.py {hc links whose command word is not a command.
find-foreign-fragments.py Latin words inside Cyrillic text and Latin letters hidden in Cyrillic words.
lint-affect-labels.py The web client affect panel fields on skills.
lint-religion-access.py Religion access rules that disagree with the help articles.

Continuous integration

A push to master of dreamland_code triggers the project's build pipeline (.drone.yml, admin/drone-build.sh), and the result is posted to the developers' Discord channel. Legacy: .travis.yml and the Travis badge in the README no longer reflect the build.

A maintainer reviews and merges your pull request.

How a change reaches a running game

You changed Do this Needs restart
A plugin (plug-ins/<name>/*.cpp) make -j 4 && make install in the plugin's build directory, then plugin reload <name> in game no
Several plugins Rebuild them, then plugin reload changed no
The core (src/*.cpp) make -j 4 && make install in the src build directory yes
A header Rebuild from the top of the build directory yes
Config and help files in dreamland_world plugin reload most for files a plugin reads at load. Which reload covers which file is listed on Data-Configs sometimes
Zone files Read once at boot yes
Public Fenia cs load public/<path> as a coder character, for example cs load public/utils/translit (some public helpers call private namespaces and do not run on a local server). The name is resolved under feniaScriptDir from etc/dreamland.xml, which the stock template sets to share/DL/fenia. A config made from an older template says share/DL/fenia.local, and there the command fails with Error loading codesource, see Local-Setup no
Fenia you type in game cs web or cs paste, then cs post no

plugin reload takes all, most, changed or one plugin name:

  • all reloads every plugin, including the critical descriptor plugin that holds connections, so everybody is dropped.
  • most reloads everything except the descriptor plugin.
  • changed reloads plugins whose library file is newer than their load time, and also skips descriptor. A change to XML or JSON alone does not mark a plugin as changed.
  • A plugin name reloads that one plugin. Naming descriptor drops connections on purpose.

Avoid all on a server with people on it.

cs load all <directory> loads every script under a directory. A failed file prints an error and the details go to the game log, so read the log after a load.

Which repository gets the pull request

Your change Repository
Engine, plugins, Fenia interpreter dreamland_code
Skills, races, classes, config, help articles, tunables dreamland_world
A reusable Fenia helper dreamland_fenia_public
Web client mudjs
Website, help site, searcher dreamland_web
Mudlet package dreamland_mudlet

Zone files and most game scripts are in private repositories. If your change needs them, describe it in an issue or on Discord and a maintainer will help land it.

See also

Clone this wiki locally