# 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 ` | Build a specific item | | `construct ` | 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 ` (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/.yaml` first, then falls back to `data/rooms/player_housing/.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 |