tuig

Timeline
Login

Timeline

8 check-ins

2026-10-13
12:01
Fix combat accuracy bonus, critical confirm, and defense order

- AccuracyBonus now returns the proficiency and base bonus it computes, and guards a nil weapon - DmgRoll applies the category critical multiplier only on a confirmed crit, confirming on a high d100 - Attack resolves dodge -> parry -> shield_block in a fixed order, practising every success - Add dice.D100; ShieldBlock scales off shield AC and proficiency; raise aegis shield AC - Update combat tests Leaf check-in: bd015d8738 user: vpsadmin tags: trunk

2026-10-12
17:48
Add warrior skills, item effects, affects, and innate abilities

- New affects constants and item/native effect handling in engine - Expand combat, magic missile, mobs, and race data - Add item data (fists, claws, fangs, stinger, aegis shield) - Remove obsolete cmd/ids tool - Update schemas and world data check-in: 05c7c383fb user: vpsadmin tags: trunk

2026-10-07
20:42
comabt stuff check-in: d2b9b9ab8e user: vpsadmin tags: trunk
2026-10-05
12:36
Replace proto ids with slugs; add summons, statuses, followers, overcast

The identifier scheme is inverted. Every entity used to be keyed by a generated "proto" string, which meant an id was only readable by the code that minted it: a mob's id had to be resolved through whatever table happened to own it before it could be compared, stored, or sent over the wire. internal/ids/ids.go now defines `type Proto string` as the single vocabulary, and ids are derived slugs that carry their own meaning. Anything that used to need a lookup to identify a thing can now just look at the thing. That is what the rest of this change hangs off, because slugs can be embedded in save files, compared as strings, and sent to a client that has never seen the server's tables.

Summons. A combatant can now put something else on the board. This is the feature that needed stable ids most: a summoned creature has to persist across a save/load and be addressable by a later turn, and the old proto scheme could not promise either.

Statuses. A combatant carries a set of status effects rather than a single derived value, so "poisoned" and "blessed" are data instead of branching in every damage path. Cure Light, Cure Heavy and Cure Wounds interact with it.

Followers. A mob can carry a group with it, so an Archon that arrives with attendants is one entity rather than several that must be kept in step by hand.

Overcast. Spell resolution needed to know whether the sky was already answering, which is a world fact rather than a per-caster one.

Engine: internal/engine/special.go, status.go and their tests are new; verbs.go, combat.go, act.go and skill.go move over to slugs.

Data: 6 mobs, 8 spells, laibread.

Deleted: internal/char/skills.go, its data/skills/kick.json, and schema/skill.schema.json. Skills are gone, not relocated; schema/ spell.schema.json absorbs the coverage. Keeping the old schema around would have left two sources of truth for what a spell is.

mage.json carries "Intelligence": 9999. That is deliberate, not a leftover debug value.

Deploy: adds scripts/deploy-vps.sh and the Dockerfile it builds. Two fixes to the script as written:

- Default TUIG_SSH_HOST was ssdvps-fossil, which does not resolve here; it now defaults to the configured vps host. - Every ssh call gains BatchMode and ConnectTimeout. A mistyped host used to look like a frozen deploy -- the name fails DNS and ssh sits in the resolver with nothing on screen to explain the stall. It now fails in seconds with the actual error.

Ignore rules: adds .idea/* and dist/*. The first keeps the GoLand workspace (which holds absolute paths) out of the repo. The second keeps a 17MB linux/amd64 binary out of it -- deploy-vps.sh rebuilds dist/tuigd on every run, so it was never meant to be tracked.

Verified: go build, go vet, gofmt, go test ./... all clean (10 packages). check-in: d01145637b user: vpsadmin tags: trunk

2026-09-18
13:48
Restructure packages (constants, dice, content, schema) and expand engine (combat, spells, skills, weather, postures, nourishment); hoist verb message strings into named msgXxx constants shared with tests check-in: e1fe604a59 user: michael.jaquier tags: trunk
2026-09-10
09:42
step check-in: 998a69bc39 user: michael.jaquier tags: trunk
2026-09-09
14:17
Initial import of the tuig MUD server

A Go MUD server built around a single-writer engine loop, so game state needs no locks. World, character, mob, spell and item definitions are authored as JSON and validated at boot, on the rule that bad data should refuse to start rather than surface at 2am.

Packages: ids distinct types for prototype, instance and room ids world rooms, exits, areas and reset lists, read-only after boot char races, classes, mobs, spells, dice and stat rolling item item prototypes with world-wide scarcity caps engine the pulse loop, verbs, area resets and item placement persist SQLite-backed accounts and character bodies transport telnet and websocket sessions web the browser terminal

Area resets follow a desired-state model: each pass tops mobs and floor items up to the counts the area file declares, so the pass is idempotent and self-healing. Reset.When is declared but not yet honoured by the engine, which docs/SPAWNING.md records along with why it matters once items are takeable. check-in: 05895bf807 user: michael.jaquier tags: trunk

14:13
initial empty check-in check-in: 5bb7b8640d user: michael.jaquier tags: trunk