aboutsummaryrefslogtreecommitdiff
path: root/worldbuilding_guide/construction.md
blob: 63249b3bbe475a51e342215db16bb997e459e374 (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
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
217
218
219
220
221
222
223
# 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.

## Skill

- Skill name: `construction`
- Abbreviation: `con`
- Level range: 1-99
- XP table: RSC 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
id: workbench
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
id: estate_directory
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
id: saw
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
id: construct_oak_planks
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
id: construct_wooden_table
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
id: estate_broker
name: estate broker
talk:
    nodes:
        start:
            message: "\"Interested in a house?\""
            options:
                - text: "\"How much?\""
                  goto: offer
                - text: "\"No thanks.\""
                  end: true
        offer:
            message: "\"10 credits for a plot.\""
            action:
                cost: 10
                set_player_flags:
                    owns_house_local_neighborhood: "local_neighborhood"
            options:
                - text: "\"Deal!\""
                  end: true
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
id: 200
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) |
| `data/recipes/construct_planks.yaml` - `construct_mahogany_table.yaml` | Construction recipes (11 recipes) |
| `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 |