2026-10-18 13:48:56 +01:00
|
|
|
|
# Guildhall
|
|
|
|
|
|
|
|
|
|
|
|
A co-op idle game for a handful of friends. Everyone is an adventurer in the
|
|
|
|
|
|
same young frontier city: train skills Melvor-style (your character keeps
|
|
|
|
|
|
working for up to a day while you're away), supply the city council, and get
|
|
|
|
|
|
the city ready for bandit raids that arrive at times the game picks.
|
|
|
|
|
|
|
|
|
|
|
|
Alpha. One season, bandit raids plus two friendly events, six buildings.
|
|
|
|
|
|
|
|
|
|
|
|
## What's in it
|
|
|
|
|
|
|
2026-10-18 19:27:56 +01:00
|
|
|
|
- **Skills:** mining, woodcutting, farming, hunting, fishing, smithing,
|
|
|
|
|
|
masonry, cooking, leatherworking, combat, plus the scout's reconnaissance.
|
|
|
|
|
|
- **Combat:** fights cost HP (less when out-levelled or armoured); below half
|
|
|
|
|
|
health you eat food from your bank, and out of food you retreat, losing
|
|
|
|
|
|
nothing but the fight. HP recovers 25% an hour.
|
2026-10-18 22:13:50 +01:00
|
|
|
|
- **Tiers:** six RuneScape-style tiers (copper, iron, steel, mithril,
|
2026-10-19 10:19:38 +01:00
|
|
|
|
adamant, rune at levels 1–75) of ore, trees (up to enchanted) and hides (deer,
|
2026-10-18 22:13:50 +01:00
|
|
|
|
boar and bear from hunting; green, blue and red dragonhide from fighting
|
|
|
|
|
|
dragons). Every metal tier has a sword, shield, helmet, greaves, cuirass and
|
|
|
|
|
|
five tools; every leather tier a cap, trousers and jerkin. Higher bars need
|
|
|
|
|
|
coal; each metal past copper needs a Smithy level (rune needs level 5, so a
|
|
|
|
|
|
city). Gear needs a combat level to wear, tools a skill level to use.
|
2026-10-18 13:48:56 +01:00
|
|
|
|
- **Classes:** warrior, scout, artisan, pioneer. Every class can train every
|
|
|
|
|
|
skill; a class makes some skills 20% faster and has one signature ability.
|
2026-10-19 10:52:07 +01:00
|
|
|
|
- **Bank:** 12 slots of 1,000 each to start; more than a stack of one item
|
|
|
|
|
|
spills into another slot. When something doesn't fit it goes to the city
|
|
|
|
|
|
stockpile (or the action stops, if you prefer).
|
2026-10-18 13:48:56 +01:00
|
|
|
|
Raids never touch your bank. Players can give items to each other.
|
2026-10-18 19:20:52 +01:00
|
|
|
|
- **City:** each building collects its own fund, from players' banks or the
|
|
|
|
|
|
city's stockpile and treasury. Funds are safe from raiders, and a funded
|
2026-10-19 09:24:45 +01:00
|
|
|
|
building joins the construction queue by itself, then rises by labour:
|
|
|
|
|
|
players working the site with Construction (more labour per action every
|
|
|
|
|
|
20 levels, faster with a hammer), plus a slow trickle from the townsfolk.
|
2026-10-19 11:15:19 +01:00
|
|
|
|
Construction also saws planks, which higher building levels need, and
|
|
|
|
|
|
builds fittings from them: one-off upgrades a building takes once it's high
|
|
|
|
|
|
enough (shelving, a well pump, weapon racks, enchanted chests…). Population eats food,
|
2026-10-18 19:20:52 +01:00
|
|
|
|
pays taxes, and grows up to the housing cap; it promotes the settlement
|
|
|
|
|
|
(hamlet, village at 40, town at 90, city at 150), which raises building
|
|
|
|
|
|
level caps and gives everyone bank slots.
|
2026-10-18 23:09:17 +01:00
|
|
|
|
- **Prayer:** enemies drop bones; burying them gives prayer points and
|
|
|
|
|
|
Prayer XP. Up to two prayers (eight unlock from level 1 to 60) boost each
|
|
|
|
|
|
fight while their points last, and praying trains Prayer too. A Temple adds
|
|
|
|
|
|
points per bone and lets players offer bones as devotion, which wards the
|
|
|
|
|
|
city in the next raid.
|
2026-10-18 23:12:57 +01:00
|
|
|
|
- **Herblore:** farmers grow six herbs (guam to snapdragon); herblore brews
|
|
|
|
|
|
them with a secondary into potions of 50 uses. One potion per skill at a
|
|
|
|
|
|
time: faster gathering, a chance to keep materials or double ore, more
|
|
|
|
|
|
prayer from bones, or combat power, armour and healing. An empty potion is
|
|
|
|
|
|
replaced from the bank automatically.
|
2026-10-19 15:09:51 +01:00
|
|
|
|
- **Events:** raids are announced a day or two ahead. Reconnaissance from
|
|
|
|
|
|
scouts, informants and the spymaster's guild narrows down when, how strong,
|
|
|
|
|
|
and finally where their camp is, so fighters can sabotage it. Each intel
|
|
|
|
|
|
level takes more scouting than the last and more for a bigger band, and
|
|
|
|
|
|
levels 2 and 3 only open about a day and eight hours before the raid
|
|
|
|
|
|
arrives. Defeat kills or drives
|
2026-10-18 13:48:56 +01:00
|
|
|
|
off people, loots the stockpile and treasury, and may damage a building.
|
|
|
|
|
|
Damaged buildings stop working until repaired but keep their level.
|
2026-10-19 14:51:05 +01:00
|
|
|
|
Every fight uses up arrows and breaks some of the swords and shields
|
|
|
|
|
|
handed out (worst first), more in a close fight or a defeat.
|
2026-10-19 09:34:18 +01:00
|
|
|
|
Now and then a dragon comes instead of bandits.
|
|
|
|
|
|
- **Happenings:** three more tracks run on their own cooldowns. Minor threats
|
|
|
|
|
|
(wolves, a mine collapse, goblin thieves…) slow or block a skill until
|
|
|
|
|
|
players deal with them; hardships (sickness, locusts, rot, storms, fire,
|
|
|
|
|
|
harsh winters, drought) hit the stores and buildings, softened by a granary,
|
|
|
|
|
|
lumber shed, well and water barrels; fortunes (visiting masters, harvests,
|
|
|
|
|
|
festivals, nobles, mercenaries…) give windows of plenty. Weather changes
|
|
|
|
|
|
every few hours, and a game season lasts a week.
|
2026-10-18 13:48:56 +01:00
|
|
|
|
|
|
|
|
|
|
## Running
|
|
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
|
nix run . -- --dev --speed 60 # http://127.0.0.1:8098, time runs 60x
|
|
|
|
|
|
python3 -m unittest discover -s tests
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Without `--dev` the server trusts the `Remote-User` header from the
|
|
|
|
|
|
authenticating proxy (Authelia). With `--dev` it reads a `gh_user` cookie
|
|
|
|
|
|
instead, so the dev bar can switch between players and fast-forward time.
|
|
|
|
|
|
|
|
|
|
|
|
The world is one JSON document in SQLite. `--backup-to DIR` writes a dated
|
|
|
|
|
|
snapshot and exits; the NixOS module runs it nightly when
|
|
|
|
|
|
`services.guildhall.backup.directory` is set.
|
|
|
|
|
|
|
|
|
|
|
|
## Layout
|
|
|
|
|
|
|
|
|
|
|
|
- `game.py`: content tables and the rules. Pure functions of `(world, now)`.
|
|
|
|
|
|
- `app.py`: stdlib HTTP server, persistence and the background ticker.
|
|
|
|
|
|
- `static/`: the client (vanilla JS, no build step).
|
2026-10-19 10:04:38 +01:00
|
|
|
|
|
|
|
|
|
|
## Credits
|
|
|
|
|
|
|
|
|
|
|
|
Icons are from [game-icons.net](https://game-icons.net) by Lorc, Delapouite
|
|
|
|
|
|
and contributors, used under [CC BY 3.0](https://creativecommons.org/licenses/by/3.0/).
|
|
|
|
|
|
`tools/build_icons.py` fetches the glyphs the game uses into `static/icons.svg`.
|