aboutsummaryrefslogtreecommitdiff
path: root/worldbuilding_guide/hacking.md
blob: 6f9bf9aaadf00690e337a2718868d8af4e1dd42c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
## Hacking

Hacking minigames are played by jacking into terminal objects. Terminals are YAML objects that are registered in Go's `terminalDefs` map.

### Terminal Object YAML

```yaml
id: terminal_basic
name: basic terminal
color: "40"
description: "A battered terminal with a cracked screen. {40}[Level 1 Hacking]{/}"
inroom_description: "A {40}basic terminal{/} hums quietly against the wall."
```

- `id` must match a key in `terminalDefs` (Go code in `internal/game/hacking.go`)
- `name` is used for matching in the `jack` command
- `color` controls the display color
- `description` is shown when examining the terminal
- `inroom_description` is shown in room listings
- No `behavior` field — terminals are registered in Go, not YAML behaviors

### Adding a New Terminal

1. Create an object YAML file in `data/objects/terminal_<name>.yaml`
2. Add an entry to `terminalDefs` in `internal/game/hacking.go`
3. Optionally create a new minigame implementation in `internal/game/hacking_<name>.go`
4. Place the terminal object in a room's `objects:` list

### Adding a New Minigame

New minigames implement the `HackingMinigame` interface:

```go
type HackingMinigame interface {
    Init(level int) string
    HandleInput(input string) (output string, done bool, won bool)
    Name() string
}
```

Optionally implement `XPBonuser` for bonus XP:

```go
type XPBonuser interface {
    BonusXP() int
}
```

### Agility Courses

Agility courses are defined in `data/courses/<id>.yaml`. Each course defines a sequence of obstacle rooms with specific verbs.

```yaml
id: "vent_shaft"
name: "Ventilation Shaft Course"
required_level: 1
start_room: 200
completion_xp: 40
obstacles:
  - room_id: 201
    verb: scramble
    ticks_per_phase: 2
    xp: 8
    fail_damage: [1, 2]
    messages:
      - "You approach the corroded ventilation wall..."
      - "You find footholds in the rusted panels and begin to climb..."
      - "You scramble up the wall and haul yourself onto the ledge!"
```

Each obstacle room should have an `on_enter` message telling the player which verb to use, and a `down` exit back to the course hub.