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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
# Construction Skill
The Construction skill allows players to process logs into planks and assemble planks into furniture at a workbench. Higher-tier logs produce more valuable planks and furniture.
> **Filenames are IDs.** The item/object YAML shown below have no `id:` field — each file's name is its ID (e.g. `construct_oak_planks.yaml` → `construct_oak_planks`). See `items.md` / `objects.md`.
## Skill
- Skill name: `construction`
- Abbreviation: `con`
- Level range: 1-99
- XP table: classic standard
## Commands
| Command | Description |
|---------|-------------|
| `construct` / `make` | Open construction menu at a workbench |
| `construct <item>` | Build a specific item |
| `construct <qty> <item>` | Build multiple of an item |
## Objects
### workbench
The primary construction station. Placed in rooms to enable construction.
```yaml
name: workbench
color: "172"
description: "A sturdy wooden workbench..."
inroom_description: "A workbench stands against the wall..."
```
### estate_directory
A terminal that shows registered homeowners and lets them enter their house. Handled entirely in Go code (`internal/game/cmd_estate_directory.go`), not via YAML behaviors.
```yaml
name: Estate Directory
color: "39"
description: "A holographic terminal displaying property records..."
inroom_description: "An estate directory terminal..."
```
When a player looks at the directory, it scans `data/players/characters/*.yaml` for the `owns_house_local_neighborhood` player flag and lists all homeowners. When a player uses or talks to the directory and owns a house, they can teleport to their house entrance room.
## Tools
### saw
Required tool for cutting logs into planks at the workbench.
```yaml
name: saw
tool_type: saw
value: 30
```
## Items
### Planks (4 tiers)
| Item ID | Name | Level | Value | Made From |
|---------|------|-------|-------|-----------|
| `planks` | planks | 1 | 20 | logs |
| `oak_planks` | oak planks | 15 | 40 | oak_logs |
| `teak_planks` | teak planks | 35 | 80 | teak_logs |
| `mahogany_planks` | mahogany planks | 50 | 120 | mahogany_logs |
### Furniture (sellables)
| Item ID | Level | Planks Required |
|---------|-------|-----------------|
| `wooden_shelf` | 4 | 2 planks |
| `wooden_table` | 6 | 3 planks |
| `wooden_chair` | 8 | 2 planks |
| `oak_shelf` | 18 | 2 oak planks |
| `oak_table` | 20 | 3 oak planks |
| `teak_table` | 38 | 3 teak planks |
| `mahogany_table` | 52 | 3 mahogany planks |
## Recipes
All recipes use `type: construction` and `station: [workbench]`. Log-to-plank recipes additionally require `tool: saw`.
Example plank recipe:
```yaml
type: construction
level: 15
xp: 10
wait: 20
station: [workbench]
tool: saw
consume:
- items: [oak_logs]
quantity: 1
output: oak_planks
message: "You saw the oak logs into sturdy oak planks."
```
Example furniture recipe:
```yaml
type: construction
level: 6
xp: 25
wait: 6
station: [workbench]
consume:
- items: [planks]
quantity: 3
output: wooden_table
message: "You build a sturdy wooden table."
```
## NPCs
### estate_broker
Located in room 16 (Construction Site). Talk behavior sells a house plot for 10 credits via `cost` + `set_player_flags`. Sets `owns_house_local_neighborhood: "local_neighborhood"` on purchase.
```yaml
name: estate broker
talk:
nodes:
start:
message: "\"Interested in a house?\""
options:
- text: "\"How much?\""
goto: offer
- text: "\"No thanks.\""
offer:
message: "\"10 credits for a plot.\""
action:
cost: 10
set_player_flags:
owns_house_local_neighborhood: "local_neighborhood"
options:
- text: "\"Deal!\""
unique: true
```
### sawmill_operator
Located in room 171 (Lumberyard). Talk behavior processes all logs in inventory into planks for a credit fee. Uses the `sawmill: true` node action which triggers `processSawmill()` in `internal/game/action_talk.go`.
Fees: regular (5cr), oak (10cr), teak (20cr), mahogany (40cr).
## Science Mod: Plank Make
Level 86 Science utility mod that converts logs to planks at 70% of sawmill cost. Uses naturejunk, solarjunk, and scrap.
```go
{ID: "plank_make", Name: "Plank Make", Level: 86, BaseXP: 90.0,
JunkCost: map[string]int{"naturejunk": 5, "solarjunk": 1, "scrap": 1},
Category: ModUtility, TargetType: "inventory"},
```
Usage: `trigger plank make` (all logs) or `trigger plank make <log type>` (specific).
## Player Houses
Player houses are real YAML rooms stored in `data/rooms/player_housing/`. Each house area (e.g. Local Neighborhood) has entrance + workshop rooms with unique room IDs in the 200+ range.
House room files follow the same format as world rooms:
```yaml
name: "Player House: Entrance Hall"
description: "..."
exits:
south: 170
north: 201
objects:
- id: charging_station
```
The room loader (`World.LoadRoom`) checks `data/rooms/<id>.yaml` first, then falls back to `data/rooms/player_housing/<id>.yaml`.
Ownership is tracked via player flags (e.g. `owns_house_local_neighborhood: "local_neighborhood"`). The Estate Directory scans character YAML files for these flags.
## Implementation
### Production Integration
Construction is added to `productionTypes` in `action_production.go`:
```go
"construction": {"construct", "constructing"},
```
This enables automatic support through the unified production system (`advanceProduction`, `startProductionFromRecipe`, etc.).
### Command
`cmd_construct.go` follows the same pattern as `cmd_craft.go`, using per-recipe `Station` and `Tool` checks. Station: `workbench`, Tool: `saw` (for plank recipes only).
### Option
`construct_all` (OptBool, default false): Auto-start construction when only one product is available.
## Data File Summary
| Path | Purpose |
|------|---------|
| `data/objects/workbench.yaml` | Workbench station object |
| `data/objects/estate_directory.yaml` | Directory terminal object |
| `data/items/saw.yaml` | Saw tool |
| `data/items/planks.yaml` - `mahogany_planks.yaml` | Plank items (4 tiers) |
| `data/items/wooden_shelf.yaml` - `mahogany_table.yaml` | Furniture items (7 items) |
| Item YAMLs with `craft:` blocks (planks, furniture) | Construction recipes — inline on output item YAML |
| `data/mobs/estate_broker.yaml` | Estate broker mob (talk inline) |
| `data/mobs/sawmill_operator.yaml` | Sawmill operator mob (talk inline) |
| `data/rooms/16.yaml` | Construction Site (updated) |
| `data/rooms/170.yaml` | Local Neighborhood |
| `data/rooms/171.yaml` | Lumberyard |
| `data/rooms/player_housing/200.yaml` | Player house entrance |
| `data/rooms/player_housing/201.yaml` | Player house workshop |
| `data/help/construct.yaml` | Help topic |
|