aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AGENTS.md4
-rw-r--r--data/.admin_history.json1
-rw-r--r--data/courses/reactor.yaml161
-rw-r--r--data/courses/rooftop.yaml138
-rw-r--r--data/courses/vent_shaft.yaml115
-rw-r--r--data/items/ammo/adamant_arrowtips.yaml10
-rw-r--r--data/items/ammo/adamant_bolts.yaml24
-rw-r--r--data/items/ammo/adamant_bolts_unf.yaml10
-rw-r--r--data/items/ammo/bronze_arrow.yaml24
-rw-r--r--data/items/ammo/bronze_arrowtips.yaml10
-rw-r--r--data/items/ammo/bronze_bolts.yaml24
-rw-r--r--data/items/ammo/bronze_bolts_unf.yaml10
-rw-r--r--data/items/ammo/diamond_bolt_tips.yaml8
-rw-r--r--data/items/ammo/diamond_bolts.yaml24
-rw-r--r--data/items/ammo/emerald_bolt_tips.yaml8
-rw-r--r--data/items/ammo/emerald_bolts.yaml24
-rw-r--r--data/items/ammo/headless_arrow.yaml14
-rw-r--r--data/items/ammo/iron_arrow.yaml24
-rw-r--r--data/items/ammo/iron_arrowtips.yaml10
-rw-r--r--data/items/ammo/iron_bolts.yaml24
-rw-r--r--data/items/ammo/iron_bolts_unf.yaml10
-rw-r--r--data/items/ammo/mithril_arrow.yaml24
-rw-r--r--data/items/ammo/mithril_arrowtips.yaml10
-rw-r--r--data/items/ammo/mithril_bolts.yaml24
-rw-r--r--data/items/ammo/mithril_bolts_unf.yaml10
-rw-r--r--data/items/ammo/ruby_bolt_tips.yaml8
-rw-r--r--data/items/ammo/ruby_bolts.yaml24
-rw-r--r--data/items/ammo/rune_arrow.yaml24
-rw-r--r--data/items/ammo/rune_arrowtips.yaml10
-rw-r--r--data/items/ammo/rune_bolts.yaml24
-rw-r--r--data/items/ammo/rune_bolts_unf.yaml10
-rw-r--r--data/items/ammo/sapphire_bolt_tips.yaml8
-rw-r--r--data/items/ammo/sapphire_bolts.yaml24
-rw-r--r--data/items/ammo/steel_arrow.yaml24
-rw-r--r--data/items/ammo/steel_arrowtips.yaml10
-rw-r--r--data/items/ammo/steel_bolts.yaml24
-rw-r--r--data/items/ammo/steel_bolts_unf.yaml10
-rw-r--r--data/items/consumables/amp_potion.yaml14
-rw-r--r--data/items/consumables/anchovies.yaml12
-rw-r--r--data/items/consumables/apple.yaml2
-rw-r--r--data/items/consumables/avantoe_potion_unf.yaml14
-rw-r--r--data/items/consumables/bio_serum.yaml14
-rw-r--r--data/items/consumables/bread.yaml10
-rw-r--r--data/items/consumables/cadantine_potion_unf.yaml14
-rw-r--r--data/items/consumables/cheese.yaml2
-rw-r--r--data/items/consumables/dwarf_weed_potion_unf.yaml14
-rw-r--r--data/items/consumables/full_restore.yaml14
-rw-r--r--data/items/consumables/guam_potion_unf.yaml14
-rw-r--r--data/items/consumables/harralander_potion_unf.yaml14
-rw-r--r--data/items/consumables/herring.yaml12
-rw-r--r--data/items/consumables/irit_potion_unf.yaml14
-rw-r--r--data/items/consumables/kwuarm_potion_unf.yaml14
-rw-r--r--data/items/consumables/lantadyme_potion_unf.yaml14
-rw-r--r--data/items/consumables/marrentill_potion_unf.yaml14
-rw-r--r--data/items/consumables/nano_restore.yaml14
-rw-r--r--data/items/consumables/pastry_dough.yaml14
-rw-r--r--data/items/consumables/pie_dish.yaml16
-rw-r--r--data/items/consumables/pizza_dough.yaml14
-rw-r--r--data/items/consumables/ranarr_potion_unf.yaml14
-rw-r--r--data/items/consumables/restoration_compound.yaml14
-rw-r--r--data/items/consumables/salmon.yaml12
-rw-r--r--data/items/consumables/sardine.yaml12
-rw-r--r--data/items/consumables/science_serum.yaml14
-rw-r--r--data/items/consumables/shield_potion.yaml14
-rw-r--r--data/items/consumables/shrimps.yaml12
-rw-r--r--data/items/consumables/snapdragon_potion_unf.yaml14
-rw-r--r--data/items/consumables/stim_potion.yaml14
-rw-r--r--data/items/consumables/super_amp.yaml14
-rw-r--r--data/items/consumables/super_bio_serum.yaml14
-rw-r--r--data/items/consumables/super_shield.yaml14
-rw-r--r--data/items/consumables/super_stim.yaml14
-rw-r--r--data/items/consumables/super_stim_cell.yaml14
-rw-r--r--data/items/consumables/targeting_serum.yaml14
-rw-r--r--data/items/consumables/tarromin_potion_unf.yaml14
-rw-r--r--data/items/consumables/tech_serum.yaml14
-rw-r--r--data/items/consumables/toadflax_potion_unf.yaml14
-rw-r--r--data/items/consumables/torstol_potion_unf.yaml14
-rw-r--r--data/items/consumables/trout.yaml12
-rw-r--r--data/items/equipment/adamant_dagger.yaml20
-rw-r--r--data/items/equipment/adamant_full_helm.yaml20
-rw-r--r--data/items/equipment/adamant_med_helm.yaml20
-rw-r--r--data/items/equipment/adamant_platebody.yaml20
-rw-r--r--data/items/equipment/adamant_sword.yaml20
-rw-r--r--data/items/equipment/bronze_dagger.yaml20
-rw-r--r--data/items/equipment/bronze_full_helm.yaml20
-rw-r--r--data/items/equipment/bronze_med_helm.yaml20
-rw-r--r--data/items/equipment/bronze_platebody.yaml20
-rw-r--r--data/items/equipment/bronze_sword.yaml20
-rw-r--r--data/items/equipment/coif.yaml24
-rw-r--r--data/items/equipment/diamond_amulet_u.yaml26
-rw-r--r--data/items/equipment/diamond_bracelet.yaml36
-rw-r--r--data/items/equipment/diamond_necklace.yaml36
-rw-r--r--data/items/equipment/diamond_ring.yaml36
-rw-r--r--data/items/equipment/emerald_amulet_u.yaml26
-rw-r--r--data/items/equipment/emerald_bracelet.yaml36
-rw-r--r--data/items/equipment/emerald_necklace.yaml36
-rw-r--r--data/items/equipment/emerald_ring.yaml36
-rw-r--r--data/items/equipment/gold_amulet_u.yaml20
-rw-r--r--data/items/equipment/gold_bracelet.yaml30
-rw-r--r--data/items/equipment/gold_necklace.yaml30
-rw-r--r--data/items/equipment/gold_ring.yaml30
-rw-r--r--data/items/equipment/hard_leather_body.yaml24
-rw-r--r--data/items/equipment/hard_leather_shield.yaml24
-rw-r--r--data/items/equipment/iron_dagger.yaml20
-rw-r--r--data/items/equipment/iron_full_helm.yaml20
-rw-r--r--data/items/equipment/iron_med_helm.yaml20
-rw-r--r--data/items/equipment/iron_platebody.yaml20
-rw-r--r--data/items/equipment/iron_sword.yaml20
-rw-r--r--data/items/equipment/leather_body.yaml24
-rw-r--r--data/items/equipment/leather_boots.yaml24
-rw-r--r--data/items/equipment/leather_chaps.yaml24
-rw-r--r--data/items/equipment/leather_cowl.yaml24
-rw-r--r--data/items/equipment/leather_gloves.yaml24
-rw-r--r--data/items/equipment/leather_vambraces.yaml24
-rw-r--r--data/items/equipment/longbow.yaml22
-rw-r--r--data/items/equipment/longbow_u.yaml8
-rw-r--r--data/items/equipment/magic_longbow.yaml22
-rw-r--r--data/items/equipment/magic_longbow_u.yaml8
-rw-r--r--data/items/equipment/magic_shortbow.yaml22
-rw-r--r--data/items/equipment/magic_shortbow_u.yaml8
-rw-r--r--data/items/equipment/maple_longbow.yaml22
-rw-r--r--data/items/equipment/maple_longbow_u.yaml8
-rw-r--r--data/items/equipment/maple_shortbow.yaml22
-rw-r--r--data/items/equipment/maple_shortbow_u.yaml8
-rw-r--r--data/items/equipment/mithril_dagger.yaml20
-rw-r--r--data/items/equipment/mithril_full_helm.yaml20
-rw-r--r--data/items/equipment/mithril_med_helm.yaml20
-rw-r--r--data/items/equipment/mithril_platebody.yaml20
-rw-r--r--data/items/equipment/mithril_sword.yaml20
-rw-r--r--data/items/equipment/oak_longbow.yaml22
-rw-r--r--data/items/equipment/oak_longbow_u.yaml8
-rw-r--r--data/items/equipment/oak_shortbow.yaml22
-rw-r--r--data/items/equipment/oak_shortbow_u.yaml8
-rw-r--r--data/items/equipment/ruby_amulet_u.yaml26
-rw-r--r--data/items/equipment/ruby_bracelet.yaml36
-rw-r--r--data/items/equipment/ruby_necklace.yaml36
-rw-r--r--data/items/equipment/ruby_ring.yaml36
-rw-r--r--data/items/equipment/rune_dagger.yaml20
-rw-r--r--data/items/equipment/rune_full_helm.yaml20
-rw-r--r--data/items/equipment/rune_med_helm.yaml20
-rw-r--r--data/items/equipment/rune_platebody.yaml20
-rw-r--r--data/items/equipment/rune_sword.yaml20
-rw-r--r--data/items/equipment/sapphire_amulet_u.yaml26
-rw-r--r--data/items/equipment/sapphire_bracelet.yaml36
-rw-r--r--data/items/equipment/sapphire_necklace.yaml36
-rw-r--r--data/items/equipment/sapphire_ring.yaml36
-rw-r--r--data/items/equipment/shortbow.yaml22
-rw-r--r--data/items/equipment/shortbow_u.yaml8
-rw-r--r--data/items/equipment/steel_dagger.yaml20
-rw-r--r--data/items/equipment/steel_full_helm.yaml20
-rw-r--r--data/items/equipment/steel_med_helm.yaml20
-rw-r--r--data/items/equipment/steel_platebody.yaml20
-rw-r--r--data/items/equipment/steel_sword.yaml20
-rw-r--r--data/items/equipment/willow_longbow.yaml22
-rw-r--r--data/items/equipment/willow_longbow_u.yaml8
-rw-r--r--data/items/equipment/willow_shortbow.yaml22
-rw-r--r--data/items/equipment/willow_shortbow_u.yaml8
-rw-r--r--data/items/equipment/yew_longbow.yaml22
-rw-r--r--data/items/equipment/yew_longbow_u.yaml8
-rw-r--r--data/items/equipment/yew_shortbow.yaml22
-rw-r--r--data/items/equipment/yew_shortbow_u.yaml8
-rw-r--r--data/items/materials/adamant_nails.yaml10
-rw-r--r--data/items/materials/adamantite_bar.yaml16
-rw-r--r--data/items/materials/avantoe.yaml8
-rw-r--r--data/items/materials/ball_of_wool.yaml10
-rw-r--r--data/items/materials/bowstring.yaml10
-rw-r--r--data/items/materials/bronze_bar.yaml16
-rw-r--r--data/items/materials/bronze_nails.yaml10
-rw-r--r--data/items/materials/cadantine.yaml8
-rw-r--r--data/items/materials/diamond.yaml8
-rw-r--r--data/items/materials/dwarf_weed.yaml8
-rw-r--r--data/items/materials/emerald.yaml8
-rw-r--r--data/items/materials/gold_bar.yaml10
-rw-r--r--data/items/materials/guam.yaml8
-rw-r--r--data/items/materials/harralander.yaml8
-rw-r--r--data/items/materials/irit.yaml8
-rw-r--r--data/items/materials/iron_bar.yaml16
-rw-r--r--data/items/materials/iron_nails.yaml10
-rw-r--r--data/items/materials/kwuarm.yaml8
-rw-r--r--data/items/materials/lantadyme.yaml8
-rw-r--r--data/items/materials/mahogany_planks.yaml10
-rw-r--r--data/items/materials/marrentill.yaml8
-rw-r--r--data/items/materials/mithril_bar.yaml16
-rw-r--r--data/items/materials/mithril_nails.yaml10
-rw-r--r--data/items/materials/oak_planks.yaml10
-rw-r--r--data/items/materials/planks.yaml10
-rw-r--r--data/items/materials/ranarr.yaml8
-rw-r--r--data/items/materials/ruby.yaml8
-rw-r--r--data/items/materials/rune_nails.yaml10
-rw-r--r--data/items/materials/runite_bar.yaml16
-rw-r--r--data/items/materials/sapphire.yaml8
-rw-r--r--data/items/materials/silver_bar.yaml10
-rw-r--r--data/items/materials/snapdragon.yaml8
-rw-r--r--data/items/materials/soft_clay.yaml22
-rw-r--r--data/items/materials/steel_bar.yaml16
-rw-r--r--data/items/materials/steel_nails.yaml10
-rw-r--r--data/items/materials/stim_cell.yaml14
-rw-r--r--data/items/materials/tarromin.yaml8
-rw-r--r--data/items/materials/teak_planks.yaml10
-rw-r--r--data/items/materials/toadflax.yaml8
-rw-r--r--data/items/materials/torstol.yaml8
-rw-r--r--data/items/misc/credit_stick.yaml2
-rw-r--r--data/items/misc/mahogany_table.yaml10
-rw-r--r--data/items/misc/oak_shelf.yaml10
-rw-r--r--data/items/misc/oak_table.yaml10
-rw-r--r--data/items/misc/teak_table.yaml10
-rw-r--r--data/items/misc/wooden_chair.yaml10
-rw-r--r--data/items/misc/wooden_shelf.yaml10
-rw-r--r--data/items/misc/wooden_table.yaml10
-rw-r--r--data/items/seeds/cabbage_seed.yaml2
-rw-r--r--data/items/seeds/onion_seed.yaml2
-rw-r--r--data/items/seeds/potato_seed.yaml2
-rw-r--r--data/items/seeds/ranarr_seed.yaml2
-rw-r--r--data/items/seeds/snapdragon_seed.yaml2
-rw-r--r--data/items/seeds/strawberry_seed.yaml2
-rw-r--r--data/items/seeds/sweetcorn_seed.yaml2
-rw-r--r--data/items/seeds/tomato_seed.yaml2
-rw-r--r--data/items/seeds/torstol_seed.yaml2
-rw-r--r--data/items/seeds/watermelon_seed.yaml2
-rw-r--r--data/items/tools/empty_pot.yaml16
-rw-r--r--data/items/tools/plant_pot.yaml16
-rw-r--r--data/items/tools/unfired_pie_dish.yaml10
-rw-r--r--data/items/tools/unfired_plant_pot.yaml10
-rw-r--r--data/items/tools/unfired_pot.yaml10
-rw-r--r--data/mobs/examples/newbie_trainer.yaml12
-rw-r--r--data/objects/000_test_object.yaml5
-rw-r--r--data/objects/adamantite_rock.yaml3
-rw-r--r--data/objects/allotment_patch.yaml3
-rw-r--r--data/objects/anglerfish_spot.yaml21
-rw-r--r--data/objects/anvil.yaml3
-rw-r--r--data/objects/aps_tower.yaml3
-rw-r--r--data/objects/bait_fishing_spot.yaml55
-rw-r--r--data/objects/bank_booth.yaml3
-rw-r--r--data/objects/bio_altar.yaml3
-rw-r--r--data/objects/blood_altar.yaml3
-rw-r--r--data/objects/cage_fishing_spot.yaml33
-rw-r--r--data/objects/chaos_altar.yaml3
-rw-r--r--data/objects/charging_station.yaml3
-rw-r--r--data/objects/clay_rock.yaml39
-rw-r--r--data/objects/cooking_range.yaml3
-rw-r--r--data/objects/copper_rock.yaml3
-rw-r--r--data/objects/cosmic_altar.yaml3
-rw-r--r--data/objects/death_altar.yaml3
-rw-r--r--data/objects/eco_altar.yaml3
-rw-r--r--data/objects/estate_directory.yaml3
-rw-r--r--data/objects/fence_post.yaml3
-rw-r--r--data/objects/fire.yaml3
-rw-r--r--data/objects/flower_patch.yaml3
-rw-r--r--data/objects/fly_fishing_spot.yaml55
-rw-r--r--data/objects/furnace.yaml3
-rw-r--r--data/objects/harpoon_fishing_spot.yaml53
-rw-r--r--data/objects/herb_patch.yaml3
-rw-r--r--data/objects/hydro_altar.yaml3
-rw-r--r--data/objects/iron_gate.yaml19
-rw-r--r--data/objects/law_altar.yaml3
-rw-r--r--data/objects/lumby_fountain.yaml3
-rw-r--r--data/objects/market_stall.yaml3
-rw-r--r--data/objects/nature_altar.yaml3
-rw-r--r--data/objects/net_fishing_spot.yaml87
-rw-r--r--data/objects/netrunner.yaml125
-rw-r--r--data/objects/pottery_oven.yaml3
-rw-r--r--data/objects/pottery_wheel.yaml3
-rw-r--r--data/objects/rock_outcrop.yaml3
-rw-r--r--data/objects/sacred_eel_spot.yaml35
-rw-r--r--data/objects/sheep.yaml39
-rw-r--r--data/objects/simple_rock.yaml3
-rw-r--r--data/objects/solar_altar.yaml3
-rw-r--r--data/objects/spinning_wheel.yaml3
-rw-r--r--data/objects/swamp_fishing_spot.yaml45
-rw-r--r--data/objects/terminal_advanced.yaml3
-rw-r--r--data/objects/terminal_basic.yaml3
-rw-r--r--data/objects/terminal_secure.yaml3
-rw-r--r--data/objects/tool_shed.yaml183
-rw-r--r--data/objects/tutorial_lever.yaml3
-rw-r--r--data/objects/workbench.yaml3
-rw-r--r--data/rooms/example_unused/player_housing/99999301.yaml6
-rw-r--r--data/rooms/example_unused/town/9999910.yaml9
-rw-r--r--data/rooms/example_unused/town/9999912.yaml47
-rw-r--r--data/rooms/example_unused/town/9999913.yaml9
-rw-r--r--data/rooms/example_unused/town/9999918.yaml9
-rw-r--r--data/rooms/example_unused/town/9999919.yaml9
-rw-r--r--data/rooms/example_unused/town/999992.yaml12
-rw-r--r--data/rooms/example_unused/town/9999920.yaml9
-rw-r--r--data/rooms/example_unused/town/9999921.yaml6
-rw-r--r--data/rooms/example_unused/town/9999922.yaml9
-rw-r--r--data/rooms/example_unused/town/9999923.yaml9
-rw-r--r--data/rooms/example_unused/town/9999924.yaml9
-rw-r--r--data/rooms/example_unused/town/9999925.yaml9
-rw-r--r--data/rooms/example_unused/town/9999926.yaml9
-rw-r--r--data/rooms/example_unused/town/9999927.yaml9
-rw-r--r--data/rooms/example_unused/town/9999928.yaml6
-rw-r--r--data/rooms/example_unused/town/999996.yaml12
-rw-r--r--data/rooms/example_unused/town/999998.yaml9
-rw-r--r--data/rooms/example_unused/town/999999.yaml15
-rw-r--r--data/rooms/example_unused/underground2/9999954.yaml13
-rw-r--r--data/rooms/example_unused/underground2/9999955.yaml21
-rw-r--r--data/rooms/example_unused/underground2/9999956.yaml6
-rw-r--r--data/rooms/example_unused/underground2/9999957.yaml6
-rw-r--r--data/rooms/example_unused/underground2/9999958.yaml9
-rw-r--r--data/rooms/example_unused/underground2/9999959.yaml6
-rw-r--r--data/rooms/example_unused/underground2/9999960.yaml9
-rw-r--r--data/rooms/example_unused/underground2/9999961.yaml6
-rw-r--r--data/rooms/example_unused/underground2/9999962.yaml9
-rw-r--r--data/rooms/example_unused/underground2/9999963.yaml9
-rw-r--r--data/rooms/example_unused/underground2/9999964.yaml9
-rw-r--r--data/rooms/example_unused/wilderness/99999161.yaml6
-rw-r--r--data/rooms/example_unused/wilderness/99999180.yaml6
-rw-r--r--data/rooms/example_unused/wilderness/99999181.yaml12
-rw-r--r--data/rooms/intro/1002.yaml6
-rw-r--r--data/rooms/intro/1003.yaml30
-rw-r--r--data/rooms/intro/2001.yaml22
-rw-r--r--data/rooms/intro/2006.yaml9
-rw-r--r--internal/admin/api_room_insert_remove_test.go101
-rw-r--r--internal/admin/api_rooms.go4
-rw-r--r--internal/admin/static/intereditor.js19
-rw-r--r--internal/admin/static/map.js25
-rw-r--r--internal/behavior/behavior.go18
-rw-r--r--internal/behavior/desc.go19
-rw-r--r--internal/engine/tick.go21
-rw-r--r--internal/game/act.go28
-rw-r--r--internal/game/cmd_room_remove_test.go62
-rw-r--r--internal/game/core_course.go60
-rw-r--r--internal/game/core_course_test.go45
-rw-r--r--internal/game/core_flags.go7
-rw-r--r--internal/game/core_flagstore.go10
-rw-r--r--internal/game/map_test.go48
-rw-r--r--internal/game/sys_triggers.go5
-rw-r--r--internal/item/item.go17
-rw-r--r--internal/validate/grid_test.go72
-rw-r--r--internal/validate/local_test.go24
-rw-r--r--internal/world/grid_test.go38
-rw-r--r--internal/world/insert_remove_test.go68
-rw-r--r--internal/world/mob.go2
-rw-r--r--internal/world/room.go26
-rw-r--r--internal/world/room_test.go9
-rw-r--r--internal/world/trigger.go4
-rw-r--r--internal/world/trigger_store.go24
337 files changed, 2991 insertions, 2958 deletions
diff --git a/AGENTS.md b/AGENTS.md
index 9016e73..3da4260 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -39,7 +39,7 @@ File prefixes in `internal/game/`: `game.go/cmd_registry.go/tick.go` (core), `co
## Room Scripting
- **`on_enter` steps** (`[]behavior.StepAction`): message + optional `condition` + `delay` + any of the shared `StepAction` effects (`set_global_flags`/`set_player_flags`, `give_item`/`take_item`, `teleport`, `heal`, `credits`, `aps_node`, `broadcast`, `broadcast_global`, `spawn_mob`, `despawn_mob`). Timed steps (any non-zero field triggers the timed path) run as scheduled enter sequences; otherwise messages print synchronously. Conditions snapshotted once at entry. Resumes on reconnect if interrupted.
-- **Conditional descriptions** (`description: [{text, condition}]`): first passing variant wins. For objects, if no variant matches the object is absent for that player. Accepts plain string or list.
+- **Conditional descriptions** (`description: [{text, condition}]`): first passing variant wins. For objects, if no variant matches the object is absent for that player.
- **Exits** carry an `on_traverse:` list of `behavior.Interaction` (same shape as on_use) — first passing entry fires AFTER `p.RoomID` is updated to the destination, so `aps_node`/`teleport` resolve against the new room. `ExitDef.Condition` still gates whether the exit is passable at all; each `on_traverse` entry has its own additional `Condition`.
## Data Files
@@ -164,7 +164,7 @@ Full field reference in `item/item.go`. Key fields: equip_slot, weapon_type, att
## Places to Be Careful
- `startAction` searches objects first, then mobs. Mobs need `behavior:` on YAML def to be interactable.
-- Exits: old `north: 2` still works via custom `UnmarshalYAML`. Same for `RoomMob`.
+- Exits use a strict `{room: <int>}` map format.
- `checkCondition` is the single condition evaluator — shared across exits, talk, on-enter, on_use/on_look (objects), on_kill (mobs), trigger steps. Every interaction type and every timed step shares one condition language.
- Object `hidden: true` = not in room listings but still interactable.
- Alias expansion happens before command dispatch and can shadow built-ins.
diff --git a/data/.admin_history.json b/data/.admin_history.json
new file mode 100644
index 0000000..f02436d
--- /dev/null
+++ b/data/.admin_history.json
@@ -0,0 +1 @@
+{"history":[{"time":"2026-07-09T05:13:08-04:00","description":"link 2001 west 1001","file_path":"data/rooms/intro/2001.yaml","old_content":"block_transport: false\ncolor: \"\"\ndescription:\n - text: It's a test room\nexits:\n east:\n room: 2002\n south:\n room: 2006\n southeast:\n room: 2005\nhazard: \"\"\nid: 2001\nitem_spawns:\n - id: bronze_axe\n quantity: 1\n respawn_ticks: 1\n - id: pot_of_flour\n quantity: 1\n respawn_ticks: 1\n - id: bucket_of_water\n quantity: 1\n respawn_ticks: 1\nmobs:\n - id: man\nname: Test Room\nobjects:\n - description:\n - text: YOU FOUND HIM\n hidden: true\n name: hidden guy\n - id: tree\non_enter: []\ntriggers: []\n","new_content":"id: 2001\nname: Test Room\ncolor: \"\"\ndescription:\n - text: It's a test room\nexits:\n east:\n room: 2002\n south:\n room: 2006\n southeast:\n room: 2005\n west:\n room: 1001\nobjects:\n - name: hidden guy\n hidden: true\n description:\n - text: YOU FOUND HIM\n - id: tree\nitem_spawns:\n - id: bronze_axe\n quantity: 1\n respawn_ticks: 1\n - id: pot_of_flour\n quantity: 1\n respawn_ticks: 1\n - id: bucket_of_water\n quantity: 1\n respawn_ticks: 1\nmobs:\n - id: man\non_enter: []\nhazard: \"\"\nblock_transport: false\ntriggers: []\n","is_delete":false,"is_create":false}],"redo":[{"time":"2026-07-09T05:13:19-04:00","description":"create room 1007","file_path":"data/rooms/intro/1007.yaml","old_content":"","new_content":"exits:\n south: 2002\nid: 1007\nname: 'Room #1007'\n","is_delete":false,"is_create":true,"extra_files":[{"file_path":"data/rooms/intro/2002.yaml","old_content":"id: 2002\nname: Test Room\ncolor: \"\"\ndescription:\n - text: It's a test room\nexits:\n east:\n room: 2003\n north:\n room: 1006\n southeast:\n room: 2004\n west:\n room: 2001\nobjects: []\nitem_spawns: []\nmobs: []\non_enter: []\nhazard: \"\"\nblock_transport: false\ntriggers: []\n","new_content":"id: 2002\nname: Test Room\ncolor: \"\"\ndescription:\n - text: It's a test room\nexits:\n east:\n room: 2003\n north:\n room: 1007\n southeast:\n room: 2004\n west:\n room: 2001\nobjects: []\nitem_spawns: []\nmobs: []\non_enter: []\nhazard: \"\"\nblock_transport: false\ntriggers: []\n"}]},{"time":"2026-07-09T05:13:10-04:00","description":"create room 1006","file_path":"data/rooms/intro/1006.yaml","old_content":"","new_content":"exits:\n south: 2002\nid: 1006\nname: 'Room #1006'\n","is_delete":false,"is_create":true,"extra_files":[{"file_path":"data/rooms/intro/2002.yaml","old_content":"id: 2002\nname: Test Room\ncolor: \"\"\ndescription:\n - text: It's a test room\nexits:\n east:\n room: 2003\n north:\n room: 1005\n southeast:\n room: 2004\n west:\n room: 2001\nobjects: []\nitem_spawns: []\nmobs: []\non_enter: []\nhazard: \"\"\nblock_transport: false\ntriggers: []\n","new_content":"id: 2002\nname: Test Room\ncolor: \"\"\ndescription:\n - text: It's a test room\nexits:\n east:\n room: 2003\n north:\n room: 1006\n southeast:\n room: 2004\n west:\n room: 2001\nobjects: []\nitem_spawns: []\nmobs: []\non_enter: []\nhazard: \"\"\nblock_transport: false\ntriggers: []\n"}]},{"time":"2026-07-09T05:13:09-04:00","description":"create room 1005","file_path":"data/rooms/intro/1005.yaml","old_content":"","new_content":"exits:\n south: 2002\nid: 1005\nname: 'Room #1005'\n","is_delete":false,"is_create":true,"extra_files":[{"file_path":"data/rooms/intro/2002.yaml","old_content":"id: 2002\nname: Test Room\ncolor: \"\"\ndescription:\n - text: It's a test room\nexits:\n east:\n room: 2003\n southeast:\n room: 2004\n west:\n room: 2001\nobjects: []\nitem_spawns: []\nmobs: []\non_enter: []\nhazard: \"\"\nblock_transport: false\ntriggers: []\n","new_content":"id: 2002\nname: Test Room\ncolor: \"\"\ndescription:\n - text: It's a test room\nexits:\n east:\n room: 2003\n north:\n room: 1005\n southeast:\n room: 2004\n west:\n room: 2001\nobjects: []\nitem_spawns: []\nmobs: []\non_enter: []\nhazard: \"\"\nblock_transport: false\ntriggers: []\n"}]},{"time":"2026-07-09T05:13:08-04:00","description":"link 1001 east 2001 (reverse)","file_path":"data/rooms/intro/1001.yaml","old_content":"block_transport: true\ncolor: \"\"\ndescription:\n - text: |-\n A dim, windowless shuttle interior with a few uncomfortable rows of steel seats facing forward. A large framed sign hangs next to the closed cockpit door. The piston-powered staircase is firmly closed at the rear of the craft.\n\n A dim, windowless shuttle interior with a few uncomfortable rows of steel seats facing forward. A large {11}framed sign{/} hangs next to the closed cockpit door. A piston-powered staircase leads down out the back of the small craft with a smiling attendant ready to help disembark.\nexits:\n down:\n blocked_message: The piston-powered staircase is firmly closed.\n condition:\n all_of: []\n any_of: []\n global_flag: \"\"\n has_item: \"\"\n min_credits: 0\n not: false\n player_flag: 1001_touchdown\n value: null\n room: 1002\n east:\n room: 2001\nhazard: \"\"\nid: 1001\nitem_spawns: []\nmobs:\n - id: flight_attendant\nname: Inside Transport Shuttle\nobjects:\n - description:\n - text: \"We hope you enjoy your trip on our shuttle! Your pilot is [TYLER].\\n\\nWhen you arrive at your final destination, please be aware of the following basic commands:\\n\\n{0B bold}Movement:{/} {0A}north{/}, {0A}south{/}, {0A}east{/}, {0A}west{/}, {0A}up{/}, {0A}down{/}\\n{0B bold}Look:{/} {0A}look{/}, {0A}look \u003citem/object/mob\u003e{/}, and {0A}map{/}\\n{0B bold}Items:{/} {0A}inv{/} to see your 28-slot inventory\\n {0A}get \u003citem\u003e{/}, {0A}drop \u003citem\u003e{/}, {0A}wear \u003citem\u003e{/}, {0A}remove \u003citem\u003e{/}\\n {0A}use \u003citem\u003e on \u003citem/object\u003e{/}\\n {0A}eq{/} for equiped gear\\n{0B bold}Comms:{/} {0A}talk \u003cmob\u003e{/} for NPC chat\\n {0A}say \u003cmsg\u003e{/} and {0A}global \u003cmsg\u003e{/} for human chat\\n{0B bold}Character:{/} {0A}score{/} and {0A}skills{/} for stats. \\n{0B bold}Combat{/} {0A}attack \u003cmob\u003e{/}\\n{0B bold}Skills{/} Many skills have shortcuts like {0A}mine{/}, {0A}fish{/}, or {0A}chop{/}\\n{0B bold}Options{/} {0A}options{/} for a list of account options\\n {0A}options \u003copt\u003e \u003cvalue\u003e{/} to change an option\\n\\nType {0C bold}what{/} for a list of possible common actions\\n\\nMake sure to check the {0A}help{/} pages, especially {0A}help newplayer{/}!\"\n hidden: true\n name: framed sign\n on_look:\n - set_player_flags:\n 1001_look_sign: true\n - description:\n - text: A sturdy, locked steel door that keeps passengers out of the cockpit. There is a tiny, thin window at eye level.\n hidden: true\n name: door\n - description:\n - text: A thick trim with rounded bolt heads frames the tiny window. It looks like it was cut into the door at some point, potentially as a simple replacement to computerized security systems. Inside the cockpit there's a pilot finishing up landing procedures on a large panel of analog instruments.\n hidden: true\n name: window\n - aliases:\n - cockpit\n description:\n - text: The cramped cockpit is surrounded by buttons, swiches, dials, and analog gauges. The parts are a mix of technologies from the last century. Part of the panel is obscured by a draped cloth as if to hide it from view. Odd.\n hidden: true\n name: instrument panel\n - aliases: []\n description:\n - text: That's the guy who took you from the Passenger Barge Denali down here to Vesta. A middle-aged man in a neat white jumpsuit with a matching white sort of conductor's hat. He's following a written procedure checklist and seems to take his job seriously.\n hidden: true\n name: pilot\non_enter:\n - broadcast: \"\"\n broadcast_global: \"\"\n condition:\n all_of: []\n any_of: []\n global_flag: \"\"\n has_item: \"\"\n min_credits: 0\n not: true\n player_flag: 1001_welcome\n value: null\n delay: 5\n despawn_mob: \"\"\n give_item: \"\"\n heal: 0\n message: '{0B bold}Welcome to The House of Icarus{/}'\n set_global_flags: {}\n set_player_flags: {}\n spawn_mob: null\n take_item: \"\"\n teleport: 0\n - broadcast: \"\"\n broadcast_global: \"\"\n condition:\n all_of: []\n any_of: []\n global_flag: \"\"\n has_item: \"\"\n min_credits: 0\n not: true\n player_flag: 1001_welcome\n value: null\n delay: 7\n despawn_mob: \"\"\n give_item: \"\"\n heal: 0\n message: '{0B}Type{/} {0A}look sign{/} {0B}or{/} {0A}talk attendant{/} {0B}to get started{/}'\n set_global_flags: {}\n set_player_flags:\n 1001_welcome: true\n spawn_mob: null\n take_item: \"\"\n teleport: 0\n - broadcast: \"\"\n broadcast_global: \"\"\n condition:\n all_of: []\n any_of: []\n global_flag: \"\"\n has_item: \"\"\n min_credits: 0\n not: true\n player_flag: 1001_welcome\n value: null\n delay: 7\n despawn_mob: \"\"\n give_item: \"\"\n heal: 0\n message: '{0B}Type{/} {0A}help newplayer{/} {0B}for the new player''s guide. That''s it. Explore and have fun.{/}'\n set_global_flags: {}\n set_player_flags: {}\n spawn_mob: null\n take_item: \"\"\n teleport: 0\ntriggers:\n - id: \"\"\n on_global_flag: \"\"\n on_player_flag: 1001_look_sign\n room: 0\n steps:\n - broadcast: \"\"\n broadcast_global: \"\"\n delay: 5\n despawn_mob: \"\"\n give_item: \"\"\n heal: 0\n message: The cabin shakes as the small craft touches down\n set_global_flags: {}\n set_player_flags: {}\n spawn_mob: null\n take_item: \"\"\n teleport: 0\n - broadcast: \"\"\n broadcast_global: \"\"\n delay: 5\n despawn_mob: \"\"\n give_item: \"\"\n heal: 0\n message: The pistons hiss as the rear staircase opens\n set_global_flags: {}\n set_player_flags: {}\n spawn_mob: null\n take_item: \"\"\n teleport: 0\n - broadcast: \"\"\n broadcast_global: \"\"\n delay: 0\n despawn_mob: \"\"\n give_item: \"\"\n heal: 0\n message: \"\"\n set_global_flags: {}\n set_player_flags:\n 1001_touchdown: true\n spawn_mob: null\n take_item: \"\"\n teleport: 0\n value: null\n","new_content":"id: 1001\nname: Inside Transport Shuttle\ncolor: \"\"\ndescription:\n - text: |-\n A dim, windowless shuttle interior with a few uncomfortable rows of steel seats facing forward. A large framed sign hangs next to the closed cockpit door. The piston-powered staircase is firmly closed at the rear of the craft.\n\n A dim, windowless shuttle interior with a few uncomfortable rows of steel seats facing forward. A large {11}framed sign{/} hangs next to the closed cockpit door. A piston-powered staircase leads down out the back of the small craft with a smiling attendant ready to help disembark.\nexits:\n down:\n room: 1002\n condition:\n global_flag: \"\"\n value: null\n not: false\n player_flag: 1001_touchdown\n has_item: \"\"\n min_credits: 0\n all_of: []\n any_of: []\n blocked_message: The piston-powered staircase is firmly closed.\n east:\n room: 2001\nobjects:\n - name: framed sign\n hidden: true\n description:\n - text: \"We hope you enjoy your trip on our shuttle! Your pilot is [TYLER].\\n\\nWhen you arrive at your final destination, please be aware of the following basic commands:\\n\\n{0B bold}Movement:{/} {0A}north{/}, {0A}south{/}, {0A}east{/}, {0A}west{/}, {0A}up{/}, {0A}down{/}\\n{0B bold}Look:{/} {0A}look{/}, {0A}look \u003citem/object/mob\u003e{/}, and {0A}map{/}\\n{0B bold}Items:{/} {0A}inv{/} to see your 28-slot inventory\\n {0A}get \u003citem\u003e{/}, {0A}drop \u003citem\u003e{/}, {0A}wear \u003citem\u003e{/}, {0A}remove \u003citem\u003e{/}\\n {0A}use \u003citem\u003e on \u003citem/object\u003e{/}\\n {0A}eq{/} for equiped gear\\n{0B bold}Comms:{/} {0A}talk \u003cmob\u003e{/} for NPC chat\\n {0A}say \u003cmsg\u003e{/} and {0A}global \u003cmsg\u003e{/} for human chat\\n{0B bold}Character:{/} {0A}score{/} and {0A}skills{/} for stats. \\n{0B bold}Combat{/} {0A}attack \u003cmob\u003e{/}\\n{0B bold}Skills{/} Many skills have shortcuts like {0A}mine{/}, {0A}fish{/}, or {0A}chop{/}\\n{0B bold}Options{/} {0A}options{/} for a list of account options\\n {0A}options \u003copt\u003e \u003cvalue\u003e{/} to change an option\\n\\nType {0C bold}what{/} for a list of possible common actions\\n\\nMake sure to check the {0A}help{/} pages, especially {0A}help newplayer{/}!\"\n on_look:\n - {}\n - name: door\n hidden: true\n description:\n - text: A sturdy, locked steel door that keeps passengers out of the cockpit. There is a tiny, thin window at eye level.\n - name: window\n hidden: true\n description:\n - text: A thick trim with rounded bolt heads frames the tiny window. It looks like it was cut into the door at some point, potentially as a simple replacement to computerized security systems. Inside the cockpit there's a pilot finishing up landing procedures on a large panel of analog instruments.\n - name: instrument panel\n aliases:\n - cockpit\n hidden: true\n description:\n - text: The cramped cockpit is surrounded by buttons, swiches, dials, and analog gauges. The parts are a mix of technologies from the last century. Part of the panel is obscured by a draped cloth as if to hide it from view. Odd.\n - name: pilot\n hidden: true\n description:\n - text: That's the guy who took you from the Passenger Barge Denali down here to Vesta. A middle-aged man in a neat white jumpsuit with a matching white sort of conductor's hat. He's following a written procedure checklist and seems to take his job seriously.\nitem_spawns: []\nmobs:\n - id: flight_attendant\non_enter:\n - condition:\n global_flag: \"\"\n value: null\n not: true\n player_flag: 1001_welcome\n has_item: \"\"\n min_credits: 0\n all_of: []\n any_of: []\n message: '{0B bold}Welcome to The House of Icarus{/}'\n delay: 5\n - set_player_flags:\n 1001_welcome: true\n condition:\n global_flag: \"\"\n value: null\n not: true\n player_flag: 1001_welcome\n has_item: \"\"\n min_credits: 0\n all_of: []\n any_of: []\n message: '{0B}Type{/} {0A}look sign{/} {0B}or{/} {0A}talk attendant{/} {0B}to get started{/}'\n delay: 7\n - condition:\n global_flag: \"\"\n value: null\n not: true\n player_flag: 1001_welcome\n has_item: \"\"\n min_credits: 0\n all_of: []\n any_of: []\n message: '{0B}Type{/} {0A}help newplayer{/} {0B}for the new player''s guide. That''s it. Explore and have fun.{/}'\n delay: 7\nhazard: \"\"\nblock_transport: true\ntriggers:\n - id: \"\"\n on_player_flag: 1001_look_sign\n on_global_flag: \"\"\n value: null\n room: 0\n steps:\n - message: The cabin shakes as the small craft touches down\n delay: 5\n - message: The pistons hiss as the rear staircase opens\n delay: 5\n - set_player_flags:\n 1001_touchdown: true\n","is_delete":false,"is_create":false}]} \ No newline at end of file
diff --git a/data/courses/reactor.yaml b/data/courses/reactor.yaml
index 91b2873..a657c21 100644
--- a/data/courses/reactor.yaml
+++ b/data/courses/reactor.yaml
@@ -3,73 +3,94 @@ required_level: 50
start_room: 99999200
completion_xp: 350
obstacles:
- - room_id: 99999220
- verb: climb
- ticks_per_phase: 3
- xp: 40
- fail_damage: [3, 6]
- exit_dir: north
- messages:
- - "You grip the reactor scaffolding and begin your ascent..."
- - "The metal groans under your weight as you climb higher, heat radiating from below..."
- - "You pull yourself onto the upper platform, the reactor humming beneath you!"
- - room_id: 99999221
- verb: swing
- ticks_per_phase: 3
- xp: 45
- fail_damage: [3, 7]
- exit_dir: north
- messages:
- - "You seize the heavy coolant chain dangling above the reactor pit..."
- - "You swing out over the glowing core, heat blasting your face..."
- - "You release and land hard on the maintenance gantry, chain clanging behind you!"
- - room_id: 99999222
- verb: balance
- ticks_per_phase: 3
- xp: 50
- fail_damage: [4, 7]
- exit_dir: north
- messages:
- - "You step onto the massive steam pipe spanning the reactor chamber..."
- - "Steam jets hiss from valves on either side as you shuffle along the pipe..."
- - "You reach the junction platform and hop off the pipe with relief!"
- - room_id: 99999223
- verb: jump
- ticks_per_phase: 2
- xp: 45
- fail_damage: [3, 6]
- exit_dir: north
- messages:
- - "A section of the reactor platform is missing, leaving a gaping void..."
- - "You back up, sprint, and leap with everything you've got..."
- - "You slam into the far platform and roll to safety!"
- - room_id: 99999224
- verb: crawl
- ticks_per_phase: 3
- xp: 40
- fail_damage: [3, 5]
- exit_dir: north
- messages:
- - "You squeeze into the narrow service conduit, radiation warnings plastered on every surface..."
- - "You drag yourself through on your elbows, sparks showering from damaged wiring above..."
- - "You tumble out the far end and gulp down clean air!"
- - room_id: 99999225
- verb: vault
- ticks_per_phase: 2
- xp: 50
- fail_damage: [4, 7]
- exit_dir: north
- messages:
- - "A radiation containment barrier blocks the path, humming with energy..."
- - "You time the pulse cycle, sprint at the barrier, and throw yourself over it..."
- - "You clear the barrier and land on the other side, heart pounding!"
- - room_id: 99999226
- verb: leap
- ticks_per_phase: 3
- xp: 55
- fail_damage: [4, 8]
- exit_dir: north
- messages:
- - "The final obstacle: a massive chasm over the reactor coolant pool..."
- - "You sprint along the narrow runway, the abyss yawning below..."
- - "You launch into the void, arms windmilling, and crash onto the far platform!"
+- room_id: 99999220
+ verb: climb
+ xp: 40
+ fail_damage: [3, 6]
+ exit_dir: north
+ phases:
+ - message: "You grip the reactor scaffolding and begin your ascent..."
+ delay: 3.0
+ - message: "The metal groans under your weight as you climb higher, heat radiating from below..."
+ delay: 3.0
+ fail_check: true
+ - message: "You pull yourself onto the upper platform, the reactor humming beneath you!"
+ delay: 3.0
+- room_id: 99999221
+ verb: swing
+ xp: 45
+ fail_damage: [3, 7]
+ exit_dir: north
+ phases:
+ - message: "You seize the heavy coolant chain dangling above the reactor pit..."
+ delay: 3.0
+ - message: "You swing out over the glowing core, heat blasting your face..."
+ delay: 3.0
+ fail_check: true
+ - message: "You release and land hard on the maintenance gantry, chain clanging behind you!"
+ delay: 3.0
+- room_id: 99999222
+ verb: balance
+ xp: 50
+ fail_damage: [4, 7]
+ exit_dir: north
+ phases:
+ - message: "You step onto the massive steam pipe spanning the reactor chamber..."
+ delay: 3.0
+ - message: "Steam jets hiss from valves on either side as you shuffle along the pipe..."
+ delay: 3.0
+ fail_check: true
+ - message: "You reach the junction platform and hop off the pipe with relief!"
+ delay: 3.0
+- room_id: 99999223
+ verb: jump
+ xp: 45
+ fail_damage: [3, 6]
+ exit_dir: north
+ phases:
+ - message: "A section of the reactor platform is missing, leaving a gaping void..."
+ delay: 2.0
+ - message: "You back up, sprint, and leap with everything you've got..."
+ delay: 2.0
+ fail_check: true
+ - message: "You slam into the far platform and roll to safety!"
+ delay: 2.0
+- room_id: 99999224
+ verb: crawl
+ xp: 40
+ fail_damage: [3, 5]
+ exit_dir: north
+ phases:
+ - message: "You squeeze into the narrow service conduit, radiation warnings plastered on every surface..."
+ delay: 3.0
+ - message: "You drag yourself through on your elbows, sparks showering from damaged wiring above..."
+ delay: 3.0
+ fail_check: true
+ - message: "You tumble out the far end and gulp down clean air!"
+ delay: 3.0
+- room_id: 99999225
+ verb: vault
+ xp: 50
+ fail_damage: [4, 7]
+ exit_dir: north
+ phases:
+ - message: "A radiation containment barrier blocks the path, humming with energy..."
+ delay: 2.0
+ - message: "You time the pulse cycle, sprint at the barrier, and throw yourself over it..."
+ delay: 2.0
+ fail_check: true
+ - message: "You clear the barrier and land on the other side, heart pounding!"
+ delay: 2.0
+- room_id: 99999226
+ verb: leap
+ xp: 55
+ fail_damage: [4, 8]
+ exit_dir: north
+ phases:
+ - message: "The final obstacle: a massive chasm over the reactor coolant pool..."
+ delay: 3.0
+ - message: "You sprint along the narrow runway, the abyss yawning below..."
+ delay: 3.0
+ fail_check: true
+ - message: "You launch into the void, arms windmilling, and crash onto the far platform!"
+ delay: 3.0
diff --git a/data/courses/rooftop.yaml b/data/courses/rooftop.yaml
index 68ad23b..4be1f71 100644
--- a/data/courses/rooftop.yaml
+++ b/data/courses/rooftop.yaml
@@ -3,63 +3,81 @@ required_level: 20
start_room: 99999200
completion_xp: 120
obstacles:
- - room_id: 99999210
- verb: climb
- ticks_per_phase: 2
- xp: 15
- fail_damage: [2, 4]
- exit_dir: north
- messages:
- - "You grab the rough permacrete wall and begin to climb..."
- - "Your fingers find cracks and ledges as you pull yourself higher..."
- - "You heave yourself over the edge and onto the rooftop!"
- - room_id: 99999211
- verb: jump
- ticks_per_phase: 2
- xp: 22
- fail_damage: [2, 4]
- exit_dir: north
- messages:
- - "You eye the gap between this building and the next..."
- - "You sprint toward the edge, boots pounding on the rooftop..."
- - "You launch yourself across and roll to a stop on the other roof!"
- - room_id: 99999212
- verb: swing
- ticks_per_phase: 3
- xp: 20
- fail_damage: [2, 5]
- exit_dir: north
- messages:
- - "You grab the dangling power cable with both hands..."
- - "You kick off the ledge and swing out over the street far below..."
- - "You release at the peak of the arc and land on the opposite platform!"
- - room_id: 99999213
- verb: balance
- ticks_per_phase: 3
- xp: 18
- fail_damage: [2, 4]
- exit_dir: north
- messages:
- - "You step onto the narrow structural beam spanning the alley..."
- - "The beam sways slightly as you inch forward, arms out for balance..."
- - "You reach the far side and step gratefully onto solid rooftop!"
- - room_id: 99999214
- verb: vault
- ticks_per_phase: 2
- xp: 15
- fail_damage: [2, 3]
- exit_dir: north
- messages:
- - "You run toward the maintenance railing at full speed..."
- - "You plant one hand on the rail and swing your legs over..."
- - "You clear the railing and land in a crouch on the other side!"
- - room_id: 99999215
- verb: leap
- ticks_per_phase: 2
- xp: 20
- fail_damage: [3, 5]
- exit_dir: north
- messages:
- - "You stare at the final gap -- the widest yet..."
- - "You take a deep breath, charge forward, and throw yourself into the air..."
- - "You barely catch the far ledge, pull yourself up, and stand triumphant!"
+- room_id: 99999210
+ verb: climb
+ xp: 15
+ fail_damage: [2, 4]
+ exit_dir: north
+ phases:
+ - message: "You grab the rough permacrete wall and begin to climb..."
+ delay: 2.0
+ - message: "Your fingers find cracks and ledges as you pull yourself higher..."
+ delay: 2.0
+ fail_check: true
+ - message: "You heave yourself over the edge and onto the rooftop!"
+ delay: 2.0
+- room_id: 99999211
+ verb: jump
+ xp: 22
+ fail_damage: [2, 4]
+ exit_dir: north
+ phases:
+ - message: "You eye the gap between this building and the next..."
+ delay: 2.0
+ - message: "You sprint toward the edge, boots pounding on the rooftop..."
+ delay: 2.0
+ fail_check: true
+ - message: "You launch yourself across and roll to a stop on the other roof!"
+ delay: 2.0
+- room_id: 99999212
+ verb: swing
+ xp: 20
+ fail_damage: [2, 5]
+ exit_dir: north
+ phases:
+ - message: "You grab the dangling power cable with both hands..."
+ delay: 3.0
+ - message: "You kick off the ledge and swing out over the street far below..."
+ delay: 3.0
+ fail_check: true
+ - message: "You release at the peak of the arc and land on the opposite platform!"
+ delay: 3.0
+- room_id: 99999213
+ verb: balance
+ xp: 18
+ fail_damage: [2, 4]
+ exit_dir: north
+ phases:
+ - message: "You step onto the narrow structural beam spanning the alley..."
+ delay: 3.0
+ - message: "The beam sways slightly as you inch forward, arms out for balance..."
+ delay: 3.0
+ fail_check: true
+ - message: "You reach the far side and step gratefully onto solid rooftop!"
+ delay: 3.0
+- room_id: 99999214
+ verb: vault
+ xp: 15
+ fail_damage: [2, 3]
+ exit_dir: north
+ phases:
+ - message: "You run toward the maintenance railing at full speed..."
+ delay: 2.0
+ - message: "You plant one hand on the rail and swing your legs over..."
+ delay: 2.0
+ fail_check: true
+ - message: "You clear the railing and land in a crouch on the other side!"
+ delay: 2.0
+- room_id: 99999215
+ verb: leap
+ xp: 20
+ fail_damage: [3, 5]
+ exit_dir: north
+ phases:
+ - message: "You stare at the final gap -- the widest yet..."
+ delay: 2.0
+ - message: "You take a deep breath, charge forward, and throw yourself into the air..."
+ delay: 2.0
+ fail_check: true
+ - message: "You barely catch the far ledge, pull yourself up, and stand triumphant!"
+ delay: 2.0
diff --git a/data/courses/vent_shaft.yaml b/data/courses/vent_shaft.yaml
index 69ca2d2..49e42c3 100644
--- a/data/courses/vent_shaft.yaml
+++ b/data/courses/vent_shaft.yaml
@@ -3,53 +3,68 @@ required_level: 1
start_room: 99999200
completion_xp: 40
obstacles:
- - room_id: 99999201
- verb: scramble
- ticks_per_phase: 2
- xp: 8
- fail_damage: [1, 2]
- exit_dir: north
- 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!"
- - room_id: 99999202
- verb: balance
- ticks_per_phase: 2
- xp: 8
- fail_damage: [1, 2]
- exit_dir: north
- messages:
- - "You step onto the narrow coolant pipe..."
- - "Arms outstretched, you carefully place one foot in front of the other..."
- - "You reach the other side of the pipe and step onto solid ground!"
- - room_id: 99999203
- verb: jump
- ticks_per_phase: 2
- xp: 7
- fail_damage: [1, 2]
- exit_dir: north
- messages:
- - "You peer across the dark gap in the shaft floor..."
- - "You take a few steps back, then sprint toward the edge..."
- - "You leap across the gap and land safely on the other side!"
- - room_id: 99999204
- verb: crawl
- ticks_per_phase: 3
- xp: 7
- fail_damage: [1, 1]
- exit_dir: north
- messages:
- - "You drop to your hands and knees at the narrow vent opening..."
- - "You squeeze through the tight passage, metal scraping against your back..."
- - "You emerge from the vent and stand up, brushing dust from your clothes!"
- - room_id: 99999205
- verb: slide
- ticks_per_phase: 2
- xp: 10
- fail_damage: [1, 2]
- exit_dir: north
- messages:
- - "You sit at the top of the emergency chute..."
- - "You push off and accelerate down the smooth metal surface..."
- - "You shoot out the bottom of the chute and land on your feet!"
+- room_id: 99999201
+ verb: scramble
+ xp: 8
+ fail_damage: [1, 2]
+ exit_dir: north
+ phases:
+ - message: "You approach the corroded ventilation wall..."
+ delay: 2.0
+ - message: "You find footholds in the rusted panels and begin to climb..."
+ delay: 2.0
+ fail_check: true
+ - message: "You scramble up the wall and haul yourself onto the ledge!"
+ delay: 2.0
+- room_id: 99999202
+ verb: balance
+ xp: 8
+ fail_damage: [1, 2]
+ exit_dir: north
+ phases:
+ - message: "You step onto the narrow coolant pipe..."
+ delay: 2.0
+ - message: "Arms outstretched, you carefully place one foot in front of the other..."
+ delay: 2.0
+ fail_check: true
+ - message: "You reach the other side of the pipe and step onto solid ground!"
+ delay: 2.0
+- room_id: 99999203
+ verb: jump
+ xp: 7
+ fail_damage: [1, 2]
+ exit_dir: north
+ phases:
+ - message: "You peer across the dark gap in the shaft floor..."
+ delay: 2.0
+ - message: "You take a few steps back, then sprint toward the edge..."
+ delay: 2.0
+ fail_check: true
+ - message: "You leap across the gap and land safely on the other side!"
+ delay: 2.0
+- room_id: 99999204
+ verb: crawl
+ xp: 7
+ fail_damage: [1, 1]
+ exit_dir: north
+ phases:
+ - message: "You drop to your hands and knees at the narrow vent opening..."
+ delay: 3.0
+ - message: "You squeeze through the tight passage, metal scraping against your back..."
+ delay: 3.0
+ fail_check: true
+ - message: "You emerge from the vent and stand up, brushing dust from your clothes!"
+ delay: 3.0
+- room_id: 99999205
+ verb: slide
+ xp: 10
+ fail_damage: [1, 2]
+ exit_dir: north
+ phases:
+ - message: "You sit at the top of the emergency chute..."
+ delay: 2.0
+ - message: "You push off and accelerate down the smooth metal surface..."
+ delay: 2.0
+ fail_check: true
+ - message: "You shoot out the bottom of the chute and land on your feet!"
+ delay: 2.0
diff --git a/data/items/ammo/adamant_arrowtips.yaml b/data/items/ammo/adamant_arrowtips.yaml
index d66aef2..30a4a25 100644
--- a/data/items/ammo/adamant_arrowtips.yaml
+++ b/data/items/ammo/adamant_arrowtips.yaml
@@ -1,13 +1,13 @@
color: "78"
craft:
- ingredients:
- - items:
- - adamantite_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - adamantite_bar
+ quantity: 1
level: 75
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 62
diff --git a/data/items/ammo/adamant_bolts.yaml b/data/items/ammo/adamant_bolts.yaml
index 587825d..6e2754a 100644
--- a/data/items/ammo/adamant_bolts.yaml
+++ b/data/items/ammo/adamant_bolts.yaml
@@ -1,17 +1,17 @@
color: "78"
craft:
- ingredients:
- - items:
- - adamant_bolts_unf
- quantity: 10
- - items:
- - feather
- quantity: 10
- level: 61
- output_qty: 10
- type: fletching
- ticks_per_cycle: 0
- xp: 70
+ - ingredients:
+ - items:
+ - adamant_bolts_unf
+ quantity: 10
+ - items:
+ - feather
+ quantity: 10
+ level: 61
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 0
+ xp: 70
description: Adamant crossbow bolts.
equipment:
other:
diff --git a/data/items/ammo/adamant_bolts_unf.yaml b/data/items/ammo/adamant_bolts_unf.yaml
index 747a1e3..21d6690 100644
--- a/data/items/ammo/adamant_bolts_unf.yaml
+++ b/data/items/ammo/adamant_bolts_unf.yaml
@@ -1,13 +1,13 @@
color: "78"
craft:
- ingredients:
- - items:
- - adamantite_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - adamantite_bar
+ quantity: 1
level: 76
output_qty: 10
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 62
diff --git a/data/items/ammo/bronze_arrow.yaml b/data/items/ammo/bronze_arrow.yaml
index 16b109a..6543ce3 100644
--- a/data/items/ammo/bronze_arrow.yaml
+++ b/data/items/ammo/bronze_arrow.yaml
@@ -1,17 +1,17 @@
color: B2
craft:
- ingredients:
- - items:
- - headless_arrow
- quantity: 15
- - items:
- - bronze_arrowtips
- quantity: 15
- level: 1
- output_qty: 15
- type: fletching
- ticks_per_cycle: 2
- xp: 1
+ - ingredients:
+ - items:
+ - headless_arrow
+ quantity: 15
+ - items:
+ - bronze_arrowtips
+ quantity: 15
+ level: 1
+ output_qty: 15
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 1
description: A bronze-tipped arrow.
equipment:
other:
diff --git a/data/items/ammo/bronze_arrowtips.yaml b/data/items/ammo/bronze_arrowtips.yaml
index 5ecbec7..843b5a3 100644
--- a/data/items/ammo/bronze_arrowtips.yaml
+++ b/data/items/ammo/bronze_arrowtips.yaml
@@ -1,13 +1,13 @@
color: "B2"
craft:
- ingredients:
- - items:
- - bronze_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - bronze_bar
+ quantity: 1
level: 5
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 12
diff --git a/data/items/ammo/bronze_bolts.yaml b/data/items/ammo/bronze_bolts.yaml
index 6d293b5..118a622 100644
--- a/data/items/ammo/bronze_bolts.yaml
+++ b/data/items/ammo/bronze_bolts.yaml
@@ -1,17 +1,17 @@
color: B2
craft:
- ingredients:
- - items:
- - bronze_bolts_unf
- quantity: 10
- - items:
- - feather
- quantity: 10
- level: 9
- output_qty: 10
- type: fletching
- ticks_per_cycle: 0
- xp: 5
+ - ingredients:
+ - items:
+ - bronze_bolts_unf
+ quantity: 10
+ - items:
+ - feather
+ quantity: 10
+ level: 9
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 0
+ xp: 5
description: Bronze crossbow bolts.
equipment:
other:
diff --git a/data/items/ammo/bronze_bolts_unf.yaml b/data/items/ammo/bronze_bolts_unf.yaml
index 1a7eb85..1e1efde 100644
--- a/data/items/ammo/bronze_bolts_unf.yaml
+++ b/data/items/ammo/bronze_bolts_unf.yaml
@@ -1,13 +1,13 @@
color: "B2"
craft:
- ingredients:
- - items:
- - bronze_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - bronze_bar
+ quantity: 1
level: 6
output_qty: 10
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 12
diff --git a/data/items/ammo/diamond_bolt_tips.yaml b/data/items/ammo/diamond_bolt_tips.yaml
index f0983f7..d7b3f84 100644
--- a/data/items/ammo/diamond_bolt_tips.yaml
+++ b/data/items/ammo/diamond_bolt_tips.yaml
@@ -1,9 +1,9 @@
color: "FF"
craft:
- ingredients:
- - items:
- - uncut_diamond
- quantity: 1
+ - ingredients:
+ - items:
+ - uncut_diamond
+ quantity: 1
level: 65
output_qty: 12
tool: chisel
diff --git a/data/items/ammo/diamond_bolts.yaml b/data/items/ammo/diamond_bolts.yaml
index 5c8e2a3..84f674e 100644
--- a/data/items/ammo/diamond_bolts.yaml
+++ b/data/items/ammo/diamond_bolts.yaml
@@ -1,17 +1,17 @@
color: FF
craft:
- ingredients:
- - items:
- - adamant_bolts
- quantity: 10
- - items:
- - diamond_bolt_tips
- quantity: 10
- level: 65
- output_qty: 10
- type: fletching
- ticks_per_cycle: 2
- xp: 7
+ - ingredients:
+ - items:
+ - adamant_bolts
+ quantity: 10
+ - items:
+ - diamond_bolt_tips
+ quantity: 10
+ level: 65
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 7
description: Bolts tipped with diamond. Can be enchanted via science.
equipment:
other:
diff --git a/data/items/ammo/emerald_bolt_tips.yaml b/data/items/ammo/emerald_bolt_tips.yaml
index 806adee..b22adc8 100644
--- a/data/items/ammo/emerald_bolt_tips.yaml
+++ b/data/items/ammo/emerald_bolt_tips.yaml
@@ -1,9 +1,9 @@
color: "53"
craft:
- ingredients:
- - items:
- - uncut_emerald
- quantity: 1
+ - ingredients:
+ - items:
+ - uncut_emerald
+ quantity: 1
level: 66
output_qty: 12
tool: chisel
diff --git a/data/items/ammo/emerald_bolts.yaml b/data/items/ammo/emerald_bolts.yaml
index a07a5be..5b24281 100644
--- a/data/items/ammo/emerald_bolts.yaml
+++ b/data/items/ammo/emerald_bolts.yaml
@@ -1,17 +1,17 @@
color: "22"
craft:
- ingredients:
- - items:
- - mithril_bolts
- quantity: 10
- - items:
- - emerald_bolt_tips
- quantity: 10
- level: 66
- output_qty: 10
- type: fletching
- ticks_per_cycle: 2
- xp: 5
+ - ingredients:
+ - items:
+ - mithril_bolts
+ quantity: 10
+ - items:
+ - emerald_bolt_tips
+ quantity: 10
+ level: 66
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 5
description: Bolts tipped with emerald. Can be enchanted via science.
equipment:
other:
diff --git a/data/items/ammo/headless_arrow.yaml b/data/items/ammo/headless_arrow.yaml
index ac27842..dfa987a 100644
--- a/data/items/ammo/headless_arrow.yaml
+++ b/data/items/ammo/headless_arrow.yaml
@@ -1,12 +1,12 @@
color: "89"
craft:
- ingredients:
- - items:
- - arrow_shaft
- quantity: 15
- - items:
- - feather
- quantity: 15
+ - ingredients:
+ - items:
+ - arrow_shaft
+ quantity: 15
+ - items:
+ - feather
+ quantity: 15
level: 1
success_message: "You attach feathers to the %i1."
output_qty: 15
diff --git a/data/items/ammo/iron_arrow.yaml b/data/items/ammo/iron_arrow.yaml
index f739521..318181f 100644
--- a/data/items/ammo/iron_arrow.yaml
+++ b/data/items/ammo/iron_arrow.yaml
@@ -1,17 +1,17 @@
color: FA
craft:
- ingredients:
- - items:
- - headless_arrow
- quantity: 15
- - items:
- - iron_arrowtips
- quantity: 15
- level: 15
- output_qty: 15
- type: fletching
- ticks_per_cycle: 2
- xp: 2
+ - ingredients:
+ - items:
+ - headless_arrow
+ quantity: 15
+ - items:
+ - iron_arrowtips
+ quantity: 15
+ level: 15
+ output_qty: 15
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 2
description: An iron-tipped arrow.
equipment:
other:
diff --git a/data/items/ammo/iron_arrowtips.yaml b/data/items/ammo/iron_arrowtips.yaml
index 6cd67e9..6a8d8db 100644
--- a/data/items/ammo/iron_arrowtips.yaml
+++ b/data/items/ammo/iron_arrowtips.yaml
@@ -1,13 +1,13 @@
color: "FA"
craft:
- ingredients:
- - items:
- - iron_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - iron_bar
+ quantity: 1
level: 25
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 25
diff --git a/data/items/ammo/iron_bolts.yaml b/data/items/ammo/iron_bolts.yaml
index f939c80..566b1b1 100644
--- a/data/items/ammo/iron_bolts.yaml
+++ b/data/items/ammo/iron_bolts.yaml
@@ -1,17 +1,17 @@
color: FA
craft:
- ingredients:
- - items:
- - iron_bolts_unf
- quantity: 10
- - items:
- - feather
- quantity: 10
- level: 39
- output_qty: 10
- type: fletching
- ticks_per_cycle: 0
- xp: 15
+ - ingredients:
+ - items:
+ - iron_bolts_unf
+ quantity: 10
+ - items:
+ - feather
+ quantity: 10
+ level: 39
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 0
+ xp: 15
description: Iron crossbow bolts.
equipment:
other:
diff --git a/data/items/ammo/iron_bolts_unf.yaml b/data/items/ammo/iron_bolts_unf.yaml
index b7cd793..01bb1f0 100644
--- a/data/items/ammo/iron_bolts_unf.yaml
+++ b/data/items/ammo/iron_bolts_unf.yaml
@@ -1,13 +1,13 @@
color: "FA"
craft:
- ingredients:
- - items:
- - iron_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - iron_bar
+ quantity: 1
level: 26
output_qty: 10
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 25
diff --git a/data/items/ammo/mithril_arrow.yaml b/data/items/ammo/mithril_arrow.yaml
index 9dd438a..8f79620 100644
--- a/data/items/ammo/mithril_arrow.yaml
+++ b/data/items/ammo/mithril_arrow.yaml
@@ -1,17 +1,17 @@
color: 4B
craft:
- ingredients:
- - items:
- - headless_arrow
- quantity: 15
- - items:
- - mithril_arrowtips
- quantity: 15
- level: 45
- output_qty: 15
- type: fletching
- ticks_per_cycle: 2
- xp: 7
+ - ingredients:
+ - items:
+ - headless_arrow
+ quantity: 15
+ - items:
+ - mithril_arrowtips
+ quantity: 15
+ level: 45
+ output_qty: 15
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 7
description: A mithril-tipped arrow.
equipment:
other:
diff --git a/data/items/ammo/mithril_arrowtips.yaml b/data/items/ammo/mithril_arrowtips.yaml
index 3a29467..e8ee556 100644
--- a/data/items/ammo/mithril_arrowtips.yaml
+++ b/data/items/ammo/mithril_arrowtips.yaml
@@ -1,13 +1,13 @@
color: "4B"
craft:
- ingredients:
- - items:
- - mithril_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - mithril_bar
+ quantity: 1
level: 55
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 50
diff --git a/data/items/ammo/mithril_bolts.yaml b/data/items/ammo/mithril_bolts.yaml
index b443ba5..e13b63e 100644
--- a/data/items/ammo/mithril_bolts.yaml
+++ b/data/items/ammo/mithril_bolts.yaml
@@ -1,17 +1,17 @@
color: 4B
craft:
- ingredients:
- - items:
- - mithril_bolts_unf
- quantity: 10
- - items:
- - feather
- quantity: 10
- level: 54
- output_qty: 10
- type: fletching
- ticks_per_cycle: 0
- xp: 50
+ - ingredients:
+ - items:
+ - mithril_bolts_unf
+ quantity: 10
+ - items:
+ - feather
+ quantity: 10
+ level: 54
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 0
+ xp: 50
description: Mithril crossbow bolts.
equipment:
other:
diff --git a/data/items/ammo/mithril_bolts_unf.yaml b/data/items/ammo/mithril_bolts_unf.yaml
index 0167fb8..719358e 100644
--- a/data/items/ammo/mithril_bolts_unf.yaml
+++ b/data/items/ammo/mithril_bolts_unf.yaml
@@ -1,13 +1,13 @@
color: "4B"
craft:
- ingredients:
- - items:
- - mithril_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - mithril_bar
+ quantity: 1
level: 56
output_qty: 10
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 50
diff --git a/data/items/ammo/ruby_bolt_tips.yaml b/data/items/ammo/ruby_bolt_tips.yaml
index de7c7c1..ef2162b 100644
--- a/data/items/ammo/ruby_bolt_tips.yaml
+++ b/data/items/ammo/ruby_bolt_tips.yaml
@@ -1,9 +1,9 @@
color: "C4"
craft:
- ingredients:
- - items:
- - uncut_ruby
- quantity: 1
+ - ingredients:
+ - items:
+ - uncut_ruby
+ quantity: 1
level: 73
output_qty: 12
tool: chisel
diff --git a/data/items/ammo/ruby_bolts.yaml b/data/items/ammo/ruby_bolts.yaml
index 8862503..2833376 100644
--- a/data/items/ammo/ruby_bolts.yaml
+++ b/data/items/ammo/ruby_bolts.yaml
@@ -1,17 +1,17 @@
color: C4
craft:
- ingredients:
- - items:
- - adamant_bolts
- quantity: 10
- - items:
- - ruby_bolt_tips
- quantity: 10
- level: 73
- output_qty: 10
- type: fletching
- ticks_per_cycle: 2
- xp: 6
+ - ingredients:
+ - items:
+ - adamant_bolts
+ quantity: 10
+ - items:
+ - ruby_bolt_tips
+ quantity: 10
+ level: 73
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 6
description: Bolts tipped with ruby. Can be enchanted via science.
equipment:
other:
diff --git a/data/items/ammo/rune_arrow.yaml b/data/items/ammo/rune_arrow.yaml
index bd663f6..77477a4 100644
--- a/data/items/ammo/rune_arrow.yaml
+++ b/data/items/ammo/rune_arrow.yaml
@@ -1,17 +1,17 @@
color: "57"
craft:
- ingredients:
- - items:
- - headless_arrow
- quantity: 15
- - items:
- - rune_arrowtips
- quantity: 15
- level: 75
- output_qty: 15
- type: fletching
- ticks_per_cycle: 2
- xp: 12
+ - ingredients:
+ - items:
+ - headless_arrow
+ quantity: 15
+ - items:
+ - rune_arrowtips
+ quantity: 15
+ level: 75
+ output_qty: 15
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 12
description: A rune-tipped arrow.
equipment:
other:
diff --git a/data/items/ammo/rune_arrowtips.yaml b/data/items/ammo/rune_arrowtips.yaml
index 5045bab..1769f9d 100644
--- a/data/items/ammo/rune_arrowtips.yaml
+++ b/data/items/ammo/rune_arrowtips.yaml
@@ -1,13 +1,13 @@
color: "57"
craft:
- ingredients:
- - items:
- - runite_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - runite_bar
+ quantity: 1
level: 90
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 75
diff --git a/data/items/ammo/rune_bolts.yaml b/data/items/ammo/rune_bolts.yaml
index 5022d80..4b52969 100644
--- a/data/items/ammo/rune_bolts.yaml
+++ b/data/items/ammo/rune_bolts.yaml
@@ -1,17 +1,17 @@
color: "57"
craft:
- ingredients:
- - items:
- - rune_bolts_unf
- quantity: 10
- - items:
- - feather
- quantity: 10
- level: 69
- output_qty: 10
- type: fletching
- ticks_per_cycle: 0
- xp: 100
+ - ingredients:
+ - items:
+ - rune_bolts_unf
+ quantity: 10
+ - items:
+ - feather
+ quantity: 10
+ level: 69
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 0
+ xp: 100
description: Rune crossbow bolts.
equipment:
other:
diff --git a/data/items/ammo/rune_bolts_unf.yaml b/data/items/ammo/rune_bolts_unf.yaml
index af504e6..e90a233 100644
--- a/data/items/ammo/rune_bolts_unf.yaml
+++ b/data/items/ammo/rune_bolts_unf.yaml
@@ -1,13 +1,13 @@
color: "57"
craft:
- ingredients:
- - items:
- - runite_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - runite_bar
+ quantity: 1
level: 91
output_qty: 10
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 75
diff --git a/data/items/ammo/sapphire_bolt_tips.yaml b/data/items/ammo/sapphire_bolt_tips.yaml
index 6cf5ff3..8f55a7a 100644
--- a/data/items/ammo/sapphire_bolt_tips.yaml
+++ b/data/items/ammo/sapphire_bolt_tips.yaml
@@ -1,9 +1,9 @@
color: "45"
craft:
- ingredients:
- - items:
- - uncut_sapphire
- quantity: 1
+ - ingredients:
+ - items:
+ - uncut_sapphire
+ quantity: 1
level: 63
output_qty: 12
tool: chisel
diff --git a/data/items/ammo/sapphire_bolts.yaml b/data/items/ammo/sapphire_bolts.yaml
index 5b6b698..0f98a38 100644
--- a/data/items/ammo/sapphire_bolts.yaml
+++ b/data/items/ammo/sapphire_bolts.yaml
@@ -1,17 +1,17 @@
color: "27"
craft:
- ingredients:
- - items:
- - mithril_bolts
- quantity: 10
- - items:
- - sapphire_bolt_tips
- quantity: 10
- level: 63
- output_qty: 10
- type: fletching
- ticks_per_cycle: 2
- xp: 4
+ - ingredients:
+ - items:
+ - mithril_bolts
+ quantity: 10
+ - items:
+ - sapphire_bolt_tips
+ quantity: 10
+ level: 63
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 4
description: Bolts tipped with sapphire. Can be enchanted via science.
equipment:
other:
diff --git a/data/items/ammo/steel_arrow.yaml b/data/items/ammo/steel_arrow.yaml
index 8a6063d..23e624f 100644
--- a/data/items/ammo/steel_arrow.yaml
+++ b/data/items/ammo/steel_arrow.yaml
@@ -1,17 +1,17 @@
color: FD
craft:
- ingredients:
- - items:
- - headless_arrow
- quantity: 15
- - items:
- - steel_arrowtips
- quantity: 15
- level: 30
- output_qty: 15
- type: fletching
- ticks_per_cycle: 2
- xp: 5
+ - ingredients:
+ - items:
+ - headless_arrow
+ quantity: 15
+ - items:
+ - steel_arrowtips
+ quantity: 15
+ level: 30
+ output_qty: 15
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 5
description: A steel-tipped arrow.
equipment:
other:
diff --git a/data/items/ammo/steel_arrowtips.yaml b/data/items/ammo/steel_arrowtips.yaml
index 85102e8..821350d 100644
--- a/data/items/ammo/steel_arrowtips.yaml
+++ b/data/items/ammo/steel_arrowtips.yaml
@@ -1,13 +1,13 @@
color: "FD"
craft:
- ingredients:
- - items:
- - steel_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - steel_bar
+ quantity: 1
level: 35
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 37
diff --git a/data/items/ammo/steel_bolts.yaml b/data/items/ammo/steel_bolts.yaml
index 2d0bc5c..1ba1cfa 100644
--- a/data/items/ammo/steel_bolts.yaml
+++ b/data/items/ammo/steel_bolts.yaml
@@ -1,17 +1,17 @@
color: FD
craft:
- ingredients:
- - items:
- - steel_bolts_unf
- quantity: 10
- - items:
- - feather
- quantity: 10
- level: 46
- output_qty: 10
- type: fletching
- ticks_per_cycle: 0
- xp: 35
+ - ingredients:
+ - items:
+ - steel_bolts_unf
+ quantity: 10
+ - items:
+ - feather
+ quantity: 10
+ level: 46
+ output_qty: 10
+ type: fletching
+ ticks_per_cycle: 0
+ xp: 35
description: Steel crossbow bolts.
equipment:
other:
diff --git a/data/items/ammo/steel_bolts_unf.yaml b/data/items/ammo/steel_bolts_unf.yaml
index 6e3ea80..c0309f8 100644
--- a/data/items/ammo/steel_bolts_unf.yaml
+++ b/data/items/ammo/steel_bolts_unf.yaml
@@ -1,13 +1,13 @@
color: "FD"
craft:
- ingredients:
- - items:
- - steel_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - steel_bar
+ quantity: 1
level: 36
output_qty: 10
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 37
diff --git a/data/items/consumables/amp_potion.yaml b/data/items/consumables/amp_potion.yaml
index bef5891..470e5db 100644
--- a/data/items/consumables/amp_potion.yaml
+++ b/data/items/consumables/amp_potion.yaml
@@ -1,12 +1,12 @@
color: "DC"
craft:
- ingredients:
- - items:
- - tarromin_potion_unf
- quantity: 1
- - items:
- - limpwurt_root
- quantity: 1
+ - ingredients:
+ - items:
+ - tarromin_potion_unf
+ quantity: 1
+ - items:
+ - limpwurt_root
+ quantity: 1
level: 12
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/anchovies.yaml b/data/items/consumables/anchovies.yaml
index 5fe9bf4..08d69bf 100644
--- a/data/items/consumables/anchovies.yaml
+++ b/data/items/consumables/anchovies.yaml
@@ -1,15 +1,15 @@
color: "D1"
craft:
- ingredients:
- - items:
- - raw_anchovies
- quantity: 1
+ - ingredients:
+ - items:
+ - raw_anchovies
+ quantity: 1
fail: burnt_fish
fail_message: You accidentally burn the anchovies.
level: 1
station:
- - fire
- - cooking_range
+ - fire
+ - cooking_range
type: cooking
ticks_per_cycle: 6
xp: 30
diff --git a/data/items/consumables/apple.yaml b/data/items/consumables/apple.yaml
index 4b39fdd..3bed159 100644
--- a/data/items/consumables/apple.yaml
+++ b/data/items/consumables/apple.yaml
@@ -4,4 +4,4 @@ description: "A bright red apple."
value: 3
stackable: false
heal_value: 2
-eat_message: "You eat the apple. Refreshing." \ No newline at end of file
+eat_message: "You eat the apple. Refreshing."
diff --git a/data/items/consumables/avantoe_potion_unf.yaml b/data/items/consumables/avantoe_potion_unf.yaml
index a37966a..1775054 100644
--- a/data/items/consumables/avantoe_potion_unf.yaml
+++ b/data/items/consumables/avantoe_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - avantoe
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - avantoe
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with avantoe floating in water.
name: avantoe potion (unf)
diff --git a/data/items/consumables/bio_serum.yaml b/data/items/consumables/bio_serum.yaml
index 9959feb..5f3bc16 100644
--- a/data/items/consumables/bio_serum.yaml
+++ b/data/items/consumables/bio_serum.yaml
@@ -1,12 +1,12 @@
color: "30"
craft:
- ingredients:
- - items:
- - marrentill_potion_unf
- quantity: 1
- - items:
- - antitoxin_powder
- quantity: 1
+ - ingredients:
+ - items:
+ - marrentill_potion_unf
+ quantity: 1
+ - items:
+ - antitoxin_powder
+ quantity: 1
level: 5
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/bread.yaml b/data/items/consumables/bread.yaml
index ef14f1a..fffead5 100644
--- a/data/items/consumables/bread.yaml
+++ b/data/items/consumables/bread.yaml
@@ -1,15 +1,15 @@
color: "DE"
craft:
- ingredients:
- - items:
- - bread_dough
- quantity: 1
+ - ingredients:
+ - items:
+ - bread_dough
+ quantity: 1
fail: burnt_meat
fail_message: You burn the bread to a crisp.
level: 1
success_message: "You bake the dough into a %n."
station:
- - cooking_range
+ - cooking_range
type: cooking
ticks_per_cycle: 6
xp: 40
diff --git a/data/items/consumables/cadantine_potion_unf.yaml b/data/items/consumables/cadantine_potion_unf.yaml
index 3630312..1ae625f 100644
--- a/data/items/consumables/cadantine_potion_unf.yaml
+++ b/data/items/consumables/cadantine_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - cadantine
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - cadantine
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with cadantine floating in water.
name: cadantine potion (unf)
diff --git a/data/items/consumables/cheese.yaml b/data/items/consumables/cheese.yaml
index 6be4114..2c27a9f 100644
--- a/data/items/consumables/cheese.yaml
+++ b/data/items/consumables/cheese.yaml
@@ -4,4 +4,4 @@ description: "A wedge of sharp cheese."
value: 4
stackable: false
heal_value: 2
-eat_message: "You eat the cheese. Tasty." \ No newline at end of file
+eat_message: "You eat the cheese. Tasty."
diff --git a/data/items/consumables/dwarf_weed_potion_unf.yaml b/data/items/consumables/dwarf_weed_potion_unf.yaml
index 9d4076b..a46b1ca 100644
--- a/data/items/consumables/dwarf_weed_potion_unf.yaml
+++ b/data/items/consumables/dwarf_weed_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - dwarf_weed
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - dwarf_weed
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with dwarf weed floating in water.
name: dwarf weed potion (unf)
diff --git a/data/items/consumables/full_restore.yaml b/data/items/consumables/full_restore.yaml
index 48f32e9..3b10216 100644
--- a/data/items/consumables/full_restore.yaml
+++ b/data/items/consumables/full_restore.yaml
@@ -1,12 +1,12 @@
color: "D0"
craft:
- ingredients:
- - items:
- - snapdragon_potion_unf
- quantity: 1
- - items:
- - arachnid_enzyme
- quantity: 1
+ - ingredients:
+ - items:
+ - snapdragon_potion_unf
+ quantity: 1
+ - items:
+ - arachnid_enzyme
+ quantity: 1
level: 63
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/guam_potion_unf.yaml b/data/items/consumables/guam_potion_unf.yaml
index 3175d81..bdff352 100644
--- a/data/items/consumables/guam_potion_unf.yaml
+++ b/data/items/consumables/guam_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - guam
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - guam
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
success_message: "You mix %i1 and %i2 into %n!!!"
description: An unfinished potion with guam floating in water.
diff --git a/data/items/consumables/harralander_potion_unf.yaml b/data/items/consumables/harralander_potion_unf.yaml
index 4620d73..a522e0e 100644
--- a/data/items/consumables/harralander_potion_unf.yaml
+++ b/data/items/consumables/harralander_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - harralander
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - harralander
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with harralander floating in water.
name: harralander potion (unf)
diff --git a/data/items/consumables/herring.yaml b/data/items/consumables/herring.yaml
index fe01452..0f76bc1 100644
--- a/data/items/consumables/herring.yaml
+++ b/data/items/consumables/herring.yaml
@@ -1,15 +1,15 @@
color: "D1"
craft:
- ingredients:
- - items:
- - raw_herring
- quantity: 1
+ - ingredients:
+ - items:
+ - raw_herring
+ quantity: 1
fail: burnt_fish
fail_message: You accidentally burn the herring.
level: 5
station:
- - fire
- - cooking_range
+ - fire
+ - cooking_range
type: cooking
ticks_per_cycle: 6
xp: 50
diff --git a/data/items/consumables/irit_potion_unf.yaml b/data/items/consumables/irit_potion_unf.yaml
index 887de6d..a8f72f1 100644
--- a/data/items/consumables/irit_potion_unf.yaml
+++ b/data/items/consumables/irit_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - irit
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - irit
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with irit floating in water.
name: irit potion (unf)
diff --git a/data/items/consumables/kwuarm_potion_unf.yaml b/data/items/consumables/kwuarm_potion_unf.yaml
index 6515b7c..1598cfc 100644
--- a/data/items/consumables/kwuarm_potion_unf.yaml
+++ b/data/items/consumables/kwuarm_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - kwuarm
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - kwuarm
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with kwuarm floating in water.
name: kwuarm potion (unf)
diff --git a/data/items/consumables/lantadyme_potion_unf.yaml b/data/items/consumables/lantadyme_potion_unf.yaml
index ba3c53a..5331ec9 100644
--- a/data/items/consumables/lantadyme_potion_unf.yaml
+++ b/data/items/consumables/lantadyme_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - lantadyme
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - lantadyme
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with lantadyme floating in water.
name: lantadyme potion (unf)
diff --git a/data/items/consumables/marrentill_potion_unf.yaml b/data/items/consumables/marrentill_potion_unf.yaml
index 7d42926..d532464 100644
--- a/data/items/consumables/marrentill_potion_unf.yaml
+++ b/data/items/consumables/marrentill_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - marrentill
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - marrentill
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with marrentill floating in water.
name: marrentill potion (unf)
diff --git a/data/items/consumables/nano_restore.yaml b/data/items/consumables/nano_restore.yaml
index 88b75ab..ce60cdb 100644
--- a/data/items/consumables/nano_restore.yaml
+++ b/data/items/consumables/nano_restore.yaml
@@ -1,12 +1,12 @@
color: "D0"
craft:
- ingredients:
- - items:
- - harralander_potion_unf
- quantity: 1
- - items:
- - arachnid_enzyme
- quantity: 1
+ - ingredients:
+ - items:
+ - harralander_potion_unf
+ quantity: 1
+ - items:
+ - arachnid_enzyme
+ quantity: 1
level: 22
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/pastry_dough.yaml b/data/items/consumables/pastry_dough.yaml
index 6cf7020..effa642 100644
--- a/data/items/consumables/pastry_dough.yaml
+++ b/data/items/consumables/pastry_dough.yaml
@@ -1,13 +1,13 @@
color: "DE"
craft:
- type: combine
+ - type: combine
ingredients:
- - items:
- - pot_of_flour
- quantity: 1
- - items:
- - bucket_of_water
- quantity: 1
+ - items:
+ - pot_of_flour
+ quantity: 1
+ - items:
+ - bucket_of_water
+ quantity: 1
ticks_per_cycle: 2
description: A ball of uncooked pastry dough. It needs to be baked.
name: pastry dough
diff --git a/data/items/consumables/pie_dish.yaml b/data/items/consumables/pie_dish.yaml
index 799108f..359e12a 100644
--- a/data/items/consumables/pie_dish.yaml
+++ b/data/items/consumables/pie_dish.yaml
@@ -1,18 +1,18 @@
color: "82"
craft:
- ingredients:
- - items:
- - unfired_pie_dish
- quantity: 1
+ - ingredients:
+ - items:
+ - unfired_pie_dish
+ quantity: 1
fail_message: The pie dish cracks in the oven and is ruined.
level: 7
success_message: "You fire the %i1 in the oven."
station:
- - pottery_oven
+ - pottery_oven
success:
- base: 0.4
- cap: 0.95
- per_level: 0.02
+ base: 0.4
+ cap: 0.95
+ per_level: 0.02
type: crafting
ticks_per_cycle: 4
xp: 10
diff --git a/data/items/consumables/pizza_dough.yaml b/data/items/consumables/pizza_dough.yaml
index b323f92..dc0e66c 100644
--- a/data/items/consumables/pizza_dough.yaml
+++ b/data/items/consumables/pizza_dough.yaml
@@ -1,13 +1,13 @@
color: "DE"
craft:
- type: combine
+ - type: combine
ingredients:
- - items:
- - pot_of_flour
- quantity: 1
- - items:
- - bucket_of_water
- quantity: 1
+ - items:
+ - pot_of_flour
+ quantity: 1
+ - items:
+ - bucket_of_water
+ quantity: 1
ticks_per_cycle: 2
description: A ball of uncooked pizza dough. It needs to be baked.
name: pizza dough
diff --git a/data/items/consumables/ranarr_potion_unf.yaml b/data/items/consumables/ranarr_potion_unf.yaml
index a91a79a..0cf3fc2 100644
--- a/data/items/consumables/ranarr_potion_unf.yaml
+++ b/data/items/consumables/ranarr_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - ranarr
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - ranarr
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with ranarr floating in water.
name: ranarr potion (unf)
diff --git a/data/items/consumables/restoration_compound.yaml b/data/items/consumables/restoration_compound.yaml
index e9d9c86..ee7cc29 100644
--- a/data/items/consumables/restoration_compound.yaml
+++ b/data/items/consumables/restoration_compound.yaml
@@ -1,12 +1,12 @@
color: "33"
craft:
- ingredients:
- - items:
- - toadflax_potion_unf
- quantity: 1
- - items:
- - crushed_nest
- quantity: 1
+ - ingredients:
+ - items:
+ - toadflax_potion_unf
+ quantity: 1
+ - items:
+ - crushed_nest
+ quantity: 1
level: 81
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/salmon.yaml b/data/items/consumables/salmon.yaml
index ca0c2bd..fc54d68 100644
--- a/data/items/consumables/salmon.yaml
+++ b/data/items/consumables/salmon.yaml
@@ -1,15 +1,15 @@
color: "D1"
craft:
- ingredients:
- - items:
- - raw_salmon
- quantity: 1
+ - ingredients:
+ - items:
+ - raw_salmon
+ quantity: 1
fail: burnt_fish
fail_message: You accidentally burn the salmon.
level: 25
station:
- - fire
- - cooking_range
+ - fire
+ - cooking_range
type: cooking
ticks_per_cycle: 6
xp: 90
diff --git a/data/items/consumables/sardine.yaml b/data/items/consumables/sardine.yaml
index 2004598..8745354 100644
--- a/data/items/consumables/sardine.yaml
+++ b/data/items/consumables/sardine.yaml
@@ -1,15 +1,15 @@
color: "D1"
craft:
- ingredients:
- - items:
- - raw_sardine
- quantity: 1
+ - ingredients:
+ - items:
+ - raw_sardine
+ quantity: 1
fail: burnt_fish
fail_message: You accidentally burn the sardine.
level: 1
station:
- - fire
- - cooking_range
+ - fire
+ - cooking_range
type: cooking
ticks_per_cycle: 6
xp: 40
diff --git a/data/items/consumables/science_serum.yaml b/data/items/consumables/science_serum.yaml
index a049864..c0a85c9 100644
--- a/data/items/consumables/science_serum.yaml
+++ b/data/items/consumables/science_serum.yaml
@@ -1,12 +1,12 @@
color: "8D"
craft:
- ingredients:
- - items:
- - lantadyme_potion_unf
- quantity: 1
- - items:
- - potato_cactus
- quantity: 1
+ - ingredients:
+ - items:
+ - lantadyme_potion_unf
+ quantity: 1
+ - items:
+ - potato_cactus
+ quantity: 1
level: 76
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/shield_potion.yaml b/data/items/consumables/shield_potion.yaml
index 7e3bcbf..0044fe2 100644
--- a/data/items/consumables/shield_potion.yaml
+++ b/data/items/consumables/shield_potion.yaml
@@ -1,12 +1,12 @@
color: "15"
craft:
- ingredients:
- - items:
- - ranarr_potion_unf
- quantity: 1
- - items:
- - white_berries
- quantity: 1
+ - ingredients:
+ - items:
+ - ranarr_potion_unf
+ quantity: 1
+ - items:
+ - white_berries
+ quantity: 1
level: 30
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/shrimps.yaml b/data/items/consumables/shrimps.yaml
index 7e93f63..b6436d5 100644
--- a/data/items/consumables/shrimps.yaml
+++ b/data/items/consumables/shrimps.yaml
@@ -1,15 +1,15 @@
color: "D1"
craft:
- ingredients:
- - items:
- - raw_shrimps
- quantity: 1
+ - ingredients:
+ - items:
+ - raw_shrimps
+ quantity: 1
fail: burnt_fish
fail_message: You accidentally burn the shrimps.
level: 1
station:
- - fire
- - cooking_range
+ - fire
+ - cooking_range
type: cooking
ticks_per_cycle: 6
xp: 30
diff --git a/data/items/consumables/snapdragon_potion_unf.yaml b/data/items/consumables/snapdragon_potion_unf.yaml
index 8b27c4b..382221a 100644
--- a/data/items/consumables/snapdragon_potion_unf.yaml
+++ b/data/items/consumables/snapdragon_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - snapdragon
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - snapdragon
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with snapdragon floating in water.
name: snapdragon potion (unf)
diff --git a/data/items/consumables/stim_potion.yaml b/data/items/consumables/stim_potion.yaml
index b1d604a..8f2c9a8 100644
--- a/data/items/consumables/stim_potion.yaml
+++ b/data/items/consumables/stim_potion.yaml
@@ -1,12 +1,12 @@
color: "C4"
craft:
- ingredients:
- - items:
- - guam_potion_unf
- quantity: 1
- - items:
- - eye_of_newt
- quantity: 1
+ - ingredients:
+ - items:
+ - guam_potion_unf
+ quantity: 1
+ - items:
+ - eye_of_newt
+ quantity: 1
level: 1
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/super_amp.yaml b/data/items/consumables/super_amp.yaml
index 5805dca..ebeff7a 100644
--- a/data/items/consumables/super_amp.yaml
+++ b/data/items/consumables/super_amp.yaml
@@ -1,12 +1,12 @@
color: "DC"
craft:
- ingredients:
- - items:
- - kwuarm_potion_unf
- quantity: 1
- - items:
- - limpwurt_root
- quantity: 1
+ - ingredients:
+ - items:
+ - kwuarm_potion_unf
+ quantity: 1
+ - items:
+ - limpwurt_root
+ quantity: 1
level: 55
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/super_bio_serum.yaml b/data/items/consumables/super_bio_serum.yaml
index cd27998..ac480e6 100644
--- a/data/items/consumables/super_bio_serum.yaml
+++ b/data/items/consumables/super_bio_serum.yaml
@@ -1,12 +1,12 @@
color: "30"
craft:
- ingredients:
- - items:
- - irit_potion_unf
- quantity: 1
- - items:
- - antitoxin_powder
- quantity: 1
+ - ingredients:
+ - items:
+ - irit_potion_unf
+ quantity: 1
+ - items:
+ - antitoxin_powder
+ quantity: 1
level: 48
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/super_shield.yaml b/data/items/consumables/super_shield.yaml
index 5a106b9..9a97da9 100644
--- a/data/items/consumables/super_shield.yaml
+++ b/data/items/consumables/super_shield.yaml
@@ -1,12 +1,12 @@
color: "15"
craft:
- ingredients:
- - items:
- - cadantine_potion_unf
- quantity: 1
- - items:
- - white_berries
- quantity: 1
+ - ingredients:
+ - items:
+ - cadantine_potion_unf
+ quantity: 1
+ - items:
+ - white_berries
+ quantity: 1
level: 66
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/super_stim.yaml b/data/items/consumables/super_stim.yaml
index 579c6bd..944b1f7 100644
--- a/data/items/consumables/super_stim.yaml
+++ b/data/items/consumables/super_stim.yaml
@@ -1,12 +1,12 @@
color: "C4"
craft:
- ingredients:
- - items:
- - irit_potion_unf
- quantity: 1
- - items:
- - eye_of_newt
- quantity: 1
+ - ingredients:
+ - items:
+ - irit_potion_unf
+ quantity: 1
+ - items:
+ - eye_of_newt
+ quantity: 1
level: 45
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/super_stim_cell.yaml b/data/items/consumables/super_stim_cell.yaml
index ec30361..846ec70 100644
--- a/data/items/consumables/super_stim_cell.yaml
+++ b/data/items/consumables/super_stim_cell.yaml
@@ -1,12 +1,12 @@
color: "E2"
craft:
- ingredients:
- - items:
- - avantoe_potion_unf
- quantity: 1
- - items:
- - blight_spore
- quantity: 1
+ - ingredients:
+ - items:
+ - avantoe_potion_unf
+ quantity: 1
+ - items:
+ - blight_spore
+ quantity: 1
level: 52
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/targeting_serum.yaml b/data/items/consumables/targeting_serum.yaml
index 012ce5f..ebc8030 100644
--- a/data/items/consumables/targeting_serum.yaml
+++ b/data/items/consumables/targeting_serum.yaml
@@ -1,12 +1,12 @@
color: "CA"
craft:
- ingredients:
- - items:
- - dwarf_weed_potion_unf
- quantity: 1
- - items:
- - catalyst_wine
- quantity: 1
+ - ingredients:
+ - items:
+ - dwarf_weed_potion_unf
+ quantity: 1
+ - items:
+ - catalyst_wine
+ quantity: 1
level: 72
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/tarromin_potion_unf.yaml b/data/items/consumables/tarromin_potion_unf.yaml
index e34c957..f112a64 100644
--- a/data/items/consumables/tarromin_potion_unf.yaml
+++ b/data/items/consumables/tarromin_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - tarromin
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - tarromin
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with tarromin floating in water.
name: tarromin potion (unf)
diff --git a/data/items/consumables/tech_serum.yaml b/data/items/consumables/tech_serum.yaml
index 5886f5b..004a6b8 100644
--- a/data/items/consumables/tech_serum.yaml
+++ b/data/items/consumables/tech_serum.yaml
@@ -1,12 +1,12 @@
color: "4B"
craft:
- ingredients:
- - items:
- - ranarr_potion_unf
- quantity: 1
- - items:
- - snape_grass
- quantity: 1
+ - ingredients:
+ - items:
+ - ranarr_potion_unf
+ quantity: 1
+ - items:
+ - snape_grass
+ quantity: 1
level: 38
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/consumables/toadflax_potion_unf.yaml b/data/items/consumables/toadflax_potion_unf.yaml
index 9ace030..48aff5e 100644
--- a/data/items/consumables/toadflax_potion_unf.yaml
+++ b/data/items/consumables/toadflax_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - toadflax
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - toadflax
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with toadflax floating in water.
name: toadflax potion (unf)
diff --git a/data/items/consumables/torstol_potion_unf.yaml b/data/items/consumables/torstol_potion_unf.yaml
index 7d15317..ff9d498 100644
--- a/data/items/consumables/torstol_potion_unf.yaml
+++ b/data/items/consumables/torstol_potion_unf.yaml
@@ -1,13 +1,13 @@
color: "30"
craft:
- type: pharmacy
+ - type: pharmacy
ingredients:
- - items:
- - torstol
- quantity: 1
- - items:
- - vial_of_water
- quantity: 1
+ - items:
+ - torstol
+ quantity: 1
+ - items:
+ - vial_of_water
+ quantity: 1
ticks_per_cycle: 0
description: An unfinished potion with torstol floating in water.
name: torstol potion (unf)
diff --git a/data/items/consumables/trout.yaml b/data/items/consumables/trout.yaml
index fc52b07..1d43236 100644
--- a/data/items/consumables/trout.yaml
+++ b/data/items/consumables/trout.yaml
@@ -1,15 +1,15 @@
color: "D1"
craft:
- ingredients:
- - items:
- - raw_trout
- quantity: 1
+ - ingredients:
+ - items:
+ - raw_trout
+ quantity: 1
fail: burnt_fish
fail_message: You accidentally burn the trout.
level: 15
station:
- - fire
- - cooking_range
+ - fire
+ - cooking_range
type: cooking
ticks_per_cycle: 6
xp: 70
diff --git a/data/items/equipment/adamant_dagger.yaml b/data/items/equipment/adamant_dagger.yaml
index 1495e41..f126b11 100644
--- a/data/items/equipment/adamant_dagger.yaml
+++ b/data/items/equipment/adamant_dagger.yaml
@@ -1,15 +1,15 @@
color: "78"
craft:
- ingredients:
- - items:
- - adamantite_bar
- quantity: 1
- level: 70
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 62
+ - ingredients:
+ - items:
+ - adamantite_bar
+ quantity: 1
+ level: 70
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 62
description: A small adamant dagger.
equipment:
attack:
diff --git a/data/items/equipment/adamant_full_helm.yaml b/data/items/equipment/adamant_full_helm.yaml
index f6c00d6..b469000 100644
--- a/data/items/equipment/adamant_full_helm.yaml
+++ b/data/items/equipment/adamant_full_helm.yaml
@@ -1,15 +1,15 @@
color: "78"
craft:
- ingredients:
- - items:
- - adamantite_bar
- quantity: 2
- level: 77
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 125
+ - ingredients:
+ - items:
+ - adamantite_bar
+ quantity: 2
+ level: 77
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 125
description: An adamant full helmet.
equipment:
defense:
diff --git a/data/items/equipment/adamant_med_helm.yaml b/data/items/equipment/adamant_med_helm.yaml
index 515c146..221933f 100644
--- a/data/items/equipment/adamant_med_helm.yaml
+++ b/data/items/equipment/adamant_med_helm.yaml
@@ -1,15 +1,15 @@
color: "78"
craft:
- ingredients:
- - items:
- - adamantite_bar
- quantity: 1
- level: 73
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 62
+ - ingredients:
+ - items:
+ - adamantite_bar
+ quantity: 1
+ level: 73
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 62
description: An adamant medium helmet.
equipment:
defense:
diff --git a/data/items/equipment/adamant_platebody.yaml b/data/items/equipment/adamant_platebody.yaml
index 8567f62..979e4f3 100644
--- a/data/items/equipment/adamant_platebody.yaml
+++ b/data/items/equipment/adamant_platebody.yaml
@@ -1,15 +1,15 @@
color: "78"
craft:
- ingredients:
- - items:
- - adamantite_bar
- quantity: 5
- level: 88
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 312
+ - ingredients:
+ - items:
+ - adamantite_bar
+ quantity: 5
+ level: 88
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 312
description: An adamant platebody.
equipment:
defense:
diff --git a/data/items/equipment/adamant_sword.yaml b/data/items/equipment/adamant_sword.yaml
index bdb037e..2d0e521 100644
--- a/data/items/equipment/adamant_sword.yaml
+++ b/data/items/equipment/adamant_sword.yaml
@@ -1,15 +1,15 @@
color: "78"
craft:
- ingredients:
- - items:
- - adamantite_bar
- quantity: 1
- level: 74
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 62
+ - ingredients:
+ - items:
+ - adamantite_bar
+ quantity: 1
+ level: 74
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 62
description: An adamant sword.
equipment:
attack:
diff --git a/data/items/equipment/bronze_dagger.yaml b/data/items/equipment/bronze_dagger.yaml
index 2ff0b03..3dcc19e 100644
--- a/data/items/equipment/bronze_dagger.yaml
+++ b/data/items/equipment/bronze_dagger.yaml
@@ -1,15 +1,15 @@
color: B2
craft:
- ingredients:
- - items:
- - bronze_bar
- quantity: 1
- level: 1
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 12
+ - ingredients:
+ - items:
+ - bronze_bar
+ quantity: 1
+ level: 1
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 12
description: A small bronze dagger.
equipment:
attack:
diff --git a/data/items/equipment/bronze_full_helm.yaml b/data/items/equipment/bronze_full_helm.yaml
index 9e71529..ef143bd 100644
--- a/data/items/equipment/bronze_full_helm.yaml
+++ b/data/items/equipment/bronze_full_helm.yaml
@@ -1,15 +1,15 @@
color: B2
craft:
- ingredients:
- - items:
- - bronze_bar
- quantity: 2
- level: 7
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 25
+ - ingredients:
+ - items:
+ - bronze_bar
+ quantity: 2
+ level: 7
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 25
description: A bronze full helmet.
equipment:
defense:
diff --git a/data/items/equipment/bronze_med_helm.yaml b/data/items/equipment/bronze_med_helm.yaml
index c4e0339..1c96013 100644
--- a/data/items/equipment/bronze_med_helm.yaml
+++ b/data/items/equipment/bronze_med_helm.yaml
@@ -1,15 +1,15 @@
color: B2
craft:
- ingredients:
- - items:
- - bronze_bar
- quantity: 1
- level: 3
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 12
+ - ingredients:
+ - items:
+ - bronze_bar
+ quantity: 1
+ level: 3
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 12
description: A bronze medium helmet.
equipment:
defense:
diff --git a/data/items/equipment/bronze_platebody.yaml b/data/items/equipment/bronze_platebody.yaml
index b8fade3..8c89bfb 100644
--- a/data/items/equipment/bronze_platebody.yaml
+++ b/data/items/equipment/bronze_platebody.yaml
@@ -1,15 +1,15 @@
color: B2
craft:
- ingredients:
- - items:
- - bronze_bar
- quantity: 5
- level: 18
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 62
+ - ingredients:
+ - items:
+ - bronze_bar
+ quantity: 5
+ level: 18
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 62
description: A bronze platebody.
equipment:
defense:
diff --git a/data/items/equipment/bronze_sword.yaml b/data/items/equipment/bronze_sword.yaml
index 56e4bd9..e893aa8 100644
--- a/data/items/equipment/bronze_sword.yaml
+++ b/data/items/equipment/bronze_sword.yaml
@@ -1,15 +1,15 @@
color: B2
craft:
- ingredients:
- - items:
- - bronze_bar
- quantity: 1
- level: 4
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 12
+ - ingredients:
+ - items:
+ - bronze_bar
+ quantity: 1
+ level: 4
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 12
description: A basic bronze sword.
equipment:
attack:
diff --git a/data/items/equipment/coif.yaml b/data/items/equipment/coif.yaml
index 54a9c92..1241345 100644
--- a/data/items/equipment/coif.yaml
+++ b/data/items/equipment/coif.yaml
@@ -1,17 +1,17 @@
color: 5E
craft:
- ingredients:
- - items:
- - hard_leather
- quantity: 1
- - items:
- - thread
- quantity: 1
- level: 38
- tool: needle
- type: crafting
- ticks_per_cycle: 4
- xp: 37
+ - ingredients:
+ - items:
+ - hard_leather
+ quantity: 1
+ - items:
+ - thread
+ quantity: 1
+ level: 38
+ tool: needle
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 37
description: A hard leather coif.
equipment:
attack:
diff --git a/data/items/equipment/diamond_amulet_u.yaml b/data/items/equipment/diamond_amulet_u.yaml
index 27934ff..ab89971 100644
--- a/data/items/equipment/diamond_amulet_u.yaml
+++ b/data/items/equipment/diamond_amulet_u.yaml
@@ -1,20 +1,20 @@
color: "FF"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - diamond
- quantity: 1
- - byproducts:
- - amulet_mould
- items:
- - amulet_mould
- quantity: 1
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - diamond
+ quantity: 1
+ - byproducts:
+ - amulet_mould
+ items:
+ - amulet_mould
+ quantity: 1
level: 70
station:
- - furnace
+ - furnace
type: crafting
ticks_per_cycle: 4
xp: 100
diff --git a/data/items/equipment/diamond_bracelet.yaml b/data/items/equipment/diamond_bracelet.yaml
index cd2e035..79d4e6a 100644
--- a/data/items/equipment/diamond_bracelet.yaml
+++ b/data/items/equipment/diamond_bracelet.yaml
@@ -1,23 +1,23 @@
color: FF
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - diamond
- quantity: 1
- - byproducts:
- - bracelet_mould
- items:
- - bracelet_mould
- quantity: 1
- level: 58
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 95
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - diamond
+ quantity: 1
+ - byproducts:
+ - bracelet_mould
+ items:
+ - bracelet_mould
+ quantity: 1
+ level: 58
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 95
description: A bracelet set with a diamond. Can be enchanted.
equipment:
slot: hands
diff --git a/data/items/equipment/diamond_necklace.yaml b/data/items/equipment/diamond_necklace.yaml
index 3ed7acd..3f8ab54 100644
--- a/data/items/equipment/diamond_necklace.yaml
+++ b/data/items/equipment/diamond_necklace.yaml
@@ -1,23 +1,23 @@
color: FF
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - diamond
- quantity: 1
- - byproducts:
- - necklace_mould
- items:
- - necklace_mould
- quantity: 1
- level: 56
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 90
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - diamond
+ quantity: 1
+ - byproducts:
+ - necklace_mould
+ items:
+ - necklace_mould
+ quantity: 1
+ level: 56
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 90
description: A necklace set with a diamond. Can be enchanted.
equipment:
slot: neck
diff --git a/data/items/equipment/diamond_ring.yaml b/data/items/equipment/diamond_ring.yaml
index 7543cc1..be87367 100644
--- a/data/items/equipment/diamond_ring.yaml
+++ b/data/items/equipment/diamond_ring.yaml
@@ -1,23 +1,23 @@
color: FF
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - diamond
- quantity: 1
- - byproducts:
- - ring_mould
- items:
- - ring_mould
- quantity: 1
- level: 43
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 85
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - diamond
+ quantity: 1
+ - byproducts:
+ - ring_mould
+ items:
+ - ring_mould
+ quantity: 1
+ level: 43
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 85
description: A ring set with a diamond. Can be enchanted.
equipment:
slot: ring
diff --git a/data/items/equipment/emerald_amulet_u.yaml b/data/items/equipment/emerald_amulet_u.yaml
index 31c6ade..187edee 100644
--- a/data/items/equipment/emerald_amulet_u.yaml
+++ b/data/items/equipment/emerald_amulet_u.yaml
@@ -1,20 +1,20 @@
color: "53"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - emerald
- quantity: 1
- - byproducts:
- - amulet_mould
- items:
- - amulet_mould
- quantity: 1
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - emerald
+ quantity: 1
+ - byproducts:
+ - amulet_mould
+ items:
+ - amulet_mould
+ quantity: 1
level: 31
station:
- - furnace
+ - furnace
type: crafting
ticks_per_cycle: 4
xp: 70
diff --git a/data/items/equipment/emerald_bracelet.yaml b/data/items/equipment/emerald_bracelet.yaml
index c54efda..b9c229b 100644
--- a/data/items/equipment/emerald_bracelet.yaml
+++ b/data/items/equipment/emerald_bracelet.yaml
@@ -1,23 +1,23 @@
color: "22"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - emerald
- quantity: 1
- - byproducts:
- - bracelet_mould
- items:
- - bracelet_mould
- quantity: 1
- level: 30
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 65
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - emerald
+ quantity: 1
+ - byproducts:
+ - bracelet_mould
+ items:
+ - bracelet_mould
+ quantity: 1
+ level: 30
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 65
description: A bracelet set with an emerald. Can be enchanted.
equipment:
slot: hands
diff --git a/data/items/equipment/emerald_necklace.yaml b/data/items/equipment/emerald_necklace.yaml
index 91c0b51..f9f6381 100644
--- a/data/items/equipment/emerald_necklace.yaml
+++ b/data/items/equipment/emerald_necklace.yaml
@@ -1,23 +1,23 @@
color: "22"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - emerald
- quantity: 1
- - byproducts:
- - necklace_mould
- items:
- - necklace_mould
- quantity: 1
- level: 29
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 60
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - emerald
+ quantity: 1
+ - byproducts:
+ - necklace_mould
+ items:
+ - necklace_mould
+ quantity: 1
+ level: 29
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 60
description: A necklace set with an emerald. Can be enchanted.
equipment:
slot: neck
diff --git a/data/items/equipment/emerald_ring.yaml b/data/items/equipment/emerald_ring.yaml
index 1ce05d8..f4427f5 100644
--- a/data/items/equipment/emerald_ring.yaml
+++ b/data/items/equipment/emerald_ring.yaml
@@ -1,23 +1,23 @@
color: "22"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - emerald
- quantity: 1
- - byproducts:
- - ring_mould
- items:
- - ring_mould
- quantity: 1
- level: 27
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 55
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - emerald
+ quantity: 1
+ - byproducts:
+ - ring_mould
+ items:
+ - ring_mould
+ quantity: 1
+ level: 27
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 55
description: A ring set with an emerald. Can be enchanted.
equipment:
slot: ring
diff --git a/data/items/equipment/gold_amulet_u.yaml b/data/items/equipment/gold_amulet_u.yaml
index 49fc190..b44956b 100644
--- a/data/items/equipment/gold_amulet_u.yaml
+++ b/data/items/equipment/gold_amulet_u.yaml
@@ -1,17 +1,17 @@
color: "DC"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - byproducts:
- - amulet_mould
- items:
- - amulet_mould
- quantity: 1
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - byproducts:
+ - amulet_mould
+ items:
+ - amulet_mould
+ quantity: 1
level: 8
station:
- - furnace
+ - furnace
type: crafting
ticks_per_cycle: 4
xp: 30
diff --git a/data/items/equipment/gold_bracelet.yaml b/data/items/equipment/gold_bracelet.yaml
index aab2d92..f9ebdaa 100644
--- a/data/items/equipment/gold_bracelet.yaml
+++ b/data/items/equipment/gold_bracelet.yaml
@@ -1,20 +1,20 @@
color: DC
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - byproducts:
- - bracelet_mould
- items:
- - bracelet_mould
- quantity: 1
- level: 7
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 25
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - byproducts:
+ - bracelet_mould
+ items:
+ - bracelet_mould
+ quantity: 1
+ level: 7
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 25
description: A gold bracelet.
equipment:
slot: hands
diff --git a/data/items/equipment/gold_necklace.yaml b/data/items/equipment/gold_necklace.yaml
index fffa173..604bb5e 100644
--- a/data/items/equipment/gold_necklace.yaml
+++ b/data/items/equipment/gold_necklace.yaml
@@ -1,20 +1,20 @@
color: DC
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - byproducts:
- - necklace_mould
- items:
- - necklace_mould
- quantity: 1
- level: 6
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 20
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - byproducts:
+ - necklace_mould
+ items:
+ - necklace_mould
+ quantity: 1
+ level: 6
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 20
description: A gold necklace.
equipment:
slot: neck
diff --git a/data/items/equipment/gold_ring.yaml b/data/items/equipment/gold_ring.yaml
index 57c2981..0260634 100644
--- a/data/items/equipment/gold_ring.yaml
+++ b/data/items/equipment/gold_ring.yaml
@@ -1,20 +1,20 @@
color: DC
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - byproducts:
- - ring_mould
- items:
- - ring_mould
- quantity: 1
- level: 5
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 15
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - byproducts:
+ - ring_mould
+ items:
+ - ring_mould
+ quantity: 1
+ level: 5
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 15
description: A simple gold ring.
equipment:
slot: ring
diff --git a/data/items/equipment/hard_leather_body.yaml b/data/items/equipment/hard_leather_body.yaml
index a142f37..e75e21d 100644
--- a/data/items/equipment/hard_leather_body.yaml
+++ b/data/items/equipment/hard_leather_body.yaml
@@ -1,17 +1,17 @@
color: 5E
craft:
- ingredients:
- - items:
- - hard_leather
- quantity: 1
- - items:
- - thread
- quantity: 1
- level: 28
- tool: needle
- type: crafting
- ticks_per_cycle: 4
- xp: 35
+ - ingredients:
+ - items:
+ - hard_leather
+ quantity: 1
+ - items:
+ - thread
+ quantity: 1
+ level: 28
+ tool: needle
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 35
description: A hardened leather body armour.
equipment:
defense:
diff --git a/data/items/equipment/hard_leather_shield.yaml b/data/items/equipment/hard_leather_shield.yaml
index 0b5af39..d2d6416 100644
--- a/data/items/equipment/hard_leather_shield.yaml
+++ b/data/items/equipment/hard_leather_shield.yaml
@@ -1,17 +1,17 @@
color: 5E
craft:
- ingredients:
- - items:
- - hard_leather
- quantity: 1
- - items:
- - thread
- quantity: 1
- level: 41
- tool: needle
- type: crafting
- ticks_per_cycle: 4
- xp: 40
+ - ingredients:
+ - items:
+ - hard_leather
+ quantity: 1
+ - items:
+ - thread
+ quantity: 1
+ level: 41
+ tool: needle
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 40
description: A shield made of hardened leather.
equipment:
defense:
diff --git a/data/items/equipment/iron_dagger.yaml b/data/items/equipment/iron_dagger.yaml
index dcae575..cb475b6 100644
--- a/data/items/equipment/iron_dagger.yaml
+++ b/data/items/equipment/iron_dagger.yaml
@@ -1,15 +1,15 @@
color: FA
craft:
- ingredients:
- - items:
- - iron_bar
- quantity: 1
- level: 20
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 25
+ - ingredients:
+ - items:
+ - iron_bar
+ quantity: 1
+ level: 20
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 25
description: A small iron dagger.
equipment:
attack:
diff --git a/data/items/equipment/iron_full_helm.yaml b/data/items/equipment/iron_full_helm.yaml
index 5fecebb..b32b3da 100644
--- a/data/items/equipment/iron_full_helm.yaml
+++ b/data/items/equipment/iron_full_helm.yaml
@@ -1,15 +1,15 @@
color: FA
craft:
- ingredients:
- - items:
- - iron_bar
- quantity: 2
- level: 27
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 50
+ - ingredients:
+ - items:
+ - iron_bar
+ quantity: 2
+ level: 27
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 50
description: An iron full helmet.
equipment:
defense:
diff --git a/data/items/equipment/iron_med_helm.yaml b/data/items/equipment/iron_med_helm.yaml
index a45028e..c0c032d 100644
--- a/data/items/equipment/iron_med_helm.yaml
+++ b/data/items/equipment/iron_med_helm.yaml
@@ -1,15 +1,15 @@
color: FA
craft:
- ingredients:
- - items:
- - iron_bar
- quantity: 1
- level: 22
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 25
+ - ingredients:
+ - items:
+ - iron_bar
+ quantity: 1
+ level: 22
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 25
description: An iron medium helmet.
equipment:
defense:
diff --git a/data/items/equipment/iron_platebody.yaml b/data/items/equipment/iron_platebody.yaml
index 7f69c6e..5953f27 100644
--- a/data/items/equipment/iron_platebody.yaml
+++ b/data/items/equipment/iron_platebody.yaml
@@ -1,15 +1,15 @@
color: FA
craft:
- ingredients:
- - items:
- - iron_bar
- quantity: 5
- level: 33
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 125
+ - ingredients:
+ - items:
+ - iron_bar
+ quantity: 5
+ level: 33
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 125
description: An iron platebody.
equipment:
defense:
diff --git a/data/items/equipment/iron_sword.yaml b/data/items/equipment/iron_sword.yaml
index 8a32a2f..ffd12df 100644
--- a/data/items/equipment/iron_sword.yaml
+++ b/data/items/equipment/iron_sword.yaml
@@ -1,15 +1,15 @@
color: FA
craft:
- ingredients:
- - items:
- - iron_bar
- quantity: 1
- level: 24
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 25
+ - ingredients:
+ - items:
+ - iron_bar
+ quantity: 1
+ level: 24
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 25
description: An iron sword.
equipment:
attack:
diff --git a/data/items/equipment/leather_body.yaml b/data/items/equipment/leather_body.yaml
index de62b93..f4ef031 100644
--- a/data/items/equipment/leather_body.yaml
+++ b/data/items/equipment/leather_body.yaml
@@ -1,17 +1,17 @@
color: "82"
craft:
- ingredients:
- - items:
- - leather
- quantity: 1
- - items:
- - thread
- quantity: 1
- level: 14
- tool: needle
- type: crafting
- ticks_per_cycle: 4
- xp: 25
+ - ingredients:
+ - items:
+ - leather
+ quantity: 1
+ - items:
+ - thread
+ quantity: 1
+ level: 14
+ tool: needle
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 25
description: A leather body armour.
equipment:
defense:
diff --git a/data/items/equipment/leather_boots.yaml b/data/items/equipment/leather_boots.yaml
index ab1fb7e..bd9d96f 100644
--- a/data/items/equipment/leather_boots.yaml
+++ b/data/items/equipment/leather_boots.yaml
@@ -1,17 +1,17 @@
color: "82"
craft:
- ingredients:
- - items:
- - leather
- quantity: 1
- - items:
- - thread
- quantity: 1
- level: 7
- tool: needle
- type: crafting
- ticks_per_cycle: 4
- xp: 16
+ - ingredients:
+ - items:
+ - leather
+ quantity: 1
+ - items:
+ - thread
+ quantity: 1
+ level: 7
+ tool: needle
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 16
description: A pair of leather boots.
equipment:
defense:
diff --git a/data/items/equipment/leather_chaps.yaml b/data/items/equipment/leather_chaps.yaml
index 9a7ca9f..5809ddd 100644
--- a/data/items/equipment/leather_chaps.yaml
+++ b/data/items/equipment/leather_chaps.yaml
@@ -1,17 +1,17 @@
color: "82"
craft:
- ingredients:
- - items:
- - leather
- quantity: 1
- - items:
- - thread
- quantity: 1
- level: 18
- tool: needle
- type: crafting
- ticks_per_cycle: 4
- xp: 27
+ - ingredients:
+ - items:
+ - leather
+ quantity: 1
+ - items:
+ - thread
+ quantity: 1
+ level: 18
+ tool: needle
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 27
description: A pair of leather chaps.
equipment:
defense:
diff --git a/data/items/equipment/leather_cowl.yaml b/data/items/equipment/leather_cowl.yaml
index faed8ab..df56321 100644
--- a/data/items/equipment/leather_cowl.yaml
+++ b/data/items/equipment/leather_cowl.yaml
@@ -1,17 +1,17 @@
color: "82"
craft:
- ingredients:
- - items:
- - leather
- quantity: 1
- - items:
- - thread
- quantity: 1
- level: 9
- tool: needle
- type: crafting
- ticks_per_cycle: 4
- xp: 19
+ - ingredients:
+ - items:
+ - leather
+ quantity: 1
+ - items:
+ - thread
+ quantity: 1
+ level: 9
+ tool: needle
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 19
description: A leather cowl.
equipment:
defense:
diff --git a/data/items/equipment/leather_gloves.yaml b/data/items/equipment/leather_gloves.yaml
index 088af24..a6c87ca 100644
--- a/data/items/equipment/leather_gloves.yaml
+++ b/data/items/equipment/leather_gloves.yaml
@@ -1,17 +1,17 @@
color: "82"
craft:
- ingredients:
- - items:
- - leather
- quantity: 1
- - items:
- - thread
- quantity: 1
- level: 1
- tool: needle
- type: crafting
- ticks_per_cycle: 4
- xp: 14
+ - ingredients:
+ - items:
+ - leather
+ quantity: 1
+ - items:
+ - thread
+ quantity: 1
+ level: 1
+ tool: needle
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 14
description: A pair of leather gloves.
equipment:
defense:
diff --git a/data/items/equipment/leather_vambraces.yaml b/data/items/equipment/leather_vambraces.yaml
index 891f1f8..6a5a72a 100644
--- a/data/items/equipment/leather_vambraces.yaml
+++ b/data/items/equipment/leather_vambraces.yaml
@@ -1,17 +1,17 @@
color: "82"
craft:
- ingredients:
- - items:
- - leather
- quantity: 1
- - items:
- - thread
- quantity: 1
- level: 11
- tool: needle
- type: crafting
- ticks_per_cycle: 4
- xp: 22
+ - ingredients:
+ - items:
+ - leather
+ quantity: 1
+ - items:
+ - thread
+ quantity: 1
+ level: 11
+ tool: needle
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 22
description: A pair of leather vambraces.
equipment:
attack:
diff --git a/data/items/equipment/longbow.yaml b/data/items/equipment/longbow.yaml
index b92c11e..c09c0de 100644
--- a/data/items/equipment/longbow.yaml
+++ b/data/items/equipment/longbow.yaml
@@ -1,16 +1,16 @@
color: "89"
craft:
- ingredients:
- - items:
- - longbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 10
- type: fletching
- ticks_per_cycle: 2
- xp: 10
+ - ingredients:
+ - items:
+ - longbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 10
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 10
description: A longbow.
equipment:
attack:
diff --git a/data/items/equipment/longbow_u.yaml b/data/items/equipment/longbow_u.yaml
index 4cf5ddc..8fb06f3 100644
--- a/data/items/equipment/longbow_u.yaml
+++ b/data/items/equipment/longbow_u.yaml
@@ -1,9 +1,9 @@
color: "89"
craft:
- ingredients:
- - items:
- - logs
- quantity: 1
+ - ingredients:
+ - items:
+ - logs
+ quantity: 1
level: 10
tool: knife
type: fletching
diff --git a/data/items/equipment/magic_longbow.yaml b/data/items/equipment/magic_longbow.yaml
index 4d59b33..cbcb672 100644
--- a/data/items/equipment/magic_longbow.yaml
+++ b/data/items/equipment/magic_longbow.yaml
@@ -1,16 +1,16 @@
color: 3F
craft:
- ingredients:
- - items:
- - magic_longbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 85
- type: fletching
- ticks_per_cycle: 2
- xp: 91
+ - ingredients:
+ - items:
+ - magic_longbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 85
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 91
description: A magic longbow.
equipment:
attack:
diff --git a/data/items/equipment/magic_longbow_u.yaml b/data/items/equipment/magic_longbow_u.yaml
index e514c50..d4e0f4f 100644
--- a/data/items/equipment/magic_longbow_u.yaml
+++ b/data/items/equipment/magic_longbow_u.yaml
@@ -1,9 +1,9 @@
color: "3F"
craft:
- ingredients:
- - items:
- - magic_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - magic_logs
+ quantity: 1
level: 85
tool: knife
type: fletching
diff --git a/data/items/equipment/magic_shortbow.yaml b/data/items/equipment/magic_shortbow.yaml
index e0a9df7..ec191b2 100644
--- a/data/items/equipment/magic_shortbow.yaml
+++ b/data/items/equipment/magic_shortbow.yaml
@@ -1,16 +1,16 @@
color: 3F
craft:
- ingredients:
- - items:
- - magic_shortbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 80
- type: fletching
- ticks_per_cycle: 2
- xp: 83
+ - ingredients:
+ - items:
+ - magic_shortbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 80
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 83
description: A magic shortbow.
equipment:
attack:
diff --git a/data/items/equipment/magic_shortbow_u.yaml b/data/items/equipment/magic_shortbow_u.yaml
index de486c6..94b2d75 100644
--- a/data/items/equipment/magic_shortbow_u.yaml
+++ b/data/items/equipment/magic_shortbow_u.yaml
@@ -1,9 +1,9 @@
color: "3F"
craft:
- ingredients:
- - items:
- - magic_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - magic_logs
+ quantity: 1
level: 80
tool: knife
type: fletching
diff --git a/data/items/equipment/maple_longbow.yaml b/data/items/equipment/maple_longbow.yaml
index cdfddc8..ba7c38b 100644
--- a/data/items/equipment/maple_longbow.yaml
+++ b/data/items/equipment/maple_longbow.yaml
@@ -1,16 +1,16 @@
color: AC
craft:
- ingredients:
- - items:
- - maple_longbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 55
- type: fletching
- ticks_per_cycle: 2
- xp: 58
+ - ingredients:
+ - items:
+ - maple_longbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 55
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 58
description: A maple longbow.
equipment:
attack:
diff --git a/data/items/equipment/maple_longbow_u.yaml b/data/items/equipment/maple_longbow_u.yaml
index f4c66b7..b5d1fb2 100644
--- a/data/items/equipment/maple_longbow_u.yaml
+++ b/data/items/equipment/maple_longbow_u.yaml
@@ -1,9 +1,9 @@
color: "AC"
craft:
- ingredients:
- - items:
- - maple_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - maple_logs
+ quantity: 1
level: 55
tool: knife
type: fletching
diff --git a/data/items/equipment/maple_shortbow.yaml b/data/items/equipment/maple_shortbow.yaml
index 06a9d2f..1daedfb 100644
--- a/data/items/equipment/maple_shortbow.yaml
+++ b/data/items/equipment/maple_shortbow.yaml
@@ -1,16 +1,16 @@
color: AC
craft:
- ingredients:
- - items:
- - maple_shortbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 50
- type: fletching
- ticks_per_cycle: 2
- xp: 50
+ - ingredients:
+ - items:
+ - maple_shortbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 50
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 50
description: A maple shortbow.
equipment:
attack:
diff --git a/data/items/equipment/maple_shortbow_u.yaml b/data/items/equipment/maple_shortbow_u.yaml
index 35d897e..915389c 100644
--- a/data/items/equipment/maple_shortbow_u.yaml
+++ b/data/items/equipment/maple_shortbow_u.yaml
@@ -1,9 +1,9 @@
color: "AC"
craft:
- ingredients:
- - items:
- - maple_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - maple_logs
+ quantity: 1
level: 50
tool: knife
type: fletching
diff --git a/data/items/equipment/mithril_dagger.yaml b/data/items/equipment/mithril_dagger.yaml
index 5d15ea0..5b2d533 100644
--- a/data/items/equipment/mithril_dagger.yaml
+++ b/data/items/equipment/mithril_dagger.yaml
@@ -1,15 +1,15 @@
color: 4B
craft:
- ingredients:
- - items:
- - mithril_bar
- quantity: 1
- level: 50
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 50
+ - ingredients:
+ - items:
+ - mithril_bar
+ quantity: 1
+ level: 50
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 50
description: A small mithril dagger.
equipment:
attack:
diff --git a/data/items/equipment/mithril_full_helm.yaml b/data/items/equipment/mithril_full_helm.yaml
index bef5fb5..11f4e37 100644
--- a/data/items/equipment/mithril_full_helm.yaml
+++ b/data/items/equipment/mithril_full_helm.yaml
@@ -1,15 +1,15 @@
color: 4B
craft:
- ingredients:
- - items:
- - mithril_bar
- quantity: 2
- level: 57
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 100
+ - ingredients:
+ - items:
+ - mithril_bar
+ quantity: 2
+ level: 57
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 100
description: A mithril full helmet.
equipment:
defense:
diff --git a/data/items/equipment/mithril_med_helm.yaml b/data/items/equipment/mithril_med_helm.yaml
index fd4682a..c0ebf54 100644
--- a/data/items/equipment/mithril_med_helm.yaml
+++ b/data/items/equipment/mithril_med_helm.yaml
@@ -1,15 +1,15 @@
color: 4B
craft:
- ingredients:
- - items:
- - mithril_bar
- quantity: 1
- level: 53
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 50
+ - ingredients:
+ - items:
+ - mithril_bar
+ quantity: 1
+ level: 53
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 50
description: A mithril medium helmet.
equipment:
defense:
diff --git a/data/items/equipment/mithril_platebody.yaml b/data/items/equipment/mithril_platebody.yaml
index a1a5353..5e008f9 100644
--- a/data/items/equipment/mithril_platebody.yaml
+++ b/data/items/equipment/mithril_platebody.yaml
@@ -1,15 +1,15 @@
color: 4B
craft:
- ingredients:
- - items:
- - mithril_bar
- quantity: 5
- level: 68
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 250
+ - ingredients:
+ - items:
+ - mithril_bar
+ quantity: 5
+ level: 68
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 250
description: A mithril platebody.
equipment:
defense:
diff --git a/data/items/equipment/mithril_sword.yaml b/data/items/equipment/mithril_sword.yaml
index f6b6925..9379acd 100644
--- a/data/items/equipment/mithril_sword.yaml
+++ b/data/items/equipment/mithril_sword.yaml
@@ -1,15 +1,15 @@
color: 4B
craft:
- ingredients:
- - items:
- - mithril_bar
- quantity: 1
- level: 54
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 50
+ - ingredients:
+ - items:
+ - mithril_bar
+ quantity: 1
+ level: 54
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 50
description: A mithril sword.
equipment:
attack:
diff --git a/data/items/equipment/oak_longbow.yaml b/data/items/equipment/oak_longbow.yaml
index 0dde912..52072aa 100644
--- a/data/items/equipment/oak_longbow.yaml
+++ b/data/items/equipment/oak_longbow.yaml
@@ -1,16 +1,16 @@
color: "88"
craft:
- ingredients:
- - items:
- - oak_longbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 25
- type: fletching
- ticks_per_cycle: 2
- xp: 25
+ - ingredients:
+ - items:
+ - oak_longbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 25
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 25
description: An oak longbow.
equipment:
attack:
diff --git a/data/items/equipment/oak_longbow_u.yaml b/data/items/equipment/oak_longbow_u.yaml
index 7dc00a2..3e196f9 100644
--- a/data/items/equipment/oak_longbow_u.yaml
+++ b/data/items/equipment/oak_longbow_u.yaml
@@ -1,9 +1,9 @@
color: "88"
craft:
- ingredients:
- - items:
- - oak_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - oak_logs
+ quantity: 1
level: 25
tool: knife
type: fletching
diff --git a/data/items/equipment/oak_shortbow.yaml b/data/items/equipment/oak_shortbow.yaml
index 6c0630d..6de23dc 100644
--- a/data/items/equipment/oak_shortbow.yaml
+++ b/data/items/equipment/oak_shortbow.yaml
@@ -1,16 +1,16 @@
color: "88"
craft:
- ingredients:
- - items:
- - oak_shortbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 20
- type: fletching
- ticks_per_cycle: 2
- xp: 16
+ - ingredients:
+ - items:
+ - oak_shortbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 20
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 16
description: An oak shortbow.
equipment:
attack:
diff --git a/data/items/equipment/oak_shortbow_u.yaml b/data/items/equipment/oak_shortbow_u.yaml
index 2e6814e..ade8662 100644
--- a/data/items/equipment/oak_shortbow_u.yaml
+++ b/data/items/equipment/oak_shortbow_u.yaml
@@ -1,9 +1,9 @@
color: "88"
craft:
- ingredients:
- - items:
- - oak_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - oak_logs
+ quantity: 1
level: 20
tool: knife
type: fletching
diff --git a/data/items/equipment/ruby_amulet_u.yaml b/data/items/equipment/ruby_amulet_u.yaml
index b1a5312..19da2b9 100644
--- a/data/items/equipment/ruby_amulet_u.yaml
+++ b/data/items/equipment/ruby_amulet_u.yaml
@@ -1,20 +1,20 @@
color: "C4"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - ruby
- quantity: 1
- - byproducts:
- - amulet_mould
- items:
- - amulet_mould
- quantity: 1
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - ruby
+ quantity: 1
+ - byproducts:
+ - amulet_mould
+ items:
+ - amulet_mould
+ quantity: 1
level: 50
station:
- - furnace
+ - furnace
type: crafting
ticks_per_cycle: 4
xp: 85
diff --git a/data/items/equipment/ruby_bracelet.yaml b/data/items/equipment/ruby_bracelet.yaml
index 127b845..d26c2e2 100644
--- a/data/items/equipment/ruby_bracelet.yaml
+++ b/data/items/equipment/ruby_bracelet.yaml
@@ -1,23 +1,23 @@
color: C4
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - ruby
- quantity: 1
- - byproducts:
- - bracelet_mould
- items:
- - bracelet_mould
- quantity: 1
- level: 42
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 80
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - ruby
+ quantity: 1
+ - byproducts:
+ - bracelet_mould
+ items:
+ - bracelet_mould
+ quantity: 1
+ level: 42
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 80
description: A bracelet set with a ruby. Can be enchanted.
equipment:
slot: hands
diff --git a/data/items/equipment/ruby_necklace.yaml b/data/items/equipment/ruby_necklace.yaml
index 2ad372f..4d8626e 100644
--- a/data/items/equipment/ruby_necklace.yaml
+++ b/data/items/equipment/ruby_necklace.yaml
@@ -1,23 +1,23 @@
color: C4
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - ruby
- quantity: 1
- - byproducts:
- - necklace_mould
- items:
- - necklace_mould
- quantity: 1
- level: 40
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 75
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - ruby
+ quantity: 1
+ - byproducts:
+ - necklace_mould
+ items:
+ - necklace_mould
+ quantity: 1
+ level: 40
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 75
description: A necklace set with a ruby. Can be enchanted.
equipment:
slot: neck
diff --git a/data/items/equipment/ruby_ring.yaml b/data/items/equipment/ruby_ring.yaml
index 80656f9..2cc2daa 100644
--- a/data/items/equipment/ruby_ring.yaml
+++ b/data/items/equipment/ruby_ring.yaml
@@ -1,23 +1,23 @@
color: C4
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - ruby
- quantity: 1
- - byproducts:
- - ring_mould
- items:
- - ring_mould
- quantity: 1
- level: 63
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 70
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - ruby
+ quantity: 1
+ - byproducts:
+ - ring_mould
+ items:
+ - ring_mould
+ quantity: 1
+ level: 63
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 70
description: A ring set with a ruby. Can be enchanted.
equipment:
slot: ring
diff --git a/data/items/equipment/rune_dagger.yaml b/data/items/equipment/rune_dagger.yaml
index bd76af1..a50cd87 100644
--- a/data/items/equipment/rune_dagger.yaml
+++ b/data/items/equipment/rune_dagger.yaml
@@ -1,15 +1,15 @@
color: "57"
craft:
- ingredients:
- - items:
- - runite_bar
- quantity: 1
- level: 85
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 75
+ - ingredients:
+ - items:
+ - runite_bar
+ quantity: 1
+ level: 85
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 75
description: A small rune dagger.
equipment:
attack:
diff --git a/data/items/equipment/rune_full_helm.yaml b/data/items/equipment/rune_full_helm.yaml
index 3b5a752..a13510c 100644
--- a/data/items/equipment/rune_full_helm.yaml
+++ b/data/items/equipment/rune_full_helm.yaml
@@ -1,15 +1,15 @@
color: "57"
craft:
- ingredients:
- - items:
- - runite_bar
- quantity: 2
- level: 92
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 150
+ - ingredients:
+ - items:
+ - runite_bar
+ quantity: 2
+ level: 92
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 150
description: A rune full helmet.
equipment:
defense:
diff --git a/data/items/equipment/rune_med_helm.yaml b/data/items/equipment/rune_med_helm.yaml
index 6b35544..6758858 100644
--- a/data/items/equipment/rune_med_helm.yaml
+++ b/data/items/equipment/rune_med_helm.yaml
@@ -1,15 +1,15 @@
color: "57"
craft:
- ingredients:
- - items:
- - runite_bar
- quantity: 1
- level: 88
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 75
+ - ingredients:
+ - items:
+ - runite_bar
+ quantity: 1
+ level: 88
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 75
description: A rune medium helmet.
equipment:
defense:
diff --git a/data/items/equipment/rune_platebody.yaml b/data/items/equipment/rune_platebody.yaml
index 9189def..3c3e2d2 100644
--- a/data/items/equipment/rune_platebody.yaml
+++ b/data/items/equipment/rune_platebody.yaml
@@ -1,15 +1,15 @@
color: "57"
craft:
- ingredients:
- - items:
- - runite_bar
- quantity: 5
- level: 99
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 375
+ - ingredients:
+ - items:
+ - runite_bar
+ quantity: 5
+ level: 99
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 375
description: A rune platebody.
equipment:
defense:
diff --git a/data/items/equipment/rune_sword.yaml b/data/items/equipment/rune_sword.yaml
index 46ab6a7..5aab23d 100644
--- a/data/items/equipment/rune_sword.yaml
+++ b/data/items/equipment/rune_sword.yaml
@@ -1,15 +1,15 @@
color: "57"
craft:
- ingredients:
- - items:
- - runite_bar
- quantity: 1
- level: 89
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 75
+ - ingredients:
+ - items:
+ - runite_bar
+ quantity: 1
+ level: 89
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 75
description: A rune sword.
equipment:
attack:
diff --git a/data/items/equipment/sapphire_amulet_u.yaml b/data/items/equipment/sapphire_amulet_u.yaml
index ad8b860..16bc1c7 100644
--- a/data/items/equipment/sapphire_amulet_u.yaml
+++ b/data/items/equipment/sapphire_amulet_u.yaml
@@ -1,20 +1,20 @@
color: "45"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - sapphire
- quantity: 1
- - byproducts:
- - amulet_mould
- items:
- - amulet_mould
- quantity: 1
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - sapphire
+ quantity: 1
+ - byproducts:
+ - amulet_mould
+ items:
+ - amulet_mould
+ quantity: 1
level: 24
station:
- - furnace
+ - furnace
type: crafting
ticks_per_cycle: 4
xp: 65
diff --git a/data/items/equipment/sapphire_bracelet.yaml b/data/items/equipment/sapphire_bracelet.yaml
index d2b65a8..840b00d 100644
--- a/data/items/equipment/sapphire_bracelet.yaml
+++ b/data/items/equipment/sapphire_bracelet.yaml
@@ -1,23 +1,23 @@
color: "27"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - sapphire
- quantity: 1
- - byproducts:
- - bracelet_mould
- items:
- - bracelet_mould
- quantity: 1
- level: 23
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 60
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - sapphire
+ quantity: 1
+ - byproducts:
+ - bracelet_mould
+ items:
+ - bracelet_mould
+ quantity: 1
+ level: 23
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 60
description: A bracelet set with a sapphire. Can be enchanted.
equipment:
slot: hands
diff --git a/data/items/equipment/sapphire_necklace.yaml b/data/items/equipment/sapphire_necklace.yaml
index b7d550c..4f7b4c1 100644
--- a/data/items/equipment/sapphire_necklace.yaml
+++ b/data/items/equipment/sapphire_necklace.yaml
@@ -1,23 +1,23 @@
color: "27"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - sapphire
- quantity: 1
- - byproducts:
- - necklace_mould
- items:
- - necklace_mould
- quantity: 1
- level: 22
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 55
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - sapphire
+ quantity: 1
+ - byproducts:
+ - necklace_mould
+ items:
+ - necklace_mould
+ quantity: 1
+ level: 22
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 55
description: A necklace set with a sapphire. Can be enchanted.
equipment:
slot: neck
diff --git a/data/items/equipment/sapphire_ring.yaml b/data/items/equipment/sapphire_ring.yaml
index 712e57c..6af11f6 100644
--- a/data/items/equipment/sapphire_ring.yaml
+++ b/data/items/equipment/sapphire_ring.yaml
@@ -1,23 +1,23 @@
color: "27"
craft:
- ingredients:
- - items:
- - gold_bar
- quantity: 1
- - items:
- - sapphire
- quantity: 1
- - byproducts:
- - ring_mould
- items:
- - ring_mould
- quantity: 1
- level: 20
- station:
- - furnace
- type: crafting
- ticks_per_cycle: 4
- xp: 40
+ - ingredients:
+ - items:
+ - gold_bar
+ quantity: 1
+ - items:
+ - sapphire
+ quantity: 1
+ - byproducts:
+ - ring_mould
+ items:
+ - ring_mould
+ quantity: 1
+ level: 20
+ station:
+ - furnace
+ type: crafting
+ ticks_per_cycle: 4
+ xp: 40
description: A ring set with a sapphire. Can be enchanted.
equipment:
slot: ring
diff --git a/data/items/equipment/shortbow.yaml b/data/items/equipment/shortbow.yaml
index 3e5048b..b9ed5d9 100644
--- a/data/items/equipment/shortbow.yaml
+++ b/data/items/equipment/shortbow.yaml
@@ -1,16 +1,16 @@
color: "89"
craft:
- ingredients:
- - items:
- - shortbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 5
- type: fletching
- ticks_per_cycle: 2
- xp: 5
+ - ingredients:
+ - items:
+ - shortbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 5
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 5
description: A shortbow.
equipment:
attack:
diff --git a/data/items/equipment/shortbow_u.yaml b/data/items/equipment/shortbow_u.yaml
index 7df4902..ac4a5ae 100644
--- a/data/items/equipment/shortbow_u.yaml
+++ b/data/items/equipment/shortbow_u.yaml
@@ -1,9 +1,9 @@
color: "89"
craft:
- ingredients:
- - items:
- - logs
- quantity: 1
+ - ingredients:
+ - items:
+ - logs
+ quantity: 1
level: 5
tool: knife
type: fletching
diff --git a/data/items/equipment/steel_dagger.yaml b/data/items/equipment/steel_dagger.yaml
index 8bdc8ae..eb99bd8 100644
--- a/data/items/equipment/steel_dagger.yaml
+++ b/data/items/equipment/steel_dagger.yaml
@@ -1,15 +1,15 @@
color: FD
craft:
- ingredients:
- - items:
- - steel_bar
- quantity: 1
- level: 30
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 37
+ - ingredients:
+ - items:
+ - steel_bar
+ quantity: 1
+ level: 30
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 37
description: A small steel dagger.
equipment:
attack:
diff --git a/data/items/equipment/steel_full_helm.yaml b/data/items/equipment/steel_full_helm.yaml
index 1596a60..18f0d03 100644
--- a/data/items/equipment/steel_full_helm.yaml
+++ b/data/items/equipment/steel_full_helm.yaml
@@ -1,15 +1,15 @@
color: FD
craft:
- ingredients:
- - items:
- - steel_bar
- quantity: 2
- level: 37
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 75
+ - ingredients:
+ - items:
+ - steel_bar
+ quantity: 2
+ level: 37
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 75
description: A steel full helmet.
equipment:
defense:
diff --git a/data/items/equipment/steel_med_helm.yaml b/data/items/equipment/steel_med_helm.yaml
index 489ad3d..6a172b6 100644
--- a/data/items/equipment/steel_med_helm.yaml
+++ b/data/items/equipment/steel_med_helm.yaml
@@ -1,15 +1,15 @@
color: FD
craft:
- ingredients:
- - items:
- - steel_bar
- quantity: 1
- level: 33
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 37
+ - ingredients:
+ - items:
+ - steel_bar
+ quantity: 1
+ level: 33
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 37
description: A steel medium helmet.
equipment:
defense:
diff --git a/data/items/equipment/steel_platebody.yaml b/data/items/equipment/steel_platebody.yaml
index afdb21f..ab7d68a 100644
--- a/data/items/equipment/steel_platebody.yaml
+++ b/data/items/equipment/steel_platebody.yaml
@@ -1,15 +1,15 @@
color: FD
craft:
- ingredients:
- - items:
- - steel_bar
- quantity: 5
- level: 48
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 187
+ - ingredients:
+ - items:
+ - steel_bar
+ quantity: 5
+ level: 48
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 187
description: A steel platebody.
equipment:
defense:
diff --git a/data/items/equipment/steel_sword.yaml b/data/items/equipment/steel_sword.yaml
index 0ede86f..1bcd003 100644
--- a/data/items/equipment/steel_sword.yaml
+++ b/data/items/equipment/steel_sword.yaml
@@ -1,15 +1,15 @@
color: FD
craft:
- ingredients:
- - items:
- - steel_bar
- quantity: 1
- level: 34
- station:
- - anvil
- type: smithing
- ticks_per_cycle: 4
- xp: 37
+ - ingredients:
+ - items:
+ - steel_bar
+ quantity: 1
+ level: 34
+ station:
+ - anvil
+ type: smithing
+ ticks_per_cycle: 4
+ xp: 37
description: A steel sword.
equipment:
attack:
diff --git a/data/items/equipment/willow_longbow.yaml b/data/items/equipment/willow_longbow.yaml
index aef00b2..57923f3 100644
--- a/data/items/equipment/willow_longbow.yaml
+++ b/data/items/equipment/willow_longbow.yaml
@@ -1,16 +1,16 @@
color: 6B
craft:
- ingredients:
- - items:
- - willow_longbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 40
- type: fletching
- ticks_per_cycle: 2
- xp: 41
+ - ingredients:
+ - items:
+ - willow_longbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 40
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 41
description: A willow longbow.
equipment:
attack:
diff --git a/data/items/equipment/willow_longbow_u.yaml b/data/items/equipment/willow_longbow_u.yaml
index 6f7b123..d2ec6a4 100644
--- a/data/items/equipment/willow_longbow_u.yaml
+++ b/data/items/equipment/willow_longbow_u.yaml
@@ -1,9 +1,9 @@
color: "6B"
craft:
- ingredients:
- - items:
- - willow_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - willow_logs
+ quantity: 1
level: 40
tool: knife
type: fletching
diff --git a/data/items/equipment/willow_shortbow.yaml b/data/items/equipment/willow_shortbow.yaml
index 643d3b7..8f5286c 100644
--- a/data/items/equipment/willow_shortbow.yaml
+++ b/data/items/equipment/willow_shortbow.yaml
@@ -1,16 +1,16 @@
color: 6B
craft:
- ingredients:
- - items:
- - willow_shortbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 35
- type: fletching
- ticks_per_cycle: 2
- xp: 33
+ - ingredients:
+ - items:
+ - willow_shortbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 35
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 33
description: A willow shortbow.
equipment:
attack:
diff --git a/data/items/equipment/willow_shortbow_u.yaml b/data/items/equipment/willow_shortbow_u.yaml
index 6a4006c..a9573e2 100644
--- a/data/items/equipment/willow_shortbow_u.yaml
+++ b/data/items/equipment/willow_shortbow_u.yaml
@@ -1,9 +1,9 @@
color: "6B"
craft:
- ingredients:
- - items:
- - willow_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - willow_logs
+ quantity: 1
level: 35
tool: knife
type: fletching
diff --git a/data/items/equipment/yew_longbow.yaml b/data/items/equipment/yew_longbow.yaml
index 5299ded..e4ac6b6 100644
--- a/data/items/equipment/yew_longbow.yaml
+++ b/data/items/equipment/yew_longbow.yaml
@@ -1,16 +1,16 @@
color: 5E
craft:
- ingredients:
- - items:
- - yew_longbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 65
- type: fletching
- ticks_per_cycle: 2
- xp: 75
+ - ingredients:
+ - items:
+ - yew_longbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 65
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 75
description: A yew longbow.
equipment:
attack:
diff --git a/data/items/equipment/yew_longbow_u.yaml b/data/items/equipment/yew_longbow_u.yaml
index dd54e21..da627de 100644
--- a/data/items/equipment/yew_longbow_u.yaml
+++ b/data/items/equipment/yew_longbow_u.yaml
@@ -1,9 +1,9 @@
color: "5E"
craft:
- ingredients:
- - items:
- - yew_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - yew_logs
+ quantity: 1
level: 65
tool: knife
type: fletching
diff --git a/data/items/equipment/yew_shortbow.yaml b/data/items/equipment/yew_shortbow.yaml
index dfd5c9b..d1bb368 100644
--- a/data/items/equipment/yew_shortbow.yaml
+++ b/data/items/equipment/yew_shortbow.yaml
@@ -1,16 +1,16 @@
color: 5E
craft:
- ingredients:
- - items:
- - yew_shortbow_u
- quantity: 1
- - items:
- - bowstring
- quantity: 1
- level: 60
- type: fletching
- ticks_per_cycle: 2
- xp: 67
+ - ingredients:
+ - items:
+ - yew_shortbow_u
+ quantity: 1
+ - items:
+ - bowstring
+ quantity: 1
+ level: 60
+ type: fletching
+ ticks_per_cycle: 2
+ xp: 67
description: A yew shortbow.
equipment:
attack:
diff --git a/data/items/equipment/yew_shortbow_u.yaml b/data/items/equipment/yew_shortbow_u.yaml
index 614241c..0112628 100644
--- a/data/items/equipment/yew_shortbow_u.yaml
+++ b/data/items/equipment/yew_shortbow_u.yaml
@@ -1,9 +1,9 @@
color: "5E"
craft:
- ingredients:
- - items:
- - yew_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - yew_logs
+ quantity: 1
level: 60
tool: knife
type: fletching
diff --git a/data/items/materials/adamant_nails.yaml b/data/items/materials/adamant_nails.yaml
index 4b48a75..643d0a3 100644
--- a/data/items/materials/adamant_nails.yaml
+++ b/data/items/materials/adamant_nails.yaml
@@ -1,13 +1,13 @@
color: "78"
craft:
- ingredients:
- - items:
- - adamantite_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - adamantite_bar
+ quantity: 1
level: 74
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 62
diff --git a/data/items/materials/adamantite_bar.yaml b/data/items/materials/adamantite_bar.yaml
index 5e1ff84..5072e07 100644
--- a/data/items/materials/adamantite_bar.yaml
+++ b/data/items/materials/adamantite_bar.yaml
@@ -1,17 +1,17 @@
color: "47"
craft:
- ingredients:
- - items:
- - adamantite_ore
- quantity: 1
- - items:
- - coal
- quantity: 6
+ - ingredients:
+ - items:
+ - adamantite_ore
+ quantity: 1
+ - items:
+ - coal
+ quantity: 6
fail_message: You fail to smelt a usable bar.
level: 65
subtype: smelting
station:
- - furnace
+ - furnace
type: smithing
ticks_per_cycle: 4
xp: 37
diff --git a/data/items/materials/avantoe.yaml b/data/items/materials/avantoe.yaml
index ed09e84..b01f6a0 100644
--- a/data/items/materials/avantoe.yaml
+++ b/data/items/materials/avantoe.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_avantoe
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_avantoe
+ quantity: 1
level: 48
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/ball_of_wool.yaml b/data/items/materials/ball_of_wool.yaml
index ad0bce4..6278e3b 100644
--- a/data/items/materials/ball_of_wool.yaml
+++ b/data/items/materials/ball_of_wool.yaml
@@ -1,13 +1,13 @@
color: "FF"
craft:
- ingredients:
- - items:
- - wool
- quantity: 1
+ - ingredients:
+ - items:
+ - wool
+ quantity: 1
level: 1
success_message: "You spin the wool into a %n."
station:
- - spinning_wheel
+ - spinning_wheel
type: crafting
ticks_per_cycle: 3
xp: 3
diff --git a/data/items/materials/bowstring.yaml b/data/items/materials/bowstring.yaml
index 5a968a8..7c5f4f7 100644
--- a/data/items/materials/bowstring.yaml
+++ b/data/items/materials/bowstring.yaml
@@ -1,13 +1,13 @@
color: "E6"
craft:
- ingredients:
- - items:
- - flax
- quantity: 1
+ - ingredients:
+ - items:
+ - flax
+ quantity: 1
level: 1
success_message: "You spin the flax into a %n."
station:
- - spinning_wheel
+ - spinning_wheel
type: crafting
ticks_per_cycle: 3
xp: 15
diff --git a/data/items/materials/bronze_bar.yaml b/data/items/materials/bronze_bar.yaml
index 1dacbc4..d83ebc9 100644
--- a/data/items/materials/bronze_bar.yaml
+++ b/data/items/materials/bronze_bar.yaml
@@ -1,17 +1,17 @@
color: "B2"
craft:
- ingredients:
- - items:
- - copper_ore
- quantity: 1
- - items:
- - tin_ore
- quantity: 1
+ - ingredients:
+ - items:
+ - copper_ore
+ quantity: 1
+ - items:
+ - tin_ore
+ quantity: 1
fail_message: You fail to smelt a usable bar.
level: 1
subtype: smelting
station:
- - furnace
+ - furnace
type: smithing
ticks_per_cycle: 4
xp: 6
diff --git a/data/items/materials/bronze_nails.yaml b/data/items/materials/bronze_nails.yaml
index e85bce9..1a8b273 100644
--- a/data/items/materials/bronze_nails.yaml
+++ b/data/items/materials/bronze_nails.yaml
@@ -1,13 +1,13 @@
color: "B2"
craft:
- ingredients:
- - items:
- - bronze_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - bronze_bar
+ quantity: 1
level: 4
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 12
diff --git a/data/items/materials/cadantine.yaml b/data/items/materials/cadantine.yaml
index fcf9494..6d056b9 100644
--- a/data/items/materials/cadantine.yaml
+++ b/data/items/materials/cadantine.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_cadantine
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_cadantine
+ quantity: 1
level: 65
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/diamond.yaml b/data/items/materials/diamond.yaml
index 5569cf4..8f98236 100644
--- a/data/items/materials/diamond.yaml
+++ b/data/items/materials/diamond.yaml
@@ -1,9 +1,9 @@
color: "FF"
craft:
- ingredients:
- - items:
- - uncut_diamond
- quantity: 1
+ - ingredients:
+ - items:
+ - uncut_diamond
+ quantity: 1
level: 43
success_message: "You cut the %i1 into a beautiful %n."
tool: chisel
diff --git a/data/items/materials/dwarf_weed.yaml b/data/items/materials/dwarf_weed.yaml
index bbbec7a..2c66b2c 100644
--- a/data/items/materials/dwarf_weed.yaml
+++ b/data/items/materials/dwarf_weed.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_dwarf_weed
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_dwarf_weed
+ quantity: 1
level: 70
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/emerald.yaml b/data/items/materials/emerald.yaml
index dd844d8..b9476f1 100644
--- a/data/items/materials/emerald.yaml
+++ b/data/items/materials/emerald.yaml
@@ -1,9 +1,9 @@
color: "53"
craft:
- ingredients:
- - items:
- - uncut_emerald
- quantity: 1
+ - ingredients:
+ - items:
+ - uncut_emerald
+ quantity: 1
level: 27
success_message: "You cut the %i1 into a beautiful %n."
tool: chisel
diff --git a/data/items/materials/gold_bar.yaml b/data/items/materials/gold_bar.yaml
index cc290e8..2ab3a76 100644
--- a/data/items/materials/gold_bar.yaml
+++ b/data/items/materials/gold_bar.yaml
@@ -1,14 +1,14 @@
color: "DC"
craft:
- ingredients:
- - items:
- - gold_ore
- quantity: 1
+ - ingredients:
+ - items:
+ - gold_ore
+ quantity: 1
fail_message: You fail to smelt a usable bar.
level: 45
subtype: smelting
station:
- - furnace
+ - furnace
type: smithing
ticks_per_cycle: 4
xp: 22
diff --git a/data/items/materials/guam.yaml b/data/items/materials/guam.yaml
index 423238f..3f9e398 100644
--- a/data/items/materials/guam.yaml
+++ b/data/items/materials/guam.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_guam
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_guam
+ quantity: 1
level: 1
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/harralander.yaml b/data/items/materials/harralander.yaml
index 22e2736..ed77c56 100644
--- a/data/items/materials/harralander.yaml
+++ b/data/items/materials/harralander.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_harralander
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_harralander
+ quantity: 1
level: 20
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/irit.yaml b/data/items/materials/irit.yaml
index 7ff6187..8d5ff23 100644
--- a/data/items/materials/irit.yaml
+++ b/data/items/materials/irit.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_irit
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_irit
+ quantity: 1
level: 40
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/iron_bar.yaml b/data/items/materials/iron_bar.yaml
index aedeabe..9f0ac58 100644
--- a/data/items/materials/iron_bar.yaml
+++ b/data/items/materials/iron_bar.yaml
@@ -1,18 +1,18 @@
color: "FA"
craft:
- ingredients:
- - items:
- - iron_ore
- quantity: 1
+ - ingredients:
+ - items:
+ - iron_ore
+ quantity: 1
fail_message: The iron is too impure to make a workable bar.
level: 20
subtype: smelting
station:
- - furnace
+ - furnace
success:
- base: 0.5
- cap: 0.5
- per_level: 0
+ base: 0.5
+ cap: 0.5
+ per_level: 0
type: smithing
ticks_per_cycle: 4
xp: 12
diff --git a/data/items/materials/iron_nails.yaml b/data/items/materials/iron_nails.yaml
index bf491ee..1f5aca2 100644
--- a/data/items/materials/iron_nails.yaml
+++ b/data/items/materials/iron_nails.yaml
@@ -1,13 +1,13 @@
color: "FA"
craft:
- ingredients:
- - items:
- - iron_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - iron_bar
+ quantity: 1
level: 24
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 25
diff --git a/data/items/materials/kwuarm.yaml b/data/items/materials/kwuarm.yaml
index 9a458a3..740d968 100644
--- a/data/items/materials/kwuarm.yaml
+++ b/data/items/materials/kwuarm.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_kwuarm
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_kwuarm
+ quantity: 1
level: 54
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/lantadyme.yaml b/data/items/materials/lantadyme.yaml
index 0bb2a90..f204793 100644
--- a/data/items/materials/lantadyme.yaml
+++ b/data/items/materials/lantadyme.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_lantadyme
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_lantadyme
+ quantity: 1
level: 67
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/mahogany_planks.yaml b/data/items/materials/mahogany_planks.yaml
index 6269cba..9d4063e 100644
--- a/data/items/materials/mahogany_planks.yaml
+++ b/data/items/materials/mahogany_planks.yaml
@@ -1,13 +1,13 @@
color: "60"
craft:
- ingredients:
- - items:
- - mahogany_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - mahogany_logs
+ quantity: 1
level: 50
success_message: "You saw the mahogany logs into %n."
station:
- - workbench
+ - workbench
tool: saw
type: construction
ticks_per_cycle: 20
diff --git a/data/items/materials/marrentill.yaml b/data/items/materials/marrentill.yaml
index 41b6ead..10c4d80 100644
--- a/data/items/materials/marrentill.yaml
+++ b/data/items/materials/marrentill.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_marrentill
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_marrentill
+ quantity: 1
level: 5
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/mithril_bar.yaml b/data/items/materials/mithril_bar.yaml
index 76a2204..bf06ec5 100644
--- a/data/items/materials/mithril_bar.yaml
+++ b/data/items/materials/mithril_bar.yaml
@@ -1,17 +1,17 @@
color: "4B"
craft:
- ingredients:
- - items:
- - mithril_ore
- quantity: 1
- - items:
- - coal
- quantity: 4
+ - ingredients:
+ - items:
+ - mithril_ore
+ quantity: 1
+ - items:
+ - coal
+ quantity: 4
fail_message: You fail to smelt a usable bar.
level: 50
subtype: smelting
station:
- - furnace
+ - furnace
type: smithing
ticks_per_cycle: 4
xp: 30
diff --git a/data/items/materials/mithril_nails.yaml b/data/items/materials/mithril_nails.yaml
index 85d105e..4eef317 100644
--- a/data/items/materials/mithril_nails.yaml
+++ b/data/items/materials/mithril_nails.yaml
@@ -1,13 +1,13 @@
color: "4B"
craft:
- ingredients:
- - items:
- - mithril_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - mithril_bar
+ quantity: 1
level: 54
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 50
diff --git a/data/items/materials/oak_planks.yaml b/data/items/materials/oak_planks.yaml
index 39405b0..7ebfd75 100644
--- a/data/items/materials/oak_planks.yaml
+++ b/data/items/materials/oak_planks.yaml
@@ -1,13 +1,13 @@
color: "66"
craft:
- ingredients:
- - items:
- - oak_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - oak_logs
+ quantity: 1
level: 15
success_message: "You saw the oak logs into %n."
station:
- - workbench
+ - workbench
tool: saw
type: construction
ticks_per_cycle: 20
diff --git a/data/items/materials/planks.yaml b/data/items/materials/planks.yaml
index 86cc5d5..064e08c 100644
--- a/data/items/materials/planks.yaml
+++ b/data/items/materials/planks.yaml
@@ -1,13 +1,13 @@
color: "89"
craft:
- ingredients:
- - items:
- - logs
- quantity: 1
+ - ingredients:
+ - items:
+ - logs
+ quantity: 1
level: 1
success_message: "You saw the logs into %n."
station:
- - workbench
+ - workbench
tool: saw
type: construction
ticks_per_cycle: 20
diff --git a/data/items/materials/ranarr.yaml b/data/items/materials/ranarr.yaml
index 101edbb..61dd1b1 100644
--- a/data/items/materials/ranarr.yaml
+++ b/data/items/materials/ranarr.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_ranarr
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_ranarr
+ quantity: 1
level: 25
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/ruby.yaml b/data/items/materials/ruby.yaml
index ef880bf..21f1686 100644
--- a/data/items/materials/ruby.yaml
+++ b/data/items/materials/ruby.yaml
@@ -1,9 +1,9 @@
color: "C4"
craft:
- ingredients:
- - items:
- - uncut_ruby
- quantity: 1
+ - ingredients:
+ - items:
+ - uncut_ruby
+ quantity: 1
level: 63
success_message: "You cut the %i1 into a beautiful %n."
tool: chisel
diff --git a/data/items/materials/rune_nails.yaml b/data/items/materials/rune_nails.yaml
index f039df8..46c74ee 100644
--- a/data/items/materials/rune_nails.yaml
+++ b/data/items/materials/rune_nails.yaml
@@ -1,13 +1,13 @@
color: "57"
craft:
- ingredients:
- - items:
- - runite_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - runite_bar
+ quantity: 1
level: 89
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 75
diff --git a/data/items/materials/runite_bar.yaml b/data/items/materials/runite_bar.yaml
index 5b60034..86bed27 100644
--- a/data/items/materials/runite_bar.yaml
+++ b/data/items/materials/runite_bar.yaml
@@ -1,17 +1,17 @@
color: "27"
craft:
- ingredients:
- - items:
- - runite_ore
- quantity: 1
- - items:
- - coal
- quantity: 8
+ - ingredients:
+ - items:
+ - runite_ore
+ quantity: 1
+ - items:
+ - coal
+ quantity: 8
fail_message: You fail to smelt a usable bar.
level: 80
subtype: smelting
station:
- - furnace
+ - furnace
type: smithing
ticks_per_cycle: 4
xp: 50
diff --git a/data/items/materials/sapphire.yaml b/data/items/materials/sapphire.yaml
index 2f2fafb..b58a2f7 100644
--- a/data/items/materials/sapphire.yaml
+++ b/data/items/materials/sapphire.yaml
@@ -1,9 +1,9 @@
color: "45"
craft:
- ingredients:
- - items:
- - uncut_sapphire
- quantity: 1
+ - ingredients:
+ - items:
+ - uncut_sapphire
+ quantity: 1
level: 20
success_message: "You cut the %i1 into a beautiful %n."
tool: chisel
diff --git a/data/items/materials/silver_bar.yaml b/data/items/materials/silver_bar.yaml
index 25aad23..7561ba0 100644
--- a/data/items/materials/silver_bar.yaml
+++ b/data/items/materials/silver_bar.yaml
@@ -1,14 +1,14 @@
color: "FF"
craft:
- ingredients:
- - items:
- - silver_ore
- quantity: 1
+ - ingredients:
+ - items:
+ - silver_ore
+ quantity: 1
fail_message: You fail to smelt a usable bar.
level: 25
subtype: smelting
station:
- - furnace
+ - furnace
type: smithing
ticks_per_cycle: 4
xp: 14
diff --git a/data/items/materials/snapdragon.yaml b/data/items/materials/snapdragon.yaml
index 0d4943c..3ca3a44 100644
--- a/data/items/materials/snapdragon.yaml
+++ b/data/items/materials/snapdragon.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_snapdragon
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_snapdragon
+ quantity: 1
level: 59
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/soft_clay.yaml b/data/items/materials/soft_clay.yaml
index 8c05d12..f5e231a 100644
--- a/data/items/materials/soft_clay.yaml
+++ b/data/items/materials/soft_clay.yaml
@@ -1,17 +1,17 @@
color: "AD"
craft:
- type: combine
+ - type: combine
ingredients:
- - items:
- - clay
- quantity: 1
- - byproducts:
- - empty_bucket
- - empty_jug
- items:
- - bucket_of_water
- - jug_of_water
- quantity: 1
+ - items:
+ - clay
+ quantity: 1
+ - byproducts:
+ - empty_bucket
+ - empty_jug
+ items:
+ - bucket_of_water
+ - jug_of_water
+ quantity: 1
ticks_per_cycle: 2
description: Soft, workable clay ready for shaping on a pottery wheel.
name: soft clay
diff --git a/data/items/materials/steel_bar.yaml b/data/items/materials/steel_bar.yaml
index b972bfc..46b4c02 100644
--- a/data/items/materials/steel_bar.yaml
+++ b/data/items/materials/steel_bar.yaml
@@ -1,17 +1,17 @@
color: "FE"
craft:
- ingredients:
- - items:
- - iron_ore
- quantity: 1
- - items:
- - coal
- quantity: 2
+ - ingredients:
+ - items:
+ - iron_ore
+ quantity: 1
+ - items:
+ - coal
+ quantity: 2
fail_message: You fail to smelt a usable bar.
level: 40
subtype: smelting
station:
- - furnace
+ - furnace
type: smithing
ticks_per_cycle: 4
xp: 17
diff --git a/data/items/materials/steel_nails.yaml b/data/items/materials/steel_nails.yaml
index bde4596..170fb2d 100644
--- a/data/items/materials/steel_nails.yaml
+++ b/data/items/materials/steel_nails.yaml
@@ -1,13 +1,13 @@
color: "FD"
craft:
- ingredients:
- - items:
- - steel_bar
- quantity: 1
+ - ingredients:
+ - items:
+ - steel_bar
+ quantity: 1
level: 34
output_qty: 15
station:
- - anvil
+ - anvil
type: smithing
ticks_per_cycle: 4
xp: 37
diff --git a/data/items/materials/stim_cell.yaml b/data/items/materials/stim_cell.yaml
index 8c870a5..af28ec4 100644
--- a/data/items/materials/stim_cell.yaml
+++ b/data/items/materials/stim_cell.yaml
@@ -1,12 +1,12 @@
color: "E2"
craft:
- ingredients:
- - items:
- - harralander_potion_unf
- quantity: 1
- - items:
- - chocolate_dust
- quantity: 1
+ - ingredients:
+ - items:
+ - harralander_potion_unf
+ quantity: 1
+ - items:
+ - chocolate_dust
+ quantity: 1
level: 26
type: pharmacy
ticks_per_cycle: 4
diff --git a/data/items/materials/tarromin.yaml b/data/items/materials/tarromin.yaml
index 36f1618..a33cf65 100644
--- a/data/items/materials/tarromin.yaml
+++ b/data/items/materials/tarromin.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_tarromin
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_tarromin
+ quantity: 1
level: 11
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/teak_planks.yaml b/data/items/materials/teak_planks.yaml
index d8b4ec7..043c502 100644
--- a/data/items/materials/teak_planks.yaml
+++ b/data/items/materials/teak_planks.yaml
@@ -1,13 +1,13 @@
color: "64"
craft:
- ingredients:
- - items:
- - teak_logs
- quantity: 1
+ - ingredients:
+ - items:
+ - teak_logs
+ quantity: 1
level: 35
success_message: "You saw the teak logs into %n."
station:
- - workbench
+ - workbench
tool: saw
type: construction
ticks_per_cycle: 20
diff --git a/data/items/materials/toadflax.yaml b/data/items/materials/toadflax.yaml
index 42713a9..aaaa544 100644
--- a/data/items/materials/toadflax.yaml
+++ b/data/items/materials/toadflax.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_toadflax
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_toadflax
+ quantity: 1
level: 30
subtype: cleaning
type: pharmacy
diff --git a/data/items/materials/torstol.yaml b/data/items/materials/torstol.yaml
index bd71245..4000a0e 100644
--- a/data/items/materials/torstol.yaml
+++ b/data/items/materials/torstol.yaml
@@ -1,9 +1,9 @@
color: "30"
craft:
- ingredients:
- - items:
- - grimy_torstol
- quantity: 1
+ - ingredients:
+ - items:
+ - grimy_torstol
+ quantity: 1
level: 75
subtype: cleaning
type: pharmacy
diff --git a/data/items/misc/credit_stick.yaml b/data/items/misc/credit_stick.yaml
index 5d191e2..de26345 100644
--- a/data/items/misc/credit_stick.yaml
+++ b/data/items/misc/credit_stick.yaml
@@ -5,4 +5,4 @@ value: 10
stackable: false
search_table: credit_stick_drop
search_ticks: 2
-search_message: "cracking open the credit stick" \ No newline at end of file
+search_message: "cracking open the credit stick"
diff --git a/data/items/misc/mahogany_table.yaml b/data/items/misc/mahogany_table.yaml
index ee5d1f0..737fb90 100644
--- a/data/items/misc/mahogany_table.yaml
+++ b/data/items/misc/mahogany_table.yaml
@@ -1,12 +1,12 @@
color: "60"
craft:
- ingredients:
- - items:
- - mahogany_planks
- quantity: 3
+ - ingredients:
+ - items:
+ - mahogany_planks
+ quantity: 3
level: 52
station:
- - workbench
+ - workbench
type: construction
ticks_per_cycle: 6
xp: 120
diff --git a/data/items/misc/oak_shelf.yaml b/data/items/misc/oak_shelf.yaml
index 7815873..03cddc8 100644
--- a/data/items/misc/oak_shelf.yaml
+++ b/data/items/misc/oak_shelf.yaml
@@ -1,12 +1,12 @@
color: "5E"
craft:
- ingredients:
- - items:
- - oak_planks
- quantity: 2
+ - ingredients:
+ - items:
+ - oak_planks
+ quantity: 2
level: 18
station:
- - workbench
+ - workbench
type: construction
ticks_per_cycle: 6
xp: 40
diff --git a/data/items/misc/oak_table.yaml b/data/items/misc/oak_table.yaml
index 35c8a0c..5a01e95 100644
--- a/data/items/misc/oak_table.yaml
+++ b/data/items/misc/oak_table.yaml
@@ -1,12 +1,12 @@
color: "5E"
craft:
- ingredients:
- - items:
- - oak_planks
- quantity: 3
+ - ingredients:
+ - items:
+ - oak_planks
+ quantity: 3
level: 20
station:
- - workbench
+ - workbench
type: construction
ticks_per_cycle: 6
xp: 50
diff --git a/data/items/misc/teak_table.yaml b/data/items/misc/teak_table.yaml
index 9a5802a..4cea6c1 100644
--- a/data/items/misc/teak_table.yaml
+++ b/data/items/misc/teak_table.yaml
@@ -1,12 +1,12 @@
color: "64"
craft:
- ingredients:
- - items:
- - teak_planks
- quantity: 3
+ - ingredients:
+ - items:
+ - teak_planks
+ quantity: 3
level: 38
station:
- - workbench
+ - workbench
type: construction
ticks_per_cycle: 6
xp: 80
diff --git a/data/items/misc/wooden_chair.yaml b/data/items/misc/wooden_chair.yaml
index 295b3db..09be4c0 100644
--- a/data/items/misc/wooden_chair.yaml
+++ b/data/items/misc/wooden_chair.yaml
@@ -1,12 +1,12 @@
color: "82"
craft:
- ingredients:
- - items:
- - planks
- quantity: 2
+ - ingredients:
+ - items:
+ - planks
+ quantity: 2
level: 8
station:
- - workbench
+ - workbench
type: construction
ticks_per_cycle: 6
xp: 30
diff --git a/data/items/misc/wooden_shelf.yaml b/data/items/misc/wooden_shelf.yaml
index e383664..22c91b4 100644
--- a/data/items/misc/wooden_shelf.yaml
+++ b/data/items/misc/wooden_shelf.yaml
@@ -1,12 +1,12 @@
color: "82"
craft:
- ingredients:
- - items:
- - planks
- quantity: 2
+ - ingredients:
+ - items:
+ - planks
+ quantity: 2
level: 4
station:
- - workbench
+ - workbench
type: construction
ticks_per_cycle: 6
xp: 20
diff --git a/data/items/misc/wooden_table.yaml b/data/items/misc/wooden_table.yaml
index 1aeaf19..2a52f61 100644
--- a/data/items/misc/wooden_table.yaml
+++ b/data/items/misc/wooden_table.yaml
@@ -1,12 +1,12 @@
color: "82"
craft:
- ingredients:
- - items:
- - planks
- quantity: 3
+ - ingredients:
+ - items:
+ - planks
+ quantity: 3
level: 6
station:
- - workbench
+ - workbench
type: construction
ticks_per_cycle: 6
xp: 25
diff --git a/data/items/seeds/cabbage_seed.yaml b/data/items/seeds/cabbage_seed.yaml
index ef0c9ac..647e91f 100644
--- a/data/items/seeds/cabbage_seed.yaml
+++ b/data/items/seeds/cabbage_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 12
farm_stages: 4
farm_product: cabbage
farm_min_yield: 3
-farm_max_yield: 10 \ No newline at end of file
+farm_max_yield: 10
diff --git a/data/items/seeds/onion_seed.yaml b/data/items/seeds/onion_seed.yaml
index b964921..e9dcece 100644
--- a/data/items/seeds/onion_seed.yaml
+++ b/data/items/seeds/onion_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 11
farm_stages: 4
farm_product: onion
farm_min_yield: 3
-farm_max_yield: 10 \ No newline at end of file
+farm_max_yield: 10
diff --git a/data/items/seeds/potato_seed.yaml b/data/items/seeds/potato_seed.yaml
index 5f085aa..ca98b05 100644
--- a/data/items/seeds/potato_seed.yaml
+++ b/data/items/seeds/potato_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 9
farm_stages: 4
farm_product: potato
farm_min_yield: 3
-farm_max_yield: 10 \ No newline at end of file
+farm_max_yield: 10
diff --git a/data/items/seeds/ranarr_seed.yaml b/data/items/seeds/ranarr_seed.yaml
index e3aba6a..31da1b4 100644
--- a/data/items/seeds/ranarr_seed.yaml
+++ b/data/items/seeds/ranarr_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 31
farm_stages: 4
farm_product: ranarr
farm_min_yield: 3
-farm_max_yield: 10 \ No newline at end of file
+farm_max_yield: 10
diff --git a/data/items/seeds/snapdragon_seed.yaml b/data/items/seeds/snapdragon_seed.yaml
index 1db0058..fe26142 100644
--- a/data/items/seeds/snapdragon_seed.yaml
+++ b/data/items/seeds/snapdragon_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 99
farm_stages: 4
farm_product: snapdragon
farm_min_yield: 3
-farm_max_yield: 9 \ No newline at end of file
+farm_max_yield: 9
diff --git a/data/items/seeds/strawberry_seed.yaml b/data/items/seeds/strawberry_seed.yaml
index aa6761c..dcbb674 100644
--- a/data/items/seeds/strawberry_seed.yaml
+++ b/data/items/seeds/strawberry_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 29
farm_stages: 4
farm_product: strawberry
farm_min_yield: 3
-farm_max_yield: 10 \ No newline at end of file
+farm_max_yield: 10
diff --git a/data/items/seeds/sweetcorn_seed.yaml b/data/items/seeds/sweetcorn_seed.yaml
index f1880d7..8d7c59f 100644
--- a/data/items/seeds/sweetcorn_seed.yaml
+++ b/data/items/seeds/sweetcorn_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 19
farm_stages: 4
farm_product: sweetcorn
farm_min_yield: 3
-farm_max_yield: 10 \ No newline at end of file
+farm_max_yield: 10
diff --git a/data/items/seeds/tomato_seed.yaml b/data/items/seeds/tomato_seed.yaml
index 852b516..619e4e6 100644
--- a/data/items/seeds/tomato_seed.yaml
+++ b/data/items/seeds/tomato_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 14
farm_stages: 4
farm_product: tomato
farm_min_yield: 3
-farm_max_yield: 10 \ No newline at end of file
+farm_max_yield: 10
diff --git a/data/items/seeds/torstol_seed.yaml b/data/items/seeds/torstol_seed.yaml
index 72595c3..9d16c25 100644
--- a/data/items/seeds/torstol_seed.yaml
+++ b/data/items/seeds/torstol_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 200
farm_stages: 4
farm_product: torstol
farm_min_yield: 3
-farm_max_yield: 8 \ No newline at end of file
+farm_max_yield: 8
diff --git a/data/items/seeds/watermelon_seed.yaml b/data/items/seeds/watermelon_seed.yaml
index f339fd6..5a1f370 100644
--- a/data/items/seeds/watermelon_seed.yaml
+++ b/data/items/seeds/watermelon_seed.yaml
@@ -10,4 +10,4 @@ farm_harvest_xp: 55
farm_stages: 4
farm_product: watermelon
farm_min_yield: 3
-farm_max_yield: 10 \ No newline at end of file
+farm_max_yield: 10
diff --git a/data/items/tools/empty_pot.yaml b/data/items/tools/empty_pot.yaml
index 9bb7c11..2620b52 100644
--- a/data/items/tools/empty_pot.yaml
+++ b/data/items/tools/empty_pot.yaml
@@ -1,18 +1,18 @@
color: "82"
craft:
- ingredients:
- - items:
- - unfired_pot
- quantity: 1
+ - ingredients:
+ - items:
+ - unfired_pot
+ quantity: 1
fail_message: The pot cracks in the oven and is ruined.
level: 1
success_message: "You fire the %i1 in the oven."
station:
- - pottery_oven
+ - pottery_oven
success:
- base: 0.5
- cap: 0.95
- per_level: 0.02
+ base: 0.5
+ cap: 0.95
+ per_level: 0.02
type: crafting
ticks_per_cycle: 4
xp: 6
diff --git a/data/items/tools/plant_pot.yaml b/data/items/tools/plant_pot.yaml
index ca384cd..d9cb53b 100644
--- a/data/items/tools/plant_pot.yaml
+++ b/data/items/tools/plant_pot.yaml
@@ -1,18 +1,18 @@
color: "82"
craft:
- ingredients:
- - items:
- - unfired_plant_pot
- quantity: 1
+ - ingredients:
+ - items:
+ - unfired_plant_pot
+ quantity: 1
fail_message: The plant pot cracks in the oven and is ruined.
level: 19
success_message: "You fire the %i1 in the oven."
station:
- - pottery_oven
+ - pottery_oven
success:
- base: 0.3
- cap: 0.95
- per_level: 0.02
+ base: 0.3
+ cap: 0.95
+ per_level: 0.02
type: crafting
ticks_per_cycle: 4
xp: 18
diff --git a/data/items/tools/unfired_pie_dish.yaml b/data/items/tools/unfired_pie_dish.yaml
index 56668a2..50148de 100644
--- a/data/items/tools/unfired_pie_dish.yaml
+++ b/data/items/tools/unfired_pie_dish.yaml
@@ -1,13 +1,13 @@
color: "AD"
craft:
- ingredients:
- - items:
- - soft_clay
- quantity: 1
+ - ingredients:
+ - items:
+ - soft_clay
+ quantity: 1
level: 7
success_message: "You shape the clay into a %n."
station:
- - pottery_wheel
+ - pottery_wheel
type: crafting
ticks_per_cycle: 4
xp: 15
diff --git a/data/items/tools/unfired_plant_pot.yaml b/data/items/tools/unfired_plant_pot.yaml
index 8de17c8..d867125 100644
--- a/data/items/tools/unfired_plant_pot.yaml
+++ b/data/items/tools/unfired_plant_pot.yaml
@@ -1,13 +1,13 @@
color: "AD"
craft:
- ingredients:
- - items:
- - soft_clay
- quantity: 1
+ - ingredients:
+ - items:
+ - soft_clay
+ quantity: 1
level: 19
success_message: "You shape the clay into a %n."
station:
- - pottery_wheel
+ - pottery_wheel
type: crafting
ticks_per_cycle: 4
xp: 18
diff --git a/data/items/tools/unfired_pot.yaml b/data/items/tools/unfired_pot.yaml
index 5c835e1..81dfa50 100644
--- a/data/items/tools/unfired_pot.yaml
+++ b/data/items/tools/unfired_pot.yaml
@@ -1,13 +1,13 @@
color: "AD"
craft:
- ingredients:
- - items:
- - soft_clay
- quantity: 1
+ - ingredients:
+ - items:
+ - soft_clay
+ quantity: 1
level: 1
success_message: "You shape the clay into a %n."
station:
- - pottery_wheel
+ - pottery_wheel
type: crafting
ticks_per_cycle: 4
xp: 6
diff --git a/data/mobs/examples/newbie_trainer.yaml b/data/mobs/examples/newbie_trainer.yaml
index eddb0e9..feed672 100644
--- a/data/mobs/examples/newbie_trainer.yaml
+++ b/data/mobs/examples/newbie_trainer.yaml
@@ -3,9 +3,9 @@ description: "A friendly-looking instructor ready to help new adventurers."
unique: true
protected: true
idle_descriptions:
- - "reviews a training manual"
- - "adjusts a practice dummy"
- - "demonstrates a sword stance to no one in particular"
- - "offers a friendly nod to passersby"
- - "polishes a wooden shield"
- - "checks a stopwatch and jots something down"
+- "reviews a training manual"
+- "adjusts a practice dummy"
+- "demonstrates a sword stance to no one in particular"
+- "offers a friendly nod to passersby"
+- "polishes a wooden shield"
+- "checks a stopwatch and jots something down"
diff --git a/data/objects/000_test_object.yaml b/data/objects/000_test_object.yaml
index ed2e897..e465048 100644
--- a/data/objects/000_test_object.yaml
+++ b/data/objects/000_test_object.yaml
@@ -1,5 +1,6 @@
color: C4
-description: A sinister altar of red biological interfaces. Place scrap here with a bio identifier to produce biojunk. Type 'id' to begin.
+description:
+- text: A sinister altar of red biological interfaces. Place scrap here with a bio identifier to produce biojunk. Type 'id' to begin.
gather:
bait: ""
depleted_message: ""
@@ -13,7 +14,7 @@ gather:
cap: 1
per_level: 0
tools:
- - axe
+ - axe
hidden: false
id: 000_test_object
name: 000 test object
diff --git a/data/objects/adamantite_rock.yaml b/data/objects/adamantite_rock.yaml
index 83544d5..5c1d335 100644
--- a/data/objects/adamantite_rock.yaml
+++ b/data/objects/adamantite_rock.yaml
@@ -1,5 +1,6 @@
color: "78"
-description: ""
+description:
+ - text: ""
gather:
bait: ""
depleted_message: ""
diff --git a/data/objects/allotment_patch.yaml b/data/objects/allotment_patch.yaml
index f4d0e64..5edc0ae 100644
--- a/data/objects/allotment_patch.yaml
+++ b/data/objects/allotment_patch.yaml
@@ -2,4 +2,5 @@ name: allotment patch
color: "5E"
hidden: false
inroom_description: "An allotment patch is marked out in the ground."
-description: "A large patch of soil for growing vegetables. Use 'inspect' to check its status."
+description:
+ - text: "A large patch of soil for growing vegetables. Use 'inspect' to check its status."
diff --git a/data/objects/anglerfish_spot.yaml b/data/objects/anglerfish_spot.yaml
index 938b11a..73be60a 100644
--- a/data/objects/anglerfish_spot.yaml
+++ b/data/objects/anglerfish_spot.yaml
@@ -1,17 +1,18 @@
color: "51"
-description: A faint glow emanates from the depths. Use a fishing rod with bait here.
+description:
+- text: A faint glow emanates from the depths. Use a fishing rod with bait here.
gather:
bait: fishing_bait
depleted_message: ""
drops:
- - depletes: false
- item_id: raw_anglerfish
- level: 82
- message: ""
- quantity: 0
- table: ""
- weight: 100
- xp: 120
+ - depletes: false
+ item_id: raw_anglerfish
+ level: 82
+ message: ""
+ quantity: 0
+ table: ""
+ weight: 100
+ xp: 120
exhausted_message: ""
fail_message: Nothing seems to bite.
gather_message: You cast your line into the deep water...
@@ -22,7 +23,7 @@ gather:
cap: 0.8
per_level: 0.005
tools:
- - fishing_rod
+ - fishing_rod
hidden: false
id: anglerfish_spot
name: anglerfish spot
diff --git a/data/objects/anvil.yaml b/data/objects/anvil.yaml
index 4737573..4c8bc40 100644
--- a/data/objects/anvil.yaml
+++ b/data/objects/anvil.yaml
@@ -1,6 +1,7 @@
name: anvil
color: "FA"
-description: "A heavy iron anvil for hammering metal into shape."
+description:
+ - text: "A heavy iron anvil for hammering metal into shape."
on_use:
- item_id: silver_bar
message: "You should use this with a mold at a furnace."
diff --git a/data/objects/aps_tower.yaml b/data/objects/aps_tower.yaml
index 68b34fc..7919a5b 100644
--- a/data/objects/aps_tower.yaml
+++ b/data/objects/aps_tower.yaml
@@ -1,6 +1,7 @@
name: APS Tower
color: "21"
-description: "A tall, skeletal metal tower with a pulsing cyan beacon at its apex. A datapad sync panel glows softly at the base."
+description:
+ - text: "A tall, skeletal metal tower with a pulsing cyan beacon at its apex. A datapad sync panel glows softly at the base."
inroom_description: "An APS Tower looms here, its beacon pulsing steadily."
on_use:
- message: "You connect your datapad to the APS Tower. Coordinates triangulated and stored."
diff --git a/data/objects/bait_fishing_spot.yaml b/data/objects/bait_fishing_spot.yaml
index b870a7f..39aee09 100644
--- a/data/objects/bait_fishing_spot.yaml
+++ b/data/objects/bait_fishing_spot.yaml
@@ -1,30 +1,31 @@
color: "4B"
-description: Small fish ripple the surface. Use a fishing rod with bait here.
+description:
+- text: Small fish ripple the surface. Use a fishing rod with bait here.
gather:
- bait: fishing_bait
- drops:
- - item_id: raw_sardine
- level: 5
- success_message: You catch a {4B}raw sardine{/}.
- weight: 60
- xp: 20
- - item_id: raw_herring
- level: 10
- success_message: You catch a {4B}raw herring{/}.
- weight: 40
- xp: 30
- - item_id: raw_pike
- level: 25
- success_message: You catch a {45}raw pike{/}.
- weight: 30
- xp: 60
- fail_message: Nothing seems to bite.
- gather_message: You cast your line into the water...
- skill: fishing
- success:
- base: 0.5
- cap: 0.9
- per_level: 0.005
- tools:
- - fishing_rod
+ bait: fishing_bait
+ drops:
+ - item_id: raw_sardine
+ level: 5
+ success_message: You catch a {4B}raw sardine{/}.
+ weight: 60
+ xp: 20
+ - item_id: raw_herring
+ level: 10
+ success_message: You catch a {4B}raw herring{/}.
+ weight: 40
+ xp: 30
+ - item_id: raw_pike
+ level: 25
+ success_message: You catch a {45}raw pike{/}.
+ weight: 30
+ xp: 60
+ fail_message: Nothing seems to bite.
+ gather_message: You cast your line into the water...
+ skill: fishing
+ success:
+ base: 0.5
+ cap: 0.9
+ per_level: 0.005
+ tools:
+ - fishing_rod
name: bait fishing spot
diff --git a/data/objects/bank_booth.yaml b/data/objects/bank_booth.yaml
index 651095e..2fff129 100644
--- a/data/objects/bank_booth.yaml
+++ b/data/objects/bank_booth.yaml
@@ -1,4 +1,5 @@
name: bank booth
color: "E2"
-description: "A sleek terminal with a biometric scanner. You can deposit or withdraw items here. Type 'bank' to access it."
+description:
+ - text: "A sleek terminal with a biometric scanner. You can deposit or withdraw items here. Type 'bank' to access it."
inroom_description: "A bank booth is set into the wall."
diff --git a/data/objects/bio_altar.yaml b/data/objects/bio_altar.yaml
index 809a6eb..32fda3c 100644
--- a/data/objects/bio_altar.yaml
+++ b/data/objects/bio_altar.yaml
@@ -1,3 +1,4 @@
name: bio altar
color: "C4"
-description: "A sinister altar of red biological interfaces. Place scrap here with a bio identifier to produce biojunk. Type 'id' to begin."
+description:
+ - text: "A sinister altar of red biological interfaces. Place scrap here with a bio identifier to produce biojunk. Type 'id' to begin."
diff --git a/data/objects/blood_altar.yaml b/data/objects/blood_altar.yaml
index ea74343..534bd89 100644
--- a/data/objects/blood_altar.yaml
+++ b/data/objects/blood_altar.yaml
@@ -1,3 +1,4 @@
name: blood altar
color: "7C"
-description: "A pulsing altar of {7C bold}crimson crystal{/}, warm to the touch. Place scrap here with a blood identifier to produce bloodjunk. Type 'id' to begin."
+description:
+ - text: "A pulsing altar of {7C bold}crimson crystal{/}, warm to the touch. Place scrap here with a blood identifier to produce bloodjunk. Type 'id' to begin."
diff --git a/data/objects/cage_fishing_spot.yaml b/data/objects/cage_fishing_spot.yaml
index 977d4fb..cebe121 100644
--- a/data/objects/cage_fishing_spot.yaml
+++ b/data/objects/cage_fishing_spot.yaml
@@ -1,19 +1,20 @@
color: "4B"
-description: A rocky underwater shelf. Use a lobster pot here.
+description:
+- text: A rocky underwater shelf. Use a lobster pot here.
gather:
- drops:
- - item_id: raw_lobster
- level: 40
- success_message: You catch a {21}raw lobster{/}.
- weight: 100
- xp: 90
- fail_message: The pot comes up empty.
- gather_message: You lower your lobster pot into the water...
- skill: fishing
- success:
- base: 0.45
- cap: 0.85
- per_level: 0.005
- tools:
- - lobster_pot
+ drops:
+ - item_id: raw_lobster
+ level: 40
+ success_message: You catch a {21}raw lobster{/}.
+ weight: 100
+ xp: 90
+ fail_message: The pot comes up empty.
+ gather_message: You lower your lobster pot into the water...
+ skill: fishing
+ success:
+ base: 0.45
+ cap: 0.85
+ per_level: 0.005
+ tools:
+ - lobster_pot
name: cage fishing spot
diff --git a/data/objects/chaos_altar.yaml b/data/objects/chaos_altar.yaml
index 23e6efd..1657d1c 100644
--- a/data/objects/chaos_altar.yaml
+++ b/data/objects/chaos_altar.yaml
@@ -1,3 +1,4 @@
name: chaos altar
color: "E2"
-description: "A crackling altar of {E2 bold}chaotic energy{/}. Place scrap here with a chaos identifier to produce chaosjunk. Type 'id' to begin."
+description:
+ - text: "A crackling altar of {E2 bold}chaotic energy{/}. Place scrap here with a chaos identifier to produce chaosjunk. Type 'id' to begin."
diff --git a/data/objects/charging_station.yaml b/data/objects/charging_station.yaml
index e4199f1..7f01c24 100644
--- a/data/objects/charging_station.yaml
+++ b/data/objects/charging_station.yaml
@@ -1,3 +1,4 @@
name: Charging Station
-description: "A humming terminal with exposed capacitor banks. Its indicator light pulses with stored energy. You could recharge your battery here."
+description:
+ - text: "A humming terminal with exposed capacitor banks. Its indicator light pulses with stored energy. You could recharge your battery here."
inroom_description: "A charging station hums quietly against the wall."
diff --git a/data/objects/clay_rock.yaml b/data/objects/clay_rock.yaml
index 8f9275c..cf42412 100644
--- a/data/objects/clay_rock.yaml
+++ b/data/objects/clay_rock.yaml
@@ -1,22 +1,23 @@
color: "AD"
-description: A soft rock of clay.
+description:
+- text: A soft rock of clay.
gather:
- drops:
- - depletes: true
- item_id: clay
- level: 1
- success_message: You manage to mine some clay.
- weight: 100
- xp: 5
- fail_message: You chip away but get nothing useful.
- gather_message: You swing your pickaxe at the clay rock...
- respawn_broadcast: Some clay fills in a nearby rock.
- respawn_timer: 10
- skill: mining
- success:
- base: 0.6
- cap: 0.95
- per_level: 0.01
- tools:
- - pickaxe
+ drops:
+ - depletes: true
+ item_id: clay
+ level: 1
+ success_message: You manage to mine some clay.
+ weight: 100
+ xp: 5
+ fail_message: You chip away but get nothing useful.
+ gather_message: You swing your pickaxe at the clay rock...
+ respawn_broadcast: Some clay fills in a nearby rock.
+ respawn_timer: 10
+ skill: mining
+ success:
+ base: 0.6
+ cap: 0.95
+ per_level: 0.01
+ tools:
+ - pickaxe
name: clay rock
diff --git a/data/objects/cooking_range.yaml b/data/objects/cooking_range.yaml
index b6ea20a..66a45a2 100644
--- a/data/objects/cooking_range.yaml
+++ b/data/objects/cooking_range.yaml
@@ -1,3 +1,4 @@
name: cooking range
color: "FD"
-description: "A sturdy iron range with multiple burners. Perfect for cooking."
+description:
+ - text: "A sturdy iron range with multiple burners. Perfect for cooking."
diff --git a/data/objects/copper_rock.yaml b/data/objects/copper_rock.yaml
index dc4e166..ebfc78d 100644
--- a/data/objects/copper_rock.yaml
+++ b/data/objects/copper_rock.yaml
@@ -1,6 +1,7 @@
aliases: []
color: B2
-description: ""
+description:
+ - text: ""
gather:
bait: ""
deplete_timer: 0
diff --git a/data/objects/cosmic_altar.yaml b/data/objects/cosmic_altar.yaml
index 12cda89..7b7a0a3 100644
--- a/data/objects/cosmic_altar.yaml
+++ b/data/objects/cosmic_altar.yaml
@@ -1,3 +1,4 @@
name: cosmic altar
color: "C9"
-description: "A floating altar of {C9 bold}shimmering pink crystal{/}, surrounded by pinpricks of light like distant stars. Place scrap here with a cosmic identifier to produce cosmicjunk. Type 'id' to begin."
+description:
+ - text: "A floating altar of {C9 bold}shimmering pink crystal{/}, surrounded by pinpricks of light like distant stars. Place scrap here with a cosmic identifier to produce cosmicjunk. Type 'id' to begin."
diff --git a/data/objects/death_altar.yaml b/data/objects/death_altar.yaml
index ea6fb0d..527aaba 100644
--- a/data/objects/death_altar.yaml
+++ b/data/objects/death_altar.yaml
@@ -1,3 +1,4 @@
name: death altar
color: "34"
-description: "A silent altar of {34 bold}dark obsidian{/}, cold to the touch. Place scrap here with a death identifier to produce deathjunk. Type 'id' to begin."
+description:
+ - text: "A silent altar of {34 bold}dark obsidian{/}, cold to the touch. Place scrap here with a death identifier to produce deathjunk. Type 'id' to begin."
diff --git a/data/objects/eco_altar.yaml b/data/objects/eco_altar.yaml
index 8281778..929dfbc 100644
--- a/data/objects/eco_altar.yaml
+++ b/data/objects/eco_altar.yaml
@@ -1,3 +1,4 @@
name: eco altar
color: "22"
-description: "A thrumming altar of green organic circuits. Place scrap here with an eco identifier to produce ecojunk. Type 'id' to begin."
+description:
+ - text: "A thrumming altar of green organic circuits. Place scrap here with an eco identifier to produce ecojunk. Type 'id' to begin."
diff --git a/data/objects/estate_directory.yaml b/data/objects/estate_directory.yaml
index 1c0b406..989bcc4 100644
--- a/data/objects/estate_directory.yaml
+++ b/data/objects/estate_directory.yaml
@@ -1,4 +1,5 @@
name: Estate Directory
color: "27"
-description: "A holographic terminal displaying property records. The screen glows with a soft cyan light."
+description:
+ - text: "A holographic terminal displaying property records. The screen glows with a soft cyan light."
inroom_description: "An estate directory terminal stands in the center of the neighborhood."
diff --git a/data/objects/fence_post.yaml b/data/objects/fence_post.yaml
index b90f2f5..82bb7d8 100644
--- a/data/objects/fence_post.yaml
+++ b/data/objects/fence_post.yaml
@@ -2,7 +2,8 @@ name: fence post
color: "89"
hidden: true
inroom_description: "A sturdy fence post juts from the ground."
-description: "A weathered wooden fence post, solid enough to crouch behind."
+description:
+ - text: "A weathered wooden fence post, solid enough to crouch behind."
safespot:
tier: 1
max_block_size: small
diff --git a/data/objects/fire.yaml b/data/objects/fire.yaml
index 2e83a83..daf5fa0 100644
--- a/data/objects/fire.yaml
+++ b/data/objects/fire.yaml
@@ -3,4 +3,5 @@ color: "D0"
hidden: false
inroom_description: "A fire is burning warmly."
removal_item: ashes
-description: "A crackling fire. Burning for {quality} more ticks."
+description:
+ - text: "A crackling fire. Burning for {quality} more ticks."
diff --git a/data/objects/flower_patch.yaml b/data/objects/flower_patch.yaml
index 17a4b72..8abd028 100644
--- a/data/objects/flower_patch.yaml
+++ b/data/objects/flower_patch.yaml
@@ -2,4 +2,5 @@ name: flower patch
color: "D5"
hidden: false
inroom_description: "A flower patch is outlined with small stones."
-description: "A small decorative patch for growing flowers. Use 'inspect' to check its status."
+description:
+ - text: "A small decorative patch for growing flowers. Use 'inspect' to check its status."
diff --git a/data/objects/fly_fishing_spot.yaml b/data/objects/fly_fishing_spot.yaml
index 8c32d38..fce9667 100644
--- a/data/objects/fly_fishing_spot.yaml
+++ b/data/objects/fly_fishing_spot.yaml
@@ -1,30 +1,31 @@
color: "4B"
-description: Insects dance above the water. Use a fly fishing rod with feathers here.
+description:
+- text: Insects dance above the water. Use a fly fishing rod with feathers here.
gather:
- bait: feather
- drops:
- - item_id: raw_trout
- level: 20
- success_message: You catch a {45}raw trout{/}.
- weight: 50
- xp: 50
- - item_id: raw_salmon
- level: 30
- success_message: You catch a {45}raw salmon{/}.
- weight: 50
- xp: 70
- - item_id: raw_rainbow_fish
- level: 38
- success_message: You catch a {B1}raw rainbow fish{/}.
- weight: 30
- xp: 80
- fail_message: Nothing seems to bite.
- gather_message: You cast your fly into the water...
- skill: fishing
- success:
- base: 0.5
- cap: 0.9
- per_level: 0.005
- tools:
- - fly_rod
+ bait: feather
+ drops:
+ - item_id: raw_trout
+ level: 20
+ success_message: You catch a {45}raw trout{/}.
+ weight: 50
+ xp: 50
+ - item_id: raw_salmon
+ level: 30
+ success_message: You catch a {45}raw salmon{/}.
+ weight: 50
+ xp: 70
+ - item_id: raw_rainbow_fish
+ level: 38
+ success_message: You catch a {B1}raw rainbow fish{/}.
+ weight: 30
+ xp: 80
+ fail_message: Nothing seems to bite.
+ gather_message: You cast your fly into the water...
+ skill: fishing
+ success:
+ base: 0.5
+ cap: 0.9
+ per_level: 0.005
+ tools:
+ - fly_rod
name: fly fishing spot
diff --git a/data/objects/furnace.yaml b/data/objects/furnace.yaml
index 8f093ea..4846c69 100644
--- a/data/objects/furnace.yaml
+++ b/data/objects/furnace.yaml
@@ -1,3 +1,4 @@
name: furnace
color: "C4"
-description: "A blazing hot furnace for smelting ores into bars."
+description:
+ - text: "A blazing hot furnace for smelting ores into bars."
diff --git a/data/objects/harpoon_fishing_spot.yaml b/data/objects/harpoon_fishing_spot.yaml
index b7497ca..f42cc30 100644
--- a/data/objects/harpoon_fishing_spot.yaml
+++ b/data/objects/harpoon_fishing_spot.yaml
@@ -1,34 +1,35 @@
aliases: []
color: 4B
-description: Large shadows move beneath the waves. Use a harpoon here.
+description:
+- text: Large shadows move beneath the waves. Use a harpoon here.
gather:
bait: ""
depleted_message: ""
drops:
- - depletes: false
- item_id: raw_tuna
- level: 35
- message: ""
- quantity: 0
- table: ""
- weight: 60
- xp: 80
- - depletes: false
- item_id: raw_swordfish
- level: 50
- message: ""
- quantity: 0
- table: ""
- weight: 50
- xp: 100
- - depletes: false
- item_id: raw_shark
- level: 76
- message: ""
- quantity: 0
- table: ""
- weight: 30
- xp: 110
+ - depletes: false
+ item_id: raw_tuna
+ level: 35
+ message: ""
+ quantity: 0
+ table: ""
+ weight: 60
+ xp: 80
+ - depletes: false
+ item_id: raw_swordfish
+ level: 50
+ message: ""
+ quantity: 0
+ table: ""
+ weight: 50
+ xp: 100
+ - depletes: false
+ item_id: raw_shark
+ level: 76
+ message: ""
+ quantity: 0
+ table: ""
+ weight: 30
+ xp: 110
exhausted_message: ""
fail_message: You fail to spear anything.
gather_message: You ready your harpoon...
@@ -39,7 +40,7 @@ gather:
cap: 0.8
per_level: 0.005
tools:
- - harpoon
+ - harpoon
hidden: false
id: harpoon_fishing_spot
inroom_description: ""
diff --git a/data/objects/herb_patch.yaml b/data/objects/herb_patch.yaml
index ff6cf3f..37706ee 100644
--- a/data/objects/herb_patch.yaml
+++ b/data/objects/herb_patch.yaml
@@ -2,4 +2,5 @@ name: herb patch
color: "1C"
hidden: false
inroom_description: "A prepared herb patch sits in the soil."
-description: "A small patch of tilled soil suitable for growing herbs. Use 'inspect' to check its status."
+description:
+ - text: "A small patch of tilled soil suitable for growing herbs. Use 'inspect' to check its status."
diff --git a/data/objects/hydro_altar.yaml b/data/objects/hydro_altar.yaml
index 83fee9f..665c1c5 100644
--- a/data/objects/hydro_altar.yaml
+++ b/data/objects/hydro_altar.yaml
@@ -1,3 +1,4 @@
name: hydro altar
color: "27"
-description: "A pulsing altar of blue crystalline conduits. Place scrap here with a hydro identifier to produce hydrojunk. Type 'id' to begin."
+description:
+ - text: "A pulsing altar of blue crystalline conduits. Place scrap here with a hydro identifier to produce hydrojunk. Type 'id' to begin."
diff --git a/data/objects/iron_gate.yaml b/data/objects/iron_gate.yaml
index b5c7de6..5d6d53e 100644
--- a/data/objects/iron_gate.yaml
+++ b/data/objects/iron_gate.yaml
@@ -1,13 +1,14 @@
color: "FA"
-description: A heavy iron gate. It looks like it can be pushed open.
+description:
+- text: A heavy iron gate. It looks like it can be pushed open.
hidden: true
name: iron gate
on_use:
- - condition:
- global_flag: gate_open
- not: true
- value: true
- message: You push the heavy iron gate open.
- action:
- set_global_flags:
- gate_open: true
+- condition:
+ global_flag: gate_open
+ not: true
+ value: true
+ message: You push the heavy iron gate open.
+ action:
+ set_global_flags:
+ gate_open: true
diff --git a/data/objects/law_altar.yaml b/data/objects/law_altar.yaml
index 1d9bbdd..67a4a57 100644
--- a/data/objects/law_altar.yaml
+++ b/data/objects/law_altar.yaml
@@ -1,3 +1,4 @@
name: law altar
color: "1B"
-description: "An imposing altar of {1B bold}pristine blue stone{/}, inscribed with orderly geometric patterns. Place scrap here with a law identifier to produce lawjunk. Type 'id' to begin."
+description:
+ - text: "An imposing altar of {1B bold}pristine blue stone{/}, inscribed with orderly geometric patterns. Place scrap here with a law identifier to produce lawjunk. Type 'id' to begin."
diff --git a/data/objects/lumby_fountain.yaml b/data/objects/lumby_fountain.yaml
index 6b977ef..e5faee0 100644
--- a/data/objects/lumby_fountain.yaml
+++ b/data/objects/lumby_fountain.yaml
@@ -1,3 +1,4 @@
name: town fountain
color: "51"
-description: "Clear water sparkles in the sunlight."
+description:
+ - text: "Clear water sparkles in the sunlight."
diff --git a/data/objects/market_stall.yaml b/data/objects/market_stall.yaml
index 36be9c9..8339981 100644
--- a/data/objects/market_stall.yaml
+++ b/data/objects/market_stall.yaml
@@ -1,5 +1,6 @@
name: Market Stall
-description: "A wooden stall piled with food and sundries. The vendor doesn't seem particularly attentive."
+description:
+ - text: "A wooden stall piled with food and sundries. The vendor doesn't seem particularly attentive."
color: "B3"
inroom_description: "A bustling {B3}market stall{/} is set up here."
hidden: false
diff --git a/data/objects/nature_altar.yaml b/data/objects/nature_altar.yaml
index 4ff7e85..d089420 100644
--- a/data/objects/nature_altar.yaml
+++ b/data/objects/nature_altar.yaml
@@ -1,3 +1,4 @@
name: nature altar
color: "2E"
-description: "A verdant altar of {2E bold}living green stone{/}, covered in moss and tiny flowers. Place scrap here with a nature identifier to produce naturejunk. Type 'id' to begin."
+description:
+ - text: "A verdant altar of {2E bold}living green stone{/}, covered in moss and tiny flowers. Place scrap here with a nature identifier to produce naturejunk. Type 'id' to begin."
diff --git a/data/objects/net_fishing_spot.yaml b/data/objects/net_fishing_spot.yaml
index 49c8f51..58a777a 100644
--- a/data/objects/net_fishing_spot.yaml
+++ b/data/objects/net_fishing_spot.yaml
@@ -1,46 +1,47 @@
color: "4B"
-description: Bubbles break the surface. Use a small or big fishing net here.
+description:
+- text: Bubbles break the surface. Use a small or big fishing net here.
gather:
- depleted_message: You don't see any fish swimming here.
- drops:
- - item_id: raw_shrimps
- level: 1
- success_message: You catch some {4B}raw shrimps{/}.
- tool: small_net
- weight: 50
- xp: 10
- - item_id: raw_anchovies
- level: 1
- success_message: You catch some {4B}raw anchovies{/}.
- tool: small_net
- weight: 50
- xp: 10
- - item_id: raw_mackerel
- level: 16
- success_message: You catch a {45}raw mackerel{/}.
- tool: small_net
- weight: 50
- xp: 20
- - item_id: raw_cod
- level: 23
- success_message: You catch a {45}raw cod{/}.
- tool: big_net
- weight: 50
- xp: 30
- - item_id: raw_bass
- level: 46
- success_message: You catch a {45}raw bass{/}.
- tool: big_net
- weight: 50
- xp: 50
- fail_message: You catch nothing.
- gather_message: You cast your net into the water...
- skill: fishing
- success:
- base: 0.5
- cap: 0.9
- per_level: 0.005
- tools:
- - small_net
- - big_net
+ depleted_message: You don't see any fish swimming here.
+ drops:
+ - item_id: raw_shrimps
+ level: 1
+ success_message: You catch some {4B}raw shrimps{/}.
+ tool: small_net
+ weight: 50
+ xp: 10
+ - item_id: raw_anchovies
+ level: 1
+ success_message: You catch some {4B}raw anchovies{/}.
+ tool: small_net
+ weight: 50
+ xp: 10
+ - item_id: raw_mackerel
+ level: 16
+ success_message: You catch a {45}raw mackerel{/}.
+ tool: small_net
+ weight: 50
+ xp: 20
+ - item_id: raw_cod
+ level: 23
+ success_message: You catch a {45}raw cod{/}.
+ tool: big_net
+ weight: 50
+ xp: 30
+ - item_id: raw_bass
+ level: 46
+ success_message: You catch a {45}raw bass{/}.
+ tool: big_net
+ weight: 50
+ xp: 50
+ fail_message: You catch nothing.
+ gather_message: You cast your net into the water...
+ skill: fishing
+ success:
+ base: 0.5
+ cap: 0.9
+ per_level: 0.005
+ tools:
+ - small_net
+ - big_net
name: net fishing spot
diff --git a/data/objects/netrunner.yaml b/data/objects/netrunner.yaml
index 7d75a51..371cb46 100644
--- a/data/objects/netrunner.yaml
+++ b/data/objects/netrunner.yaml
@@ -1,66 +1,67 @@
color: "27"
-description: A wiry figure hunched over a custom rig, fingers dancing across holographic keys. Cables snake from the back of their neck into the terminal. They glance up at you with augmented eyes.
+description:
+- text: A wiry figure hunched over a custom rig, fingers dancing across holographic keys. Cables snake from the back of their neck into the terminal. They glance up at you with augmented eyes.
inroom_description: A {27}Netrunner{/} sits cross-legged on the floor, wired into the network.
name: Netrunner
talk:
- nodes:
- start:
- messages:
- - The Netrunner looks up. "You want in on the network? I can give you some pointers."
- options:
- - goto: what_is
- text: '"What is hacking?"'
- - goto: terminals
- text: '"Where can I find terminals?"'
- - goto: tips_basic
- text: '"Any tips for the basic terminal?"'
- - condition:
- player_flag: hacking_asked_basic
- value: true
- goto: tips_advanced
- text: '"What about the advanced terminal?"'
- - condition:
- player_flag: hacking_asked_advanced
- value: true
- goto: tips_secure
- text: '"Tell me about the secure terminal."'
- - text: '"Goodbye."'
- terminals:
- messages:
- - '"There''s a basic terminal right here in this lab -- good for beginners. The station down east has an advanced one if you''ve got the chops. And if you''re really good, there''s a secure terminal deep in the compound. You''ll need the skills to match though."'
- options:
- - goto: tips_basic
- text: '"Any tips?"'
- - text: '"Thanks."'
- tips_advanced:
- action:
- set_player_flags:
- hacking_asked_advanced: true
- messages:
- - '"Advanced terminal runs a cipher crack. Four symbols, no repeats. You get feedback after each guess -- locked means right spot, found means right symbol wrong spot. Process of elimination. Ten tries."'
- options:
- - goto: tips_secure
- text: '"Tell me about the secure terminal."'
- - text: '"Thanks."'
- tips_basic:
- action:
- set_player_flags:
- hacking_asked_basic: true
- messages:
- - '"The basic terminal runs an old rogue AI hunt. Twenty nodes in a network. You''ve got probes to flush it out. Listen for the warnings -- corrupted data means it''s close, voids mean a trap, static means ICE. Shoot into adjacent nodes, don''t walk into danger."'
- options:
- - goto: tips_advanced
- text: '"What about the advanced terminal?"'
- - text: '"Thanks."'
- tips_secure:
- messages:
- - '"Secure terminal? Signal Bluff. It''s a bluffing game -- you and the system each roll hidden dice and take turns making claims about the total. Ones are wild. Call the bluff or raise the stakes. Read the probabilities, play the odds, and don''t let it psych you out."'
- options:
- - text: '"Thanks."'
- what_is:
- messages:
- - '"Hacking''s about jacking into terminals and running their gauntlets. Each terminal runs a different challenge -- puzzles, hunts, pattern games. Crack ''em and you get better at it. Simple as that."'
- options:
- - goto: terminals
- text: '"Where can I find terminals?"'
- - text: '"Goodbye."'
+ nodes:
+ start:
+ messages:
+ - The Netrunner looks up. "You want in on the network? I can give you some pointers."
+ options:
+ - goto: what_is
+ text: '"What is hacking?"'
+ - goto: terminals
+ text: '"Where can I find terminals?"'
+ - goto: tips_basic
+ text: '"Any tips for the basic terminal?"'
+ - condition:
+ player_flag: hacking_asked_basic
+ value: true
+ goto: tips_advanced
+ text: '"What about the advanced terminal?"'
+ - condition:
+ player_flag: hacking_asked_advanced
+ value: true
+ goto: tips_secure
+ text: '"Tell me about the secure terminal."'
+ - text: '"Goodbye."'
+ terminals:
+ messages:
+ - '"There''s a basic terminal right here in this lab -- good for beginners. The station down east has an advanced one if you''ve got the chops. And if you''re really good, there''s a secure terminal deep in the compound. You''ll need the skills to match though."'
+ options:
+ - goto: tips_basic
+ text: '"Any tips?"'
+ - text: '"Thanks."'
+ tips_advanced:
+ action:
+ set_player_flags:
+ hacking_asked_advanced: true
+ messages:
+ - '"Advanced terminal runs a cipher crack. Four symbols, no repeats. You get feedback after each guess -- locked means right spot, found means right symbol wrong spot. Process of elimination. Ten tries."'
+ options:
+ - goto: tips_secure
+ text: '"Tell me about the secure terminal."'
+ - text: '"Thanks."'
+ tips_basic:
+ action:
+ set_player_flags:
+ hacking_asked_basic: true
+ messages:
+ - '"The basic terminal runs an old rogue AI hunt. Twenty nodes in a network. You''ve got probes to flush it out. Listen for the warnings -- corrupted data means it''s close, voids mean a trap, static means ICE. Shoot into adjacent nodes, don''t walk into danger."'
+ options:
+ - goto: tips_advanced
+ text: '"What about the advanced terminal?"'
+ - text: '"Thanks."'
+ tips_secure:
+ messages:
+ - '"Secure terminal? Signal Bluff. It''s a bluffing game -- you and the system each roll hidden dice and take turns making claims about the total. Ones are wild. Call the bluff or raise the stakes. Read the probabilities, play the odds, and don''t let it psych you out."'
+ options:
+ - text: '"Thanks."'
+ what_is:
+ messages:
+ - '"Hacking''s about jacking into terminals and running their gauntlets. Each terminal runs a different challenge -- puzzles, hunts, pattern games. Crack ''em and you get better at it. Simple as that."'
+ options:
+ - goto: terminals
+ text: '"Where can I find terminals?"'
+ - text: '"Goodbye."'
diff --git a/data/objects/pottery_oven.yaml b/data/objects/pottery_oven.yaml
index 5971c3f..e05dad8 100644
--- a/data/objects/pottery_oven.yaml
+++ b/data/objects/pottery_oven.yaml
@@ -1,3 +1,4 @@
name: pottery oven
color: "C4"
-description: "A kiln for firing pottery."
+description:
+ - text: "A kiln for firing pottery."
diff --git a/data/objects/pottery_wheel.yaml b/data/objects/pottery_wheel.yaml
index 03e22b4..12affaf 100644
--- a/data/objects/pottery_wheel.yaml
+++ b/data/objects/pottery_wheel.yaml
@@ -1,3 +1,4 @@
name: pottery wheel
color: "AD"
-description: "A foot-powered pottery wheel for shaping clay."
+description:
+ - text: "A foot-powered pottery wheel for shaping clay."
diff --git a/data/objects/rock_outcrop.yaml b/data/objects/rock_outcrop.yaml
index 40a87bb..75bf2dc 100644
--- a/data/objects/rock_outcrop.yaml
+++ b/data/objects/rock_outcrop.yaml
@@ -2,7 +2,8 @@ name: rock outcrop
color: "F8"
hidden: true
inroom_description: "A jagged rock outcrop juts from the floor."
-description: "A large, jagged rock formation providing natural cover."
+description:
+ - text: "A large, jagged rock formation providing natural cover."
safespot:
tier: 1
max_block_size: large
diff --git a/data/objects/sacred_eel_spot.yaml b/data/objects/sacred_eel_spot.yaml
index 1a712cb..4be35db 100644
--- a/data/objects/sacred_eel_spot.yaml
+++ b/data/objects/sacred_eel_spot.yaml
@@ -1,20 +1,21 @@
color: "B1"
-description: Waters shimmer with an otherworldly light. Use a fishing rod with bait here.
+description:
+- text: Waters shimmer with an otherworldly light. Use a fishing rod with bait here.
gather:
- bait: fishing_bait
- drops:
- - item_id: sacred_eel
- level: 87
- success_message: You catch a {B1}sacred eel{/}.
- weight: 100
- xp: 125
- fail_message: Nothing seems to bite.
- gather_message: You cast your line near the sacred waters...
- skill: fishing
- success:
- base: 0.25
- cap: 0.75
- per_level: 0.005
- tools:
- - fishing_rod
+ bait: fishing_bait
+ drops:
+ - item_id: sacred_eel
+ level: 87
+ success_message: You catch a {B1}sacred eel{/}.
+ weight: 100
+ xp: 125
+ fail_message: Nothing seems to bite.
+ gather_message: You cast your line near the sacred waters...
+ skill: fishing
+ success:
+ base: 0.25
+ cap: 0.75
+ per_level: 0.005
+ tools:
+ - fishing_rod
name: sacred eel spot
diff --git a/data/objects/sheep.yaml b/data/objects/sheep.yaml
index e482198..580af39 100644
--- a/data/objects/sheep.yaml
+++ b/data/objects/sheep.yaml
@@ -1,23 +1,24 @@
color: "FF"
-description: A fluffy sheep, ready to be shorn.
+description:
+- text: A fluffy sheep, ready to be shorn.
gather:
- drops:
- - depletes: true
- item_id: wool
- level: 1
- success_message: You shear some wool from the sheep.
- weight: 100
- xp: 0
- fail_message: The sheep wriggles free!
- gather_message: You hold the sheep still and begin shearing...
- respawn_broadcast: A sheep grows a fresh coat of wool.
- respawn_timer: 100
- skill: crafting
- success:
- base: 0.95
- cap: 0.95
- per_level: 0
- tools:
- - shears
+ drops:
+ - depletes: true
+ item_id: wool
+ level: 1
+ success_message: You shear some wool from the sheep.
+ weight: 100
+ xp: 0
+ fail_message: The sheep wriggles free!
+ gather_message: You hold the sheep still and begin shearing...
+ respawn_broadcast: A sheep grows a fresh coat of wool.
+ respawn_timer: 100
+ skill: crafting
+ success:
+ base: 0.95
+ cap: 0.95
+ per_level: 0
+ tools:
+ - shears
inroom_description: A fluffy sheep is wandering around here.
name: sheep
diff --git a/data/objects/simple_rock.yaml b/data/objects/simple_rock.yaml
index 656c00b..41bd92c 100644
--- a/data/objects/simple_rock.yaml
+++ b/data/objects/simple_rock.yaml
@@ -2,7 +2,8 @@ name: rock formation
color: "F8"
hidden: true
inroom_description: "A sturdy rock formation juts from the ground."
-description: "A solid rock formation, weathered but large enough to crouch behind."
+description:
+ - text: "A solid rock formation, weathered but large enough to crouch behind."
safespot:
tier: 1
max_block_size: small
diff --git a/data/objects/solar_altar.yaml b/data/objects/solar_altar.yaml
index c8923ab..bcd6ec3 100644
--- a/data/objects/solar_altar.yaml
+++ b/data/objects/solar_altar.yaml
@@ -1,3 +1,4 @@
name: solar altar
color: "DC"
-description: "A humming altar of golden circuitry. Place scrap here with a solar identifier to produce solarjunk. Type 'id' to begin."
+description:
+ - text: "A humming altar of golden circuitry. Place scrap here with a solar identifier to produce solarjunk. Type 'id' to begin."
diff --git a/data/objects/spinning_wheel.yaml b/data/objects/spinning_wheel.yaml
index f24d2f8..a140286 100644
--- a/data/objects/spinning_wheel.yaml
+++ b/data/objects/spinning_wheel.yaml
@@ -1,3 +1,4 @@
name: spinning wheel
color: "82"
-description: "A wooden spinning wheel for spinning wool and flax."
+description:
+ - text: "A wooden spinning wheel for spinning wool and flax."
diff --git a/data/objects/swamp_fishing_spot.yaml b/data/objects/swamp_fishing_spot.yaml
index 5c2cafc..a1054a7 100644
--- a/data/objects/swamp_fishing_spot.yaml
+++ b/data/objects/swamp_fishing_spot.yaml
@@ -1,25 +1,26 @@
color: "6C"
-description: Murky water bubbles ominously. Use a fishing rod with bait here.
+description:
+- text: Murky water bubbles ominously. Use a fishing rod with bait here.
gather:
- bait: fishing_bait
- drops:
- - item_id: raw_slimy_eel
- level: 28
- success_message: You catch a {6C}raw slimy eel{/}.
- weight: 60
- xp: 80
- - item_id: raw_cave_eel
- level: 38
- success_message: You catch a {50}raw cave eel{/}.
- weight: 40
- xp: 80
- fail_message: Nothing seems to bite.
- gather_message: You cast your line into the murky swamp...
- skill: fishing
- success:
- base: 0.45
- cap: 0.85
- per_level: 0.005
- tools:
- - fishing_rod
+ bait: fishing_bait
+ drops:
+ - item_id: raw_slimy_eel
+ level: 28
+ success_message: You catch a {6C}raw slimy eel{/}.
+ weight: 60
+ xp: 80
+ - item_id: raw_cave_eel
+ level: 38
+ success_message: You catch a {50}raw cave eel{/}.
+ weight: 40
+ xp: 80
+ fail_message: Nothing seems to bite.
+ gather_message: You cast your line into the murky swamp...
+ skill: fishing
+ success:
+ base: 0.45
+ cap: 0.85
+ per_level: 0.005
+ tools:
+ - fishing_rod
name: swamp fishing spot
diff --git a/data/objects/terminal_advanced.yaml b/data/objects/terminal_advanced.yaml
index e4a21f0..f519225 100644
--- a/data/objects/terminal_advanced.yaml
+++ b/data/objects/terminal_advanced.yaml
@@ -1,4 +1,5 @@
name: advanced terminal
color: "21"
-description: "A sleek terminal with a holographic display. Encrypted data streams flow across the screen in complex patterns. {21}[Level 20 Hacking]{/}"
+description:
+ - text: "A sleek terminal with a holographic display. Encrypted data streams flow across the screen in complex patterns. {21}[Level 20 Hacking]{/}"
inroom_description: "An {21}advanced terminal{/} projects a holographic interface."
diff --git a/data/objects/terminal_basic.yaml b/data/objects/terminal_basic.yaml
index 5ed4c54..39a2d69 100644
--- a/data/objects/terminal_basic.yaml
+++ b/data/objects/terminal_basic.yaml
@@ -1,4 +1,5 @@
name: basic terminal
color: "28"
-description: "A battered terminal with a cracked screen. Faded text scrolls across the display -- it looks like it's running some kind of legacy intrusion detection system. {28}[Level 1 Hacking]{/}"
+description:
+ - text: "A battered terminal with a cracked screen. Faded text scrolls across the display -- it looks like it's running some kind of legacy intrusion detection system. {28}[Level 1 Hacking]{/}"
inroom_description: "A {28}basic terminal{/} hums quietly against the wall."
diff --git a/data/objects/terminal_secure.yaml b/data/objects/terminal_secure.yaml
index 7f4bd52..8d87821 100644
--- a/data/objects/terminal_secure.yaml
+++ b/data/objects/terminal_secure.yaml
@@ -1,4 +1,5 @@
name: secure terminal
color: "C4"
-description: "A heavily reinforced terminal embedded in the wall. Warning glyphs pulse across its surface. A bluffing protocol runs on loop -- it's probing you as much as you're probing it. {C4}[Level 40 Hacking]{/}"
+description:
+ - text: "A heavily reinforced terminal embedded in the wall. Warning glyphs pulse across its surface. A bluffing protocol runs on loop -- it's probing you as much as you're probing it. {C4}[Level 40 Hacking]{/}"
inroom_description: "A {C4}secure terminal{/} glows with warning indicators."
diff --git a/data/objects/tool_shed.yaml b/data/objects/tool_shed.yaml
index 119d3e2..7b539db 100644
--- a/data/objects/tool_shed.yaml
+++ b/data/objects/tool_shed.yaml
@@ -1,96 +1,97 @@
color: "5E"
-description: A small shed for storing farming tools. Talk to it to store or retrieve tools.
+description:
+- text: A small shed for storing farming tools. Talk to it to store or retrieve tools.
hidden: false
inroom_description: A weathered tool shed stands against the wall.
name: tool shed
talk:
- nodes:
- retrieve_rake:
- action:
- give_item: rake
- set_player_flags:
- tool_shed_rake: false
- messages:
- - You retrieve the rake from the tool shed.
- options:
- - goto: start
- text: Continue
- retrieve_spade:
- action:
- give_item: spade
- set_player_flags:
- tool_shed_spade: false
- messages:
- - You retrieve the spade from the tool shed.
- options:
- - goto: start
- text: Continue
- retrieve_watering_can:
- action:
- give_item: watering_can
- set_player_flags:
- tool_shed_watering_can: false
- messages:
- - You retrieve the watering can from the tool shed.
- options:
- - goto: start
- text: Continue
- start:
- messages:
- - The tool shed is open. What would you like to do?
- options:
- - condition:
- has_item: rake
- goto: store_rake
- text: Store rake
- - condition:
- has_item: spade
- goto: store_spade
- text: Store spade
- - condition:
- has_item: watering_can
- goto: store_watering_can
- text: Store watering can
- - condition:
- player_flag: tool_shed_rake
- goto: retrieve_rake
- text: Retrieve rake
- - condition:
- player_flag: tool_shed_spade
- goto: retrieve_spade
- text: Retrieve spade
- - condition:
- player_flag: tool_shed_watering_can
- goto: retrieve_watering_can
- text: Retrieve watering can
- - text: Never mind
- store_rake:
- action:
- set_player_flags:
- tool_shed_rake: true
- take_item: rake
- messages:
- - You store the rake in the tool shed.
- options:
- - goto: start
- text: Continue
- store_spade:
- action:
- set_player_flags:
- tool_shed_spade: true
- take_item: spade
- messages:
- - You store the spade in the tool shed.
- options:
- - goto: start
- text: Continue
- store_watering_can:
- action:
- set_player_flags:
- tool_shed_watering_can: true
- take_item: watering_can
- messages:
- - You store the watering can in the tool shed.
- options:
- - goto: start
- text: Continue
+ nodes:
+ retrieve_rake:
+ action:
+ give_item: rake
+ set_player_flags:
+ tool_shed_rake: false
+ messages:
+ - You retrieve the rake from the tool shed.
+ options:
+ - goto: start
+ text: Continue
+ retrieve_spade:
+ action:
+ give_item: spade
+ set_player_flags:
+ tool_shed_spade: false
+ messages:
+ - You retrieve the spade from the tool shed.
+ options:
+ - goto: start
+ text: Continue
+ retrieve_watering_can:
+ action:
+ give_item: watering_can
+ set_player_flags:
+ tool_shed_watering_can: false
+ messages:
+ - You retrieve the watering can from the tool shed.
+ options:
+ - goto: start
+ text: Continue
+ start:
+ messages:
+ - The tool shed is open. What would you like to do?
+ options:
+ - condition:
+ has_item: rake
+ goto: store_rake
+ text: Store rake
+ - condition:
+ has_item: spade
+ goto: store_spade
+ text: Store spade
+ - condition:
+ has_item: watering_can
+ goto: store_watering_can
+ text: Store watering can
+ - condition:
+ player_flag: tool_shed_rake
+ goto: retrieve_rake
+ text: Retrieve rake
+ - condition:
+ player_flag: tool_shed_spade
+ goto: retrieve_spade
+ text: Retrieve spade
+ - condition:
+ player_flag: tool_shed_watering_can
+ goto: retrieve_watering_can
+ text: Retrieve watering can
+ - text: Never mind
+ store_rake:
+ action:
+ set_player_flags:
+ tool_shed_rake: true
+ take_item: rake
+ messages:
+ - You store the rake in the tool shed.
+ options:
+ - goto: start
+ text: Continue
+ store_spade:
+ action:
+ set_player_flags:
+ tool_shed_spade: true
+ take_item: spade
+ messages:
+ - You store the spade in the tool shed.
+ options:
+ - goto: start
+ text: Continue
+ store_watering_can:
+ action:
+ set_player_flags:
+ tool_shed_watering_can: true
+ take_item: watering_can
+ messages:
+ - You store the watering can in the tool shed.
+ options:
+ - goto: start
+ text: Continue
diff --git a/data/objects/tutorial_lever.yaml b/data/objects/tutorial_lever.yaml
index 73166bd..9c105ba 100644
--- a/data/objects/tutorial_lever.yaml
+++ b/data/objects/tutorial_lever.yaml
@@ -2,7 +2,8 @@ name: stone lever
color: "FA"
hidden: true
inroom_description: "A stone lever protrudes from the base of the rock formation."
-description: "A weathered stone lever set into a metal bracket. It looks like it can be pulled."
+description:
+ - text: "A weathered stone lever set into a metal bracket. It looks like it can be pulled."
on_use:
- condition:
player_flag: unlocked_rock_cover
diff --git a/data/objects/workbench.yaml b/data/objects/workbench.yaml
index be2f8c1..7b73709 100644
--- a/data/objects/workbench.yaml
+++ b/data/objects/workbench.yaml
@@ -1,4 +1,5 @@
name: workbench
color: "AC"
-description: "A sturdy wooden workbench covered in sawdust, nails, and blueprints. The surface is worn from years of crafting."
+description:
+ - text: "A sturdy wooden workbench covered in sawdust, nails, and blueprints. The surface is worn from years of crafting."
inroom_description: "A workbench stands against the wall, cluttered with tools and wood shavings."
diff --git a/data/rooms/example_unused/player_housing/99999301.yaml b/data/rooms/example_unused/player_housing/99999301.yaml
index 7341508..19a38e9 100644
--- a/data/rooms/example_unused/player_housing/99999301.yaml
+++ b/data/rooms/example_unused/player_housing/99999301.yaml
@@ -1,7 +1,9 @@
name: "Player House: Workshop"
-description: "A well-lit workshop with a sturdy workbench covered in tools and blueprints. Wood shavings litter the floor around the bench."
+description:
+ - text: "A well-lit workshop with a sturdy workbench covered in tools and blueprints. Wood shavings litter the floor around the bench."
exits:
- south: 99999300
+ south:
+ room: 99999300
objects:
- id: workbench
- id: bank_booth
diff --git a/data/rooms/example_unused/town/9999910.yaml b/data/rooms/example_unused/town/9999910.yaml
index 6c9614a..43bfbb5 100644
--- a/data/rooms/example_unused/town/9999910.yaml
+++ b/data/rooms/example_unused/town/9999910.yaml
@@ -1,8 +1,11 @@
name: "Farming Plot"
-description: "A small patch of tilled soil behind a weathered fence. This area is not yet accessible."
+description:
+ - text: "A small patch of tilled soil behind a weathered fence. This area is not yet accessible."
exits:
- west: 999999
- east: 9999911
+ west:
+ room: 999999
+ east:
+ room: 9999911
mobs:
- id: skeleton
- id: skeleton
diff --git a/data/rooms/example_unused/town/9999912.yaml b/data/rooms/example_unused/town/9999912.yaml
index 60d55a2..0df117e 100644
--- a/data/rooms/example_unused/town/9999912.yaml
+++ b/data/rooms/example_unused/town/9999912.yaml
@@ -1,27 +1,30 @@
name: "Forge"
-description: "A blazing forge and anvil dominate this smoky workshop. The heat from the furnace is intense."
+description:
+- text: "A blazing forge and anvil dominate this smoky workshop. The heat from the furnace is intense."
exits:
- east: 9999913
- west: 9999911
+ east:
+ room: 9999913
+ west:
+ room: 9999911
mobs:
- - "weapons_smith"
+- id: weapons_smith
objects:
- - id: furnace
- - id: anvil
- - id: bank_booth
+- id: furnace
+- id: anvil
+- id: bank_booth
item_spawns:
- - id: copper_ore
- quantity: 3
- respawn_ticks: 30
- - id: tin_ore
- quantity: 3
- respawn_ticks: 30
- - id: iron_ore
- quantity: 3
- respawn_ticks: 30
- - id: coal
- quantity: 5
- respawn_ticks: 30
- - id: hammer
- quantity: 1
- respawn_ticks: 30
+- id: copper_ore
+ quantity: 3
+ respawn_ticks: 30
+- id: tin_ore
+ quantity: 3
+ respawn_ticks: 30
+- id: iron_ore
+ quantity: 3
+ respawn_ticks: 30
+- id: coal
+ quantity: 5
+ respawn_ticks: 30
+- id: hammer
+ quantity: 1
+ respawn_ticks: 30
diff --git a/data/rooms/example_unused/town/9999913.yaml b/data/rooms/example_unused/town/9999913.yaml
index 24339bf..318369c 100644
--- a/data/rooms/example_unused/town/9999913.yaml
+++ b/data/rooms/example_unused/town/9999913.yaml
@@ -1,8 +1,11 @@
name: "Crafting Workshop"
-description: "A bustling workshop filled with crafting stations. A {130}spinning wheel{/} sits in one corner, a {173}pottery wheel{/} and {196}pottery oven{/} in another. Racks of tools and raw materials line the walls. The forge is just to the west."
+description:
+ - text: "A bustling workshop filled with crafting stations. A {130}spinning wheel{/} sits in one corner, a {173}pottery wheel{/} and {196}pottery oven{/} in another. Racks of tools and raw materials line the walls. The forge is just to the west."
exits:
- east: 9999914
- west: 9999912
+ east:
+ room: 9999914
+ west:
+ room: 9999912
objects:
- id: spinning_wheel
- id: pottery_wheel
diff --git a/data/rooms/example_unused/town/9999918.yaml b/data/rooms/example_unused/town/9999918.yaml
index 1afdc73..31e81bc 100644
--- a/data/rooms/example_unused/town/9999918.yaml
+++ b/data/rooms/example_unused/town/9999918.yaml
@@ -1,5 +1,8 @@
name: "Thieves' Den"
-description: "A shadowy hideout with lockpicks, dark cloaks, and wanted posters on the walls. This area is not yet accessible."
+description:
+ - text: "A shadowy hideout with lockpicks, dark cloaks, and wanted posters on the walls. This area is not yet accessible."
exits:
- east: 9999919
- west: 9999917
+ east:
+ room: 9999919
+ west:
+ room: 9999917
diff --git a/data/rooms/example_unused/town/9999919.yaml b/data/rooms/example_unused/town/9999919.yaml
index 2b199ef..a25b884 100644
--- a/data/rooms/example_unused/town/9999919.yaml
+++ b/data/rooms/example_unused/town/9999919.yaml
@@ -1,5 +1,8 @@
name: "Agility Course"
-description: "A training ground with balance beams, monkey bars, and climbing nets. This area is not yet accessible."
+description:
+ - text: "A training ground with balance beams, monkey bars, and climbing nets. This area is not yet accessible."
exits:
- east: 9999920
- west: 9999918
+ east:
+ room: 9999920
+ west:
+ room: 9999918
diff --git a/data/rooms/example_unused/town/999992.yaml b/data/rooms/example_unused/town/999992.yaml
index f37ec6a..3ac13a1 100644
--- a/data/rooms/example_unused/town/999992.yaml
+++ b/data/rooms/example_unused/town/999992.yaml
@@ -1,9 +1,13 @@
name: "Fishing Spot"
-description: "A quiet spot along the riverbank. The water is clear and fish can be seen swimming beneath the surface. You can cast a line here with a fishing rod and bait."
+description:
+ - text: "A quiet spot along the riverbank. The water is clear and fish can be seen swimming beneath the surface. You can cast a line here with a fishing rod and bait."
exits:
- east: 999994
- north: 999993
- west: 999991
+ east:
+ room: 999994
+ north:
+ room: 999993
+ west:
+ room: 999991
objects:
- id: bait_fishing_spot
item_spawns:
diff --git a/data/rooms/example_unused/town/9999920.yaml b/data/rooms/example_unused/town/9999920.yaml
index f097b04..67ad606 100644
--- a/data/rooms/example_unused/town/9999920.yaml
+++ b/data/rooms/example_unused/town/9999920.yaml
@@ -1,5 +1,8 @@
name: "Assassin's Bureau"
-description: "A discreet office with job postings pinned to a corkboard. This area is not yet accessible."
+description:
+ - text: "A discreet office with job postings pinned to a corkboard. This area is not yet accessible."
exits:
- east: 9999921
- west: 9999919
+ east:
+ room: 9999921
+ west:
+ room: 9999919
diff --git a/data/rooms/example_unused/town/9999921.yaml b/data/rooms/example_unused/town/9999921.yaml
index 5d7b270..d1b1739 100644
--- a/data/rooms/example_unused/town/9999921.yaml
+++ b/data/rooms/example_unused/town/9999921.yaml
@@ -1,7 +1,9 @@
name: "Combat Arena"
-description: "A sandy training ground with practice dummies and sparring rings. Several men wander here looking for a fight."
+description:
+ - text: "A sandy training ground with practice dummies and sparring rings. Several men wander here looking for a fight."
exits:
- west: 9999920
+ west:
+ room: 9999920
mobs:
- id: man
wander_interval: 10
diff --git a/data/rooms/example_unused/town/9999922.yaml b/data/rooms/example_unused/town/9999922.yaml
index 7084650..90683bb 100644
--- a/data/rooms/example_unused/town/9999922.yaml
+++ b/data/rooms/example_unused/town/9999922.yaml
@@ -1,5 +1,8 @@
name: "West of Town Square"
-description: ""
+description:
+ - text: ""
exits:
- east: 999991
- west: 9999923
+ east:
+ room: 999991
+ west:
+ room: 9999923
diff --git a/data/rooms/example_unused/town/9999923.yaml b/data/rooms/example_unused/town/9999923.yaml
index 95f8b2f..83613d2 100644
--- a/data/rooms/example_unused/town/9999923.yaml
+++ b/data/rooms/example_unused/town/9999923.yaml
@@ -1,5 +1,8 @@
name: "West of West of Town Square"
-description: "Here is a description of where we are!"
+description:
+ - text: "Here is a description of where we are!"
exits:
- east: 9999922
- south: 9999924
+ east:
+ room: 9999922
+ south:
+ room: 9999924
diff --git a/data/rooms/example_unused/town/9999924.yaml b/data/rooms/example_unused/town/9999924.yaml
index 78ce26f..7d6e175 100644
--- a/data/rooms/example_unused/town/9999924.yaml
+++ b/data/rooms/example_unused/town/9999924.yaml
@@ -1,5 +1,8 @@
name: "South of West of West of Town Square"
-description: "Here is a description of where we are!"
+description:
+ - text: "Here is a description of where we are!"
exits:
- north: 9999923
- east: 9999925
+ north:
+ room: 9999923
+ east:
+ room: 9999925
diff --git a/data/rooms/example_unused/town/9999925.yaml b/data/rooms/example_unused/town/9999925.yaml
index 50c2a5d..741d5da 100644
--- a/data/rooms/example_unused/town/9999925.yaml
+++ b/data/rooms/example_unused/town/9999925.yaml
@@ -1,5 +1,8 @@
name: "East of South of West of West of Town Square"
-description: "Here is a description of where we are!"
+description:
+ - text: "Here is a description of where we are!"
exits:
- west: 9999924
- east: 9999926
+ west:
+ room: 9999924
+ east:
+ room: 9999926
diff --git a/data/rooms/example_unused/town/9999926.yaml b/data/rooms/example_unused/town/9999926.yaml
index 72c6d5b..e6efc47 100644
--- a/data/rooms/example_unused/town/9999926.yaml
+++ b/data/rooms/example_unused/town/9999926.yaml
@@ -1,5 +1,8 @@
name: "East of South of West of West of Town Square"
-description: "Here is a description of where we are!"
+description:
+ - text: "Here is a description of where we are!"
exits:
- west: 9999925
- south: 9999927
+ west:
+ room: 9999925
+ south:
+ room: 9999927
diff --git a/data/rooms/example_unused/town/9999927.yaml b/data/rooms/example_unused/town/9999927.yaml
index 145e1bd..5862463 100644
--- a/data/rooms/example_unused/town/9999927.yaml
+++ b/data/rooms/example_unused/town/9999927.yaml
@@ -1,5 +1,8 @@
name: "East of South of West of West of Town Square"
-description: "Here is a description of where we are!"
+description:
+ - text: "Here is a description of where we are!"
exits:
- west: 9999928
- north: 9999926
+ west:
+ room: 9999928
+ north:
+ room: 9999926
diff --git a/data/rooms/example_unused/town/9999928.yaml b/data/rooms/example_unused/town/9999928.yaml
index 40f92ec..a0f7734 100644
--- a/data/rooms/example_unused/town/9999928.yaml
+++ b/data/rooms/example_unused/town/9999928.yaml
@@ -1,4 +1,6 @@
name: "East of South of West of West of Town Square"
-description: "Here is a description of where we are!"
+description:
+ - text: "Here is a description of where we are!"
exits:
- east: 9999927
+ east:
+ room: 9999927
diff --git a/data/rooms/example_unused/town/999996.yaml b/data/rooms/example_unused/town/999996.yaml
index 22a2cb5..2106b86 100644
--- a/data/rooms/example_unused/town/999996.yaml
+++ b/data/rooms/example_unused/town/999996.yaml
@@ -1,9 +1,13 @@
name: "Mining Pit"
-description: "A small mining pit. The rocky walls glint with veins of copper ore."
+description:
+ - text: "A small mining pit. The rocky walls glint with veins of copper ore."
exits:
- east: 999998
- north: 999997
- west: 999994
+ east:
+ room: 999998
+ north:
+ room: 999997
+ west:
+ room: 999994
objects:
- id: copper_rock
- id: copper_rock
diff --git a/data/rooms/example_unused/town/999998.yaml b/data/rooms/example_unused/town/999998.yaml
index 1fd0de5..81d06e1 100644
--- a/data/rooms/example_unused/town/999998.yaml
+++ b/data/rooms/example_unused/town/999998.yaml
@@ -1,8 +1,11 @@
name: "Hacking Lab"
-description: "A dimly lit room filled with old terminals and flickering screens. Cables dangle from the ceiling, some still sparking. The air smells of ozone and burnt circuitry. A {40}basic terminal{/} against the far wall still has power."
+description:
+ - text: "A dimly lit room filled with old terminals and flickering screens. Cables dangle from the ceiling, some still sparking. The air smells of ozone and burnt circuitry. A {40}basic terminal{/} against the far wall still has power."
exits:
- east: 999999
- west: 999996
+ east:
+ room: 999999
+ west:
+ room: 999996
objects:
- id: terminal_basic
- id: terminal_advanced
diff --git a/data/rooms/example_unused/town/999999.yaml b/data/rooms/example_unused/town/999999.yaml
index 3bc9938..1b8106e 100644
--- a/data/rooms/example_unused/town/999999.yaml
+++ b/data/rooms/example_unused/town/999999.yaml
@@ -1,10 +1,15 @@
name: "Scavenging Post"
-description: "A cluttered yard full of {243}scrap{/} and discarded technology. Piles of salvageable debris are scattered across the ground. The air smells of ozone and rust."
+description:
+ - text: "A cluttered yard full of {243}scrap{/} and discarded technology. Piles of salvageable debris are scattered across the ground. The air smells of ozone and rust."
exits:
- east: 9999910
- west: 999998
- north: 99999150
- south: 99999151
+ east:
+ room: 9999910
+ west:
+ room: 999998
+ north:
+ room: 99999150
+ south:
+ room: 99999151
objects:
- id: scrap_pile
- id: scrap_pile
diff --git a/data/rooms/example_unused/underground2/9999954.yaml b/data/rooms/example_unused/underground2/9999954.yaml
index 8348801..cee1ccd 100644
--- a/data/rooms/example_unused/underground2/9999954.yaml
+++ b/data/rooms/example_unused/underground2/9999954.yaml
@@ -1,8 +1,11 @@
name: "The Void Chamber"
-description: "A vast cavern where reality seems to thin. The air shimmers with {141}spectral energy{/} and strange whispers fill your mind."
+description:
+- text: "A vast cavern where reality seems to thin. The air shimmers with {141}spectral energy{/} and strange whispers fill your mind."
exits:
- north: 9999953
- down: 9999955
+ north:
+ room: 9999953
+ down:
+ room: 9999955
mobs:
- - "phantom"
- - "phantom"
+- id: phantom
+- id: phantom
diff --git a/data/rooms/example_unused/underground2/9999955.yaml b/data/rooms/example_unused/underground2/9999955.yaml
index 2cce00a..f12e556 100644
--- a/data/rooms/example_unused/underground2/9999955.yaml
+++ b/data/rooms/example_unused/underground2/9999955.yaml
@@ -1,11 +1,18 @@
name: "The Deeper Tunnels"
-description: "A junction deep beneath the void chamber. The walls here are reinforced with pre-regression alloys. Several passages branch off into the darkness, and you can hear the sounds of machinery echoing from all directions. A steep shaft descends further into the depths."
+description:
+ - text: "A junction deep beneath the void chamber. The walls here are reinforced with pre-regression alloys. Several passages branch off into the darkness, and you can hear the sounds of machinery echoing from all directions. A steep shaft descends further into the depths."
exits:
- up: 9999954
- north: 9999956
- east: 9999957
- south: 9999958
- west: 9999960
- down: 9999962
+ up:
+ room: 9999954
+ north:
+ room: 9999956
+ east:
+ room: 9999957
+ south:
+ room: 9999958
+ west:
+ room: 9999960
+ down:
+ room: 9999962
mobs:
- id: security_turret
diff --git a/data/rooms/example_unused/underground2/9999956.yaml b/data/rooms/example_unused/underground2/9999956.yaml
index b5996ae..a82c068 100644
--- a/data/rooms/example_unused/underground2/9999956.yaml
+++ b/data/rooms/example_unused/underground2/9999956.yaml
@@ -1,7 +1,9 @@
name: "Irradiated Sector"
-description: "Warning symbols cover every surface, their paint long since faded. A faint green glow emanates from cracks in the walls. The air is thick with the taste of old radiation."
+description:
+ - text: "Warning symbols cover every surface, their paint long since faded. A faint green glow emanates from cracks in the walls. The air is thick with the taste of old radiation."
exits:
- south: 9999955
+ south:
+ room: 9999955
mobs:
- id: ghoul
- id: ghoul
diff --git a/data/rooms/example_unused/underground2/9999957.yaml b/data/rooms/example_unused/underground2/9999957.yaml
index be20359..501619d 100644
--- a/data/rooms/example_unused/underground2/9999957.yaml
+++ b/data/rooms/example_unused/underground2/9999957.yaml
@@ -1,7 +1,9 @@
name: "Drone Assembly"
-description: "A long-abandoned drone manufacturing bay. Conveyor belts lie still, and half-assembled drone chassis hang from the ceiling. A few of them still twitch with residual power."
+description:
+ - text: "A long-abandoned drone manufacturing bay. Conveyor belts lie still, and half-assembled drone chassis hang from the ceiling. A few of them still twitch with residual power."
exits:
- west: 9999955
+ west:
+ room: 9999955
mobs:
- id: war_drone
- id: war_drone
diff --git a/data/rooms/example_unused/underground2/9999958.yaml b/data/rooms/example_unused/underground2/9999958.yaml
index 09bd869..3b02c46 100644
--- a/data/rooms/example_unused/underground2/9999958.yaml
+++ b/data/rooms/example_unused/underground2/9999958.yaml
@@ -1,7 +1,10 @@
name: "Security Checkpoint"
-description: "A fortified security station with blast shields and a decommissioned weapons locker. Scorch marks on the walls tell the story of a last stand."
+description:
+ - text: "A fortified security station with blast shields and a decommissioned weapons locker. Scorch marks on the walls tell the story of a last stand."
exits:
- north: 9999955
- south: 9999959
+ north:
+ room: 9999955
+ south:
+ room: 9999959
mobs:
- id: enforcer_bot
diff --git a/data/rooms/example_unused/underground2/9999959.yaml b/data/rooms/example_unused/underground2/9999959.yaml
index 29ca4fc..65797eb 100644
--- a/data/rooms/example_unused/underground2/9999959.yaml
+++ b/data/rooms/example_unused/underground2/9999959.yaml
@@ -1,7 +1,9 @@
name: "Plasma Core"
-description: "A massive plasma containment chamber with cracked magnetic coils lining the walls. Streams of superheated gas leak from the containment vessel, forming shimmering wraith-like shapes in the air."
+description:
+ - text: "A massive plasma containment chamber with cracked magnetic coils lining the walls. Streams of superheated gas leak from the containment vessel, forming shimmering wraith-like shapes in the air."
exits:
- north: 9999958
+ north:
+ room: 9999958
mobs:
- id: plasma_wraith
- id: plasma_wraith
diff --git a/data/rooms/example_unused/underground2/9999960.yaml b/data/rooms/example_unused/underground2/9999960.yaml
index 56cca24..12c050d 100644
--- a/data/rooms/example_unused/underground2/9999960.yaml
+++ b/data/rooms/example_unused/underground2/9999960.yaml
@@ -1,7 +1,10 @@
name: "Heavy Mech Bay"
-description: "An enormous maintenance bay built to house assault mechs. A gantry crane hangs overhead, and hydraulic lifts dot the floor. The bay's occupant is still active — and it has noticed you."
+description:
+ - text: "An enormous maintenance bay built to house assault mechs. A gantry crane hangs overhead, and hydraulic lifts dot the floor. The bay's occupant is still active — and it has noticed you."
exits:
- east: 9999955
- west: 9999961
+ east:
+ room: 9999955
+ west:
+ room: 9999961
mobs:
- id: heavy_mech
diff --git a/data/rooms/example_unused/underground2/9999961.yaml b/data/rooms/example_unused/underground2/9999961.yaml
index 2d1e75c..e9124d8 100644
--- a/data/rooms/example_unused/underground2/9999961.yaml
+++ b/data/rooms/example_unused/underground2/9999961.yaml
@@ -1,6 +1,8 @@
name: "Synth Lab"
-description: "A sterile laboratory where combat androids were designed and assembled. White panels line the walls, some splattered with old coolant stains. Diagnostic screens flicker with corrupted data."
+description:
+ - text: "A sterile laboratory where combat androids were designed and assembled. White panels line the walls, some splattered with old coolant stains. Diagnostic screens flicker with corrupted data."
exits:
- east: 9999960
+ east:
+ room: 9999960
mobs:
- id: elite_synth
diff --git a/data/rooms/example_unused/underground2/9999962.yaml b/data/rooms/example_unused/underground2/9999962.yaml
index b5b89c4..1e41704 100644
--- a/data/rooms/example_unused/underground2/9999962.yaml
+++ b/data/rooms/example_unused/underground2/9999962.yaml
@@ -1,7 +1,10 @@
name: "Abandoned Bunker"
-description: "A fortified bunker from some forgotten conflict. Sandbags are piled in the corners and spent shell casings litter the floor. A solitary figure stands watch over the remains."
+description:
+ - text: "A fortified bunker from some forgotten conflict. Sandbags are piled in the corners and spent shell casings litter the floor. A solitary figure stands watch over the remains."
exits:
- up: 9999955
- down: 9999963
+ up:
+ room: 9999955
+ down:
+ room: 9999963
mobs:
- id: veteran_merc
diff --git a/data/rooms/example_unused/underground2/9999963.yaml b/data/rooms/example_unused/underground2/9999963.yaml
index fca468e..5963fd2 100644
--- a/data/rooms/example_unused/underground2/9999963.yaml
+++ b/data/rooms/example_unused/underground2/9999963.yaml
@@ -1,7 +1,10 @@
name: "Magma Conduit"
-description: "A geothermal vent has been tapped and routed through industrial conduits. The heat is oppressive, and molten rivulets course through channels in the floor. Something moves within the glowing flow."
+description:
+ - text: "A geothermal vent has been tapped and routed through industrial conduits. The heat is oppressive, and molten rivulets course through channels in the floor. Something moves within the glowing flow."
exits:
- up: 9999962
- down: 9999964
+ up:
+ room: 9999962
+ down:
+ room: 9999964
mobs:
- id: molten_elemental
diff --git a/data/rooms/example_unused/underground2/9999964.yaml b/data/rooms/example_unused/underground2/9999964.yaml
index 4e74383..646ad15 100644
--- a/data/rooms/example_unused/underground2/9999964.yaml
+++ b/data/rooms/example_unused/underground2/9999964.yaml
@@ -1,7 +1,10 @@
name: "The Foundry"
-description: "A vast smelting facility where sentinels were once forged. Massive crucibles hang from chains, and rivers of cooled slag form a maze-like floor. A single iron sentinel stands guard over the dormant machinery."
+description:
+ - text: "A vast smelting facility where sentinels were once forged. Massive crucibles hang from chains, and rivers of cooled slag form a maze-like floor. A single iron sentinel stands guard over the dormant machinery."
exits:
- up: 9999963
- down: 9999965
+ up:
+ room: 9999963
+ down:
+ room: 9999965
mobs:
- id: iron_sentinel
diff --git a/data/rooms/example_unused/wilderness/99999161.yaml b/data/rooms/example_unused/wilderness/99999161.yaml
index 033c816..9ac309f 100644
--- a/data/rooms/example_unused/wilderness/99999161.yaml
+++ b/data/rooms/example_unused/wilderness/99999161.yaml
@@ -9,13 +9,13 @@ item_spawns: []
mobs:
- id: farmer
wander_rooms:
- - 161
+ - 99999161
- id: farmer
wander_rooms:
- - 161
+ - 99999161
- id: bioengineer
wander_rooms:
- - 161
+ - 99999161
on_enter: []
hazard: ""
block_transport: false
diff --git a/data/rooms/example_unused/wilderness/99999180.yaml b/data/rooms/example_unused/wilderness/99999180.yaml
index de7773d..1753086 100644
--- a/data/rooms/example_unused/wilderness/99999180.yaml
+++ b/data/rooms/example_unused/wilderness/99999180.yaml
@@ -1,4 +1,6 @@
name: "Construction Yard Entrance"
-description: "A fenced staging area at the edge of the terraforming works. Crates of brackets and coils of cable are stacked under a sturdy section of atmospheric dome. To the {220}north{/} the dome shielding gives out and the open solar array field begins."
+description:
+ - text: "A fenced staging area at the edge of the terraforming works. Crates of brackets and coils of cable are stacked under a sturdy section of atmospheric dome. To the {220}north{/} the dome shielding gives out and the open solar array field begins."
exits:
- north: 99999181
+ north:
+ room: 99999181
diff --git a/data/rooms/example_unused/wilderness/99999181.yaml b/data/rooms/example_unused/wilderness/99999181.yaml
index a5af7be..9253347 100644
--- a/data/rooms/example_unused/wilderness/99999181.yaml
+++ b/data/rooms/example_unused/wilderness/99999181.yaml
@@ -1,10 +1,12 @@
name: "Exposed Solar Array"
-description: "A wide field of steel frames stretches under a torn section of the atmospheric dome. Raw sunlight blazes down with nothing to filter it. Half-built {220}solar panel frames{/} wait to be finished. A jagged {248}rock outcrop{/} on the south edge throws a patch of shade. The yard entrance lies back to the {34}south{/}."
+description:
+- text: "A wide field of steel frames stretches under a torn section of the atmospheric dome. Raw sunlight blazes down with nothing to filter it. Half-built {220}solar panel frames{/} wait to be finished. A jagged {248}rock outcrop{/} on the south edge throws a patch of shade. The yard entrance lies back to the {34}south{/}."
hazard: solar_radiation
exits:
- south: 99999180
+ south:
+ room: 99999180
objects:
- - id: rock_outcrop
+- id: rock_outcrop
mobs:
- - solar_panel_frame
- - solar_panel_frame
+- id: solar_panel_frame
+- id: solar_panel_frame
diff --git a/data/rooms/intro/1002.yaml b/data/rooms/intro/1002.yaml
index c7195ea..ca34347 100644
--- a/data/rooms/intro/1002.yaml
+++ b/data/rooms/intro/1002.yaml
@@ -42,9 +42,11 @@ objects:
text: "The pilot stands straight as if about to escort royalty looking down his nose a bit at the passengers. He is quickly and professionally checking tickets."
- name: building
aliases: [processing]
- description: "A building with no door on this side that looks like a giant cup of tea spilled towards you. It's built from large chunks of gray rock that must've come from the surface of Vesta."
+ description:
+ - text: "A building with no door on this side that looks like a giant cup of tea spilled towards you. It's built from large chunks of gray rock that must've come from the surface of Vesta."
- name: sign
- description: "The sign simply says 'Processing' in bold red letters. Beneath in smaller text it says 'Welcome to Vesta', seemingly added afterwards to try to give the sign some warmth."
+ description:
+ - text: "The sign simply says 'Processing' in bold red letters. Beneath in smaller text it says 'Welcome to Vesta', seemingly added afterwards to try to give the sign some warmth."
exits:
up:
room: 1001
diff --git a/data/rooms/intro/1003.yaml b/data/rooms/intro/1003.yaml
index 77cb096..c6d3d8a 100644
--- a/data/rooms/intro/1003.yaml
+++ b/data/rooms/intro/1003.yaml
@@ -2,26 +2,26 @@ id: 1003
name: Processing Building
color: ""
description:
- - text: A short tunnel-like building with queue ropes and desks on each side, and signs directing "Departures" and "Arrivals" above each. An attendant stands doing paperwork on the Departures side. No one is on the Arrivals side.
+- text: A short tunnel-like building with queue ropes and desks on each side, and signs directing "Departures" and "Arrivals" above each. An attendant stands doing paperwork on the Departures side. No one is on the Arrivals side.
exits:
- north:
- room: 1004
- condition:
- player_flag: 1003_talked
- south:
- room: 1002
+ north:
+ room: 1004
+ condition:
+ player_flag: 1003_talked
+ south:
+ room: 1002
objects: []
item_spawns: []
mobs:
- - spaceport_attendant
+- id: spaceport_attendant
on_enter:
- - condition:
- player_flag: 1003_first_time
- not: true
- delay: 5
- message: "{bold}The ground rumbles as the shuttle departs the pad behind you!{/}"
- set_player_flags:
- 1003_first_time: true
+- condition:
+ player_flag: 1003_first_time
+ not: true
+ delay: 5
+ message: "{bold}The ground rumbles as the shuttle departs the pad behind you!{/}"
+ set_player_flags:
+ 1003_first_time: true
hazard: ""
block_transport: false
triggers: []
diff --git a/data/rooms/intro/2001.yaml b/data/rooms/intro/2001.yaml
index 5b79018..eb7bd59 100644
--- a/data/rooms/intro/2001.yaml
+++ b/data/rooms/intro/2001.yaml
@@ -1,4 +1,5 @@
-block_transport: false
+id: 2001
+name: Test Room
color: ""
description:
- text: It's a test room
@@ -9,8 +10,14 @@ exits:
room: 2006
southeast:
room: 2005
-hazard: ""
-id: 2001
+ west:
+ room: 1001
+objects:
+ - name: hidden guy
+ hidden: true
+ description:
+ - text: YOU FOUND HIM
+ - id: tree
item_spawns:
- id: bronze_axe
quantity: 1
@@ -23,12 +30,7 @@ item_spawns:
respawn_ticks: 1
mobs:
- id: man
-name: Test Room
-objects:
- - description:
- - text: YOU FOUND HIM
- hidden: true
- name: hidden guy
- - id: tree
on_enter: []
+hazard: ""
+block_transport: false
triggers: []
diff --git a/data/rooms/intro/2006.yaml b/data/rooms/intro/2006.yaml
index 74dd657..7ab682f 100644
--- a/data/rooms/intro/2006.yaml
+++ b/data/rooms/intro/2006.yaml
@@ -1,5 +1,8 @@
name: "Test Room"
-description: "It's a test room"
+description:
+ - text: "It's a test room"
exits:
- east: 2005
- north: 2001
+ east:
+ room: 2005
+ north:
+ room: 2001
diff --git a/internal/admin/api_room_insert_remove_test.go b/internal/admin/api_room_insert_remove_test.go
index 5a3b28e..6d80595 100644
--- a/internal/admin/api_room_insert_remove_test.go
+++ b/internal/admin/api_room_insert_remove_test.go
@@ -11,6 +11,7 @@ import (
"strings"
"testing"
+ "thehouseoficarus/internal/behavior"
"thehouseoficarus/internal/world"
)
@@ -93,8 +94,8 @@ func postRemove(t *testing.T, s *AdminServer, body string) (map[string]any, int)
// rewires A and B onto it, and pushes an undo entry that restores everything.
func TestInsertSuccess(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
})
resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":"Mid"}`)
@@ -157,8 +158,8 @@ func TestInsertSuccess(t *testing.T) {
// TestInsertDefaultName confirms an empty name falls back to "Room #<id>".
func TestInsertDefaultName(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
})
resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":""}`)
if code != http.StatusOK {
@@ -177,14 +178,14 @@ func TestInsertGridConflict(t *testing.T) {
// 1→east→2→east→3 and 1→south→4→east→5→east→6→east→7→north→8 at (3,0,0).
// Inserting between 1 and 2 pushes 3 to (3,0,0), colliding with 8.
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n south: 4\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n west: 2\n",
- 4: "name: D\nexits:\n east: 5\n north: 1\n",
- 5: "name: E\nexits:\n east: 6\n west: 4\n",
- 6: "name: F\nexits:\n east: 7\n west: 5\n",
- 7: "name: G\nexits:\n north: 8\n west: 6\n",
- 8: "name: H\nexits:\n south: 7\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n south: {room: 4}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
+ 4: "name: D\nexits:\n east: {room: 5}\n north: {room: 1}\n",
+ 5: "name: E\nexits:\n east: {room: 6}\n west: {room: 4}\n",
+ 6: "name: F\nexits:\n east: {room: 7}\n west: {room: 5}\n",
+ 7: "name: G\nexits:\n north: {room: 8}\n west: {room: 6}\n",
+ 8: "name: H\nexits:\n south: {room: 7}\n",
})
resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":"X"}`)
if code != http.StatusConflict {
@@ -210,9 +211,9 @@ func TestInsertGridConflict(t *testing.T) {
// undo/redo round-trip.
func TestRemoveSuccess(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n west: 2\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
})
resp, code := postRemove(t, s, `{"from":1,"dir":"east"}`)
if code != http.StatusOK {
@@ -282,8 +283,8 @@ func TestRemoveGuards(t *testing.T) {
{
name: "no such exit",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
},
body: `{"from":1,"dir":"north"}`,
want: "has no north exit",
@@ -291,7 +292,7 @@ func TestRemoveGuards(t *testing.T) {
{
name: "self loop",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 1\n",
+ 1: "name: A\nexits:\n east: {room: 1}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "loops back",
@@ -299,9 +300,9 @@ func TestRemoveGuards(t *testing.T) {
{
name: "not an insert chain (B does not lead back)",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n",
- 3: "name: C\nexits:\n west: 2\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "not an insert chain",
@@ -309,8 +310,8 @@ func TestRemoveGuards(t *testing.T) {
{
name: "dead end (B has no forward exit)",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "no room beyond",
@@ -318,10 +319,10 @@ func TestRemoveGuards(t *testing.T) {
{
name: "B has extra exits",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n north: 4\n",
- 3: "name: C\nexits:\n west: 2\n",
- 4: "name: D\nexits:\n south: 2\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n north: {room: 4}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
+ 4: "name: D\nexits:\n south: {room: 2}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "other exits besides",
@@ -329,10 +330,10 @@ func TestRemoveGuards(t *testing.T) {
{
name: "C does not lead back to B",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n east: 4\n",
- 4: "name: D\nexits:\n west: 3\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n east: {room: 4}\n",
+ 4: "name: D\nexits:\n west: {room: 3}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "does not lead back to",
@@ -363,12 +364,12 @@ func TestRemoveGridConflict(t *testing.T) {
// to (1,0,0); 6 (at 3's old south neighbor (2,1,0)) follows to (1,1,0)? No
// — the pull shifts the whole beyond-component; 6 lands on 5's cell (1,1,0).
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n south: 4\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n south: 6\n west: 2\n",
- 4: "name: D\nexits:\n east: 5\n north: 1\n",
- 5: "name: E\nexits:\n west: 4\n",
- 6: "name: F\nexits:\n north: 3\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n south: {room: 4}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n south: {room: 6}\n west: {room: 2}\n",
+ 4: "name: D\nexits:\n east: {room: 5}\n north: {room: 1}\n",
+ 5: "name: E\nexits:\n west: {room: 4}\n",
+ 6: "name: F\nexits:\n north: {room: 3}\n",
})
resp, code := postRemove(t, s, `{"from":1,"dir":"east"}`)
if code != http.StatusConflict {
@@ -394,10 +395,10 @@ func TestRemoveGridConflict(t *testing.T) {
// room points into B, and that the message names the count.
func TestRemoveExtraInbound(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n west: 2\n",
- 9: "name: X\nexits:\n north: 2\n", // extra inbound edge into B
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
+ 9: "name: X\nexits:\n north: {room: 2}\n", // extra inbound edge into B
})
resp, code := postRemove(t, s, `{"from":1,"dir":"east"}`)
if code != http.StatusBadRequest {
@@ -418,12 +419,12 @@ func TestNextRoomIDNoCrossSubdirCollision(t *testing.T) {
t.Fatal(err)
}
// Room 1 in root, room 2 in a subdirectory "zone".
- writeRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n")
+ writeRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n")
zoneDir := filepath.Join(roomsDir, "zone")
if err := os.MkdirAll(zoneDir, 0o755); err != nil {
t.Fatal(err)
}
- if err := os.WriteFile(filepath.Join(zoneDir, "2.yaml"), []byte("name: B\nexits:\n west: 1\n"), 0o644); err != nil {
+ if err := os.WriteFile(filepath.Join(zoneDir, "2.yaml"), []byte("name: B\nexits:\n west: {room: 1}\n"), 0o644); err != nil {
t.Fatal(err)
}
s := &AdminServer{
@@ -461,8 +462,8 @@ func testMobDef() *world.MobDef {
// instances for the (now-deleted) new room, via rebuildAfterUndo's stat check.
func TestUndoInsertClearsMobs(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
})
resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":"Mid"}`)
if code != http.StatusOK {
@@ -471,7 +472,7 @@ func TestUndoInsertClearsMobs(t *testing.T) {
newID := int(resp["room"].(map[string]any)["id"].(float64))
// Spawn a transient mob in the new room so the store has something to clear.
- inst := s.mobStore.SpawnTransient(testMobDef(), &world.SpawnMobConfig{ID: "testmob"}, newID, "")
+ inst := s.mobStore.SpawnTransient(testMobDef(), &behavior.SpawnMobConfig{ID: "testmob"}, newID, "")
if inst == nil {
t.Fatal("SpawnTransient returned nil")
}
@@ -494,9 +495,9 @@ func TestUndoInsertClearsMobs(t *testing.T) {
// for the re-deleted room.
func TestRedoRemoveClearsMobs(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n west: 2\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
})
if _, code := postRemove(t, s, `{"from":1,"dir":"east"}`); code != http.StatusOK {
t.Fatal("remove failed")
@@ -510,7 +511,7 @@ func TestRedoRemoveClearsMobs(t *testing.T) {
if !roomExists(s, 2) {
t.Fatal("precondition: B should exist after undo")
}
- s.mobStore.SpawnTransient(testMobDef(), &world.SpawnMobConfig{ID: "testmob"}, 2, "")
+ s.mobStore.SpawnTransient(testMobDef(), &behavior.SpawnMobConfig{ID: "testmob"}, 2, "")
if got := len(s.mobStore.MobsInRoom(2)); got != 1 {
t.Fatalf("precondition: expected 1 mob in B, got %d", got)
}
diff --git a/internal/admin/api_rooms.go b/internal/admin/api_rooms.go
index 0925f8b..1339bcd 100644
--- a/internal/admin/api_rooms.go
+++ b/internal/admin/api_rooms.go
@@ -171,7 +171,7 @@ func (s *AdminServer) handleRooms(w http.ResponseWriter, r *http.Request) {
}
if !linkOneWay {
- exits[string(opp)] = *linkFrom
+ exits[string(opp)] = map[string]any{"room": *linkFrom}
}
}
}
@@ -1081,7 +1081,7 @@ func (s *AdminServer) handleCreateEmptyRoom(w http.ResponseWriter, r *http.Reque
roomName := fmt.Sprintf("Room #%d", id)
m := map[string]any{
"name": roomName,
- "description": "An empty room.",
+ "description": []map[string]any{{"text": "An empty room."}},
}
newContent, writeErr := writeMapAsYAML(path, m)
if writeErr != nil {
diff --git a/internal/admin/static/intereditor.js b/internal/admin/static/intereditor.js
index 4e48df1..b46c456 100644
--- a/internal/admin/static/intereditor.js
+++ b/internal/admin/static/intereditor.js
@@ -944,23 +944,6 @@ function ie_syncActEntry(ed, secId, secPath, idx) {
delete ed[secPath][idx].message;
}
-// ── Upgrade: migrate legacy message/condition/action on load ──
-
-function ie_upgradeItem(item) {
- if (!item) return;
- if (item.message && typeof item.message === 'string' && item.message.trim()) {
- if (!item.action || typeof item.action !== 'object') item.action = {};
- if (!item.action.message) item.action.message = item.message;
- delete item.message;
- }
- if (item.condition && typeof item.condition === 'string') {
- try { item.condition = JSON.parse(item.condition); } catch(e) { delete item.condition; }
- }
- if (item.action && typeof item.action === 'string') {
- try { item.action = JSON.parse(item.action); } catch(e) { delete item.action; }
- }
-}
-
// ── Shared interaction-style array-section renderer ──
//
// Replaces the duplicated `renderArraySection` (objecteditor.js) and
@@ -984,8 +967,6 @@ function ie_renderArraySection(ctx) {
var h = '';
arr.forEach(function(item, idx) {
- ie_upgradeItem(item);
-
visMap[idx] = visMap[idx] || {};
var vis = visMap[idx];
var showItem = vis.item_id || (item.item_id && item.item_id !== '');
diff --git a/internal/admin/static/map.js b/internal/admin/static/map.js
index 3507e2d..aeb2d57 100644
--- a/internal/admin/static/map.js
+++ b/internal/admin/static/map.js
@@ -1433,11 +1433,9 @@ function renderExitsSection(r) {
var target = typeof exit === 'object' ? exit.room : exit;
var cond = (typeof exit === 'object' && exit.condition) ? exit.condition : null;
var bmsg = (typeof exit === 'object' && exit.blocked_message) ? exit.blocked_message : '';
- var setFlags = (typeof exit === 'object' && exit.set_flags) ? exit.set_flags : null;
- var setPlayerFlags = (typeof exit === 'object' && exit.set_player_flags) ? exit.set_player_flags : null;
var hidden = (typeof exit === 'object' && exit.hidden) ? exit.hidden : false;
var alwaysBlocked = (typeof exit === 'object' && exit.always_blocked) ? exit.always_blocked : false;
- var isConditional = !!(cond || bmsg || setFlags || setPlayerFlags || hidden || alwaysBlocked);
+ var isConditional = !!(cond || bmsg || hidden || alwaysBlocked);
var isBidi = mapData && mapData.links && mapData.links.some(function(l) {
return l.bidirectional && ((l.from === r.id && l.to === target) || (l.from === target && l.to === r.id));
});
@@ -1475,16 +1473,9 @@ function editExitCondition(dir) {
if (typeof exit !== 'object') { exit = {room: exit}; }
var cond = exit.condition || null;
var bmsg = exit.blocked_message || '';
- var setFlags = exit.set_flags || null;
- var setPlayerFlags = exit.set_player_flags || null;
var hidden = exit.hidden || false;
var alwaysBlocked = exit.always_blocked || false;
- var flagsStr = '';
- if (setFlags) flagsStr = Object.keys(setFlags).map(function(k) { return k + '=' + setFlags[k]; }).join(', ');
- var pflagsStr = '';
- if (setPlayerFlags) pflagsStr = Object.keys(setPlayerFlags).map(function(k) { return k + '=' + setPlayerFlags[k]; }).join(', ');
-
var parsed = parseCondition(cond);
var overlay = document.createElement('div');
@@ -1494,8 +1485,6 @@ function editExitCondition(dir) {
menu.style.cssText = 'position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);min-width:520px;max-width:90vw;max-height:85vh;overflow-y:auto;overflow-x:hidden;padding:14px;z-index:201';
var h = '<h3 style="margin-bottom:8px;font-size:13px">Exit: ' + esc(dir) + ' &rarr; #' + exit.room + '</h3>';
- h += '<div class="form-group"><label>Set Flags (key=value, comma separated)</label><input id="exitFlags" value="' + escAttr(flagsStr) + '"></div>';
- h += '<div class="form-group"><label>Set Player Flags (key=value, comma separated)</label><input id="exitPFlags" value="' + escAttr(pflagsStr) + '"></div>';
h += '<div class="form-group"><label>Blocked Message</label><textarea id="exitBmsg" rows="2">' + esc(bmsg) + '</textarea></div>';
h += '<div class="form-group"><label><input type="checkbox" id="exitHidden"' + (hidden ? ' checked' : '') + '> Hidden</label></div>';
h += '<div class="form-group"><label><input type="checkbox" id="exitAlwaysBlocked"' + (alwaysBlocked ? ' checked' : '') + '> Always Blocked (blocked, shown on map)</label></div>';
@@ -1540,7 +1529,7 @@ function parseCondition(cond) {
function extractClause(c) {
var not = c.not === true;
if (c.player_flag && c.player_flag !== '') return {type: 'player_flag', value: c.player_flag, not: not};
- if (c.flag && c.flag !== '') return {type: 'flag', value: c.flag, not: not};
+ if (c.global_flag && c.global_flag !== '') return {type: 'global_flag', value: c.global_flag, not: not};
if (c.has_item && c.has_item !== '') return {type: 'has_item', value: c.has_item, not: not};
if (c.min_credits && c.min_credits !== 0) return {type: 'min_credits', value: String(c.min_credits), not: not};
if (c.value && typeof c.value === 'object' && c.value.key) return {type: 'value', value: c.value.key + '=' + (c.value.value || ''), not: not};
@@ -1555,7 +1544,7 @@ function renderConditionClauses(menu) {
clauses.forEach(function(clause, i) {
h += '<div class="cond-clause" data-idx="' + i + '" style="display:flex;gap:4px;align-items:center;margin-bottom:4px">';
h += '<select class="cond-type" onchange="var c=this.parentElement;var m=this.closest(\'.exit-modal\');var idx=parseInt(c.getAttribute(\'data-idx\'));m._condClauses[idx].type=this.value;renderConditionClauses(m)">';
- ['player_flag','flag','value','has_item','min_credits'].forEach(function(t) {
+ ['player_flag','global_flag','value','has_item','min_credits'].forEach(function(t) {
h += '<option value="' + t + '"' + (clause.type === t ? ' selected' : '') + '>' + t + '</option>';
});
h += '</select>';
@@ -1640,10 +1629,6 @@ function saveExitCondition() {
exit.hidden = hiddenEl ? hiddenEl.checked : false;
var alwaysBlockedEl = document.getElementById('exitAlwaysBlocked');
exit.always_blocked = alwaysBlockedEl ? alwaysBlockedEl.checked : false;
- var flagsStr = document.getElementById('exitFlags');
- var pflagsStr = document.getElementById('exitPFlags');
- exit.set_flags = parseFlagInput(flagsStr ? flagsStr.value : '');
- exit.set_player_flags = parseFlagInput(pflagsStr ? pflagsStr.value : '');
var clauseEls = menu.querySelectorAll('.cond-clause');
clauseEls.forEach(function(el) { updateClauseData(el); });
@@ -1682,10 +1667,6 @@ function clearExitCondition() {
renderConditionClauses(menu);
var bmsg = document.getElementById('exitBmsg');
if (bmsg) bmsg.value = '';
- var ef = document.getElementById('exitFlags');
- if (ef) ef.value = '';
- var pf = document.getElementById('exitPFlags');
- if (pf) pf.value = '';
var hx = document.getElementById('exitHidden');
if (hx) hx.checked = false;
var ab = document.getElementById('exitAlwaysBlocked');
diff --git a/internal/behavior/behavior.go b/internal/behavior/behavior.go
index 69b91cd..58b5e6b 100644
--- a/internal/behavior/behavior.go
+++ b/internal/behavior/behavior.go
@@ -1,7 +1,5 @@
package behavior
-import "gopkg.in/yaml.v3"
-
type GatherConfig struct {
Skill string `yaml:"skill"`
Tools []string `yaml:"tools"`
@@ -106,8 +104,7 @@ func (s StepAction) IsTimed() bool {
}
// SpawnMobConfig configures a transient mob spawned by a trigger or on_enter
-// step. It accepts either a bare string (the mob id) or a full map at
-// unmarshal time.
+// step. The mob id is required; other fields are optional.
type SpawnMobConfig struct {
ID string `yaml:"id"`
OwnerOnly bool `yaml:"owner_only"`
@@ -116,19 +113,6 @@ type SpawnMobConfig struct {
DespawnTicks float64 `yaml:"despawn_ticks"`
}
-func (s *SpawnMobConfig) UnmarshalYAML(value *yaml.Node) error {
- if value.Kind == yaml.ScalarNode {
- var id string
- if err := value.Decode(&id); err != nil {
- return err
- }
- s.ID = id
- return nil
- }
- type raw SpawnMobConfig
- return value.Decode((*raw)(s))
-}
-
// ShopConfig is a root-level mob property (mob YAML `shop:`). Buy prices are
// always 100% of the item's value; sell prices follow the OSRS store formula:
//
diff --git a/internal/behavior/desc.go b/internal/behavior/desc.go
index ca4bf69..f6dbaf3 100644
--- a/internal/behavior/desc.go
+++ b/internal/behavior/desc.go
@@ -1,27 +1,8 @@
package behavior
-import "gopkg.in/yaml.v3"
-
type DescVariant struct {
Text string `yaml:"text"`
Condition *Condition `yaml:"condition,omitempty"`
}
type DescList []DescVariant
-
-func (dl *DescList) UnmarshalYAML(value *yaml.Node) error {
- if value.Kind == yaml.ScalarNode {
- var s string
- if err := value.Decode(&s); err != nil {
- return err
- }
- *dl = DescList{{Text: s}}
- return nil
- }
- var entries []DescVariant
- if err := value.Decode(&entries); err != nil {
- return err
- }
- *dl = entries
- return nil
-}
diff --git a/internal/engine/tick.go b/internal/engine/tick.go
index 7a422af..ff1bace 100644
--- a/internal/engine/tick.go
+++ b/internal/engine/tick.go
@@ -116,3 +116,24 @@ func ToTicks(base float64) int {
}
return floor
}
+
+func ValuesEqual(a, b any) bool {
+ ai, aok := NumericValue(a)
+ bi, bok := NumericValue(b)
+ if aok && bok {
+ return ai == bi
+ }
+ return a == b
+}
+
+func NumericValue(v any) (float64, bool) {
+ switch x := v.(type) {
+ case int:
+ return float64(x), true
+ case int64:
+ return float64(x), true
+ case float64:
+ return x, true
+ }
+ return 0, false
+}
diff --git a/internal/game/act.go b/internal/game/act.go
index ddeed04..91f05a8 100644
--- a/internal/game/act.go
+++ b/internal/game/act.go
@@ -7,6 +7,7 @@ import (
"strings"
"thehouseoficarus/internal/behavior"
+ "thehouseoficarus/internal/engine"
"thehouseoficarus/internal/net"
"thehouseoficarus/internal/object"
"thehouseoficarus/internal/player"
@@ -332,7 +333,7 @@ func flagMatches(present bool, val, want any, not bool) bool {
if want == nil {
match = present && isTruthy(val)
} else {
- match = present && valuesEqual(val, want)
+ match = present && engine.ValuesEqual(val, want)
}
if not {
return !match
@@ -340,31 +341,6 @@ func flagMatches(present bool, val, want any, not bool) bool {
return match
}
-// valuesEqual compares two any-typed values, normalizing numeric types (int,
-// int64, float64) so that e.g. int(3) == int64(3) == float64(3). Non-numeric
-// types fall back to ==.
-func valuesEqual(a, b any) bool {
- ai, aok := numericValue(a)
- bi, bok := numericValue(b)
- if aok && bok {
- return ai == bi
- }
- return a == b
-}
-
-// numericValue returns the value as a float64 if it is a numeric type.
-func numericValue(v any) (float64, bool) {
- switch x := v.(type) {
- case int:
- return float64(x), true
- case int64:
- return float64(x), true
- case float64:
- return x, true
- }
- return 0, false
-}
-
func isTruthy(v any) bool {
switch x := v.(type) {
case nil:
diff --git a/internal/game/cmd_room_remove_test.go b/internal/game/cmd_room_remove_test.go
index 1868c30..a13af8a 100644
--- a/internal/game/cmd_room_remove_test.go
+++ b/internal/game/cmd_room_remove_test.go
@@ -85,9 +85,9 @@ func reloadRoom(t *testing.T, g *Game, id int) *world.Room {
func TestRoomRemoveSuccessPull(t *testing.T) {
dir := t.TempDir()
- writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n")
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: 3\n west: 1\n")
- writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: 2\n")
+ writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n")
+ writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: {room: 2}\n")
g := newRemoveGame(t, dir)
sess := newRemoveSession(&player.Player{Name: "tester", RoomID: 1})
@@ -113,9 +113,9 @@ func TestRoomRemoveSuccessPull(t *testing.T) {
func TestRoomRemoveDiagonalPull(t *testing.T) {
dir := t.TempDir()
- writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n northeast: 2\n")
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n northeast: 3\n southwest: 1\n")
- writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n southwest: 2\n")
+ writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n northeast: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n northeast: {room: 3}\n southwest: {room: 1}\n")
+ writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n southwest: {room: 2}\n")
g := newRemoveGame(t, dir)
sess := newRemoveSession(&player.Player{Name: "tester", RoomID: 1})
@@ -145,9 +145,9 @@ func TestRoomRemoveNoExit(t *testing.T) {
func TestRoomRemoveNotInsertChain(t *testing.T) {
dir := t.TempDir()
// B does not lead back to A via west.
- writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n")
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: 3\n")
- writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: 2\n")
+ writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: {room: 3}\n")
+ writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: {room: 2}\n")
g := newRemoveGame(t, dir)
sess := newRemoveSession(&player.Player{Name: "tester", RoomID: 1})
@@ -162,8 +162,8 @@ func TestRoomRemoveNotInsertChain(t *testing.T) {
func TestRoomRemoveDeadEndFarRoom(t *testing.T) {
dir := t.TempDir()
// B leads back to A but has no forward east exit.
- writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n")
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n west: 1\n")
+ writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n west: {room: 1}\n")
g := newRemoveGame(t, dir)
sess := newRemoveSession(&player.Player{Name: "tester", RoomID: 1})
@@ -177,10 +177,10 @@ func TestRoomRemoveDeadEndFarRoom(t *testing.T) {
func TestRoomRemoveOtherExitsInB(t *testing.T) {
dir := t.TempDir()
// B has east (fwd), west (back), AND up (extra).
- writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n")
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: 3\n west: 1\n up: 4\n")
- writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: 2\n")
- writeRemoveRoomFile(t, dir, 4, "name: D\nexits:\n down: 2\n")
+ writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n up: {room: 4}\n")
+ writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 4, "name: D\nexits:\n down: {room: 2}\n")
g := newRemoveGame(t, dir)
sess := newRemoveSession(&player.Player{Name: "tester", RoomID: 1})
@@ -194,8 +194,8 @@ func TestRoomRemoveOtherExitsInB(t *testing.T) {
func TestRoomRemoveFarReciprocityBroken(t *testing.T) {
dir := t.TempDir()
// C's west does not point back to B.
- writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n")
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: 3\n west: 1\n")
+ writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n")
writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n")
g := newRemoveGame(t, dir)
sess := newRemoveSession(&player.Player{Name: "tester", RoomID: 1})
@@ -210,10 +210,10 @@ func TestRoomRemoveFarReciprocityBroken(t *testing.T) {
func TestRoomRemoveExtraInboundEdge(t *testing.T) {
dir := t.TempDir()
// A clean chain A-east->B-east->C, but an unrelated room 5 also points to B.
- writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n")
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: 3\n west: 1\n")
- writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: 2\n")
- writeRemoveRoomFile(t, dir, 5, "name: E\nexits:\n north: 2\n")
+ writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n")
+ writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 5, "name: E\nexits:\n north: {room: 2}\n")
g := newRemoveGame(t, dir)
sess := newRemoveSession(&player.Player{Name: "tester", RoomID: 1})
@@ -228,12 +228,12 @@ func TestRoomRemoveExtraInboundEdge(t *testing.T) {
// pulls room 6 onto room 5's cell, which must be rejected.
func TestRoomRemoveOverlap(t *testing.T) {
dir := t.TempDir()
- writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n south: 4\n")
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: 3\n west: 1\n")
- writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n south: 6\n west: 2\n")
- writeRemoveRoomFile(t, dir, 4, "name: D\nexits:\n east: 5\n north: 1\n")
- writeRemoveRoomFile(t, dir, 5, "name: E\nexits:\n west: 4\n")
- writeRemoveRoomFile(t, dir, 6, "name: F\nexits:\n north: 3\n")
+ writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n south: {room: 4}\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n")
+ writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n south: {room: 6}\n west: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 4, "name: D\nexits:\n east: {room: 5}\n north: {room: 1}\n")
+ writeRemoveRoomFile(t, dir, 5, "name: E\nexits:\n west: {room: 4}\n")
+ writeRemoveRoomFile(t, dir, 6, "name: F\nexits:\n north: {room: 3}\n")
g := newRemoveGame(t, dir)
sess := newRemoveSession(&player.Player{Name: "tester", RoomID: 1})
@@ -275,7 +275,7 @@ exits:
blocked_message: "A rock blocks the way."
hidden: true
`)
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: 3\n west: 1\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n")
writeRemoveRoomFile(t, dir, 3, `name: C
exits:
west:
@@ -310,9 +310,9 @@ exits:
// moved to A and notified. The caller stays in A.
func TestRoomRemoveRelocatesPlayersInB(t *testing.T) {
dir := t.TempDir()
- writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n")
- writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: 3\n west: 1\n")
- writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: 2\n")
+ writeRemoveRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n")
+ writeRemoveRoomFile(t, dir, 2, "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n")
+ writeRemoveRoomFile(t, dir, 3, "name: C\nexits:\n west: {room: 2}\n")
g := newRemoveGame(t, dir)
caller := newRemoveSession(&player.Player{Name: "builder", RoomID: 1})
diff --git a/internal/game/core_course.go b/internal/game/core_course.go
index 031eff5..6394b99 100644
--- a/internal/game/core_course.go
+++ b/internal/game/core_course.go
@@ -21,21 +21,17 @@ type ObstaclePhase struct {
}
// ObstacleDef is the YAML representation of a single agility obstacle.
-// Two equivalent forms are supported:
-// - Legacy: Messages (exactly 3) + TicksPerPhase + fail at phase index 1.
-// - Preferred: Phases, an explicit ordered list with per-phase delays and
-// an optional fail_check flag (at most one phase should carry it).
+// Phases is the ordered list of advancement steps, each with a per-phase
+// delay and an optional fail_check flag (at most one phase should carry it).
type ObstacleDef struct {
- RoomID int `yaml:"room_id"`
- Verb string `yaml:"verb"`
- XP int `yaml:"xp"`
- FailDamage [2]int `yaml:"fail_damage"`
- FailChance *float64 `yaml:"fail_chance,omitempty"`
- TicksPerPhase float64 `yaml:"ticks_per_phase"`
- Messages []string `yaml:"messages"`
- Phases []ObstaclePhase `yaml:"phases"`
- ExitDir string `yaml:"exit_dir"`
- OnFailRoom int `yaml:"on_fail,omitempty"`
+ RoomID int `yaml:"room_id"`
+ Verb string `yaml:"verb"`
+ XP int `yaml:"xp"`
+ FailDamage [2]int `yaml:"fail_damage"`
+ FailChance *float64 `yaml:"fail_chance,omitempty"`
+ Phases []ObstaclePhase `yaml:"phases"`
+ ExitDir string `yaml:"exit_dir"`
+ OnFailRoom int `yaml:"on_fail,omitempty"`
}
type CourseConfig struct {
@@ -140,33 +136,13 @@ func (cs *CourseStore) GetObstacle(roomID int) *ObstacleInfo {
}
// resolvePhases converts an ObstacleDef into a normalized PhaseInfo list.
-// Preferred form: explicit Phases. Legacy form: Messages with a shared
-// TicksPerPhase and the failure check at the middle (index 1) phase.
func resolvePhases(obs ObstacleDef) []PhaseInfo {
- if len(obs.Phases) > 0 {
- phases := make([]PhaseInfo, 0, len(obs.Phases))
- for _, p := range obs.Phases {
- phases = append(phases, PhaseInfo{
- Message: p.Message,
- Delay: p.Delay,
- FailCheck: p.FailCheck,
- })
- }
- return phases
- }
- msgs := obs.Messages
- phases := make([]PhaseInfo, 0, len(msgs))
- for i, m := range msgs {
- var delay float64
- if i == 0 {
- delay = 0
- } else {
- delay = obs.TicksPerPhase
- }
+ phases := make([]PhaseInfo, 0, len(obs.Phases))
+ for _, p := range obs.Phases {
phases = append(phases, PhaseInfo{
- Message: m,
- Delay: delay,
- FailCheck: i == 1,
+ Message: p.Message,
+ Delay: p.Delay,
+ FailCheck: p.FailCheck,
})
}
return phases
@@ -197,12 +173,6 @@ func (cs *CourseStore) resolveExitTarget(roomID int, dir string) int {
return 0
}
switch x := v.(type) {
- case int:
- return x
- case int64:
- return int(x)
- case float64:
- return int(x)
case map[string]any:
if r, ok := x["room"]; ok {
switch y := r.(type) {
diff --git a/internal/game/core_course_test.go b/internal/game/core_course_test.go
index 64ec8ad..93f49f5 100644
--- a/internal/game/core_course_test.go
+++ b/internal/game/core_course_test.go
@@ -6,7 +6,7 @@ import (
"testing"
)
-func TestResolvePhasesPrefersExplicitPhases(t *testing.T) {
+func TestResolvePhases(t *testing.T) {
obs := ObstacleDef{
RoomID: 5,
Verb: "climb",
@@ -15,9 +15,6 @@ func TestResolvePhasesPrefersExplicitPhases(t *testing.T) {
{Message: "middle", Delay: 2, FailCheck: true},
{Message: "end", Delay: 1.5},
},
- // Legacy fields set as a decoy; should be ignored when Phases present.
- TicksPerPhase: 99,
- Messages: []string{"ignored1", "ignored2", "ignored3"},
}
got := resolvePhases(obs)
if len(got) != 3 {
@@ -34,28 +31,6 @@ func TestResolvePhasesPrefersExplicitPhases(t *testing.T) {
}
}
-func TestResolvePhasesLegacyMigration(t *testing.T) {
- obs := ObstacleDef{
- RoomID: 7,
- Verb: "jump",
- TicksPerPhase: 2,
- Messages: []string{"a", "b", "c"},
- }
- got := resolvePhases(obs)
- if len(got) != 3 {
- t.Fatalf("expected 3 legacy phases, got %d", len(got))
- }
- if got[0].Message != "a" || got[0].Delay != 0 || got[0].FailCheck {
- t.Errorf("legacy phase 0 wrong: %+v", got[0])
- }
- if got[1].Message != "b" || got[1].Delay != 2 || !got[1].FailCheck {
- t.Errorf("legacy phase 1 must carry fail_check at index 1: %+v", got[1])
- }
- if got[2].Message != "c" || got[2].Delay != 2 || got[2].FailCheck {
- t.Errorf("legacy phase 2 wrong: %+v", got[2])
- }
-}
-
func TestCourseStoreLoadsWithExplicitFailChance(t *testing.T) {
dir := t.TempDir()
coursesDir := filepath.Join(dir, "courses")
@@ -85,8 +60,14 @@ obstacles:
verb: jump
xp: 14
fail_damage: [1, 3]
- messages: ["p0", "p1", "p2"]
- ticks_per_phase: 1
+ phases:
+ - message: "p0"
+ delay: 0
+ - message: "p1"
+ delay: 1
+ fail_check: true
+ - message: "p2"
+ delay: 1
`)
if err := os.WriteFile(filepath.Join(coursesDir, "testcourse.yaml"), yaml, 0644); err != nil {
t.Fatal(err)
@@ -116,16 +97,16 @@ obstacles:
t.Errorf("first obstacle should have no completion xp, got %d", o1.CompletionXP)
}
- // Obstacle 2: legacy migration, derived fail chance (nil)
+ // Obstacle 2: explicit phases, derived fail chance (nil)
o2 := cs.GetObstacle(102)
if o2 == nil {
t.Fatal("expected obstacle for room 102")
}
if len(o2.Phases) != 3 || !o2.Phases[1].FailCheck {
- t.Errorf("legacy obstacle phases not migrated: %+v", o2.Phases)
+ t.Errorf("obstacle 2 phases wrong: %+v", o2.Phases)
}
if o2.FailChance != nil {
- t.Errorf("legacy obstacle should have nil (derived) fail_chance, got %v", *o2.FailChance)
+ t.Errorf("obstacle 2 should have nil (derived) fail_chance, got %v", *o2.FailChance)
}
if o2.CompletionXP != 50 {
t.Errorf("last obstacle should carry completion_xp, got %d", o2.CompletionXP)
@@ -137,4 +118,4 @@ obstacles:
if cs.GetObstacle(999) != nil {
t.Error("expected nil for unrelated room")
}
-} \ No newline at end of file
+}
diff --git a/internal/game/core_flags.go b/internal/game/core_flags.go
index 5e1c812..c78f3c3 100644
--- a/internal/game/core_flags.go
+++ b/internal/game/core_flags.go
@@ -1,6 +1,9 @@
package game
-import "thehouseoficarus/internal/player"
+import (
+ "thehouseoficarus/internal/engine"
+ "thehouseoficarus/internal/player"
+)
func getPlayerFlagInt(p *player.Player, key string) int {
if p.Flags == nil {
@@ -37,7 +40,7 @@ func (g *Game) setPlayerFlag(p *player.Player, key string, val any) {
p.EnsureFlags()
old, existed := p.Flags[key]
p.Flags[key] = val
- if !existed || !valuesEqual(old, val) {
+ if !existed || !engine.ValuesEqual(old, val) {
g.firePlayerFlagTrigger(p, key, val)
}
}
diff --git a/internal/game/core_flagstore.go b/internal/game/core_flagstore.go
index 18578b7..5dd8d00 100644
--- a/internal/game/core_flagstore.go
+++ b/internal/game/core_flagstore.go
@@ -1,6 +1,10 @@
package game
-import "sync"
+import (
+ "sync"
+
+ "thehouseoficarus/internal/engine"
+)
// GlobalFlagChangeCallback is invoked when a global flag value actually changes
// (old value differs from new, or new flag is created with a truthy value).
@@ -39,7 +43,7 @@ func (f *GlobalFlagStore) Set(name string, value any) {
cbs := f.callbacks
f.mu.Unlock()
- if !existed || !valuesEqual(old, value) {
+ if !existed || !engine.ValuesEqual(old, value) {
for _, cb := range cbs {
cb(name, value)
}
@@ -52,7 +56,7 @@ func (f *GlobalFlagStore) SetAll(m map[string]any) {
for k, v := range m {
old, existed := f.flags[k]
f.flags[k] = v
- if !existed || !valuesEqual(old, v) {
+ if !existed || !engine.ValuesEqual(old, v) {
changed[k] = v
}
}
diff --git a/internal/game/map_test.go b/internal/game/map_test.go
index 2975551..d13cbdc 100644
--- a/internal/game/map_test.go
+++ b/internal/game/map_test.go
@@ -46,14 +46,14 @@ func TestMapConnectorGlyphs(t *testing.T) {
}{
{
name: "bidirectional bar",
- room1: "name: One\nexits:\n east: 2\n",
- room2: "name: Two\nexits:\n west: 1\n",
+ room1: "name: One\nexits:\n east: {room: 2}\n",
+ room2: "name: Two\nexits:\n west: {room: 1}\n",
wantPresent: "-",
wantAbsent: []string{"X", "<", ">"},
},
{
name: "one-way east arrow",
- room1: "name: One\nexits:\n east: 2\n",
+ room1: "name: One\nexits:\n east: {room: 2}\n",
room2: "name: Two\n",
wantPresent: ">",
wantAbsent: []string{"X", "-", "<"},
@@ -61,7 +61,7 @@ func TestMapConnectorGlyphs(t *testing.T) {
{
name: "forward blocked, reverse open -> X (shortest path is blocked)",
room1: condEast,
- room2: "name: Two\nexits:\n west: 1\n",
+ room2: "name: Two\nexits:\n west: {room: 1}\n",
flagOpen: false,
wantPresent: "X",
wantAbsent: []string{"-", "<", ">"},
@@ -77,15 +77,15 @@ func TestMapConnectorGlyphs(t *testing.T) {
{
name: "conditional unblocked -> bar",
room1: condEast,
- room2: "name: Two\nexits:\n west: 1\n",
+ room2: "name: Two\nexits:\n west: {room: 1}\n",
flagOpen: true,
wantPresent: "-",
wantAbsent: []string{"X", "<", ">"},
},
{
name: "outward open, inward blocked -> outward arrow (dist rules)",
- room1: "name: One\nexits:\n east: 2\n",
- room2: "name: Two\nexits:\n west: 1\n north: 3\n",
+ room1: "name: One\nexits:\n east: {room: 2}\n",
+ room2: "name: Two\nexits:\n west: {room: 1}\n north: {room: 3}\n",
room3: condSouth,
flagOpen: false,
// dist[room1]=0, dist[room2]=1, dist[room3]=2.
@@ -96,21 +96,21 @@ func TestMapConnectorGlyphs(t *testing.T) {
},
{
name: "bidirectional diagonal NE-SW",
- room1: "name: One\nexits:\n northeast: 2\n",
- room2: "name: Two\nexits:\n southwest: 1\n",
+ room1: "name: One\nexits:\n northeast: {room: 2}\n",
+ room2: "name: Two\nexits:\n southwest: {room: 1}\n",
wantPresent: "/",
wantAbsent: []string{"X", "\\"},
},
{
name: "bidirectional diagonal NW-SE",
- room1: "name: One\nexits:\n northwest: 2\n",
- room2: "name: Two\nexits:\n southeast: 1\n",
+ room1: "name: One\nexits:\n northwest: {room: 2}\n",
+ room2: "name: Two\nexits:\n southeast: {room: 1}\n",
wantPresent: "\\",
wantAbsent: []string{"X", "/"},
},
{
name: "one-way NE arrow",
- room1: "name: One\nexits:\n northeast: 2\n",
+ room1: "name: One\nexits:\n northeast: {room: 2}\n",
room2: "name: Two\n",
wantPresent: "/",
wantAbsent: []string{"X", "\\"},
@@ -134,15 +134,15 @@ func TestMapConnectorGlyphs(t *testing.T) {
{
name: "diagonal conditional unblocked -> bar",
room1: condNE,
- room2: "name: Two\nexits:\n southwest: 1\n",
+ room2: "name: Two\nexits:\n southwest: {room: 1}\n",
flagOpen: true,
wantPresent: "/",
wantAbsent: []string{"X", "\\"},
},
{
name: "criss-crossed diagonal paths show X",
- room1: "name: One\nexits:\n east: 2\n south: 3\n southeast: 4\n",
- room2: "name: Two\nexits:\n southwest: 3\n",
+ room1: "name: One\nexits:\n east: {room: 2}\n south: {room: 3}\n southeast: {room: 4}\n",
+ room2: "name: Two\nexits:\n southwest: {room: 3}\n",
room3: "name: Three\n",
room4: "name: Four\n",
wantPresent: "X",
@@ -187,10 +187,10 @@ func TestMapConnectorGlyphs(t *testing.T) {
// both bar glyphs and arrow glyphs.
func TestMapDiagonalOneWayCrossing(t *testing.T) {
dir := t.TempDir()
- writeTempRoom(t, dir, 1, "name: One\nexits:\n north: 3\n northeast: 2\n")
+ writeTempRoom(t, dir, 1, "name: One\nexits:\n north: {room: 3}\n northeast: {room: 2}\n")
writeTempRoom(t, dir, 2, "name: Two\n")
- writeTempRoom(t, dir, 3, "name: Three\nexits:\n southeast: 4\n")
- writeTempRoom(t, dir, 4, "name: Four\nexits:\n northwest: 3\n")
+ writeTempRoom(t, dir, 3, "name: Three\nexits:\n southeast: {room: 4}\n")
+ writeTempRoom(t, dir, 4, "name: Four\nexits:\n northwest: {room: 3}\n")
g := &Game{Deps: Deps{World: world.New(dir)}}
sess := &net.Session{Player: &player.Player{Options: map[string]any{"unicode": true}}}
@@ -396,10 +396,10 @@ func TestMap3DDisconnectedComponent(t *testing.T) {
// tower2base→up→tower2 (1,0,0). Tower 2 is at the same z=0 as tower 1 but
// unreachable via horizontal exits. The 3D map should still show it.
dir := t.TempDir()
- writeTempRoom(t, dir, 1, "name: Tower One\nexits:\n down: 2\n")
- writeTempRoom(t, dir, 2, "name: Bridge\nexits:\n east: 3\n up: 1\n")
- writeTempRoom(t, dir, 3, "name: Tower Two Base\nexits:\n up: 4\n west: 2\n")
- writeTempRoom(t, dir, 4, "name: Tower Two\nexits:\n down: 3\n")
+ writeTempRoom(t, dir, 1, "name: Tower One\nexits:\n down: {room: 2}\n")
+ writeTempRoom(t, dir, 2, "name: Bridge\nexits:\n east: {room: 3}\n up: {room: 1}\n")
+ writeTempRoom(t, dir, 3, "name: Tower Two Base\nexits:\n up: {room: 4}\n west: {room: 2}\n")
+ writeTempRoom(t, dir, 4, "name: Tower Two\nexits:\n down: {room: 3}\n")
g := &Game{Deps: Deps{World: world.New(dir)}, GlobalFlags: NewGlobalFlagStore()}
mg := mapGlyphsForPlayer(false)
@@ -423,8 +423,8 @@ func TestMap3DDifferentZExcluded(t *testing.T) {
// Room 1 at (0,0,0) with up to room 2 at (0,0,1). Room 2 is at z=1,
// different from the player's z=0 level — should NOT show on the map.
dir := t.TempDir()
- writeTempRoom(t, dir, 1, "name: Ground\nexits:\n up: 2\n")
- writeTempRoom(t, dir, 2, "name: Upper\nexits:\n down: 1\n")
+ writeTempRoom(t, dir, 1, "name: Ground\nexits:\n up: {room: 2}\n")
+ writeTempRoom(t, dir, 2, "name: Upper\nexits:\n down: {room: 1}\n")
g := &Game{Deps: Deps{World: world.New(dir)}, GlobalFlags: NewGlobalFlagStore()}
mg := mapGlyphsForPlayer(false)
diff --git a/internal/game/sys_triggers.go b/internal/game/sys_triggers.go
index 2e8b877..6a1e224 100644
--- a/internal/game/sys_triggers.go
+++ b/internal/game/sys_triggers.go
@@ -8,7 +8,6 @@ import (
"thehouseoficarus/internal/engine"
"thehouseoficarus/internal/net"
"thehouseoficarus/internal/player"
- "thehouseoficarus/internal/world"
)
func (g *Game) TriggerSeqTick() {
@@ -150,7 +149,7 @@ func (g *Game) executeGlobalTriggerStep(step *behavior.StepAction, roomID int, f
g.applyStepAction(nil, nil, step, roomID, scopeGlobal, flagValue)
}
-func (g *Game) spawnTriggerMob(sess *net.Session, p *player.Player, cfg *world.SpawnMobConfig, roomID int) {
+func (g *Game) spawnTriggerMob(sess *net.Session, p *player.Player, cfg *behavior.SpawnMobConfig, roomID int) {
if cfg.ID == "" {
return
}
@@ -166,7 +165,7 @@ func (g *Game) spawnTriggerMob(sess *net.Session, p *player.Player, cfg *world.S
sess.WriteLine(g.colorize(sess, "broadcast", mobDisplayName(inst, true)+" appears!"))
}
-func (g *Game) spawnWorldTriggerMob(cfg *world.SpawnMobConfig, roomID int) {
+func (g *Game) spawnWorldTriggerMob(cfg *behavior.SpawnMobConfig, roomID int) {
if cfg.ID == "" {
return
}
diff --git a/internal/item/item.go b/internal/item/item.go
index 93f736b..1536006 100644
--- a/internal/item/item.go
+++ b/internal/item/item.go
@@ -1,10 +1,8 @@
package item
import (
- "fmt"
"strings"
- "gopkg.in/yaml.v3"
"thehouseoficarus/internal/behavior"
)
@@ -216,21 +214,6 @@ func (d *ItemDef) Stats() ItemStats {
type CraftList []CraftDef
-func (cl *CraftList) UnmarshalYAML(value *yaml.Node) error {
- switch value.Kind {
- case yaml.SequenceNode:
- return value.Decode((*[]CraftDef)(cl))
- case yaml.MappingNode:
- var single CraftDef
- if err := value.Decode(&single); err != nil {
- return err
- }
- *cl = []CraftDef{single}
- return nil
- }
- return fmt.Errorf("craft: expected mapping or sequence")
-}
-
func (d *ItemDef) FirstCraft() *CraftDef {
if len(d.Craft) == 0 {
return nil
diff --git a/internal/validate/grid_test.go b/internal/validate/grid_test.go
index e40c50b..0e1d2dd 100644
--- a/internal/validate/grid_test.go
+++ b/internal/validate/grid_test.go
@@ -42,9 +42,9 @@ func containsMsg(issues []Issue, substr string) bool {
func TestGridCleanLayout(t *testing.T) {
// A consistent 2x2 block: 4 is reached the same way from 2 and from 3.
rooms := map[int]string{
- 1: "exits:\n south: 3\n east: 2\n",
- 2: "exits:\n south: 4\n",
- 3: "exits:\n east: 4\n",
+ 1: "exits:\n south: {room: 3}\n east: {room: 2}\n",
+ 2: "exits:\n south: {room: 4}\n",
+ 3: "exits:\n east: {room: 4}\n",
4: "name: corner\n",
}
if issues := runGridCheck(t, rooms, 1); len(issues) != 0 {
@@ -55,9 +55,9 @@ func TestGridCleanLayout(t *testing.T) {
func TestGridOverlap(t *testing.T) {
// rooms 4 and 5 both resolve to grid (1,1).
rooms := map[int]string{
- 1: "exits:\n south: 3\n east: 2\n",
- 2: "exits:\n south: 5\n",
- 3: "exits:\n east: 4\n",
+ 1: "exits:\n south: {room: 3}\n east: {room: 2}\n",
+ 2: "exits:\n south: {room: 5}\n",
+ 3: "exits:\n east: {room: 4}\n",
4: "name: four\n",
5: "name: five\n",
}
@@ -75,9 +75,9 @@ func TestGridOverlap(t *testing.T) {
func TestGridTwist(t *testing.T) {
// room 3 is forced onto two different cells.
rooms := map[int]string{
- 1: "exits:\n south: 4\n east: 2\n",
- 2: "exits:\n east: 3\n",
- 4: "exits:\n east: 3\n",
+ 1: "exits:\n south: {room: 4}\n east: {room: 2}\n",
+ 2: "exits:\n east: {room: 3}\n",
+ 4: "exits:\n east: {room: 3}\n",
3: "name: three\n",
}
issues := runGridCheck(t, rooms, 1)
@@ -90,10 +90,10 @@ func TestGridMultiPlaneViaUpDown(t *testing.T) {
// Room 1 at (0,0,0) goes up to room 10 at (0,0,1). Rooms 13 and 14 both
// resolve to (1,1,1) — 3D overlap on the upper level.
rooms := map[int]string{
- 1: "exits:\n up: 10\n",
- 10: "exits:\n south: 12\n east: 11\n",
- 11: "exits:\n south: 14\n",
- 12: "exits:\n east: 13\n",
+ 1: "exits:\n up: {room: 10}\n",
+ 10: "exits:\n south: {room: 12}\n east: {room: 11}\n",
+ 11: "exits:\n south: {room: 14}\n",
+ 12: "exits:\n east: {room: 13}\n",
13: "name: thirteen\n",
14: "name: fourteen\n",
}
@@ -107,11 +107,11 @@ func TestGrid3DCleanViaUpDown(t *testing.T) {
// Clean 3D layout: up/down maintain same (x,y) across z-levels.
// 1(0,0,0) up→2(0,0,1) east→3(1,0,1) down→4(1,0,0) south→5(1,1,0)
rooms := map[int]string{
- 1: "exits:\n up: 2\n",
- 2: "exits:\n east: 3\n down: 1\n",
- 3: "exits:\n down: 4\n west: 2\n",
- 4: "exits:\n south: 5\n up: 3\n",
- 5: "name: five\n exits:\n north: 4\n",
+ 1: "exits:\n up: {room: 2}\n",
+ 2: "exits:\n east: {room: 3}\n down: {room: 1}\n",
+ 3: "exits:\n down: {room: 4}\n west: {room: 2}\n",
+ 4: "exits:\n south: {room: 5}\n up: {room: 3}\n",
+ 5: "name: five\n exits:\n north: {room: 4}\n",
}
if issues := runGridCheck(t, rooms, 1); len(issues) != 0 {
t.Errorf("expected no grid issues, got: %+v", issues)
@@ -123,10 +123,10 @@ func TestGrid3DOverlapUpDown(t *testing.T) {
// 1(0,0,0) up→2(0,0,1).
// 1(0,0,0) east→3(1,0,0) up→4(1,0,1) west→5 wants (0,0,1) — already room 2.
rooms := map[int]string{
- 1: "exits:\n up: 2\n east: 3\n",
+ 1: "exits:\n up: {room: 2}\n east: {room: 3}\n",
2: "name: two\n",
- 3: "exits:\n up: 4\n west: 1\n",
- 4: "exits:\n west: 5\n down: 3\n",
+ 3: "exits:\n up: {room: 4}\n west: {room: 1}\n",
+ 4: "exits:\n west: {room: 5}\n down: {room: 3}\n",
5: "name: five\n",
}
issues := runGridCheck(t, rooms, 1)
@@ -141,13 +141,13 @@ func TestGrid3DTwistUpDown(t *testing.T) {
// path2: 1 east→A(1,0,0) up→B(1,0,1) east→C(2,0,1) south→4 wants (2,1,1)
// 4 already at (1,1,1) from path1 → twist.
rooms := map[int]string{
- 1: "exits:\n up: 2\n east: 6\n",
- 2: "exits:\n south: 3\n down: 1\n",
- 3: "exits:\n east: 4\n north: 2\n",
+ 1: "exits:\n up: {room: 2}\n east: {room: 6}\n",
+ 2: "exits:\n south: {room: 3}\n down: {room: 1}\n",
+ 3: "exits:\n east: {room: 4}\n north: {room: 2}\n",
4: "name: four\n",
- 6: "exits:\n up: 7\n west: 1\n",
- 7: "exits:\n east: 8\n down: 6\n",
- 8: "exits:\n south: 4\n west: 7\n",
+ 6: "exits:\n up: {room: 7}\n west: {room: 1}\n",
+ 7: "exits:\n east: {room: 8}\n down: {room: 6}\n",
+ 8: "exits:\n south: {room: 4}\n west: {room: 7}\n",
}
issues := runGridCheck(t, rooms, 1)
if !containsMsg(issues, "Grid twist") {
@@ -158,8 +158,8 @@ func TestGrid3DTwistUpDown(t *testing.T) {
func TestGridDiagonalClean(t *testing.T) {
// Room 1 -> NE -> Room 2 (at 1,-1). Clean diagonal placement.
rooms := map[int]string{
- 1: "exits:\n northeast: 2\n",
- 2: "name: two\n exits:\n southwest: 1\n",
+ 1: "exits:\n northeast: {room: 2}\n",
+ 2: "name: two\n exits:\n southwest: {room: 1}\n",
}
if issues := runGridCheck(t, rooms, 1); len(issues) != 0 {
t.Errorf("expected no grid issues, got: %+v", issues)
@@ -171,9 +171,9 @@ func TestGridDiagonalOverlap(t *testing.T) {
// 1→SE→2→E→4 lands 4 at (2,1).
// 1→E→3→SE→5 lands 5 at (2,1). Room 4 != 5 → overlap.
rooms := map[int]string{
- 1: "exits:\n southeast: 2\n east: 3\n",
- 2: "exits:\n east: 4\n",
- 3: "exits:\n southeast: 5\n",
+ 1: "exits:\n southeast: {room: 2}\n east: {room: 3}\n",
+ 2: "exits:\n east: {room: 4}\n",
+ 3: "exits:\n southeast: {room: 5}\n",
4: "name: four\n",
5: "name: five\n",
}
@@ -189,11 +189,11 @@ func TestGridDiagonalTwist(t *testing.T) {
// path2: 1→N→3 (3 at 0,-1). 3→E→5 (5 at 1,-1). 5→N→4 wants 4 at (1,-2).
// 4 already placed at (2,-1) but wanted at (1,-2) → twist.
rooms := map[int]string{
- 1: "exits:\n east: 2\n north: 3\n",
- 2: "exits:\n northeast: 4\n",
- 3: "exits:\n east: 5\n",
+ 1: "exits:\n east: {room: 2}\n north: {room: 3}\n",
+ 2: "exits:\n northeast: {room: 4}\n",
+ 3: "exits:\n east: {room: 5}\n",
4: "name: four\n",
- 5: "exits:\n north: 4\n",
+ 5: "exits:\n north: {room: 4}\n",
}
issues := runGridCheck(t, rooms, 1)
if !containsMsg(issues, "Grid twist") {
diff --git a/internal/validate/local_test.go b/internal/validate/local_test.go
index 337f3d2..f0bc0a1 100644
--- a/internal/validate/local_test.go
+++ b/internal/validate/local_test.go
@@ -78,9 +78,11 @@ func TestValidateRoomsSameNameCollision(t *testing.T) {
objects:
- id: ghost_object
- name: sign
- description: "one"
+ description:
+ - text: "one"
- name: sign
- description: "two"
+ description:
+ - text: "two"
`)
issues := validateRooms(newSource(dir))
@@ -102,7 +104,8 @@ objects:
- id: copper_rock
- id: anvil
- name: anvil
- description: "a local thing that collides with the file id"
+ description:
+ - text: "a local thing that collides with the file id"
`)
issues := validateRooms(newSource(dir))
@@ -136,11 +139,13 @@ func TestValidateExitReciprocityMismatch(t *testing.T) {
dir := t.TempDir()
writeFile(t, filepath.Join(dir, "rooms", "1.yaml"), `name: Room One
exits:
- down: 2
+ down:
+ room: 2
`)
writeFile(t, filepath.Join(dir, "rooms", "2.yaml"), `name: Room Two
exits:
- south: 1
+ south:
+ room: 1
`)
issues := validateExitReciprocity(newSource(dir))
if !containsMsg(issues, "not the expected opposite direction") {
@@ -152,7 +157,8 @@ func TestValidateExitReciprocityOneWay(t *testing.T) {
dir := t.TempDir()
writeFile(t, filepath.Join(dir, "rooms", "1.yaml"), `name: Room One
exits:
- east: 2
+ east:
+ room: 2
`)
writeFile(t, filepath.Join(dir, "rooms", "2.yaml"), `name: Room Two
`)
@@ -167,9 +173,11 @@ func TestValidateRoomsPartialNameSiblingsOK(t *testing.T) {
writeFile(t, filepath.Join(dir, "rooms", "1.yaml"), `name: Test Room
objects:
- name: rusty sign
- description: "rusty"
+ description:
+ - text: "rusty"
- name: shiny sign
- description: "shiny"
+ description:
+ - text: "shiny"
`)
issues := validateRooms(newSource(dir))
for _, iss := range issues {
diff --git a/internal/world/grid_test.go b/internal/world/grid_test.go
index c777f90..005f60f 100644
--- a/internal/world/grid_test.go
+++ b/internal/world/grid_test.go
@@ -39,9 +39,9 @@ func hasConflictKind(conflicts []GridConflict, kind string) bool {
func TestBuildGridConflictsClean(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n south: 3\n east: 2\n")
- writeGridTestRoom(t, dir, 2, "exits:\n south: 4\n")
- writeGridTestRoom(t, dir, 3, "exits:\n east: 4\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n south: {room: 3}\n east: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n south: {room: 4}\n")
+ writeGridTestRoom(t, dir, 3, "exits:\n east: {room: 4}\n")
writeGridTestRoom(t, dir, 4, "name: corner\n")
w := New(dir)
@@ -52,9 +52,9 @@ func TestBuildGridConflictsClean(t *testing.T) {
func TestBuildGridConflictsOverlap(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n south: 3\n east: 2\n")
- writeGridTestRoom(t, dir, 2, "exits:\n south: 5\n")
- writeGridTestRoom(t, dir, 3, "exits:\n east: 4\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n south: {room: 3}\n east: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n south: {room: 5}\n")
+ writeGridTestRoom(t, dir, 3, "exits:\n east: {room: 4}\n")
writeGridTestRoom(t, dir, 4, "name: four\n")
writeGridTestRoom(t, dir, 5, "name: five\n")
@@ -67,9 +67,9 @@ func TestBuildGridConflictsOverlap(t *testing.T) {
func TestBuildGridConflictsTwist(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n south: 4\n east: 2\n")
- writeGridTestRoom(t, dir, 2, "exits:\n east: 3\n")
- writeGridTestRoom(t, dir, 4, "exits:\n east: 3\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n south: {room: 4}\n east: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n east: {room: 3}\n")
+ writeGridTestRoom(t, dir, 4, "exits:\n east: {room: 3}\n")
writeGridTestRoom(t, dir, 3, "name: three\n")
w := New(dir)
@@ -81,8 +81,8 @@ func TestBuildGridConflictsTwist(t *testing.T) {
func TestBuildGridConflictsDiagonalClean(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n northeast: 2\n")
- writeGridTestRoom(t, dir, 2, "name: two\n exits:\n southwest: 1\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n northeast: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "name: two\n exits:\n southwest: {room: 1}\n")
w := New(dir)
if conflicts := BuildGridConflicts(1, loadGridRoom(w)); len(conflicts) != 0 {
@@ -97,8 +97,8 @@ func TestBuildGridConflictsDiagonalClean(t *testing.T) {
// confirm the (clean) post-edit world has no conflicts.
func TestBuildGridConflictsHypotheticalInsert(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "name: one\nexits:\n east: 2\n")
- writeGridTestRoom(t, dir, 2, "name: two\nexits:\n west: 1\n")
+ writeGridTestRoom(t, dir, 1, "name: one\nexits:\n east: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "name: two\nexits:\n west: {room: 1}\n")
w := New(dir)
newRoom := &Room{Name: "new", Exits: map[ExitDir]ExitDef{
@@ -145,12 +145,12 @@ func TestBuildGridConflictsHypotheticalInsert(t *testing.T) {
// (1,1,0). The helper must report an overlap without anything being written.
func TestBuildGridConflictsHypotheticalRemoveOverlap(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n east: 2\n south: 4\n")
- writeGridTestRoom(t, dir, 2, "exits:\n east: 3\n west: 1\n")
- writeGridTestRoom(t, dir, 3, "exits:\n south: 6\n west: 2\n")
- writeGridTestRoom(t, dir, 4, "exits:\n east: 5\n north: 1\n")
- writeGridTestRoom(t, dir, 5, "exits:\n west: 4\n")
- writeGridTestRoom(t, dir, 6, "exits:\n north: 3\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n east: {room: 2}\n south: {room: 4}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n east: {room: 3}\n west: {room: 1}\n")
+ writeGridTestRoom(t, dir, 3, "exits:\n south: {room: 6}\n west: {room: 2}\n")
+ writeGridTestRoom(t, dir, 4, "exits:\n east: {room: 5}\n north: {room: 1}\n")
+ writeGridTestRoom(t, dir, 5, "exits:\n west: {room: 4}\n")
+ writeGridTestRoom(t, dir, 6, "exits:\n north: {room: 3}\n")
w := New(dir)
load := func(id int) (*Room, bool) {
diff --git a/internal/world/insert_remove_test.go b/internal/world/insert_remove_test.go
index 3be3222..15d752e 100644
--- a/internal/world/insert_remove_test.go
+++ b/internal/world/insert_remove_test.go
@@ -9,8 +9,8 @@ const insertSentinel = 9999
func TestInsertGridConflictsCleanNSEW(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n east: 2\n")
- writeGridTestRoom(t, dir, 2, "exits:\n west: 1\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n east: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n west: {room: 1}\n")
w := New(dir)
if c := InsertGridConflicts(1, East, 2, insertSentinel, loadGridRoom(w)); len(c) != 0 {
t.Errorf("clean east insert: expected no conflicts, got %+v", c)
@@ -19,8 +19,8 @@ func TestInsertGridConflictsCleanNSEW(t *testing.T) {
func TestInsertGridConflictsCleanDiagonal(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n northeast: 2\n")
- writeGridTestRoom(t, dir, 2, "exits:\n southwest: 1\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n northeast: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n southwest: {room: 1}\n")
w := New(dir)
if c := InsertGridConflicts(1, Northeast, 2, insertSentinel, loadGridRoom(w)); len(c) != 0 {
t.Errorf("clean NE insert: expected no conflicts, got %+v", c)
@@ -29,8 +29,8 @@ func TestInsertGridConflictsCleanDiagonal(t *testing.T) {
func TestInsertGridConflictsCleanUpDown(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n up: 2\n")
- writeGridTestRoom(t, dir, 2, "exits:\n down: 1\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n up: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n down: {room: 1}\n")
w := New(dir)
if c := InsertGridConflicts(1, Up, 2, insertSentinel, loadGridRoom(w)); len(c) != 0 {
t.Errorf("clean up insert: expected no conflicts, got %+v", c)
@@ -73,14 +73,14 @@ func TestInsertGridConflictsCleanUpDown(t *testing.T) {
// beyond-set (reachable from 1 via south, not via east/2), so it's an overlap.
func TestInsertGridConflictsOverlap(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n east: 2\n south: 4\n")
- writeGridTestRoom(t, dir, 2, "exits:\n east: 3\n west: 1\n")
- writeGridTestRoom(t, dir, 3, "exits:\n west: 2\n")
- writeGridTestRoom(t, dir, 4, "exits:\n east: 5\n north: 1\n")
- writeGridTestRoom(t, dir, 5, "exits:\n east: 6\n west: 4\n")
- writeGridTestRoom(t, dir, 6, "exits:\n east: 7\n west: 5\n")
- writeGridTestRoom(t, dir, 7, "exits:\n north: 8\n west: 6\n")
- writeGridTestRoom(t, dir, 8, "exits:\n south: 7\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n east: {room: 2}\n south: {room: 4}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n east: {room: 3}\n west: {room: 1}\n")
+ writeGridTestRoom(t, dir, 3, "exits:\n west: {room: 2}\n")
+ writeGridTestRoom(t, dir, 4, "exits:\n east: {room: 5}\n north: {room: 1}\n")
+ writeGridTestRoom(t, dir, 5, "exits:\n east: {room: 6}\n west: {room: 4}\n")
+ writeGridTestRoom(t, dir, 6, "exits:\n east: {room: 7}\n west: {room: 5}\n")
+ writeGridTestRoom(t, dir, 7, "exits:\n north: {room: 8}\n west: {room: 6}\n")
+ writeGridTestRoom(t, dir, 8, "exits:\n south: {room: 7}\n")
w := New(dir)
// Sanity: the pre-edit world must be clean.
@@ -101,11 +101,11 @@ func TestInsertGridConflictsOverlap(t *testing.T) {
// insert helper must surface a twist conflict.
func TestInsertGridConflictsTwist(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n east: 2\n south: 4\n")
- writeGridTestRoom(t, dir, 2, "exits:\n east: 3\n west: 1\n")
- writeGridTestRoom(t, dir, 3, "exits:\n west: 2\n south: 5\n")
- writeGridTestRoom(t, dir, 4, "exits:\n east: 5\n north: 1\n")
- writeGridTestRoom(t, dir, 5, "exits:\n north: 3\n west: 4\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n east: {room: 2}\n south: {room: 4}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n east: {room: 3}\n west: {room: 1}\n")
+ writeGridTestRoom(t, dir, 3, "exits:\n west: {room: 2}\n south: {room: 5}\n")
+ writeGridTestRoom(t, dir, 4, "exits:\n east: {room: 5}\n north: {room: 1}\n")
+ writeGridTestRoom(t, dir, 5, "exits:\n north: {room: 3}\n west: {room: 4}\n")
w := New(dir)
c := InsertGridConflicts(1, East, 2, insertSentinel, loadGridRoom(w))
@@ -120,7 +120,7 @@ func TestInsertGridConflictsTwist(t *testing.T) {
// geometrically clean insert.
func TestInsertGridConflictsOneWayFarReciprocal(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n east: 2\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n east: {room: 2}\n")
writeGridTestRoom(t, dir, 2, "exits:\n") // no west exit back to 1
w := New(dir)
if c := InsertGridConflicts(1, East, 2, insertSentinel, loadGridRoom(w)); len(c) != 0 {
@@ -131,9 +131,9 @@ func TestInsertGridConflictsOneWayFarReciprocal(t *testing.T) {
func TestRemoveGridConflictsCleanPull(t *testing.T) {
dir := t.TempDir()
// 1 east→2 east→3, with reciprocals. Removing 2 pulls 3 to (1,0,0). Clean.
- writeGridTestRoom(t, dir, 1, "exits:\n east: 2\n")
- writeGridTestRoom(t, dir, 2, "exits:\n east: 3\n west: 1\n")
- writeGridTestRoom(t, dir, 3, "exits:\n west: 2\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n east: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n east: {room: 3}\n west: {room: 1}\n")
+ writeGridTestRoom(t, dir, 3, "exits:\n west: {room: 2}\n")
w := New(dir)
if c := RemoveGridConflicts(1, East, loadGridRoom(w)); len(c) != 0 {
t.Errorf("clean pull should produce no conflicts, got %+v", c)
@@ -142,9 +142,9 @@ func TestRemoveGridConflictsCleanPull(t *testing.T) {
func TestRemoveGridConflictsDiagonalPull(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n northeast: 2\n")
- writeGridTestRoom(t, dir, 2, "exits:\n northeast: 3\n southwest: 1\n")
- writeGridTestRoom(t, dir, 3, "exits:\n southwest: 2\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n northeast: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n northeast: {room: 3}\n southwest: {room: 1}\n")
+ writeGridTestRoom(t, dir, 3, "exits:\n southwest: {room: 2}\n")
w := New(dir)
if c := RemoveGridConflicts(1, Northeast, loadGridRoom(w)); len(c) != 0 {
t.Errorf("clean diagonal pull should produce no conflicts, got %+v", c)
@@ -155,12 +155,12 @@ func TestRemoveGridConflictsDiagonalPull(t *testing.T) {
// removing 2 pulls 6 onto 5's cell.
func TestRemoveGridConflictsOverlap(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n east: 2\n south: 4\n")
- writeGridTestRoom(t, dir, 2, "exits:\n east: 3\n west: 1\n")
- writeGridTestRoom(t, dir, 3, "exits:\n south: 6\n west: 2\n")
- writeGridTestRoom(t, dir, 4, "exits:\n east: 5\n north: 1\n")
- writeGridTestRoom(t, dir, 5, "exits:\n west: 4\n")
- writeGridTestRoom(t, dir, 6, "exits:\n north: 3\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n east: {room: 2}\n south: {room: 4}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n east: {room: 3}\n west: {room: 1}\n")
+ writeGridTestRoom(t, dir, 3, "exits:\n south: {room: 6}\n west: {room: 2}\n")
+ writeGridTestRoom(t, dir, 4, "exits:\n east: {room: 5}\n north: {room: 1}\n")
+ writeGridTestRoom(t, dir, 5, "exits:\n west: {room: 4}\n")
+ writeGridTestRoom(t, dir, 6, "exits:\n north: {room: 3}\n")
w := New(dir)
if c := BuildGridConflicts(1, loadGridRoom(w)); len(c) != 0 {
@@ -177,8 +177,8 @@ func TestRemoveGridConflictsOverlap(t *testing.T) {
// world this cannot introduce a conflict.
func TestRemoveGridConflictsDeadEnd(t *testing.T) {
dir := t.TempDir()
- writeGridTestRoom(t, dir, 1, "exits:\n east: 2\n")
- writeGridTestRoom(t, dir, 2, "exits:\n west: 1\n")
+ writeGridTestRoom(t, dir, 1, "exits:\n east: {room: 2}\n")
+ writeGridTestRoom(t, dir, 2, "exits:\n west: {room: 1}\n")
w := New(dir)
if c := RemoveGridConflicts(1, East, loadGridRoom(w)); len(c) != 0 {
t.Errorf("dead-end removal should produce no conflicts, got %+v", c)
diff --git a/internal/world/mob.go b/internal/world/mob.go
index a9e2f7e..45b0fb8 100644
--- a/internal/world/mob.go
+++ b/internal/world/mob.go
@@ -645,7 +645,7 @@ func (s *MobStore) RollIdleDescription(inst *MobInstance) {
inst.WanderTickCounter = 0
}
-func (s *MobStore) SpawnTransient(def *MobDef, cfg *SpawnMobConfig, roomID int, owner string) *MobInstance {
+func (s *MobStore) SpawnTransient(def *MobDef, cfg *behavior.SpawnMobConfig, roomID int, owner string) *MobInstance {
s.mu.Lock()
defer s.mu.Unlock()
diff --git a/internal/world/room.go b/internal/world/room.go
index 08e18a4..8ae2d13 100644
--- a/internal/world/room.go
+++ b/internal/world/room.go
@@ -83,19 +83,6 @@ type ExitDef struct {
AlwaysBlocked bool `yaml:"always_blocked,omitempty"`
}
-func (e *ExitDef) UnmarshalYAML(value *yaml.Node) error {
- if value.Kind == yaml.ScalarNode {
- var n int
- if err := value.Decode(&n); err != nil {
- return err
- }
- e.Room = n
- return nil
- }
- type raw ExitDef
- return value.Decode((*raw)(e))
-}
-
type Room struct {
ID int `yaml:"id"`
Name string `yaml:"name"`
@@ -117,19 +104,6 @@ type RoomMob struct {
WanderInterval float64 `yaml:"wander_interval,omitempty"`
}
-func (rm *RoomMob) UnmarshalYAML(value *yaml.Node) error {
- if value.Kind == yaml.ScalarNode {
- var s string
- if err := value.Decode(&s); err != nil {
- return err
- }
- rm.ID = s
- return nil
- }
- type raw RoomMob
- return value.Decode((*raw)(rm))
-}
-
// RoomObject is either a reference to a file-backed object definition (only
// `id`/wander fields set) or a fully local object definition (Local != nil).
// An entry is treated as local when it carries any passive content field
diff --git a/internal/world/room_test.go b/internal/world/room_test.go
index 1ad974e..855eba5 100644
--- a/internal/world/room_test.go
+++ b/internal/world/room_test.go
@@ -27,11 +27,13 @@ objects:
- id: workbench
- name: window
hidden: true
- description: "A small window."
+ description:
+ - text: "A small window."
- id: control
name: instrument panel
aliases: [cockpit]
- description: "A panel."
+ description:
+ - text: "A panel."
`
// rebuild the path index so LoadRoom can find the room file
writeRoom(t, dir, body)
@@ -98,7 +100,8 @@ func TestExitDefUnmarshalAlwaysBlocked(t *testing.T) {
north:
room: 5
always_blocked: true
- south: 3
+ south:
+ room: 3
east:
room: 7
hidden: true
diff --git a/internal/world/trigger.go b/internal/world/trigger.go
index e7f3b75..de07c18 100644
--- a/internal/world/trigger.go
+++ b/internal/world/trigger.go
@@ -2,10 +2,6 @@ package world
import "thehouseoficarus/internal/behavior"
-// SpawnMobConfig is an alias for the behavior.SpawnMobConfig so callers that
-// historically referenced world.SpawnMobConfig continue to compile.
-type SpawnMobConfig = behavior.SpawnMobConfig
-
type TriggerDef struct {
ID string `yaml:"id"`
OnPlayerFlag string `yaml:"on_player_flag"`
diff --git a/internal/world/trigger_store.go b/internal/world/trigger_store.go
index 04d77f4..e50ae81 100644
--- a/internal/world/trigger_store.go
+++ b/internal/world/trigger_store.go
@@ -9,6 +9,7 @@ import (
"gopkg.in/yaml.v3"
"thehouseoficarus/internal/behavior"
+ "thehouseoficarus/internal/engine"
)
type TriggerStore struct {
@@ -262,7 +263,7 @@ func (ts *TriggerStore) valueMatches(want, got any) bool {
if want == nil {
return true
}
- return valuesEqual(want, got)
+ return engine.ValuesEqual(want, got)
}
func (ts *TriggerStore) SnapshotPlayerSeqs() []*PlayerTriggerSeq {
@@ -311,27 +312,6 @@ func (ts *TriggerStore) AllGlobalTriggers() []*TriggerDef {
return out
}
-func valuesEqual(a, b any) bool {
- ai, aok := numericValue(a)
- bi, bok := numericValue(b)
- if aok && bok {
- return ai == bi
- }
- return a == b
-}
-
-func numericValue(v any) (float64, bool) {
- switch x := v.(type) {
- case int:
- return float64(x), true
- case int64:
- return float64(x), true
- case float64:
- return x, true
- }
- return 0, false
-}
-
func (ts *TriggerStore) AllRoomTriggers() map[int][]*TriggerDef {
ts.mu.Lock()
defer ts.mu.Unlock()