golangci-lint is no longer invoked on the host anywhere in the repo.
Dockerfile.lint pins golangci/golangci-lint:v2.12.2 by digest and runs
the linter as a build step, so a successful build IS a clean lint, and
`make lint` becomes a thin shim over script/lint. This removes the host
linter install that produced a false green here, where a branch that was
genuinely red with a goconst finding reported "0 issues" off the shared
host cache; a container per run has its own cache and lock.
Two deliberate divergences from the sneak/homoicon reference shape:
- Two stages rather than one. A cached `deps` stage holds
`go mod download`, then `FROM deps AS lint` carries the source copy
and the lint run, and script/lint builds with
`--no-cache-filter=lint`. Caching of the lint result is explicitly
waived (a cached build lints nothing), and splitting the stages means
busting the lint layer does not re-fetch the module cache over the
network on every run.
- No `golangci-lint config verify` step. It resolves its JSON schema
over a live, unpinned HTTPS call: an unpinned network input inside
the one step whose purpose is a pinned, reproducible gate, and a
schema-host outage would surface as a red build. `golangci-lint run`
already fails on a malformed config. The reason is recorded in a
comment in Dockerfile.lint.
.dockerignore excludes .git only; the lint reads the Go sources,
go.mod/go.sum and .golangci.yml, none of which come from there.
The TODO.md scaffold-exemption note is narrowed rather than dropped:
Dockerfile.lint and script/lint are now permitted and required, while CI
config, REPO_POLICIES.md, an application Dockerfile and any other
script/ entrypoint still are not.
Verified, since a green docker build is the classic false green: two
consecutive script/lint runs on an unchanged tree each showed the
`golangci-lint run` layer executing (9.8s and 7.9s, both "0 issues.")
while the deps layers reported CACHED; a deliberate indent-error-flow
violation failed the build naming that finding and the unused one, and a
revert went clean again. `make check` green.
93 lines
3.0 KiB
Markdown
93 lines
3.0 KiB
Markdown
# Rogue: Exploring the Dungeons of Doom (Go port)
|
||
|
||
[](LICENSE.TXT)
|
||
|
||
**Rogue** is the original dungeon-crawling adventure game that spawned an entire
|
||
genre. This branch is a faithful Go port of Rogue 5.4.4: explore procedurally
|
||
generated dungeons, fight monsters, collect treasure, and attempt to retrieve
|
||
the Amulet of Yendor.
|
||
|
||
**Original authors:** Michael Toy, Ken Arnold, and Glenn Wichman (1980–1983,
|
||
1985, 1999).
|
||
|
||
The port is function-by-function faithful to the classic C sources — same
|
||
dungeon generation (seed-compatible RNG), same combat math, same item tables,
|
||
same messages. The C reference implementation lives on the `master` and
|
||
`modern-rogue` branches; [ARCHITECTURE.md](ARCHITECTURE.md) documents both the
|
||
original program structure and the design of this port.
|
||
|
||
## Building and running
|
||
|
||
Requires Go 1.25 or later and a terminal at least 80x24.
|
||
|
||
```bash
|
||
go build ./cmd/rogue
|
||
./rogue
|
||
```
|
||
|
||
```bash
|
||
# Restore a saved game
|
||
./rogue ~/rogue.save
|
||
|
||
# View high scores
|
||
./rogue -s
|
||
|
||
# Test the death screen (demo mode)
|
||
./rogue -d
|
||
```
|
||
|
||
## In-game commands
|
||
|
||
Press `?` in game for the full list.
|
||
|
||
- **arrows** or **h/j/k/l/y/u/b/n** — move (shift to run, ctrl to run until
|
||
adjacent)
|
||
- **`.`** rest, **`s`** search for hidden doors and traps
|
||
- **`i`** inventory, **`,`** pick up, **`d`** drop
|
||
- **`q`** quaff potion, **`r`** read scroll, **`e`** eat food
|
||
- **`w`** wield weapon, **`W`** wear armor, **`P`**/**`R`** put on / remove ring
|
||
- **`t`** throw, **`z`** zap a wand, **`f`**/**`F`** fight
|
||
- **`>`**/**`<`** take the stairs
|
||
- **`S`** save, **`Q`** quit
|
||
|
||
## Environment
|
||
|
||
```bash
|
||
# Game options, as in the original
|
||
export ROGUEOPTS="name=YourName,terse,jump,fruit=mango"
|
||
|
||
# Wizard (debug) mode, with a reproducible dungeon
|
||
ROGUE_WIZARD=1 SEED=12345 ./rogue
|
||
```
|
||
|
||
The scoreboard is kept in `~/.rogue.scores`. Save files are Go gob snapshots
|
||
and, as in the original, are deleted when restored.
|
||
|
||
## Code layout
|
||
|
||
```
|
||
game/ the game engine: one Go file per original C file,
|
||
function-by-function (see ARCHITECTURE.md for the mapping)
|
||
term/ tcell-backed terminal, replacing curses
|
||
cmd/rogue/ the executable
|
||
```
|
||
|
||
The engine package is fully headless-testable: `make test` runs scripted command
|
||
sequences, dungeon-generation golden checks, and an RNG compatibility test
|
||
against the original C generator.
|
||
|
||
For development, the `Makefile` wraps the toolchain: `make fmt` (gofmt +
|
||
prettier), `make lint` (`script/lint`, which runs golangci-lint inside the
|
||
pinned container built from `Dockerfile.lint` — it is never installed on the
|
||
host, so docker is required), `make test` (the suite, under the race detector
|
||
with coverage and a timeout), and `make check` (all three). Use the targets
|
||
rather than invoking `go test` directly — they carry the flags the project
|
||
relies on.
|
||
|
||
## License
|
||
|
||
BSD-style; see [LICENSE.TXT](LICENSE.TXT).
|
||
|
||
Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman.
|
||
All rights reserved.
|