From 8ee8982b8759bcae116647cc993867f4c8b0a6ce Mon Sep 17 00:00:00 2001 From: workhorse Date: Fri, 19 Jun 2026 20:24:52 -0400 Subject: reorganized items, objects, and rooms in directories. oranized module names. added startup checks. --- AGENTS.md | 635 +++++++--------- cmd/mud/main.go | 2 +- data/items/abyssal_bracelet.yaml | 6 - data/items/acid_vial.yaml | 6 - data/items/adamant_arrow.yaml | 9 - data/items/adamant_arrowtips.yaml | 6 - data/items/adamant_axe.yaml | 19 - data/items/adamant_bolts.yaml | 9 - data/items/adamant_bolts_unf.yaml | 6 - data/items/adamant_dagger.yaml | 17 - data/items/adamant_full_helm.yaml | 15 - data/items/adamant_med_helm.yaml | 15 - data/items/adamant_nails.yaml | 6 - data/items/adamant_pickaxe.yaml | 19 - data/items/adamant_platebody.yaml | 15 - data/items/adamant_sword.yaml | 17 - data/items/adamantite_bar.yaml | 6 - data/items/adamantite_ore.yaml | 6 - data/items/advanced_bio_deck.yaml | 11 - data/items/advanced_eco_deck.yaml | 11 - data/items/advanced_hydro_deck.yaml | 11 - data/items/advanced_solar_deck.yaml | 11 - data/items/ammo/adamant_arrow.yaml | 9 + data/items/ammo/adamant_arrowtips.yaml | 6 + data/items/ammo/adamant_bolts.yaml | 9 + data/items/ammo/adamant_bolts_unf.yaml | 6 + data/items/ammo/arrow_shaft.yaml | 6 + data/items/ammo/bronze_arrow.yaml | 9 + data/items/ammo/bronze_arrowtips.yaml | 6 + data/items/ammo/bronze_bolts.yaml | 9 + data/items/ammo/bronze_bolts_unf.yaml | 6 + data/items/ammo/diamond_bolt_tips.yaml | 6 + data/items/ammo/diamond_bolts.yaml | 9 + data/items/ammo/diamond_bolts_e.yaml | 9 + data/items/ammo/emerald_bolt_tips.yaml | 6 + data/items/ammo/emerald_bolts.yaml | 9 + data/items/ammo/emerald_bolts_e.yaml | 9 + data/items/ammo/headless_arrow.yaml | 6 + data/items/ammo/iron_arrow.yaml | 9 + data/items/ammo/iron_arrowtips.yaml | 6 + data/items/ammo/iron_bolts.yaml | 9 + data/items/ammo/iron_bolts_unf.yaml | 6 + data/items/ammo/mithril_arrow.yaml | 9 + data/items/ammo/mithril_arrowtips.yaml | 6 + data/items/ammo/mithril_bolts.yaml | 9 + data/items/ammo/mithril_bolts_unf.yaml | 6 + data/items/ammo/ruby_bolt_tips.yaml | 6 + data/items/ammo/ruby_bolts.yaml | 9 + data/items/ammo/ruby_bolts_e.yaml | 9 + data/items/ammo/rune_arrow.yaml | 9 + data/items/ammo/rune_arrowtips.yaml | 6 + data/items/ammo/rune_bolts.yaml | 9 + data/items/ammo/rune_bolts_unf.yaml | 6 + data/items/ammo/sapphire_bolt_tips.yaml | 6 + data/items/ammo/sapphire_bolts.yaml | 9 + data/items/ammo/sapphire_bolts_e.yaml | 9 + data/items/ammo/steel_arrow.yaml | 9 + data/items/ammo/steel_arrowtips.yaml | 6 + data/items/ammo/steel_bolts.yaml | 9 + data/items/ammo/steel_bolts_unf.yaml | 6 + data/items/amp_potion.yaml | 9 - data/items/amulet_mould.yaml | 5 - data/items/anchovies.yaml | 8 - data/items/antitoxin_powder.yaml | 6 - data/items/apple.yaml | 8 - data/items/arachnid_enzyme.yaml | 6 - data/items/arrow_shaft.yaml | 6 - data/items/ashes.yaml | 6 - data/items/avantoe.yaml | 6 - data/items/avantoe_potion_unf.yaml | 12 - data/items/avantoe_seed.yaml | 14 - data/items/ball_of_wool.yaml | 6 - data/items/basic_deck.yaml | 10 - data/items/big_fishing_net.yaml | 15 - data/items/binding_necklace.yaml | 6 - data/items/bio_deck.yaml | 11 - data/items/bio_identifier.yaml | 5 - data/items/bio_serum.yaml | 9 - data/items/biojunk.yaml | 6 - data/items/birds_nest.yaml | 9 - data/items/black_axe.yaml | 19 - data/items/black_pickaxe.yaml | 19 - data/items/blight_spore.yaml | 6 - data/items/blood_identifier.yaml | 5 - data/items/bloodjunk.yaml | 6 - data/items/bones.yaml | 6 - data/items/bowstring.yaml | 5 - data/items/bracelet_mould.yaml | 5 - data/items/bracelet_of_clay.yaml | 6 - data/items/bracelet_of_slaughter.yaml | 6 - data/items/bread.yaml | 8 - data/items/bread_dough.yaml | 14 - data/items/bronze_arrow.yaml | 9 - data/items/bronze_arrowtips.yaml | 6 - data/items/bronze_axe.yaml | 17 - data/items/bronze_bar.yaml | 6 - data/items/bronze_bolts.yaml | 9 - data/items/bronze_bolts_unf.yaml | 6 - data/items/bronze_dagger.yaml | 15 - data/items/bronze_full_helm.yaml | 13 - data/items/bronze_med_helm.yaml | 13 - data/items/bronze_nails.yaml | 6 - data/items/bronze_pickaxe.yaml | 17 - data/items/bronze_platebody.yaml | 13 - data/items/bronze_sword.yaml | 15 - data/items/bucket_of_water.yaml | 6 - data/items/burnt_fish.yaml | 6 - data/items/burnt_meat.yaml | 6 - data/items/cabbage.yaml | 8 - data/items/cabbage_seed.yaml | 14 - data/items/cadantine.yaml | 6 - data/items/cadantine_potion_unf.yaml | 12 - data/items/cadantine_seed.yaml | 14 - data/items/capacitor_gloves.yaml | 11 - data/items/cape_of_agility.yaml | 6 - data/items/catalyst_wine.yaml | 6 - data/items/chaos_identifier.yaml | 5 - data/items/chaosjunk.yaml | 6 - data/items/cheese.yaml | 8 - data/items/chisel.yaml | 6 - data/items/chitin_plate.yaml | 6 - data/items/chocolate_dust.yaml | 6 - data/items/christmas_cracker.yaml | 10 - data/items/circuit_board.yaml | 6 - data/items/clay.yaml | 6 - data/items/coal.yaml | 6 - data/items/coif.yaml | 16 - data/items/consumables/acid_vial.yaml | 6 + data/items/consumables/amp_potion.yaml | 9 + data/items/consumables/anchovies.yaml | 8 + data/items/consumables/antitoxin_powder.yaml | 6 + data/items/consumables/apple.yaml | 8 + data/items/consumables/avantoe_potion_unf.yaml | 12 + data/items/consumables/bio_serum.yaml | 9 + data/items/consumables/blight_spore.yaml | 6 + data/items/consumables/bread.yaml | 8 + data/items/consumables/bread_dough.yaml | 14 + data/items/consumables/bucket_of_water.yaml | 6 + data/items/consumables/burnt_fish.yaml | 6 + data/items/consumables/burnt_meat.yaml | 6 + data/items/consumables/cabbage.yaml | 8 + data/items/consumables/cadantine_potion_unf.yaml | 12 + data/items/consumables/catalyst_wine.yaml | 6 + data/items/consumables/cheese.yaml | 8 + data/items/consumables/dwarf_weed_potion_unf.yaml | 12 + data/items/consumables/full_restore.yaml | 9 + data/items/consumables/guam_potion_unf.yaml | 12 + data/items/consumables/harralander_potion_unf.yaml | 12 + data/items/consumables/herring.yaml | 8 + data/items/consumables/irit_potion_unf.yaml | 12 + data/items/consumables/jug_of_water.yaml | 6 + data/items/consumables/kwuarm_potion_unf.yaml | 12 + data/items/consumables/lantadyme_potion_unf.yaml | 12 + data/items/consumables/marrentill_potion_unf.yaml | 12 + data/items/consumables/nano_restore.yaml | 9 + data/items/consumables/onion.yaml | 8 + data/items/consumables/pastry_dough.yaml | 11 + data/items/consumables/pie_dish.yaml | 5 + data/items/consumables/pizza_dough.yaml | 11 + data/items/consumables/plant_cure.yaml | 6 + data/items/consumables/pot_of_flour.yaml | 6 + data/items/consumables/potato.yaml | 8 + data/items/consumables/ranarr_potion_unf.yaml | 12 + data/items/consumables/raw_anchovies.yaml | 6 + data/items/consumables/raw_anglerfish.yaml | 6 + data/items/consumables/raw_bass.yaml | 6 + data/items/consumables/raw_beef.yaml | 6 + data/items/consumables/raw_cave_eel.yaml | 6 + data/items/consumables/raw_cod.yaml | 6 + data/items/consumables/raw_herring.yaml | 6 + data/items/consumables/raw_lobster.yaml | 6 + data/items/consumables/raw_mackerel.yaml | 6 + data/items/consumables/raw_pike.yaml | 6 + data/items/consumables/raw_rainbow_fish.yaml | 6 + data/items/consumables/raw_salmon.yaml | 6 + data/items/consumables/raw_sardine.yaml | 6 + data/items/consumables/raw_shark.yaml | 6 + data/items/consumables/raw_shrimps.yaml | 6 + data/items/consumables/raw_slimy_eel.yaml | 6 + data/items/consumables/raw_swordfish.yaml | 6 + data/items/consumables/raw_trout.yaml | 6 + data/items/consumables/raw_tuna.yaml | 6 + data/items/consumables/restoration_compound.yaml | 9 + data/items/consumables/salmon.yaml | 8 + data/items/consumables/sardine.yaml | 8 + data/items/consumables/science_serum.yaml | 9 + data/items/consumables/shield_potion.yaml | 9 + data/items/consumables/shrimps.yaml | 8 + data/items/consumables/snapdragon_potion_unf.yaml | 12 + data/items/consumables/stim_potion.yaml | 9 + data/items/consumables/strawberry.yaml | 8 + data/items/consumables/super_amp.yaml | 9 + data/items/consumables/super_bio_serum.yaml | 9 + data/items/consumables/super_shield.yaml | 9 + data/items/consumables/super_stim.yaml | 9 + data/items/consumables/super_stim_cell.yaml | 9 + data/items/consumables/sweetcorn.yaml | 8 + data/items/consumables/targeting_serum.yaml | 9 + data/items/consumables/tarromin_potion_unf.yaml | 12 + data/items/consumables/tech_serum.yaml | 9 + data/items/consumables/toadflax_potion_unf.yaml | 12 + data/items/consumables/tomato.yaml | 8 + data/items/consumables/torstol_potion_unf.yaml | 12 + data/items/consumables/trout.yaml | 8 + data/items/consumables/vial_of_water.yaml | 6 + data/items/consumables/watermelon.yaml | 8 + data/items/copper_ore.yaml | 6 - data/items/cosmic_identifier.yaml | 5 - data/items/cosmicjunk.yaml | 6 - data/items/cowhide.yaml | 6 - data/items/credit_stick.yaml | 9 - data/items/credits.yaml | 6 - data/items/crushed_nest.yaml | 6 - data/items/death_identifier.yaml | 5 - data/items/deathjunk.yaml | 6 - data/items/decks/advanced_bio_deck.yaml | 11 + data/items/decks/advanced_eco_deck.yaml | 11 + data/items/decks/advanced_hydro_deck.yaml | 11 + data/items/decks/advanced_solar_deck.yaml | 11 + data/items/decks/basic_deck.yaml | 10 + data/items/decks/bio_deck.yaml | 11 + data/items/decks/bio_identifier.yaml | 5 + data/items/decks/biojunk.yaml | 6 + data/items/decks/blood_identifier.yaml | 5 + data/items/decks/bloodjunk.yaml | 6 + data/items/decks/chaos_identifier.yaml | 5 + data/items/decks/chaosjunk.yaml | 6 + data/items/decks/cosmic_identifier.yaml | 5 + data/items/decks/cosmicjunk.yaml | 6 + data/items/decks/death_identifier.yaml | 5 + data/items/decks/deathjunk.yaml | 6 + data/items/decks/eco_deck.yaml | 11 + data/items/decks/eco_identifier.yaml | 5 + data/items/decks/ecojunk.yaml | 6 + data/items/decks/hydro_deck.yaml | 11 + data/items/decks/hydro_identifier.yaml | 5 + data/items/decks/hydrojunk.yaml | 6 + data/items/decks/law_identifier.yaml | 5 + data/items/decks/lawjunk.yaml | 6 + data/items/decks/nature_identifier.yaml | 5 + data/items/decks/naturejunk.yaml | 6 + data/items/decks/solar_deck.yaml | 11 + data/items/decks/solar_identifier.yaml | 5 + data/items/decks/solarjunk.yaml | 6 + data/items/diamond.yaml | 6 - data/items/diamond_amulet_u.yaml | 5 - data/items/diamond_bolt_tips.yaml | 6 - data/items/diamond_bolts.yaml | 9 - data/items/diamond_bolts_e.yaml | 9 - data/items/diamond_bracelet.yaml | 6 - data/items/diamond_necklace.yaml | 6 - data/items/diamond_ring.yaml | 6 - data/items/digsite_pendant.yaml | 6 - data/items/dragon_axe.yaml | 19 - data/items/dragon_pickaxe.yaml | 19 - data/items/dwarf_weed.yaml | 6 - data/items/dwarf_weed_potion_unf.yaml | 12 - data/items/dwarf_weed_seed.yaml | 14 - data/items/eco_deck.yaml | 11 - data/items/eco_identifier.yaml | 5 - data/items/ecojunk.yaml | 6 - data/items/ectoplasm.yaml | 6 - data/items/emerald.yaml | 6 - data/items/emerald_amulet_u.yaml | 5 - data/items/emerald_bolt_tips.yaml | 6 - data/items/emerald_bolts.yaml | 9 - data/items/emerald_bolts_e.yaml | 9 - data/items/emerald_bracelet.yaml | 6 - data/items/emerald_necklace.yaml | 6 - data/items/emerald_ring.yaml | 6 - data/items/empty_bucket.yaml | 6 - data/items/empty_jug.yaml | 6 - data/items/empty_pot.yaml | 6 - data/items/equipment/abyssal_bracelet.yaml | 6 + data/items/equipment/adamant_dagger.yaml | 17 + data/items/equipment/adamant_full_helm.yaml | 15 + data/items/equipment/adamant_med_helm.yaml | 15 + data/items/equipment/adamant_platebody.yaml | 15 + data/items/equipment/adamant_sword.yaml | 17 + data/items/equipment/binding_necklace.yaml | 6 + data/items/equipment/black_axe.yaml | 19 + data/items/equipment/bracelet_of_clay.yaml | 6 + data/items/equipment/bracelet_of_slaughter.yaml | 6 + data/items/equipment/bronze_dagger.yaml | 15 + data/items/equipment/bronze_full_helm.yaml | 13 + data/items/equipment/bronze_med_helm.yaml | 13 + data/items/equipment/bronze_platebody.yaml | 13 + data/items/equipment/bronze_sword.yaml | 15 + data/items/equipment/capacitor_gloves.yaml | 11 + data/items/equipment/cape_of_agility.yaml | 6 + data/items/equipment/chitin_plate.yaml | 6 + data/items/equipment/coif.yaml | 16 + data/items/equipment/diamond_amulet_u.yaml | 5 + data/items/equipment/diamond_bracelet.yaml | 6 + data/items/equipment/diamond_necklace.yaml | 6 + data/items/equipment/diamond_ring.yaml | 6 + data/items/equipment/digsite_pendant.yaml | 6 + data/items/equipment/dragon_axe.yaml | 19 + data/items/equipment/emerald_amulet_u.yaml | 5 + data/items/equipment/emerald_bracelet.yaml | 6 + data/items/equipment/emerald_necklace.yaml | 6 + data/items/equipment/emerald_ring.yaml | 6 + data/items/equipment/gold_amulet_u.yaml | 5 + data/items/equipment/gold_bracelet.yaml | 6 + data/items/equipment/gold_necklace.yaml | 6 + data/items/equipment/gold_ring.yaml | 6 + data/items/equipment/graceful_boots.yaml | 6 + data/items/equipment/graceful_cape.yaml | 6 + data/items/equipment/graceful_gloves.yaml | 6 + data/items/equipment/graceful_hat.yaml | 6 + data/items/equipment/graceful_legs.yaml | 6 + data/items/equipment/graceful_torso.yaml | 6 + data/items/equipment/hard_leather_body.yaml | 14 + data/items/equipment/hard_leather_shield.yaml | 14 + data/items/equipment/inoculation_bracelet.yaml | 6 + data/items/equipment/insulated_gloves.yaml | 9 + data/items/equipment/iron_dagger.yaml | 15 + data/items/equipment/iron_full_helm.yaml | 13 + data/items/equipment/iron_med_helm.yaml | 13 + data/items/equipment/iron_platebody.yaml | 13 + data/items/equipment/iron_sword.yaml | 15 + data/items/equipment/leather_body.yaml | 12 + data/items/equipment/leather_boots.yaml | 12 + data/items/equipment/leather_chaps.yaml | 12 + data/items/equipment/leather_cowl.yaml | 12 + data/items/equipment/leather_gloves.yaml | 12 + data/items/equipment/leather_vambraces.yaml | 13 + data/items/equipment/longbow.yaml | 11 + data/items/equipment/longbow_u.yaml | 5 + data/items/equipment/magic_longbow.yaml | 13 + data/items/equipment/magic_longbow_u.yaml | 5 + data/items/equipment/magic_shortbow.yaml | 13 + data/items/equipment/magic_shortbow_u.yaml | 5 + data/items/equipment/maple_longbow.yaml | 13 + data/items/equipment/maple_longbow_u.yaml | 5 + data/items/equipment/maple_shortbow.yaml | 13 + data/items/equipment/maple_shortbow_u.yaml | 5 + data/items/equipment/mithril_dagger.yaml | 17 + data/items/equipment/mithril_full_helm.yaml | 15 + data/items/equipment/mithril_med_helm.yaml | 15 + data/items/equipment/mithril_platebody.yaml | 15 + data/items/equipment/mithril_sword.yaml | 17 + data/items/equipment/necklace_of_passage.yaml | 6 + data/items/equipment/neural_headband.yaml | 11 + data/items/equipment/oak_longbow.yaml | 13 + data/items/equipment/oak_longbow_u.yaml | 5 + data/items/equipment/oak_shortbow.yaml | 13 + data/items/equipment/oak_shortbow_u.yaml | 5 + data/items/equipment/party_hat_blue.yaml | 7 + data/items/equipment/party_hat_green.yaml | 7 + data/items/equipment/party_hat_pink.yaml | 7 + data/items/equipment/party_hat_red.yaml | 7 + data/items/equipment/party_hat_white.yaml | 7 + data/items/equipment/party_hat_yellow.yaml | 7 + data/items/equipment/phoenix_necklace.yaml | 6 + data/items/equipment/power_amulet.yaml | 8 + data/items/equipment/ring_of_dueling.yaml | 6 + data/items/equipment/ring_of_forging.yaml | 6 + data/items/equipment/ring_of_life.yaml | 6 + data/items/equipment/ring_of_recoil.yaml | 6 + data/items/equipment/ruby_amulet_u.yaml | 5 + data/items/equipment/ruby_bracelet.yaml | 6 + data/items/equipment/ruby_necklace.yaml | 6 + data/items/equipment/ruby_ring.yaml | 6 + data/items/equipment/rune_dagger.yaml | 17 + data/items/equipment/rune_full_helm.yaml | 15 + data/items/equipment/rune_med_helm.yaml | 15 + data/items/equipment/rune_platebody.yaml | 15 + data/items/equipment/rune_sword.yaml | 17 + data/items/equipment/sapphire_amulet_u.yaml | 5 + data/items/equipment/sapphire_bracelet.yaml | 6 + data/items/equipment/sapphire_necklace.yaml | 6 + data/items/equipment/sapphire_ring.yaml | 6 + data/items/equipment/shortbow.yaml | 11 + data/items/equipment/shortbow_u.yaml | 5 + data/items/equipment/spectral_visor.yaml | 9 + data/items/equipment/steel_dagger.yaml | 17 + data/items/equipment/steel_full_helm.yaml | 15 + data/items/equipment/steel_med_helm.yaml | 15 + data/items/equipment/steel_platebody.yaml | 15 + data/items/equipment/steel_sword.yaml | 17 + data/items/equipment/willow_longbow.yaml | 13 + data/items/equipment/willow_longbow_u.yaml | 5 + data/items/equipment/willow_shortbow.yaml | 13 + data/items/equipment/willow_shortbow_u.yaml | 5 + data/items/equipment/yew_longbow.yaml | 13 + data/items/equipment/yew_longbow_u.yaml | 5 + data/items/equipment/yew_shortbow.yaml | 13 + data/items/equipment/yew_shortbow_u.yaml | 5 + data/items/eye_of_newt.yaml | 6 - data/items/feather.yaml | 6 - data/items/firesteel.yaml | 8 - data/items/fishing_bait.yaml | 6 - data/items/fishing_rod.yaml | 15 - data/items/flax.yaml | 6 - data/items/fly_fishing_rod.yaml | 15 - data/items/full_restore.yaml | 9 - data/items/gold_amulet_u.yaml | 5 - data/items/gold_bar.yaml | 6 - data/items/gold_bracelet.yaml | 6 - data/items/gold_necklace.yaml | 6 - data/items/gold_ore.yaml | 6 - data/items/gold_ring.yaml | 6 - data/items/graceful_boots.yaml | 6 - data/items/graceful_cape.yaml | 6 - data/items/graceful_gloves.yaml | 6 - data/items/graceful_hat.yaml | 6 - data/items/graceful_legs.yaml | 6 - data/items/graceful_torso.yaml | 6 - data/items/grimy_avantoe.yaml | 6 - data/items/grimy_cadantine.yaml | 6 - data/items/grimy_dwarf_weed.yaml | 6 - data/items/grimy_guam.yaml | 6 - data/items/grimy_harralander.yaml | 6 - data/items/grimy_irit.yaml | 6 - data/items/grimy_kwuarm.yaml | 6 - data/items/grimy_lantadyme.yaml | 6 - data/items/grimy_marrentill.yaml | 6 - data/items/grimy_ranarr.yaml | 6 - data/items/grimy_snapdragon.yaml | 6 - data/items/grimy_tarromin.yaml | 6 - data/items/grimy_toadflax.yaml | 6 - data/items/grimy_torstol.yaml | 6 - data/items/guam.yaml | 6 - data/items/guam_potion_unf.yaml | 12 - data/items/guam_seed.yaml | 14 - data/items/hammer.yaml | 7 - data/items/hard_leather.yaml | 6 - data/items/hard_leather_body.yaml | 14 - data/items/hard_leather_shield.yaml | 14 - data/items/harpoon.yaml | 15 - data/items/harralander.yaml | 6 - data/items/harralander_potion_unf.yaml | 12 - data/items/harralander_seed.yaml | 14 - data/items/headless_arrow.yaml | 6 - data/items/herring.yaml | 8 - data/items/hydro_deck.yaml | 11 - data/items/hydro_identifier.yaml | 5 - data/items/hydrojunk.yaml | 6 - data/items/inoculation_bracelet.yaml | 6 - data/items/insulated_gloves.yaml | 9 - data/items/irit.yaml | 6 - data/items/irit_potion_unf.yaml | 12 - data/items/irit_seed.yaml | 14 - data/items/iron_arrow.yaml | 9 - data/items/iron_arrowtips.yaml | 6 - data/items/iron_axe.yaml | 17 - data/items/iron_bar.yaml | 6 - data/items/iron_bolts.yaml | 9 - data/items/iron_bolts_unf.yaml | 6 - data/items/iron_dagger.yaml | 15 - data/items/iron_full_helm.yaml | 13 - data/items/iron_med_helm.yaml | 13 - data/items/iron_nails.yaml | 6 - data/items/iron_ore.yaml | 6 - data/items/iron_pickaxe.yaml | 17 - data/items/iron_platebody.yaml | 13 - data/items/iron_sword.yaml | 15 - data/items/jug_of_water.yaml | 6 - data/items/knife.yaml | 6 - data/items/kwuarm.yaml | 6 - data/items/kwuarm_potion_unf.yaml | 12 - data/items/kwuarm_seed.yaml | 14 - data/items/lantadyme.yaml | 6 - data/items/lantadyme_potion_unf.yaml | 12 - data/items/lantadyme_seed.yaml | 14 - data/items/law_identifier.yaml | 5 - data/items/lawjunk.yaml | 6 - data/items/leather.yaml | 6 - data/items/leather_body.yaml | 12 - data/items/leather_boots.yaml | 12 - data/items/leather_chaps.yaml | 12 - data/items/leather_cowl.yaml | 12 - data/items/leather_gloves.yaml | 12 - data/items/leather_vambraces.yaml | 13 - data/items/lighter.yaml | 11 - data/items/limpwurt_root.yaml | 6 - data/items/lobster_pot.yaml | 15 - data/items/logs.yaml | 9 - data/items/longbow.yaml | 11 - data/items/longbow_u.yaml | 5 - data/items/magic_logs.yaml | 9 - data/items/magic_longbow.yaml | 13 - data/items/magic_longbow_u.yaml | 5 - data/items/magic_shortbow.yaml | 13 - data/items/magic_shortbow_u.yaml | 5 - data/items/mahogany_logs.yaml | 9 - data/items/mahogany_planks.yaml | 6 - data/items/mahogany_table.yaml | 6 - data/items/maple_logs.yaml | 9 - data/items/maple_longbow.yaml | 13 - data/items/maple_longbow_u.yaml | 5 - data/items/maple_shortbow.yaml | 13 - data/items/maple_shortbow_u.yaml | 5 - data/items/marrentill.yaml | 6 - data/items/marrentill_potion_unf.yaml | 12 - data/items/marrentill_seed.yaml | 14 - data/items/matches.yaml | 9 - data/items/materials/adamant_nails.yaml | 6 + data/items/materials/adamantite_bar.yaml | 6 + data/items/materials/adamantite_ore.yaml | 6 + data/items/materials/arachnid_enzyme.yaml | 6 + data/items/materials/ashes.yaml | 6 + data/items/materials/avantoe.yaml | 6 + data/items/materials/ball_of_wool.yaml | 6 + data/items/materials/bones.yaml | 6 + data/items/materials/bowstring.yaml | 5 + data/items/materials/bronze_bar.yaml | 6 + data/items/materials/bronze_nails.yaml | 6 + data/items/materials/cadantine.yaml | 6 + data/items/materials/chocolate_dust.yaml | 6 + data/items/materials/clay.yaml | 6 + data/items/materials/coal.yaml | 6 + data/items/materials/copper_ore.yaml | 6 + data/items/materials/cowhide.yaml | 6 + data/items/materials/crushed_nest.yaml | 6 + data/items/materials/diamond.yaml | 6 + data/items/materials/dwarf_weed.yaml | 6 + data/items/materials/ectoplasm.yaml | 6 + data/items/materials/emerald.yaml | 6 + data/items/materials/eye_of_newt.yaml | 6 + data/items/materials/feather.yaml | 6 + data/items/materials/flax.yaml | 6 + data/items/materials/gold_bar.yaml | 6 + data/items/materials/gold_ore.yaml | 6 + data/items/materials/grimy_avantoe.yaml | 6 + data/items/materials/grimy_cadantine.yaml | 6 + data/items/materials/grimy_dwarf_weed.yaml | 6 + data/items/materials/grimy_guam.yaml | 6 + data/items/materials/grimy_harralander.yaml | 6 + data/items/materials/grimy_irit.yaml | 6 + data/items/materials/grimy_kwuarm.yaml | 6 + data/items/materials/grimy_lantadyme.yaml | 6 + data/items/materials/grimy_marrentill.yaml | 6 + data/items/materials/grimy_ranarr.yaml | 6 + data/items/materials/grimy_snapdragon.yaml | 6 + data/items/materials/grimy_tarromin.yaml | 6 + data/items/materials/grimy_toadflax.yaml | 6 + data/items/materials/grimy_torstol.yaml | 6 + data/items/materials/guam.yaml | 6 + data/items/materials/hard_leather.yaml | 6 + data/items/materials/harralander.yaml | 6 + data/items/materials/irit.yaml | 6 + data/items/materials/iron_bar.yaml | 6 + data/items/materials/iron_nails.yaml | 6 + data/items/materials/iron_ore.yaml | 6 + data/items/materials/kwuarm.yaml | 6 + data/items/materials/lantadyme.yaml | 6 + data/items/materials/leather.yaml | 6 + data/items/materials/limpwurt_root.yaml | 6 + data/items/materials/logs.yaml | 9 + data/items/materials/magic_logs.yaml | 9 + data/items/materials/mahogany_logs.yaml | 9 + data/items/materials/mahogany_planks.yaml | 6 + data/items/materials/maple_logs.yaml | 9 + data/items/materials/marrentill.yaml | 6 + data/items/materials/mithril_bar.yaml | 6 + data/items/materials/mithril_nails.yaml | 6 + data/items/materials/mithril_ore.yaml | 6 + data/items/materials/oak_logs.yaml | 9 + data/items/materials/oak_planks.yaml | 6 + data/items/materials/planks.yaml | 6 + data/items/materials/potato_cactus.yaml | 6 + data/items/materials/ranarr.yaml | 6 + data/items/materials/redwood_logs.yaml | 9 + data/items/materials/ruby.yaml | 6 + data/items/materials/rune_nails.yaml | 6 + data/items/materials/runite_bar.yaml | 6 + data/items/materials/runite_ore.yaml | 6 + data/items/materials/sacred_eel.yaml | 6 + data/items/materials/salt.yaml | 6 + data/items/materials/sapphire.yaml | 6 + data/items/materials/silver_bar.yaml | 6 + data/items/materials/silver_ore.yaml | 6 + data/items/materials/slug_mucus.yaml | 6 + data/items/materials/snapdragon.yaml | 6 + data/items/materials/snape_grass.yaml | 6 + data/items/materials/soft_clay.yaml | 13 + data/items/materials/steel_bar.yaml | 6 + data/items/materials/steel_nails.yaml | 6 + data/items/materials/stim_cell.yaml | 9 + data/items/materials/tarromin.yaml | 6 + data/items/materials/teak_logs.yaml | 9 + data/items/materials/teak_planks.yaml | 6 + data/items/materials/thread.yaml | 6 + data/items/materials/tin_ore.yaml | 6 + data/items/materials/toadflax.yaml | 6 + data/items/materials/torstol.yaml | 6 + data/items/materials/uncut_diamond.yaml | 6 + data/items/materials/uncut_emerald.yaml | 6 + data/items/materials/uncut_ruby.yaml | 6 + data/items/materials/uncut_sapphire.yaml | 6 + data/items/materials/vial.yaml | 6 + data/items/materials/white_berries.yaml | 6 + data/items/materials/willow_logs.yaml | 9 + data/items/materials/wool.yaml | 6 + data/items/materials/yew_logs.yaml | 9 + data/items/misc/birds_nest.yaml | 9 + data/items/misc/christmas_cracker.yaml | 10 + data/items/misc/circuit_board.yaml | 6 + data/items/misc/credit_stick.yaml | 9 + data/items/misc/credits.yaml | 6 + data/items/misc/mahogany_table.yaml | 6 + data/items/misc/nutrient_bar.yaml | 8 + data/items/misc/oak_shelf.yaml | 6 + data/items/misc/oak_table.yaml | 6 + data/items/misc/pass_stub.yaml | 6 + data/items/misc/scrap_metal.yaml | 6 + data/items/misc/teak_table.yaml | 6 + data/items/misc/wooden_chair.yaml | 6 + data/items/misc/wooden_shelf.yaml | 6 + data/items/misc/wooden_table.yaml | 6 + data/items/mithril_arrow.yaml | 9 - data/items/mithril_arrowtips.yaml | 6 - data/items/mithril_axe.yaml | 19 - data/items/mithril_bar.yaml | 6 - data/items/mithril_bolts.yaml | 9 - data/items/mithril_bolts_unf.yaml | 6 - data/items/mithril_dagger.yaml | 17 - data/items/mithril_full_helm.yaml | 15 - data/items/mithril_med_helm.yaml | 15 - data/items/mithril_nails.yaml | 6 - data/items/mithril_ore.yaml | 6 - data/items/mithril_pickaxe.yaml | 19 - data/items/mithril_platebody.yaml | 15 - data/items/mithril_sword.yaml | 17 - data/items/nano_restore.yaml | 9 - data/items/nature_identifier.yaml | 5 - data/items/naturejunk.yaml | 6 - data/items/necklace_mould.yaml | 5 - data/items/necklace_of_passage.yaml | 6 - data/items/needle.yaml | 6 - data/items/neural_headband.yaml | 11 - data/items/nutrient_bar.yaml | 8 - data/items/oak_logs.yaml | 9 - data/items/oak_longbow.yaml | 13 - data/items/oak_longbow_u.yaml | 5 - data/items/oak_planks.yaml | 6 - data/items/oak_shelf.yaml | 6 - data/items/oak_shortbow.yaml | 13 - data/items/oak_shortbow_u.yaml | 5 - data/items/oak_table.yaml | 6 - data/items/onion.yaml | 8 - data/items/onion_seed.yaml | 14 - data/items/party_hat_blue.yaml | 7 - data/items/party_hat_green.yaml | 7 - data/items/party_hat_pink.yaml | 7 - data/items/party_hat_red.yaml | 7 - data/items/party_hat_white.yaml | 7 - data/items/party_hat_yellow.yaml | 7 - data/items/pass_stub.yaml | 6 - data/items/pastry_dough.yaml | 11 - data/items/phoenix_necklace.yaml | 6 - data/items/pie_dish.yaml | 5 - data/items/pizza_dough.yaml | 11 - data/items/planks.yaml | 6 - data/items/plant_cure.yaml | 6 - data/items/plant_pot.yaml | 5 - data/items/pot_of_flour.yaml | 6 - data/items/potato.yaml | 8 - data/items/potato_cactus.yaml | 6 - data/items/potato_seed.yaml | 14 - data/items/power_amulet.yaml | 8 - data/items/rake.yaml | 7 - data/items/ranarr.yaml | 6 - data/items/ranarr_potion_unf.yaml | 12 - data/items/ranarr_seed.yaml | 14 - data/items/raw_anchovies.yaml | 6 - data/items/raw_anglerfish.yaml | 6 - data/items/raw_bass.yaml | 6 - data/items/raw_beef.yaml | 6 - data/items/raw_cave_eel.yaml | 6 - data/items/raw_cod.yaml | 6 - data/items/raw_herring.yaml | 6 - data/items/raw_lobster.yaml | 6 - data/items/raw_mackerel.yaml | 6 - data/items/raw_pike.yaml | 6 - data/items/raw_rainbow_fish.yaml | 6 - data/items/raw_salmon.yaml | 6 - data/items/raw_sardine.yaml | 6 - data/items/raw_shark.yaml | 6 - data/items/raw_shrimps.yaml | 6 - data/items/raw_slimy_eel.yaml | 6 - data/items/raw_swordfish.yaml | 6 - data/items/raw_trout.yaml | 6 - data/items/raw_tuna.yaml | 6 - data/items/redwood_logs.yaml | 9 - data/items/restoration_compound.yaml | 9 - data/items/ring_mould.yaml | 5 - data/items/ring_of_dueling.yaml | 6 - data/items/ring_of_forging.yaml | 6 - data/items/ring_of_life.yaml | 6 - data/items/ring_of_recoil.yaml | 6 - data/items/ruby.yaml | 6 - data/items/ruby_amulet_u.yaml | 5 - data/items/ruby_bolt_tips.yaml | 6 - data/items/ruby_bolts.yaml | 9 - data/items/ruby_bolts_e.yaml | 9 - data/items/ruby_bracelet.yaml | 6 - data/items/ruby_necklace.yaml | 6 - data/items/ruby_ring.yaml | 6 - data/items/rune_arrow.yaml | 9 - data/items/rune_arrowtips.yaml | 6 - data/items/rune_axe.yaml | 19 - data/items/rune_bolts.yaml | 9 - data/items/rune_bolts_unf.yaml | 6 - data/items/rune_dagger.yaml | 17 - data/items/rune_full_helm.yaml | 15 - data/items/rune_med_helm.yaml | 15 - data/items/rune_nails.yaml | 6 - data/items/rune_pickaxe.yaml | 19 - data/items/rune_platebody.yaml | 15 - data/items/rune_sword.yaml | 17 - data/items/runite_bar.yaml | 6 - data/items/runite_ore.yaml | 6 - data/items/sacred_eel.yaml | 6 - data/items/salmon.yaml | 8 - data/items/salt.yaml | 6 - data/items/sapphire.yaml | 6 - data/items/sapphire_amulet_u.yaml | 5 - data/items/sapphire_bolt_tips.yaml | 6 - data/items/sapphire_bolts.yaml | 9 - data/items/sapphire_bolts_e.yaml | 9 - data/items/sapphire_bracelet.yaml | 6 - data/items/sapphire_necklace.yaml | 6 - data/items/sapphire_ring.yaml | 6 - data/items/sardine.yaml | 8 - data/items/saw.yaml | 7 - data/items/science_serum.yaml | 9 - data/items/scrap_metal.yaml | 6 - data/items/seeds/avantoe_seed.yaml | 14 + data/items/seeds/cabbage_seed.yaml | 14 + data/items/seeds/cadantine_seed.yaml | 14 + data/items/seeds/dwarf_weed_seed.yaml | 14 + data/items/seeds/guam_seed.yaml | 14 + data/items/seeds/harralander_seed.yaml | 14 + data/items/seeds/irit_seed.yaml | 14 + data/items/seeds/kwuarm_seed.yaml | 14 + data/items/seeds/lantadyme_seed.yaml | 14 + data/items/seeds/marrentill_seed.yaml | 14 + data/items/seeds/onion_seed.yaml | 14 + data/items/seeds/potato_seed.yaml | 14 + data/items/seeds/ranarr_seed.yaml | 14 + data/items/seeds/snapdragon_seed.yaml | 14 + data/items/seeds/strawberry_seed.yaml | 14 + data/items/seeds/sweetcorn_seed.yaml | 14 + data/items/seeds/tarromin_seed.yaml | 14 + data/items/seeds/toadflax_seed.yaml | 14 + data/items/seeds/tomato_seed.yaml | 14 + data/items/seeds/torstol_seed.yaml | 14 + data/items/seeds/watermelon_seed.yaml | 14 + data/items/shears.yaml | 6 - data/items/shield_potion.yaml | 9 - data/items/shortbow.yaml | 11 - data/items/shortbow_u.yaml | 5 - data/items/shrimps.yaml | 8 - data/items/silver_bar.yaml | 6 - data/items/silver_ore.yaml | 6 - data/items/slug_mucus.yaml | 6 - data/items/small_fishing_net.yaml | 15 - data/items/snapdragon.yaml | 6 - data/items/snapdragon_potion_unf.yaml | 12 - data/items/snapdragon_seed.yaml | 14 - data/items/snape_grass.yaml | 6 - data/items/soft_clay.yaml | 13 - data/items/solar_deck.yaml | 11 - data/items/solar_identifier.yaml | 5 - data/items/solarjunk.yaml | 6 - data/items/spade.yaml | 7 - data/items/spectral_visor.yaml | 9 - data/items/steel_arrow.yaml | 9 - data/items/steel_arrowtips.yaml | 6 - data/items/steel_axe.yaml | 19 - data/items/steel_bar.yaml | 6 - data/items/steel_bolts.yaml | 9 - data/items/steel_bolts_unf.yaml | 6 - data/items/steel_dagger.yaml | 17 - data/items/steel_full_helm.yaml | 15 - data/items/steel_med_helm.yaml | 15 - data/items/steel_nails.yaml | 6 - data/items/steel_pickaxe.yaml | 19 - data/items/steel_platebody.yaml | 15 - data/items/steel_sword.yaml | 17 - data/items/stim_cell.yaml | 9 - data/items/stim_potion.yaml | 9 - data/items/strawberry.yaml | 8 - data/items/strawberry_seed.yaml | 14 - data/items/super_amp.yaml | 9 - data/items/super_bio_serum.yaml | 9 - data/items/super_shield.yaml | 9 - data/items/super_stim.yaml | 9 - data/items/super_stim_cell.yaml | 9 - data/items/sweetcorn.yaml | 8 - data/items/sweetcorn_seed.yaml | 14 - data/items/targeting_serum.yaml | 9 - data/items/tarromin.yaml | 6 - data/items/tarromin_potion_unf.yaml | 12 - data/items/tarromin_seed.yaml | 14 - data/items/teak_logs.yaml | 9 - data/items/teak_planks.yaml | 6 - data/items/teak_table.yaml | 6 - data/items/tech_serum.yaml | 9 - data/items/thread.yaml | 6 - data/items/tin_ore.yaml | 6 - data/items/toadflax.yaml | 6 - data/items/toadflax_potion_unf.yaml | 12 - data/items/toadflax_seed.yaml | 14 - data/items/tomato.yaml | 8 - data/items/tomato_seed.yaml | 14 - data/items/tools/adamant_axe.yaml | 19 + data/items/tools/adamant_pickaxe.yaml | 19 + data/items/tools/amulet_mould.yaml | 5 + data/items/tools/big_fishing_net.yaml | 15 + data/items/tools/black_pickaxe.yaml | 19 + data/items/tools/bracelet_mould.yaml | 5 + data/items/tools/bronze_axe.yaml | 17 + data/items/tools/bronze_pickaxe.yaml | 17 + data/items/tools/chisel.yaml | 6 + data/items/tools/dragon_pickaxe.yaml | 19 + data/items/tools/empty_bucket.yaml | 6 + data/items/tools/empty_jug.yaml | 6 + data/items/tools/empty_pot.yaml | 6 + data/items/tools/firesteel.yaml | 8 + data/items/tools/fishing_bait.yaml | 6 + data/items/tools/fishing_rod.yaml | 15 + data/items/tools/fly_fishing_rod.yaml | 15 + data/items/tools/hammer.yaml | 7 + data/items/tools/harpoon.yaml | 15 + data/items/tools/iron_axe.yaml | 17 + data/items/tools/iron_pickaxe.yaml | 17 + data/items/tools/knife.yaml | 6 + data/items/tools/lighter.yaml | 11 + data/items/tools/lobster_pot.yaml | 15 + data/items/tools/matches.yaml | 9 + data/items/tools/mithril_axe.yaml | 19 + data/items/tools/mithril_pickaxe.yaml | 19 + data/items/tools/necklace_mould.yaml | 5 + data/items/tools/needle.yaml | 6 + data/items/tools/plant_pot.yaml | 5 + data/items/tools/rake.yaml | 7 + data/items/tools/ring_mould.yaml | 5 + data/items/tools/rune_axe.yaml | 19 + data/items/tools/rune_pickaxe.yaml | 19 + data/items/tools/saw.yaml | 7 + data/items/tools/shears.yaml | 6 + data/items/tools/small_fishing_net.yaml | 15 + data/items/tools/spade.yaml | 7 + data/items/tools/steel_axe.yaml | 19 + data/items/tools/steel_pickaxe.yaml | 19 + data/items/tools/unfired_pie_dish.yaml | 5 + data/items/tools/unfired_plant_pot.yaml | 5 + data/items/tools/unfired_pot.yaml | 5 + data/items/tools/watering_can.yaml | 7 + data/items/torstol.yaml | 6 - data/items/torstol_potion_unf.yaml | 12 - data/items/torstol_seed.yaml | 14 - data/items/trout.yaml | 8 - data/items/uncut_diamond.yaml | 6 - data/items/uncut_emerald.yaml | 6 - data/items/uncut_ruby.yaml | 6 - data/items/uncut_sapphire.yaml | 6 - data/items/unfired_pie_dish.yaml | 5 - data/items/unfired_plant_pot.yaml | 5 - data/items/unfired_pot.yaml | 5 - data/items/vial.yaml | 6 - data/items/vial_of_water.yaml | 6 - data/items/watering_can.yaml | 7 - data/items/watermelon.yaml | 8 - data/items/watermelon_seed.yaml | 14 - data/items/white_berries.yaml | 6 - data/items/willow_logs.yaml | 9 - data/items/willow_longbow.yaml | 13 - data/items/willow_longbow_u.yaml | 5 - data/items/willow_shortbow.yaml | 13 - data/items/willow_shortbow_u.yaml | 5 - data/items/wooden_chair.yaml | 6 - data/items/wooden_shelf.yaml | 6 - data/items/wooden_table.yaml | 6 - data/items/wool.yaml | 6 - data/items/yew_logs.yaml | 9 - data/items/yew_longbow.yaml | 13 - data/items/yew_longbow_u.yaml | 5 - data/items/yew_shortbow.yaml | 13 - data/items/yew_shortbow_u.yaml | 5 - data/mobs/estate_broker.yaml | 8 +- data/objects/anvil.yaml | 4 +- data/recipes/clean/clean_avantoe.yaml | 11 + data/recipes/clean/clean_cadantine.yaml | 11 + data/recipes/clean/clean_dwarf_weed.yaml | 11 + data/recipes/clean/clean_guam.yaml | 11 + data/recipes/clean/clean_harralander.yaml | 11 + data/recipes/clean/clean_irit.yaml | 11 + data/recipes/clean/clean_kwuarm.yaml | 11 + data/recipes/clean/clean_lantadyme.yaml | 11 + data/recipes/clean/clean_marrentill.yaml | 11 + data/recipes/clean/clean_ranarr.yaml | 11 + data/recipes/clean/clean_snapdragon.yaml | 11 + data/recipes/clean/clean_tarromin.yaml | 11 + data/recipes/clean/clean_toadflax.yaml | 11 + data/recipes/clean/clean_torstol.yaml | 11 + data/recipes/clean_avantoe.yaml | 11 - data/recipes/clean_cadantine.yaml | 11 - data/recipes/clean_dwarf_weed.yaml | 11 - data/recipes/clean_guam.yaml | 11 - data/recipes/clean_harralander.yaml | 11 - data/recipes/clean_irit.yaml | 11 - data/recipes/clean_kwuarm.yaml | 11 - data/recipes/clean_lantadyme.yaml | 11 - data/recipes/clean_marrentill.yaml | 11 - data/recipes/clean_ranarr.yaml | 11 - data/recipes/clean_snapdragon.yaml | 11 - data/recipes/clean_tarromin.yaml | 11 - data/recipes/clean_toadflax.yaml | 11 - data/recipes/clean_torstol.yaml | 11 - data/recipes/construct_mahogany_planks.yaml | 12 - data/recipes/construct_mahogany_table.yaml | 11 - data/recipes/construct_oak_planks.yaml | 12 - data/recipes/construct_oak_shelf.yaml | 11 - data/recipes/construct_oak_table.yaml | 11 - data/recipes/construct_planks.yaml | 12 - data/recipes/construct_teak_planks.yaml | 12 - data/recipes/construct_teak_table.yaml | 11 - data/recipes/construct_wooden_chair.yaml | 11 - data/recipes/construct_wooden_shelf.yaml | 11 - data/recipes/construct_wooden_table.yaml | 11 - .../construction/construct_mahogany_planks.yaml | 12 + .../construction/construct_mahogany_table.yaml | 11 + .../recipes/construction/construct_oak_planks.yaml | 12 + data/recipes/construction/construct_oak_shelf.yaml | 11 + data/recipes/construction/construct_oak_table.yaml | 11 + data/recipes/construction/construct_planks.yaml | 12 + .../construction/construct_teak_planks.yaml | 12 + .../recipes/construction/construct_teak_table.yaml | 11 + .../construction/construct_wooden_chair.yaml | 11 + .../construction/construct_wooden_shelf.yaml | 11 + .../construction/construct_wooden_table.yaml | 11 + data/recipes/cook_anchovies.yaml | 13 - data/recipes/cook_bread.yaml | 13 - data/recipes/cook_herring.yaml | 13 - data/recipes/cook_salmon.yaml | 13 - data/recipes/cook_sardine.yaml | 13 - data/recipes/cook_shrimps.yaml | 13 - data/recipes/cook_trout.yaml | 13 - data/recipes/cooking/cook_anchovies.yaml | 13 + data/recipes/cooking/cook_bread.yaml | 13 + data/recipes/cooking/cook_herring.yaml | 13 + data/recipes/cooking/cook_salmon.yaml | 13 + data/recipes/cooking/cook_sardine.yaml | 13 + data/recipes/cooking/cook_shrimps.yaml | 13 + data/recipes/cooking/cook_trout.yaml | 13 + data/recipes/craft_ball_of_wool.yaml | 11 - data/recipes/craft_bowstring.yaml | 11 - data/recipes/craft_coif.yaml | 13 - data/recipes/craft_cut_diamond.yaml | 11 - data/recipes/craft_cut_emerald.yaml | 11 - data/recipes/craft_cut_ruby.yaml | 11 - data/recipes/craft_cut_sapphire.yaml | 11 - data/recipes/craft_diamond_amulet_u.yaml | 16 - data/recipes/craft_diamond_bracelet.yaml | 16 - data/recipes/craft_diamond_necklace.yaml | 16 - data/recipes/craft_diamond_ring.yaml | 16 - data/recipes/craft_emerald_amulet_u.yaml | 16 - data/recipes/craft_emerald_bracelet.yaml | 16 - data/recipes/craft_emerald_necklace.yaml | 16 - data/recipes/craft_emerald_ring.yaml | 16 - data/recipes/craft_gold_amulet_u.yaml | 14 - data/recipes/craft_gold_bracelet.yaml | 14 - data/recipes/craft_gold_necklace.yaml | 14 - data/recipes/craft_gold_ring.yaml | 14 - data/recipes/craft_hard_leather_body.yaml | 13 - data/recipes/craft_hard_leather_shield.yaml | 13 - data/recipes/craft_leather_body.yaml | 13 - data/recipes/craft_leather_boots.yaml | 13 - data/recipes/craft_leather_chaps.yaml | 13 - data/recipes/craft_leather_cowl.yaml | 13 - data/recipes/craft_leather_gloves.yaml | 13 - data/recipes/craft_leather_vambraces.yaml | 13 - data/recipes/craft_pie_dish.yaml | 16 - data/recipes/craft_plant_pot.yaml | 16 - data/recipes/craft_pot.yaml | 16 - data/recipes/craft_ruby_amulet_u.yaml | 16 - data/recipes/craft_ruby_bracelet.yaml | 16 - data/recipes/craft_ruby_necklace.yaml | 16 - data/recipes/craft_ruby_ring.yaml | 16 - data/recipes/craft_sapphire_amulet_u.yaml | 16 - data/recipes/craft_sapphire_bracelet.yaml | 16 - data/recipes/craft_sapphire_necklace.yaml | 16 - data/recipes/craft_sapphire_ring.yaml | 16 - data/recipes/craft_unfired_pie_dish.yaml | 11 - data/recipes/craft_unfired_plant_pot.yaml | 11 - data/recipes/craft_unfired_pot.yaml | 11 - data/recipes/crafting/craft_ball_of_wool.yaml | 11 + data/recipes/crafting/craft_bowstring.yaml | 11 + data/recipes/crafting/craft_coif.yaml | 13 + data/recipes/crafting/craft_cut_diamond.yaml | 11 + data/recipes/crafting/craft_cut_emerald.yaml | 11 + data/recipes/crafting/craft_cut_ruby.yaml | 11 + data/recipes/crafting/craft_cut_sapphire.yaml | 11 + data/recipes/crafting/craft_diamond_amulet_u.yaml | 16 + data/recipes/crafting/craft_diamond_bracelet.yaml | 16 + data/recipes/crafting/craft_diamond_necklace.yaml | 16 + data/recipes/crafting/craft_diamond_ring.yaml | 16 + data/recipes/crafting/craft_emerald_amulet_u.yaml | 16 + data/recipes/crafting/craft_emerald_bracelet.yaml | 16 + data/recipes/crafting/craft_emerald_necklace.yaml | 16 + data/recipes/crafting/craft_emerald_ring.yaml | 16 + data/recipes/crafting/craft_gold_amulet_u.yaml | 14 + data/recipes/crafting/craft_gold_bracelet.yaml | 14 + data/recipes/crafting/craft_gold_necklace.yaml | 14 + data/recipes/crafting/craft_gold_ring.yaml | 14 + data/recipes/crafting/craft_hard_leather_body.yaml | 13 + .../crafting/craft_hard_leather_shield.yaml | 13 + data/recipes/crafting/craft_leather_body.yaml | 13 + data/recipes/crafting/craft_leather_boots.yaml | 13 + data/recipes/crafting/craft_leather_chaps.yaml | 13 + data/recipes/crafting/craft_leather_cowl.yaml | 13 + data/recipes/crafting/craft_leather_gloves.yaml | 13 + data/recipes/crafting/craft_leather_vambraces.yaml | 13 + data/recipes/crafting/craft_pie_dish.yaml | 16 + data/recipes/crafting/craft_plant_pot.yaml | 16 + data/recipes/crafting/craft_pot.yaml | 16 + data/recipes/crafting/craft_ruby_amulet_u.yaml | 16 + data/recipes/crafting/craft_ruby_bracelet.yaml | 16 + data/recipes/crafting/craft_ruby_necklace.yaml | 16 + data/recipes/crafting/craft_ruby_ring.yaml | 16 + data/recipes/crafting/craft_sapphire_amulet_u.yaml | 16 + data/recipes/crafting/craft_sapphire_bracelet.yaml | 16 + data/recipes/crafting/craft_sapphire_necklace.yaml | 16 + data/recipes/crafting/craft_sapphire_ring.yaml | 16 + data/recipes/crafting/craft_unfired_pie_dish.yaml | 11 + data/recipes/crafting/craft_unfired_plant_pot.yaml | 11 + data/recipes/crafting/craft_unfired_pot.yaml | 11 + data/recipes/fletch_adamant_arrow.yaml | 13 - data/recipes/fletch_adamant_bolts.yaml | 13 - data/recipes/fletch_arrow_shaft.yaml | 12 - data/recipes/fletch_arrow_shaft_magic.yaml | 12 - data/recipes/fletch_arrow_shaft_maple.yaml | 12 - data/recipes/fletch_arrow_shaft_oak.yaml | 12 - data/recipes/fletch_arrow_shaft_willow.yaml | 12 - data/recipes/fletch_arrow_shaft_yew.yaml | 12 - data/recipes/fletch_bronze_arrow.yaml | 13 - data/recipes/fletch_bronze_bolts.yaml | 13 - data/recipes/fletch_diamond_bolt_tips.yaml | 12 - data/recipes/fletch_diamond_bolts.yaml | 13 - data/recipes/fletch_emerald_bolt_tips.yaml | 12 - data/recipes/fletch_emerald_bolts.yaml | 13 - data/recipes/fletch_headless_arrow.yaml | 13 - data/recipes/fletch_iron_arrow.yaml | 13 - data/recipes/fletch_iron_bolts.yaml | 13 - data/recipes/fletch_longbow.yaml | 12 - data/recipes/fletch_longbow_u.yaml | 11 - data/recipes/fletch_magic_longbow.yaml | 12 - data/recipes/fletch_magic_longbow_u.yaml | 11 - data/recipes/fletch_magic_shortbow.yaml | 12 - data/recipes/fletch_magic_shortbow_u.yaml | 11 - data/recipes/fletch_maple_longbow.yaml | 12 - data/recipes/fletch_maple_longbow_u.yaml | 11 - data/recipes/fletch_maple_shortbow.yaml | 12 - data/recipes/fletch_maple_shortbow_u.yaml | 11 - data/recipes/fletch_mithril_arrow.yaml | 13 - data/recipes/fletch_mithril_bolts.yaml | 13 - data/recipes/fletch_oak_longbow.yaml | 12 - data/recipes/fletch_oak_longbow_u.yaml | 11 - data/recipes/fletch_oak_shortbow.yaml | 12 - data/recipes/fletch_oak_shortbow_u.yaml | 11 - data/recipes/fletch_ruby_bolt_tips.yaml | 12 - data/recipes/fletch_ruby_bolts.yaml | 13 - data/recipes/fletch_rune_arrow.yaml | 13 - data/recipes/fletch_rune_bolts.yaml | 13 - data/recipes/fletch_sapphire_bolt_tips.yaml | 12 - data/recipes/fletch_sapphire_bolts.yaml | 13 - data/recipes/fletch_shortbow.yaml | 12 - data/recipes/fletch_shortbow_u.yaml | 11 - data/recipes/fletch_steel_arrow.yaml | 13 - data/recipes/fletch_steel_bolts.yaml | 13 - data/recipes/fletch_willow_longbow.yaml | 12 - data/recipes/fletch_willow_longbow_u.yaml | 11 - data/recipes/fletch_willow_shortbow.yaml | 12 - data/recipes/fletch_willow_shortbow_u.yaml | 11 - data/recipes/fletch_yew_longbow.yaml | 12 - data/recipes/fletch_yew_longbow_u.yaml | 11 - data/recipes/fletch_yew_shortbow.yaml | 12 - data/recipes/fletch_yew_shortbow_u.yaml | 11 - data/recipes/fletching/fletch_adamant_arrow.yaml | 13 + data/recipes/fletching/fletch_adamant_bolts.yaml | 13 + data/recipes/fletching/fletch_arrow_shaft.yaml | 12 + .../fletching/fletch_arrow_shaft_magic.yaml | 12 + .../fletching/fletch_arrow_shaft_maple.yaml | 12 + data/recipes/fletching/fletch_arrow_shaft_oak.yaml | 12 + .../fletching/fletch_arrow_shaft_willow.yaml | 12 + data/recipes/fletching/fletch_arrow_shaft_yew.yaml | 12 + data/recipes/fletching/fletch_bronze_arrow.yaml | 13 + data/recipes/fletching/fletch_bronze_bolts.yaml | 13 + .../fletching/fletch_diamond_bolt_tips.yaml | 12 + data/recipes/fletching/fletch_diamond_bolts.yaml | 13 + .../fletching/fletch_emerald_bolt_tips.yaml | 12 + data/recipes/fletching/fletch_emerald_bolts.yaml | 13 + data/recipes/fletching/fletch_headless_arrow.yaml | 13 + data/recipes/fletching/fletch_iron_arrow.yaml | 13 + data/recipes/fletching/fletch_iron_bolts.yaml | 13 + data/recipes/fletching/fletch_longbow.yaml | 12 + data/recipes/fletching/fletch_longbow_u.yaml | 11 + data/recipes/fletching/fletch_magic_longbow.yaml | 12 + data/recipes/fletching/fletch_magic_longbow_u.yaml | 11 + data/recipes/fletching/fletch_magic_shortbow.yaml | 12 + .../recipes/fletching/fletch_magic_shortbow_u.yaml | 11 + data/recipes/fletching/fletch_maple_longbow.yaml | 12 + data/recipes/fletching/fletch_maple_longbow_u.yaml | 11 + data/recipes/fletching/fletch_maple_shortbow.yaml | 12 + .../recipes/fletching/fletch_maple_shortbow_u.yaml | 11 + data/recipes/fletching/fletch_mithril_arrow.yaml | 13 + data/recipes/fletching/fletch_mithril_bolts.yaml | 13 + data/recipes/fletching/fletch_oak_longbow.yaml | 12 + data/recipes/fletching/fletch_oak_longbow_u.yaml | 11 + data/recipes/fletching/fletch_oak_shortbow.yaml | 12 + data/recipes/fletching/fletch_oak_shortbow_u.yaml | 11 + data/recipes/fletching/fletch_ruby_bolt_tips.yaml | 12 + data/recipes/fletching/fletch_ruby_bolts.yaml | 13 + data/recipes/fletching/fletch_rune_arrow.yaml | 13 + data/recipes/fletching/fletch_rune_bolts.yaml | 13 + .../fletching/fletch_sapphire_bolt_tips.yaml | 12 + data/recipes/fletching/fletch_sapphire_bolts.yaml | 13 + data/recipes/fletching/fletch_shortbow.yaml | 12 + data/recipes/fletching/fletch_shortbow_u.yaml | 11 + data/recipes/fletching/fletch_steel_arrow.yaml | 13 + data/recipes/fletching/fletch_steel_bolts.yaml | 13 + data/recipes/fletching/fletch_willow_longbow.yaml | 12 + .../recipes/fletching/fletch_willow_longbow_u.yaml | 11 + data/recipes/fletching/fletch_willow_shortbow.yaml | 12 + .../fletching/fletch_willow_shortbow_u.yaml | 11 + data/recipes/fletching/fletch_yew_longbow.yaml | 12 + data/recipes/fletching/fletch_yew_longbow_u.yaml | 11 + data/recipes/fletching/fletch_yew_shortbow.yaml | 12 + data/recipes/fletching/fletch_yew_shortbow_u.yaml | 11 + data/recipes/mix_amp_potion.yaml | 13 - data/recipes/mix_bio_serum.yaml | 13 - data/recipes/mix_full_restore.yaml | 13 - data/recipes/mix_nano_restore.yaml | 13 - data/recipes/mix_restoration_compound.yaml | 13 - data/recipes/mix_science_serum.yaml | 13 - data/recipes/mix_shield_potion.yaml | 13 - data/recipes/mix_stim_cell.yaml | 13 - data/recipes/mix_stim_potion.yaml | 13 - data/recipes/mix_super_amp.yaml | 13 - data/recipes/mix_super_bio_serum.yaml | 13 - data/recipes/mix_super_shield.yaml | 13 - data/recipes/mix_super_stim.yaml | 13 - data/recipes/mix_super_stim_cell.yaml | 13 - data/recipes/mix_targeting_serum.yaml | 13 - data/recipes/mix_tech_serum.yaml | 13 - data/recipes/mixing/mix_amp_potion.yaml | 13 + data/recipes/mixing/mix_bio_serum.yaml | 13 + data/recipes/mixing/mix_full_restore.yaml | 13 + data/recipes/mixing/mix_nano_restore.yaml | 13 + data/recipes/mixing/mix_restoration_compound.yaml | 13 + data/recipes/mixing/mix_science_serum.yaml | 13 + data/recipes/mixing/mix_shield_potion.yaml | 13 + data/recipes/mixing/mix_stim_cell.yaml | 13 + data/recipes/mixing/mix_stim_potion.yaml | 13 + data/recipes/mixing/mix_super_amp.yaml | 13 + data/recipes/mixing/mix_super_bio_serum.yaml | 13 + data/recipes/mixing/mix_super_shield.yaml | 13 + data/recipes/mixing/mix_super_stim.yaml | 13 + data/recipes/mixing/mix_super_stim_cell.yaml | 13 + data/recipes/mixing/mix_targeting_serum.yaml | 13 + data/recipes/mixing/mix_tech_serum.yaml | 13 + data/recipes/smelt_adamantite.yaml | 15 - data/recipes/smelt_bronze.yaml | 15 - data/recipes/smelt_gold.yaml | 13 - data/recipes/smelt_iron.yaml | 17 - data/recipes/smelt_mithril.yaml | 15 - data/recipes/smelt_runite.yaml | 15 - data/recipes/smelt_silver.yaml | 13 - data/recipes/smelt_steel.yaml | 15 - data/recipes/smelting/smelt_adamantite.yaml | 15 + data/recipes/smelting/smelt_bronze.yaml | 15 + data/recipes/smelting/smelt_gold.yaml | 13 + data/recipes/smelting/smelt_iron.yaml | 17 + data/recipes/smelting/smelt_mithril.yaml | 15 + data/recipes/smelting/smelt_runite.yaml | 15 + data/recipes/smelting/smelt_silver.yaml | 13 + data/recipes/smelting/smelt_steel.yaml | 15 + data/recipes/smith_adamant_arrowtips.yaml | 12 - data/recipes/smith_adamant_bolts_unf.yaml | 12 - data/recipes/smith_adamant_dagger.yaml | 11 - data/recipes/smith_adamant_full_helm.yaml | 11 - data/recipes/smith_adamant_med_helm.yaml | 11 - data/recipes/smith_adamant_nails.yaml | 12 - data/recipes/smith_adamant_platebody.yaml | 11 - data/recipes/smith_adamant_sword.yaml | 11 - data/recipes/smith_bronze_arrowtips.yaml | 12 - data/recipes/smith_bronze_bolts_unf.yaml | 12 - data/recipes/smith_bronze_dagger.yaml | 11 - data/recipes/smith_bronze_full_helm.yaml | 11 - data/recipes/smith_bronze_med_helm.yaml | 11 - data/recipes/smith_bronze_nails.yaml | 12 - data/recipes/smith_bronze_platebody.yaml | 11 - data/recipes/smith_bronze_sword.yaml | 11 - data/recipes/smith_iron_arrowtips.yaml | 12 - data/recipes/smith_iron_bolts_unf.yaml | 12 - data/recipes/smith_iron_dagger.yaml | 11 - data/recipes/smith_iron_full_helm.yaml | 11 - data/recipes/smith_iron_med_helm.yaml | 11 - data/recipes/smith_iron_nails.yaml | 12 - data/recipes/smith_iron_platebody.yaml | 11 - data/recipes/smith_iron_sword.yaml | 11 - data/recipes/smith_mithril_arrowtips.yaml | 12 - data/recipes/smith_mithril_bolts_unf.yaml | 12 - data/recipes/smith_mithril_dagger.yaml | 11 - data/recipes/smith_mithril_full_helm.yaml | 11 - data/recipes/smith_mithril_med_helm.yaml | 11 - data/recipes/smith_mithril_nails.yaml | 12 - data/recipes/smith_mithril_platebody.yaml | 11 - data/recipes/smith_mithril_sword.yaml | 11 - data/recipes/smith_rune_arrowtips.yaml | 12 - data/recipes/smith_rune_bolts_unf.yaml | 12 - data/recipes/smith_rune_dagger.yaml | 11 - data/recipes/smith_rune_full_helm.yaml | 11 - data/recipes/smith_rune_med_helm.yaml | 11 - data/recipes/smith_rune_nails.yaml | 12 - data/recipes/smith_rune_platebody.yaml | 11 - data/recipes/smith_rune_sword.yaml | 11 - data/recipes/smith_steel_arrowtips.yaml | 12 - data/recipes/smith_steel_bolts_unf.yaml | 12 - data/recipes/smith_steel_dagger.yaml | 11 - data/recipes/smith_steel_full_helm.yaml | 11 - data/recipes/smith_steel_med_helm.yaml | 11 - data/recipes/smith_steel_nails.yaml | 12 - data/recipes/smith_steel_platebody.yaml | 11 - data/recipes/smith_steel_sword.yaml | 11 - data/recipes/smithing/smith_adamant_arrowtips.yaml | 12 + data/recipes/smithing/smith_adamant_bolts_unf.yaml | 12 + data/recipes/smithing/smith_adamant_dagger.yaml | 11 + data/recipes/smithing/smith_adamant_full_helm.yaml | 11 + data/recipes/smithing/smith_adamant_med_helm.yaml | 11 + data/recipes/smithing/smith_adamant_nails.yaml | 12 + data/recipes/smithing/smith_adamant_platebody.yaml | 11 + data/recipes/smithing/smith_adamant_sword.yaml | 11 + data/recipes/smithing/smith_bronze_arrowtips.yaml | 12 + data/recipes/smithing/smith_bronze_bolts_unf.yaml | 12 + data/recipes/smithing/smith_bronze_dagger.yaml | 11 + data/recipes/smithing/smith_bronze_full_helm.yaml | 11 + data/recipes/smithing/smith_bronze_med_helm.yaml | 11 + data/recipes/smithing/smith_bronze_nails.yaml | 12 + data/recipes/smithing/smith_bronze_platebody.yaml | 11 + data/recipes/smithing/smith_bronze_sword.yaml | 11 + data/recipes/smithing/smith_iron_arrowtips.yaml | 12 + data/recipes/smithing/smith_iron_bolts_unf.yaml | 12 + data/recipes/smithing/smith_iron_dagger.yaml | 11 + data/recipes/smithing/smith_iron_full_helm.yaml | 11 + data/recipes/smithing/smith_iron_med_helm.yaml | 11 + data/recipes/smithing/smith_iron_nails.yaml | 12 + data/recipes/smithing/smith_iron_platebody.yaml | 11 + data/recipes/smithing/smith_iron_sword.yaml | 11 + data/recipes/smithing/smith_mithril_arrowtips.yaml | 12 + data/recipes/smithing/smith_mithril_bolts_unf.yaml | 12 + data/recipes/smithing/smith_mithril_dagger.yaml | 11 + data/recipes/smithing/smith_mithril_full_helm.yaml | 11 + data/recipes/smithing/smith_mithril_med_helm.yaml | 11 + data/recipes/smithing/smith_mithril_nails.yaml | 12 + data/recipes/smithing/smith_mithril_platebody.yaml | 11 + data/recipes/smithing/smith_mithril_sword.yaml | 11 + data/recipes/smithing/smith_rune_arrowtips.yaml | 12 + data/recipes/smithing/smith_rune_bolts_unf.yaml | 12 + data/recipes/smithing/smith_rune_dagger.yaml | 11 + data/recipes/smithing/smith_rune_full_helm.yaml | 11 + data/recipes/smithing/smith_rune_med_helm.yaml | 11 + data/recipes/smithing/smith_rune_nails.yaml | 12 + data/recipes/smithing/smith_rune_platebody.yaml | 11 + data/recipes/smithing/smith_rune_sword.yaml | 11 + data/recipes/smithing/smith_steel_arrowtips.yaml | 12 + data/recipes/smithing/smith_steel_bolts_unf.yaml | 12 + data/recipes/smithing/smith_steel_dagger.yaml | 11 + data/recipes/smithing/smith_steel_full_helm.yaml | 11 + data/recipes/smithing/smith_steel_med_helm.yaml | 11 + data/recipes/smithing/smith_steel_nails.yaml | 12 + data/recipes/smithing/smith_steel_platebody.yaml | 11 + data/recipes/smithing/smith_steel_sword.yaml | 11 + data/rooms/1.yaml | 38 - data/rooms/10.yaml | 10 - data/rooms/11.yaml | 17 - data/rooms/12.yaml | 28 - data/rooms/13.yaml | 46 -- data/rooms/14.yaml | 18 - data/rooms/15.yaml | 10 - data/rooms/150.yaml | 32 - data/rooms/151.yaml | 11 - data/rooms/152.yaml | 11 - data/rooms/16.yaml | 12 - data/rooms/160.yaml | 17 - data/rooms/161.yaml | 13 - data/rooms/162.yaml | 6 - data/rooms/17.yaml | 10 - data/rooms/170.yaml | 7 - data/rooms/171.yaml | 7 - data/rooms/18.yaml | 6 - data/rooms/19.yaml | 6 - data/rooms/2.yaml | 17 - data/rooms/20.yaml | 6 - data/rooms/200.yaml | 8 - data/rooms/201.yaml | 9 - data/rooms/202.yaml | 9 - data/rooms/203.yaml | 9 - data/rooms/204.yaml | 9 - data/rooms/205.yaml | 9 - data/rooms/21.yaml | 13 - data/rooms/210.yaml | 9 - data/rooms/211.yaml | 9 - data/rooms/212.yaml | 9 - data/rooms/213.yaml | 9 - data/rooms/214.yaml | 9 - data/rooms/215.yaml | 9 - data/rooms/22.yaml | 7 - data/rooms/220.yaml | 9 - data/rooms/221.yaml | 9 - data/rooms/222.yaml | 9 - data/rooms/223.yaml | 9 - data/rooms/224.yaml | 9 - data/rooms/225.yaml | 9 - data/rooms/226.yaml | 9 - data/rooms/23.yaml | 7 - data/rooms/24.yaml | 7 - data/rooms/25.yaml | 7 - data/rooms/26.yaml | 7 - data/rooms/27.yaml | 7 - data/rooms/28.yaml | 6 - data/rooms/3.yaml | 15 - data/rooms/30.yaml | 6 - data/rooms/31.yaml | 7 - data/rooms/4.yaml | 29 - data/rooms/5.yaml | 12 - data/rooms/50.yaml | 7 - data/rooms/51.yaml | 10 - data/rooms/52.yaml | 9 - data/rooms/53.yaml | 9 - data/rooms/54.yaml | 9 - data/rooms/55.yaml | 12 - data/rooms/56.yaml | 9 - data/rooms/57.yaml | 8 - data/rooms/58.yaml | 8 - data/rooms/59.yaml | 9 - data/rooms/6.yaml | 16 - data/rooms/60.yaml | 8 - data/rooms/61.yaml | 7 - data/rooms/62.yaml | 8 - data/rooms/63.yaml | 8 - data/rooms/64.yaml | 8 - data/rooms/65.yaml | 8 - data/rooms/66.yaml | 8 - data/rooms/67.yaml | 8 - data/rooms/68.yaml | 7 - data/rooms/7.yaml | 9 - data/rooms/8.yaml | 11 - data/rooms/9.yaml | 17 - data/rooms/agility/200.yaml | 8 + data/rooms/agility/201.yaml | 9 + data/rooms/agility/202.yaml | 9 + data/rooms/agility/203.yaml | 9 + data/rooms/agility/204.yaml | 9 + data/rooms/agility/205.yaml | 9 + data/rooms/agility/210.yaml | 9 + data/rooms/agility/211.yaml | 9 + data/rooms/agility/212.yaml | 9 + data/rooms/agility/213.yaml | 9 + data/rooms/agility/214.yaml | 9 + data/rooms/agility/215.yaml | 9 + data/rooms/agility/220.yaml | 9 + data/rooms/agility/221.yaml | 9 + data/rooms/agility/222.yaml | 9 + data/rooms/agility/223.yaml | 9 + data/rooms/agility/224.yaml | 9 + data/rooms/agility/225.yaml | 9 + data/rooms/agility/226.yaml | 9 + data/rooms/player_housing/200.yaml | 8 - data/rooms/player_housing/201.yaml | 8 - data/rooms/player_housing/300.yaml | 8 + data/rooms/player_housing/301.yaml | 8 + data/rooms/town/1.yaml | 38 + data/rooms/town/10.yaml | 10 + data/rooms/town/11.yaml | 17 + data/rooms/town/12.yaml | 28 + data/rooms/town/13.yaml | 46 ++ data/rooms/town/14.yaml | 18 + data/rooms/town/15.yaml | 10 + data/rooms/town/16.yaml | 12 + data/rooms/town/17.yaml | 10 + data/rooms/town/18.yaml | 6 + data/rooms/town/19.yaml | 6 + data/rooms/town/2.yaml | 17 + data/rooms/town/20.yaml | 6 + data/rooms/town/21.yaml | 13 + data/rooms/town/22.yaml | 7 + data/rooms/town/23.yaml | 7 + data/rooms/town/24.yaml | 7 + data/rooms/town/25.yaml | 7 + data/rooms/town/26.yaml | 7 + data/rooms/town/27.yaml | 7 + data/rooms/town/28.yaml | 6 + data/rooms/town/3.yaml | 15 + data/rooms/town/30.yaml | 6 + data/rooms/town/31.yaml | 7 + data/rooms/town/4.yaml | 29 + data/rooms/town/5.yaml | 12 + data/rooms/town/6.yaml | 16 + data/rooms/town/7.yaml | 9 + data/rooms/town/8.yaml | 11 + data/rooms/town/9.yaml | 14 + data/rooms/underground/50.yaml | 7 + data/rooms/underground/51.yaml | 10 + data/rooms/underground/52.yaml | 9 + data/rooms/underground/53.yaml | 9 + data/rooms/underground/54.yaml | 9 + data/rooms/underground/55.yaml | 12 + data/rooms/underground/56.yaml | 9 + data/rooms/underground/57.yaml | 8 + data/rooms/underground/58.yaml | 8 + data/rooms/underground/59.yaml | 9 + data/rooms/underground/60.yaml | 8 + data/rooms/underground/61.yaml | 7 + data/rooms/underground/62.yaml | 8 + data/rooms/underground/63.yaml | 8 + data/rooms/underground/64.yaml | 8 + data/rooms/underground/65.yaml | 8 + data/rooms/underground/66.yaml | 8 + data/rooms/underground/67.yaml | 8 + data/rooms/underground/68.yaml | 7 + data/rooms/wilderness/150.yaml | 32 + data/rooms/wilderness/151.yaml | 11 + data/rooms/wilderness/152.yaml | 11 + data/rooms/wilderness/160.yaml | 17 + data/rooms/wilderness/161.yaml | 13 + data/rooms/wilderness/162.yaml | 6 + data/rooms/wilderness/170.yaml | 7 + data/rooms/wilderness/171.yaml | 7 + internal/action/recipe.go | 39 +- internal/action/store.go | 89 ++- internal/config/config.go | 12 +- internal/game/action_burn.go | 13 + internal/game/action_steal.go | 10 + internal/game/aggro.go | 53 -- internal/game/assassin.go | 174 ----- internal/game/buff.go | 55 -- internal/game/cmd_alias.go | 8 + internal/game/cmd_attack.go | 14 + internal/game/cmd_autotrigger.go | 4 + internal/game/cmd_bank.go | 4 + internal/game/cmd_clean.go | 4 + internal/game/cmd_color.go | 4 + internal/game/cmd_colortable.go | 4 + internal/game/cmd_consume.go | 293 ++++++++ internal/game/cmd_cook.go | 5 + internal/game/cmd_craft.go | 8 + internal/game/cmd_description.go | 4 + internal/game/cmd_drink.go | 150 ---- internal/game/cmd_drop.go | 14 + internal/game/cmd_eat.go | 145 ---- internal/game/cmd_estate_directory.go | 2 +- internal/game/cmd_farm.go | 58 ++ internal/game/cmd_fletch.go | 4 + internal/game/cmd_get.go | 15 + internal/game/cmd_handlers.go | 370 ---------- internal/game/cmd_id.go | 5 + internal/game/cmd_inventory.go | 4 + internal/game/cmd_jack.go | 6 + internal/game/cmd_look.go | 12 + internal/game/cmd_map.go | 4 + internal/game/cmd_mix.go | 6 + internal/game/cmd_mods.go | 5 + internal/game/cmd_move.go | 5 + internal/game/cmd_option.go | 4 + internal/game/cmd_prompt.go | 14 + internal/game/cmd_queued.go | 4 + internal/game/cmd_quit.go | 4 + internal/game/cmd_registry.go | 26 + internal/game/cmd_remove.go | 4 + internal/game/cmd_say.go | 14 + internal/game/cmd_score.go | 4 + internal/game/cmd_search.go | 10 + internal/game/cmd_smelt.go | 5 + internal/game/cmd_smith.go | 4 + internal/game/cmd_sneak.go | 4 + internal/game/cmd_stats.go | 4 + internal/game/cmd_style.go | 8 + internal/game/cmd_task.go | 4 + internal/game/cmd_tech.go | 4 + internal/game/cmd_trigger.go | 637 +--------------- internal/game/cmd_trigger_combat.go | 104 +++ internal/game/cmd_trigger_enchant.go | 116 +++ internal/game/cmd_trigger_transport.go | 54 ++ internal/game/cmd_trigger_utility.go | 397 ++++++++++ internal/game/cmd_use.go | 7 + internal/game/cmd_walk.go | 4 + internal/game/cmd_wear.go | 4 + internal/game/color.go | 79 -- internal/game/construction.go | 74 -- internal/game/core_course.go | 135 ++++ internal/game/core_equip.go | 41 ++ internal/game/core_flags.go | 55 ++ internal/game/core_hacking.go | 93 +++ internal/game/core_login_account.go | 351 +++++++++ internal/game/core_login_char.go | 244 +++++++ internal/game/core_messages.go | 13 + internal/game/core_production.go | 803 +++++++++++++++++++++ internal/game/core_skill.go | 15 + internal/game/core_startup.go | 770 ++++++++++++++++++++ internal/game/core_stations.go | 28 + internal/game/core_types.go | 29 + internal/game/core_utils.go | 116 +++ internal/game/course.go | 141 ---- internal/game/death.go | 66 -- internal/game/equip_stats.go | 41 -- internal/game/game.go | 29 +- internal/game/hacking.go | 93 --- internal/game/help.go | 155 ---- internal/game/login_account.go | 351 --------- internal/game/login_char.go | 244 ------- internal/game/map.go | 317 -------- internal/game/messages.go | 13 - internal/game/player_flags.go | 55 -- internal/game/production_core.go | 606 ---------------- internal/game/production_menu.go | 209 ------ internal/game/prompt.go | 100 --- internal/game/science.go | 231 ------ internal/game/stations.go | 28 - internal/game/sys_assassin.go | 174 +++++ internal/game/sys_buff.go | 55 ++ internal/game/sys_combat.go | 114 +++ internal/game/sys_construction.go | 74 ++ internal/game/sys_science.go | 220 ++++++ internal/game/sys_technology.go | 250 +++++++ internal/game/table.go | 150 ---- internal/game/tech.go | 250 ------- internal/game/types.go | 29 - internal/game/ui_color.go | 79 ++ internal/game/ui_help.go | 152 ++++ internal/game/ui_map.go | 317 ++++++++ internal/game/ui_prompt.go | 100 +++ internal/game/ui_table.go | 150 ++++ internal/game/utils.go | 121 ---- internal/object/item.go | 2 +- internal/object/item_store.go | 56 +- internal/object/object.go | 2 +- internal/object/store.go | 28 +- internal/world/mob.go | 15 +- internal/world/room.go | 6 +- internal/world/world.go | 52 +- worldbuilding_guide/construction.md | 4 +- worldbuilding_guide/items.md | 12 +- worldbuilding_guide/objects.md | 12 +- worldbuilding_guide/recipes.md | 24 +- worldbuilding_guide/rooms.md | 8 +- 1551 files changed, 13356 insertions(+), 12535 deletions(-) delete mode 100644 data/items/abyssal_bracelet.yaml delete mode 100644 data/items/acid_vial.yaml delete mode 100644 data/items/adamant_arrow.yaml delete mode 100644 data/items/adamant_arrowtips.yaml delete mode 100644 data/items/adamant_axe.yaml delete mode 100644 data/items/adamant_bolts.yaml delete mode 100644 data/items/adamant_bolts_unf.yaml delete mode 100644 data/items/adamant_dagger.yaml delete mode 100644 data/items/adamant_full_helm.yaml delete mode 100644 data/items/adamant_med_helm.yaml delete mode 100644 data/items/adamant_nails.yaml delete mode 100644 data/items/adamant_pickaxe.yaml delete mode 100644 data/items/adamant_platebody.yaml delete mode 100644 data/items/adamant_sword.yaml delete mode 100644 data/items/adamantite_bar.yaml delete mode 100644 data/items/adamantite_ore.yaml delete mode 100644 data/items/advanced_bio_deck.yaml delete mode 100644 data/items/advanced_eco_deck.yaml delete mode 100644 data/items/advanced_hydro_deck.yaml delete mode 100644 data/items/advanced_solar_deck.yaml create mode 100644 data/items/ammo/adamant_arrow.yaml create mode 100644 data/items/ammo/adamant_arrowtips.yaml create mode 100644 data/items/ammo/adamant_bolts.yaml create mode 100644 data/items/ammo/adamant_bolts_unf.yaml create mode 100644 data/items/ammo/arrow_shaft.yaml create mode 100644 data/items/ammo/bronze_arrow.yaml create mode 100644 data/items/ammo/bronze_arrowtips.yaml create mode 100644 data/items/ammo/bronze_bolts.yaml create mode 100644 data/items/ammo/bronze_bolts_unf.yaml create mode 100644 data/items/ammo/diamond_bolt_tips.yaml create mode 100644 data/items/ammo/diamond_bolts.yaml create mode 100644 data/items/ammo/diamond_bolts_e.yaml create mode 100644 data/items/ammo/emerald_bolt_tips.yaml create mode 100644 data/items/ammo/emerald_bolts.yaml create mode 100644 data/items/ammo/emerald_bolts_e.yaml create mode 100644 data/items/ammo/headless_arrow.yaml create mode 100644 data/items/ammo/iron_arrow.yaml create mode 100644 data/items/ammo/iron_arrowtips.yaml create mode 100644 data/items/ammo/iron_bolts.yaml create mode 100644 data/items/ammo/iron_bolts_unf.yaml create mode 100644 data/items/ammo/mithril_arrow.yaml create mode 100644 data/items/ammo/mithril_arrowtips.yaml create mode 100644 data/items/ammo/mithril_bolts.yaml create mode 100644 data/items/ammo/mithril_bolts_unf.yaml create mode 100644 data/items/ammo/ruby_bolt_tips.yaml create mode 100644 data/items/ammo/ruby_bolts.yaml create mode 100644 data/items/ammo/ruby_bolts_e.yaml create mode 100644 data/items/ammo/rune_arrow.yaml create mode 100644 data/items/ammo/rune_arrowtips.yaml create mode 100644 data/items/ammo/rune_bolts.yaml create mode 100644 data/items/ammo/rune_bolts_unf.yaml create mode 100644 data/items/ammo/sapphire_bolt_tips.yaml create mode 100644 data/items/ammo/sapphire_bolts.yaml create mode 100644 data/items/ammo/sapphire_bolts_e.yaml create mode 100644 data/items/ammo/steel_arrow.yaml create mode 100644 data/items/ammo/steel_arrowtips.yaml create mode 100644 data/items/ammo/steel_bolts.yaml create mode 100644 data/items/ammo/steel_bolts_unf.yaml delete mode 100644 data/items/amp_potion.yaml delete mode 100644 data/items/amulet_mould.yaml delete mode 100644 data/items/anchovies.yaml delete mode 100644 data/items/antitoxin_powder.yaml delete mode 100644 data/items/apple.yaml delete mode 100644 data/items/arachnid_enzyme.yaml delete mode 100644 data/items/arrow_shaft.yaml delete mode 100644 data/items/ashes.yaml delete mode 100644 data/items/avantoe.yaml delete mode 100644 data/items/avantoe_potion_unf.yaml delete mode 100644 data/items/avantoe_seed.yaml delete mode 100644 data/items/ball_of_wool.yaml delete mode 100644 data/items/basic_deck.yaml delete mode 100644 data/items/big_fishing_net.yaml delete mode 100644 data/items/binding_necklace.yaml delete mode 100644 data/items/bio_deck.yaml delete mode 100644 data/items/bio_identifier.yaml delete mode 100644 data/items/bio_serum.yaml delete mode 100644 data/items/biojunk.yaml delete mode 100644 data/items/birds_nest.yaml delete mode 100644 data/items/black_axe.yaml delete mode 100644 data/items/black_pickaxe.yaml delete mode 100644 data/items/blight_spore.yaml delete mode 100644 data/items/blood_identifier.yaml delete mode 100644 data/items/bloodjunk.yaml delete mode 100644 data/items/bones.yaml delete mode 100644 data/items/bowstring.yaml delete mode 100644 data/items/bracelet_mould.yaml delete mode 100644 data/items/bracelet_of_clay.yaml delete mode 100644 data/items/bracelet_of_slaughter.yaml delete mode 100644 data/items/bread.yaml delete mode 100644 data/items/bread_dough.yaml delete mode 100644 data/items/bronze_arrow.yaml delete mode 100644 data/items/bronze_arrowtips.yaml delete mode 100644 data/items/bronze_axe.yaml delete mode 100644 data/items/bronze_bar.yaml delete mode 100644 data/items/bronze_bolts.yaml delete mode 100644 data/items/bronze_bolts_unf.yaml delete mode 100644 data/items/bronze_dagger.yaml delete mode 100644 data/items/bronze_full_helm.yaml delete mode 100644 data/items/bronze_med_helm.yaml delete mode 100644 data/items/bronze_nails.yaml delete mode 100644 data/items/bronze_pickaxe.yaml delete mode 100644 data/items/bronze_platebody.yaml delete mode 100644 data/items/bronze_sword.yaml delete mode 100644 data/items/bucket_of_water.yaml delete mode 100644 data/items/burnt_fish.yaml delete mode 100644 data/items/burnt_meat.yaml delete mode 100644 data/items/cabbage.yaml delete mode 100644 data/items/cabbage_seed.yaml delete mode 100644 data/items/cadantine.yaml delete mode 100644 data/items/cadantine_potion_unf.yaml delete mode 100644 data/items/cadantine_seed.yaml delete mode 100644 data/items/capacitor_gloves.yaml delete mode 100644 data/items/cape_of_agility.yaml delete mode 100644 data/items/catalyst_wine.yaml delete mode 100644 data/items/chaos_identifier.yaml delete mode 100644 data/items/chaosjunk.yaml delete mode 100644 data/items/cheese.yaml delete mode 100644 data/items/chisel.yaml delete mode 100644 data/items/chitin_plate.yaml delete mode 100644 data/items/chocolate_dust.yaml delete mode 100644 data/items/christmas_cracker.yaml delete mode 100644 data/items/circuit_board.yaml delete mode 100644 data/items/clay.yaml delete mode 100644 data/items/coal.yaml delete mode 100644 data/items/coif.yaml create mode 100644 data/items/consumables/acid_vial.yaml create mode 100644 data/items/consumables/amp_potion.yaml create mode 100644 data/items/consumables/anchovies.yaml create mode 100644 data/items/consumables/antitoxin_powder.yaml create mode 100644 data/items/consumables/apple.yaml create mode 100644 data/items/consumables/avantoe_potion_unf.yaml create mode 100644 data/items/consumables/bio_serum.yaml create mode 100644 data/items/consumables/blight_spore.yaml create mode 100644 data/items/consumables/bread.yaml create mode 100644 data/items/consumables/bread_dough.yaml create mode 100644 data/items/consumables/bucket_of_water.yaml create mode 100644 data/items/consumables/burnt_fish.yaml create mode 100644 data/items/consumables/burnt_meat.yaml create mode 100644 data/items/consumables/cabbage.yaml create mode 100644 data/items/consumables/cadantine_potion_unf.yaml create mode 100644 data/items/consumables/catalyst_wine.yaml create mode 100644 data/items/consumables/cheese.yaml create mode 100644 data/items/consumables/dwarf_weed_potion_unf.yaml create mode 100644 data/items/consumables/full_restore.yaml create mode 100644 data/items/consumables/guam_potion_unf.yaml create mode 100644 data/items/consumables/harralander_potion_unf.yaml create mode 100644 data/items/consumables/herring.yaml create mode 100644 data/items/consumables/irit_potion_unf.yaml create mode 100644 data/items/consumables/jug_of_water.yaml create mode 100644 data/items/consumables/kwuarm_potion_unf.yaml create mode 100644 data/items/consumables/lantadyme_potion_unf.yaml create mode 100644 data/items/consumables/marrentill_potion_unf.yaml create mode 100644 data/items/consumables/nano_restore.yaml create mode 100644 data/items/consumables/onion.yaml create mode 100644 data/items/consumables/pastry_dough.yaml create mode 100644 data/items/consumables/pie_dish.yaml create mode 100644 data/items/consumables/pizza_dough.yaml create mode 100644 data/items/consumables/plant_cure.yaml create mode 100644 data/items/consumables/pot_of_flour.yaml create mode 100644 data/items/consumables/potato.yaml create mode 100644 data/items/consumables/ranarr_potion_unf.yaml create mode 100644 data/items/consumables/raw_anchovies.yaml create mode 100644 data/items/consumables/raw_anglerfish.yaml create mode 100644 data/items/consumables/raw_bass.yaml create mode 100644 data/items/consumables/raw_beef.yaml create mode 100644 data/items/consumables/raw_cave_eel.yaml create mode 100644 data/items/consumables/raw_cod.yaml create mode 100644 data/items/consumables/raw_herring.yaml create mode 100644 data/items/consumables/raw_lobster.yaml create mode 100644 data/items/consumables/raw_mackerel.yaml create mode 100644 data/items/consumables/raw_pike.yaml create mode 100644 data/items/consumables/raw_rainbow_fish.yaml create mode 100644 data/items/consumables/raw_salmon.yaml create mode 100644 data/items/consumables/raw_sardine.yaml create mode 100644 data/items/consumables/raw_shark.yaml create mode 100644 data/items/consumables/raw_shrimps.yaml create mode 100644 data/items/consumables/raw_slimy_eel.yaml create mode 100644 data/items/consumables/raw_swordfish.yaml create mode 100644 data/items/consumables/raw_trout.yaml create mode 100644 data/items/consumables/raw_tuna.yaml create mode 100644 data/items/consumables/restoration_compound.yaml create mode 100644 data/items/consumables/salmon.yaml create mode 100644 data/items/consumables/sardine.yaml create mode 100644 data/items/consumables/science_serum.yaml create mode 100644 data/items/consumables/shield_potion.yaml create mode 100644 data/items/consumables/shrimps.yaml create mode 100644 data/items/consumables/snapdragon_potion_unf.yaml create mode 100644 data/items/consumables/stim_potion.yaml create mode 100644 data/items/consumables/strawberry.yaml create mode 100644 data/items/consumables/super_amp.yaml create mode 100644 data/items/consumables/super_bio_serum.yaml create mode 100644 data/items/consumables/super_shield.yaml create mode 100644 data/items/consumables/super_stim.yaml create mode 100644 data/items/consumables/super_stim_cell.yaml create mode 100644 data/items/consumables/sweetcorn.yaml create mode 100644 data/items/consumables/targeting_serum.yaml create mode 100644 data/items/consumables/tarromin_potion_unf.yaml create mode 100644 data/items/consumables/tech_serum.yaml create mode 100644 data/items/consumables/toadflax_potion_unf.yaml create mode 100644 data/items/consumables/tomato.yaml create mode 100644 data/items/consumables/torstol_potion_unf.yaml create mode 100644 data/items/consumables/trout.yaml create mode 100644 data/items/consumables/vial_of_water.yaml create mode 100644 data/items/consumables/watermelon.yaml delete mode 100644 data/items/copper_ore.yaml delete mode 100644 data/items/cosmic_identifier.yaml delete mode 100644 data/items/cosmicjunk.yaml delete mode 100644 data/items/cowhide.yaml delete mode 100644 data/items/credit_stick.yaml delete mode 100644 data/items/credits.yaml delete mode 100644 data/items/crushed_nest.yaml delete mode 100644 data/items/death_identifier.yaml delete mode 100644 data/items/deathjunk.yaml create mode 100644 data/items/decks/advanced_bio_deck.yaml create mode 100644 data/items/decks/advanced_eco_deck.yaml create mode 100644 data/items/decks/advanced_hydro_deck.yaml create mode 100644 data/items/decks/advanced_solar_deck.yaml create mode 100644 data/items/decks/basic_deck.yaml create mode 100644 data/items/decks/bio_deck.yaml create mode 100644 data/items/decks/bio_identifier.yaml create mode 100644 data/items/decks/biojunk.yaml create mode 100644 data/items/decks/blood_identifier.yaml create mode 100644 data/items/decks/bloodjunk.yaml create mode 100644 data/items/decks/chaos_identifier.yaml create mode 100644 data/items/decks/chaosjunk.yaml create mode 100644 data/items/decks/cosmic_identifier.yaml create mode 100644 data/items/decks/cosmicjunk.yaml create mode 100644 data/items/decks/death_identifier.yaml create mode 100644 data/items/decks/deathjunk.yaml create mode 100644 data/items/decks/eco_deck.yaml create mode 100644 data/items/decks/eco_identifier.yaml create mode 100644 data/items/decks/ecojunk.yaml create mode 100644 data/items/decks/hydro_deck.yaml create mode 100644 data/items/decks/hydro_identifier.yaml create mode 100644 data/items/decks/hydrojunk.yaml create mode 100644 data/items/decks/law_identifier.yaml create mode 100644 data/items/decks/lawjunk.yaml create mode 100644 data/items/decks/nature_identifier.yaml create mode 100644 data/items/decks/naturejunk.yaml create mode 100644 data/items/decks/solar_deck.yaml create mode 100644 data/items/decks/solar_identifier.yaml create mode 100644 data/items/decks/solarjunk.yaml delete mode 100644 data/items/diamond.yaml delete mode 100644 data/items/diamond_amulet_u.yaml delete mode 100644 data/items/diamond_bolt_tips.yaml delete mode 100644 data/items/diamond_bolts.yaml delete mode 100644 data/items/diamond_bolts_e.yaml delete mode 100644 data/items/diamond_bracelet.yaml delete mode 100644 data/items/diamond_necklace.yaml delete mode 100644 data/items/diamond_ring.yaml delete mode 100644 data/items/digsite_pendant.yaml delete mode 100644 data/items/dragon_axe.yaml delete mode 100644 data/items/dragon_pickaxe.yaml delete mode 100644 data/items/dwarf_weed.yaml delete mode 100644 data/items/dwarf_weed_potion_unf.yaml delete mode 100644 data/items/dwarf_weed_seed.yaml delete mode 100644 data/items/eco_deck.yaml delete mode 100644 data/items/eco_identifier.yaml delete mode 100644 data/items/ecojunk.yaml delete mode 100644 data/items/ectoplasm.yaml delete mode 100644 data/items/emerald.yaml delete mode 100644 data/items/emerald_amulet_u.yaml delete mode 100644 data/items/emerald_bolt_tips.yaml delete mode 100644 data/items/emerald_bolts.yaml delete mode 100644 data/items/emerald_bolts_e.yaml delete mode 100644 data/items/emerald_bracelet.yaml delete mode 100644 data/items/emerald_necklace.yaml delete mode 100644 data/items/emerald_ring.yaml delete mode 100644 data/items/empty_bucket.yaml delete mode 100644 data/items/empty_jug.yaml delete mode 100644 data/items/empty_pot.yaml create mode 100644 data/items/equipment/abyssal_bracelet.yaml create mode 100644 data/items/equipment/adamant_dagger.yaml create mode 100644 data/items/equipment/adamant_full_helm.yaml create mode 100644 data/items/equipment/adamant_med_helm.yaml create mode 100644 data/items/equipment/adamant_platebody.yaml create mode 100644 data/items/equipment/adamant_sword.yaml create mode 100644 data/items/equipment/binding_necklace.yaml create mode 100644 data/items/equipment/black_axe.yaml create mode 100644 data/items/equipment/bracelet_of_clay.yaml create mode 100644 data/items/equipment/bracelet_of_slaughter.yaml create mode 100644 data/items/equipment/bronze_dagger.yaml create mode 100644 data/items/equipment/bronze_full_helm.yaml create mode 100644 data/items/equipment/bronze_med_helm.yaml create mode 100644 data/items/equipment/bronze_platebody.yaml create mode 100644 data/items/equipment/bronze_sword.yaml create mode 100644 data/items/equipment/capacitor_gloves.yaml create mode 100644 data/items/equipment/cape_of_agility.yaml create mode 100644 data/items/equipment/chitin_plate.yaml create mode 100644 data/items/equipment/coif.yaml create mode 100644 data/items/equipment/diamond_amulet_u.yaml create mode 100644 data/items/equipment/diamond_bracelet.yaml create mode 100644 data/items/equipment/diamond_necklace.yaml create mode 100644 data/items/equipment/diamond_ring.yaml create mode 100644 data/items/equipment/digsite_pendant.yaml create mode 100644 data/items/equipment/dragon_axe.yaml create mode 100644 data/items/equipment/emerald_amulet_u.yaml create mode 100644 data/items/equipment/emerald_bracelet.yaml create mode 100644 data/items/equipment/emerald_necklace.yaml create mode 100644 data/items/equipment/emerald_ring.yaml create mode 100644 data/items/equipment/gold_amulet_u.yaml create mode 100644 data/items/equipment/gold_bracelet.yaml create mode 100644 data/items/equipment/gold_necklace.yaml create mode 100644 data/items/equipment/gold_ring.yaml create mode 100644 data/items/equipment/graceful_boots.yaml create mode 100644 data/items/equipment/graceful_cape.yaml create mode 100644 data/items/equipment/graceful_gloves.yaml create mode 100644 data/items/equipment/graceful_hat.yaml create mode 100644 data/items/equipment/graceful_legs.yaml create mode 100644 data/items/equipment/graceful_torso.yaml create mode 100644 data/items/equipment/hard_leather_body.yaml create mode 100644 data/items/equipment/hard_leather_shield.yaml create mode 100644 data/items/equipment/inoculation_bracelet.yaml create mode 100644 data/items/equipment/insulated_gloves.yaml create mode 100644 data/items/equipment/iron_dagger.yaml create mode 100644 data/items/equipment/iron_full_helm.yaml create mode 100644 data/items/equipment/iron_med_helm.yaml create mode 100644 data/items/equipment/iron_platebody.yaml create mode 100644 data/items/equipment/iron_sword.yaml create mode 100644 data/items/equipment/leather_body.yaml create mode 100644 data/items/equipment/leather_boots.yaml create mode 100644 data/items/equipment/leather_chaps.yaml create mode 100644 data/items/equipment/leather_cowl.yaml create mode 100644 data/items/equipment/leather_gloves.yaml create mode 100644 data/items/equipment/leather_vambraces.yaml create mode 100644 data/items/equipment/longbow.yaml create mode 100644 data/items/equipment/longbow_u.yaml create mode 100644 data/items/equipment/magic_longbow.yaml create mode 100644 data/items/equipment/magic_longbow_u.yaml create mode 100644 data/items/equipment/magic_shortbow.yaml create mode 100644 data/items/equipment/magic_shortbow_u.yaml create mode 100644 data/items/equipment/maple_longbow.yaml create mode 100644 data/items/equipment/maple_longbow_u.yaml create mode 100644 data/items/equipment/maple_shortbow.yaml create mode 100644 data/items/equipment/maple_shortbow_u.yaml create mode 100644 data/items/equipment/mithril_dagger.yaml create mode 100644 data/items/equipment/mithril_full_helm.yaml create mode 100644 data/items/equipment/mithril_med_helm.yaml create mode 100644 data/items/equipment/mithril_platebody.yaml create mode 100644 data/items/equipment/mithril_sword.yaml create mode 100644 data/items/equipment/necklace_of_passage.yaml create mode 100644 data/items/equipment/neural_headband.yaml create mode 100644 data/items/equipment/oak_longbow.yaml create mode 100644 data/items/equipment/oak_longbow_u.yaml create mode 100644 data/items/equipment/oak_shortbow.yaml create mode 100644 data/items/equipment/oak_shortbow_u.yaml create mode 100644 data/items/equipment/party_hat_blue.yaml create mode 100644 data/items/equipment/party_hat_green.yaml create mode 100644 data/items/equipment/party_hat_pink.yaml create mode 100644 data/items/equipment/party_hat_red.yaml create mode 100644 data/items/equipment/party_hat_white.yaml create mode 100644 data/items/equipment/party_hat_yellow.yaml create mode 100644 data/items/equipment/phoenix_necklace.yaml create mode 100644 data/items/equipment/power_amulet.yaml create mode 100644 data/items/equipment/ring_of_dueling.yaml create mode 100644 data/items/equipment/ring_of_forging.yaml create mode 100644 data/items/equipment/ring_of_life.yaml create mode 100644 data/items/equipment/ring_of_recoil.yaml create mode 100644 data/items/equipment/ruby_amulet_u.yaml create mode 100644 data/items/equipment/ruby_bracelet.yaml create mode 100644 data/items/equipment/ruby_necklace.yaml create mode 100644 data/items/equipment/ruby_ring.yaml create mode 100644 data/items/equipment/rune_dagger.yaml create mode 100644 data/items/equipment/rune_full_helm.yaml create mode 100644 data/items/equipment/rune_med_helm.yaml create mode 100644 data/items/equipment/rune_platebody.yaml create mode 100644 data/items/equipment/rune_sword.yaml create mode 100644 data/items/equipment/sapphire_amulet_u.yaml create mode 100644 data/items/equipment/sapphire_bracelet.yaml create mode 100644 data/items/equipment/sapphire_necklace.yaml create mode 100644 data/items/equipment/sapphire_ring.yaml create mode 100644 data/items/equipment/shortbow.yaml create mode 100644 data/items/equipment/shortbow_u.yaml create mode 100644 data/items/equipment/spectral_visor.yaml create mode 100644 data/items/equipment/steel_dagger.yaml create mode 100644 data/items/equipment/steel_full_helm.yaml create mode 100644 data/items/equipment/steel_med_helm.yaml create mode 100644 data/items/equipment/steel_platebody.yaml create mode 100644 data/items/equipment/steel_sword.yaml create mode 100644 data/items/equipment/willow_longbow.yaml create mode 100644 data/items/equipment/willow_longbow_u.yaml create mode 100644 data/items/equipment/willow_shortbow.yaml create mode 100644 data/items/equipment/willow_shortbow_u.yaml create mode 100644 data/items/equipment/yew_longbow.yaml create mode 100644 data/items/equipment/yew_longbow_u.yaml create mode 100644 data/items/equipment/yew_shortbow.yaml create mode 100644 data/items/equipment/yew_shortbow_u.yaml delete mode 100644 data/items/eye_of_newt.yaml delete mode 100644 data/items/feather.yaml delete mode 100644 data/items/firesteel.yaml delete mode 100644 data/items/fishing_bait.yaml delete mode 100644 data/items/fishing_rod.yaml delete mode 100644 data/items/flax.yaml delete mode 100644 data/items/fly_fishing_rod.yaml delete mode 100644 data/items/full_restore.yaml delete mode 100644 data/items/gold_amulet_u.yaml delete mode 100644 data/items/gold_bar.yaml delete mode 100644 data/items/gold_bracelet.yaml delete mode 100644 data/items/gold_necklace.yaml delete mode 100644 data/items/gold_ore.yaml delete mode 100644 data/items/gold_ring.yaml delete mode 100644 data/items/graceful_boots.yaml delete mode 100644 data/items/graceful_cape.yaml delete mode 100644 data/items/graceful_gloves.yaml delete mode 100644 data/items/graceful_hat.yaml delete mode 100644 data/items/graceful_legs.yaml delete mode 100644 data/items/graceful_torso.yaml delete mode 100644 data/items/grimy_avantoe.yaml delete mode 100644 data/items/grimy_cadantine.yaml delete mode 100644 data/items/grimy_dwarf_weed.yaml delete mode 100644 data/items/grimy_guam.yaml delete mode 100644 data/items/grimy_harralander.yaml delete mode 100644 data/items/grimy_irit.yaml delete mode 100644 data/items/grimy_kwuarm.yaml delete mode 100644 data/items/grimy_lantadyme.yaml delete mode 100644 data/items/grimy_marrentill.yaml delete mode 100644 data/items/grimy_ranarr.yaml delete mode 100644 data/items/grimy_snapdragon.yaml delete mode 100644 data/items/grimy_tarromin.yaml delete mode 100644 data/items/grimy_toadflax.yaml delete mode 100644 data/items/grimy_torstol.yaml delete mode 100644 data/items/guam.yaml delete mode 100644 data/items/guam_potion_unf.yaml delete mode 100644 data/items/guam_seed.yaml delete mode 100644 data/items/hammer.yaml delete mode 100644 data/items/hard_leather.yaml delete mode 100644 data/items/hard_leather_body.yaml delete mode 100644 data/items/hard_leather_shield.yaml delete mode 100644 data/items/harpoon.yaml delete mode 100644 data/items/harralander.yaml delete mode 100644 data/items/harralander_potion_unf.yaml delete mode 100644 data/items/harralander_seed.yaml delete mode 100644 data/items/headless_arrow.yaml delete mode 100644 data/items/herring.yaml delete mode 100644 data/items/hydro_deck.yaml delete mode 100644 data/items/hydro_identifier.yaml delete mode 100644 data/items/hydrojunk.yaml delete mode 100644 data/items/inoculation_bracelet.yaml delete mode 100644 data/items/insulated_gloves.yaml delete mode 100644 data/items/irit.yaml delete mode 100644 data/items/irit_potion_unf.yaml delete mode 100644 data/items/irit_seed.yaml delete mode 100644 data/items/iron_arrow.yaml delete mode 100644 data/items/iron_arrowtips.yaml delete mode 100644 data/items/iron_axe.yaml delete mode 100644 data/items/iron_bar.yaml delete mode 100644 data/items/iron_bolts.yaml delete mode 100644 data/items/iron_bolts_unf.yaml delete mode 100644 data/items/iron_dagger.yaml delete mode 100644 data/items/iron_full_helm.yaml delete mode 100644 data/items/iron_med_helm.yaml delete mode 100644 data/items/iron_nails.yaml delete mode 100644 data/items/iron_ore.yaml delete mode 100644 data/items/iron_pickaxe.yaml delete mode 100644 data/items/iron_platebody.yaml delete mode 100644 data/items/iron_sword.yaml delete mode 100644 data/items/jug_of_water.yaml delete mode 100644 data/items/knife.yaml delete mode 100644 data/items/kwuarm.yaml delete mode 100644 data/items/kwuarm_potion_unf.yaml delete mode 100644 data/items/kwuarm_seed.yaml delete mode 100644 data/items/lantadyme.yaml delete mode 100644 data/items/lantadyme_potion_unf.yaml delete mode 100644 data/items/lantadyme_seed.yaml delete mode 100644 data/items/law_identifier.yaml delete mode 100644 data/items/lawjunk.yaml delete mode 100644 data/items/leather.yaml delete mode 100644 data/items/leather_body.yaml delete mode 100644 data/items/leather_boots.yaml delete mode 100644 data/items/leather_chaps.yaml delete mode 100644 data/items/leather_cowl.yaml delete mode 100644 data/items/leather_gloves.yaml delete mode 100644 data/items/leather_vambraces.yaml delete mode 100644 data/items/lighter.yaml delete mode 100644 data/items/limpwurt_root.yaml delete mode 100644 data/items/lobster_pot.yaml delete mode 100644 data/items/logs.yaml delete mode 100644 data/items/longbow.yaml delete mode 100644 data/items/longbow_u.yaml delete mode 100644 data/items/magic_logs.yaml delete mode 100644 data/items/magic_longbow.yaml delete mode 100644 data/items/magic_longbow_u.yaml delete mode 100644 data/items/magic_shortbow.yaml delete mode 100644 data/items/magic_shortbow_u.yaml delete mode 100644 data/items/mahogany_logs.yaml delete mode 100644 data/items/mahogany_planks.yaml delete mode 100644 data/items/mahogany_table.yaml delete mode 100644 data/items/maple_logs.yaml delete mode 100644 data/items/maple_longbow.yaml delete mode 100644 data/items/maple_longbow_u.yaml delete mode 100644 data/items/maple_shortbow.yaml delete mode 100644 data/items/maple_shortbow_u.yaml delete mode 100644 data/items/marrentill.yaml delete mode 100644 data/items/marrentill_potion_unf.yaml delete mode 100644 data/items/marrentill_seed.yaml delete mode 100644 data/items/matches.yaml create mode 100644 data/items/materials/adamant_nails.yaml create mode 100644 data/items/materials/adamantite_bar.yaml create mode 100644 data/items/materials/adamantite_ore.yaml create mode 100644 data/items/materials/arachnid_enzyme.yaml create mode 100644 data/items/materials/ashes.yaml create mode 100644 data/items/materials/avantoe.yaml create mode 100644 data/items/materials/ball_of_wool.yaml create mode 100644 data/items/materials/bones.yaml create mode 100644 data/items/materials/bowstring.yaml create mode 100644 data/items/materials/bronze_bar.yaml create mode 100644 data/items/materials/bronze_nails.yaml create mode 100644 data/items/materials/cadantine.yaml create mode 100644 data/items/materials/chocolate_dust.yaml create mode 100644 data/items/materials/clay.yaml create mode 100644 data/items/materials/coal.yaml create mode 100644 data/items/materials/copper_ore.yaml create mode 100644 data/items/materials/cowhide.yaml create mode 100644 data/items/materials/crushed_nest.yaml create mode 100644 data/items/materials/diamond.yaml create mode 100644 data/items/materials/dwarf_weed.yaml create mode 100644 data/items/materials/ectoplasm.yaml create mode 100644 data/items/materials/emerald.yaml create mode 100644 data/items/materials/eye_of_newt.yaml create mode 100644 data/items/materials/feather.yaml create mode 100644 data/items/materials/flax.yaml create mode 100644 data/items/materials/gold_bar.yaml create mode 100644 data/items/materials/gold_ore.yaml create mode 100644 data/items/materials/grimy_avantoe.yaml create mode 100644 data/items/materials/grimy_cadantine.yaml create mode 100644 data/items/materials/grimy_dwarf_weed.yaml create mode 100644 data/items/materials/grimy_guam.yaml create mode 100644 data/items/materials/grimy_harralander.yaml create mode 100644 data/items/materials/grimy_irit.yaml create mode 100644 data/items/materials/grimy_kwuarm.yaml create mode 100644 data/items/materials/grimy_lantadyme.yaml create mode 100644 data/items/materials/grimy_marrentill.yaml create mode 100644 data/items/materials/grimy_ranarr.yaml create mode 100644 data/items/materials/grimy_snapdragon.yaml create mode 100644 data/items/materials/grimy_tarromin.yaml create mode 100644 data/items/materials/grimy_toadflax.yaml create mode 100644 data/items/materials/grimy_torstol.yaml create mode 100644 data/items/materials/guam.yaml create mode 100644 data/items/materials/hard_leather.yaml create mode 100644 data/items/materials/harralander.yaml create mode 100644 data/items/materials/irit.yaml create mode 100644 data/items/materials/iron_bar.yaml create mode 100644 data/items/materials/iron_nails.yaml create mode 100644 data/items/materials/iron_ore.yaml create mode 100644 data/items/materials/kwuarm.yaml create mode 100644 data/items/materials/lantadyme.yaml create mode 100644 data/items/materials/leather.yaml create mode 100644 data/items/materials/limpwurt_root.yaml create mode 100644 data/items/materials/logs.yaml create mode 100644 data/items/materials/magic_logs.yaml create mode 100644 data/items/materials/mahogany_logs.yaml create mode 100644 data/items/materials/mahogany_planks.yaml create mode 100644 data/items/materials/maple_logs.yaml create mode 100644 data/items/materials/marrentill.yaml create mode 100644 data/items/materials/mithril_bar.yaml create mode 100644 data/items/materials/mithril_nails.yaml create mode 100644 data/items/materials/mithril_ore.yaml create mode 100644 data/items/materials/oak_logs.yaml create mode 100644 data/items/materials/oak_planks.yaml create mode 100644 data/items/materials/planks.yaml create mode 100644 data/items/materials/potato_cactus.yaml create mode 100644 data/items/materials/ranarr.yaml create mode 100644 data/items/materials/redwood_logs.yaml create mode 100644 data/items/materials/ruby.yaml create mode 100644 data/items/materials/rune_nails.yaml create mode 100644 data/items/materials/runite_bar.yaml create mode 100644 data/items/materials/runite_ore.yaml create mode 100644 data/items/materials/sacred_eel.yaml create mode 100644 data/items/materials/salt.yaml create mode 100644 data/items/materials/sapphire.yaml create mode 100644 data/items/materials/silver_bar.yaml create mode 100644 data/items/materials/silver_ore.yaml create mode 100644 data/items/materials/slug_mucus.yaml create mode 100644 data/items/materials/snapdragon.yaml create mode 100644 data/items/materials/snape_grass.yaml create mode 100644 data/items/materials/soft_clay.yaml create mode 100644 data/items/materials/steel_bar.yaml create mode 100644 data/items/materials/steel_nails.yaml create mode 100644 data/items/materials/stim_cell.yaml create mode 100644 data/items/materials/tarromin.yaml create mode 100644 data/items/materials/teak_logs.yaml create mode 100644 data/items/materials/teak_planks.yaml create mode 100644 data/items/materials/thread.yaml create mode 100644 data/items/materials/tin_ore.yaml create mode 100644 data/items/materials/toadflax.yaml create mode 100644 data/items/materials/torstol.yaml create mode 100644 data/items/materials/uncut_diamond.yaml create mode 100644 data/items/materials/uncut_emerald.yaml create mode 100644 data/items/materials/uncut_ruby.yaml create mode 100644 data/items/materials/uncut_sapphire.yaml create mode 100644 data/items/materials/vial.yaml create mode 100644 data/items/materials/white_berries.yaml create mode 100644 data/items/materials/willow_logs.yaml create mode 100644 data/items/materials/wool.yaml create mode 100644 data/items/materials/yew_logs.yaml create mode 100644 data/items/misc/birds_nest.yaml create mode 100644 data/items/misc/christmas_cracker.yaml create mode 100644 data/items/misc/circuit_board.yaml create mode 100644 data/items/misc/credit_stick.yaml create mode 100644 data/items/misc/credits.yaml create mode 100644 data/items/misc/mahogany_table.yaml create mode 100644 data/items/misc/nutrient_bar.yaml create mode 100644 data/items/misc/oak_shelf.yaml create mode 100644 data/items/misc/oak_table.yaml create mode 100644 data/items/misc/pass_stub.yaml create mode 100644 data/items/misc/scrap_metal.yaml create mode 100644 data/items/misc/teak_table.yaml create mode 100644 data/items/misc/wooden_chair.yaml create mode 100644 data/items/misc/wooden_shelf.yaml create mode 100644 data/items/misc/wooden_table.yaml delete mode 100644 data/items/mithril_arrow.yaml delete mode 100644 data/items/mithril_arrowtips.yaml delete mode 100644 data/items/mithril_axe.yaml delete mode 100644 data/items/mithril_bar.yaml delete mode 100644 data/items/mithril_bolts.yaml delete mode 100644 data/items/mithril_bolts_unf.yaml delete mode 100644 data/items/mithril_dagger.yaml delete mode 100644 data/items/mithril_full_helm.yaml delete mode 100644 data/items/mithril_med_helm.yaml delete mode 100644 data/items/mithril_nails.yaml delete mode 100644 data/items/mithril_ore.yaml delete mode 100644 data/items/mithril_pickaxe.yaml delete mode 100644 data/items/mithril_platebody.yaml delete mode 100644 data/items/mithril_sword.yaml delete mode 100644 data/items/nano_restore.yaml delete mode 100644 data/items/nature_identifier.yaml delete mode 100644 data/items/naturejunk.yaml delete mode 100644 data/items/necklace_mould.yaml delete mode 100644 data/items/necklace_of_passage.yaml delete mode 100644 data/items/needle.yaml delete mode 100644 data/items/neural_headband.yaml delete mode 100644 data/items/nutrient_bar.yaml delete mode 100644 data/items/oak_logs.yaml delete mode 100644 data/items/oak_longbow.yaml delete mode 100644 data/items/oak_longbow_u.yaml delete mode 100644 data/items/oak_planks.yaml delete mode 100644 data/items/oak_shelf.yaml delete mode 100644 data/items/oak_shortbow.yaml delete mode 100644 data/items/oak_shortbow_u.yaml delete mode 100644 data/items/oak_table.yaml delete mode 100644 data/items/onion.yaml delete mode 100644 data/items/onion_seed.yaml delete mode 100644 data/items/party_hat_blue.yaml delete mode 100644 data/items/party_hat_green.yaml delete mode 100644 data/items/party_hat_pink.yaml delete mode 100644 data/items/party_hat_red.yaml delete mode 100644 data/items/party_hat_white.yaml delete mode 100644 data/items/party_hat_yellow.yaml delete mode 100644 data/items/pass_stub.yaml delete mode 100644 data/items/pastry_dough.yaml delete mode 100644 data/items/phoenix_necklace.yaml delete mode 100644 data/items/pie_dish.yaml delete mode 100644 data/items/pizza_dough.yaml delete mode 100644 data/items/planks.yaml delete mode 100644 data/items/plant_cure.yaml delete mode 100644 data/items/plant_pot.yaml delete mode 100644 data/items/pot_of_flour.yaml delete mode 100644 data/items/potato.yaml delete mode 100644 data/items/potato_cactus.yaml delete mode 100644 data/items/potato_seed.yaml delete mode 100644 data/items/power_amulet.yaml delete mode 100644 data/items/rake.yaml delete mode 100644 data/items/ranarr.yaml delete mode 100644 data/items/ranarr_potion_unf.yaml delete mode 100644 data/items/ranarr_seed.yaml delete mode 100644 data/items/raw_anchovies.yaml delete mode 100644 data/items/raw_anglerfish.yaml delete mode 100644 data/items/raw_bass.yaml delete mode 100644 data/items/raw_beef.yaml delete mode 100644 data/items/raw_cave_eel.yaml delete mode 100644 data/items/raw_cod.yaml delete mode 100644 data/items/raw_herring.yaml delete mode 100644 data/items/raw_lobster.yaml delete mode 100644 data/items/raw_mackerel.yaml delete mode 100644 data/items/raw_pike.yaml delete mode 100644 data/items/raw_rainbow_fish.yaml delete mode 100644 data/items/raw_salmon.yaml delete mode 100644 data/items/raw_sardine.yaml delete mode 100644 data/items/raw_shark.yaml delete mode 100644 data/items/raw_shrimps.yaml delete mode 100644 data/items/raw_slimy_eel.yaml delete mode 100644 data/items/raw_swordfish.yaml delete mode 100644 data/items/raw_trout.yaml delete mode 100644 data/items/raw_tuna.yaml delete mode 100644 data/items/redwood_logs.yaml delete mode 100644 data/items/restoration_compound.yaml delete mode 100644 data/items/ring_mould.yaml delete mode 100644 data/items/ring_of_dueling.yaml delete mode 100644 data/items/ring_of_forging.yaml delete mode 100644 data/items/ring_of_life.yaml delete mode 100644 data/items/ring_of_recoil.yaml delete mode 100644 data/items/ruby.yaml delete mode 100644 data/items/ruby_amulet_u.yaml delete mode 100644 data/items/ruby_bolt_tips.yaml delete mode 100644 data/items/ruby_bolts.yaml delete mode 100644 data/items/ruby_bolts_e.yaml delete mode 100644 data/items/ruby_bracelet.yaml delete mode 100644 data/items/ruby_necklace.yaml delete mode 100644 data/items/ruby_ring.yaml delete mode 100644 data/items/rune_arrow.yaml delete mode 100644 data/items/rune_arrowtips.yaml delete mode 100644 data/items/rune_axe.yaml delete mode 100644 data/items/rune_bolts.yaml delete mode 100644 data/items/rune_bolts_unf.yaml delete mode 100644 data/items/rune_dagger.yaml delete mode 100644 data/items/rune_full_helm.yaml delete mode 100644 data/items/rune_med_helm.yaml delete mode 100644 data/items/rune_nails.yaml delete mode 100644 data/items/rune_pickaxe.yaml delete mode 100644 data/items/rune_platebody.yaml delete mode 100644 data/items/rune_sword.yaml delete mode 100644 data/items/runite_bar.yaml delete mode 100644 data/items/runite_ore.yaml delete mode 100644 data/items/sacred_eel.yaml delete mode 100644 data/items/salmon.yaml delete mode 100644 data/items/salt.yaml delete mode 100644 data/items/sapphire.yaml delete mode 100644 data/items/sapphire_amulet_u.yaml delete mode 100644 data/items/sapphire_bolt_tips.yaml delete mode 100644 data/items/sapphire_bolts.yaml delete mode 100644 data/items/sapphire_bolts_e.yaml delete mode 100644 data/items/sapphire_bracelet.yaml delete mode 100644 data/items/sapphire_necklace.yaml delete mode 100644 data/items/sapphire_ring.yaml delete mode 100644 data/items/sardine.yaml delete mode 100644 data/items/saw.yaml delete mode 100644 data/items/science_serum.yaml delete mode 100644 data/items/scrap_metal.yaml create mode 100644 data/items/seeds/avantoe_seed.yaml create mode 100644 data/items/seeds/cabbage_seed.yaml create mode 100644 data/items/seeds/cadantine_seed.yaml create mode 100644 data/items/seeds/dwarf_weed_seed.yaml create mode 100644 data/items/seeds/guam_seed.yaml create mode 100644 data/items/seeds/harralander_seed.yaml create mode 100644 data/items/seeds/irit_seed.yaml create mode 100644 data/items/seeds/kwuarm_seed.yaml create mode 100644 data/items/seeds/lantadyme_seed.yaml create mode 100644 data/items/seeds/marrentill_seed.yaml create mode 100644 data/items/seeds/onion_seed.yaml create mode 100644 data/items/seeds/potato_seed.yaml create mode 100644 data/items/seeds/ranarr_seed.yaml create mode 100644 data/items/seeds/snapdragon_seed.yaml create mode 100644 data/items/seeds/strawberry_seed.yaml create mode 100644 data/items/seeds/sweetcorn_seed.yaml create mode 100644 data/items/seeds/tarromin_seed.yaml create mode 100644 data/items/seeds/toadflax_seed.yaml create mode 100644 data/items/seeds/tomato_seed.yaml create mode 100644 data/items/seeds/torstol_seed.yaml create mode 100644 data/items/seeds/watermelon_seed.yaml delete mode 100644 data/items/shears.yaml delete mode 100644 data/items/shield_potion.yaml delete mode 100644 data/items/shortbow.yaml delete mode 100644 data/items/shortbow_u.yaml delete mode 100644 data/items/shrimps.yaml delete mode 100644 data/items/silver_bar.yaml delete mode 100644 data/items/silver_ore.yaml delete mode 100644 data/items/slug_mucus.yaml delete mode 100644 data/items/small_fishing_net.yaml delete mode 100644 data/items/snapdragon.yaml delete mode 100644 data/items/snapdragon_potion_unf.yaml delete mode 100644 data/items/snapdragon_seed.yaml delete mode 100644 data/items/snape_grass.yaml delete mode 100644 data/items/soft_clay.yaml delete mode 100644 data/items/solar_deck.yaml delete mode 100644 data/items/solar_identifier.yaml delete mode 100644 data/items/solarjunk.yaml delete mode 100644 data/items/spade.yaml delete mode 100644 data/items/spectral_visor.yaml delete mode 100644 data/items/steel_arrow.yaml delete mode 100644 data/items/steel_arrowtips.yaml delete mode 100644 data/items/steel_axe.yaml delete mode 100644 data/items/steel_bar.yaml delete mode 100644 data/items/steel_bolts.yaml delete mode 100644 data/items/steel_bolts_unf.yaml delete mode 100644 data/items/steel_dagger.yaml delete mode 100644 data/items/steel_full_helm.yaml delete mode 100644 data/items/steel_med_helm.yaml delete mode 100644 data/items/steel_nails.yaml delete mode 100644 data/items/steel_pickaxe.yaml delete mode 100644 data/items/steel_platebody.yaml delete mode 100644 data/items/steel_sword.yaml delete mode 100644 data/items/stim_cell.yaml delete mode 100644 data/items/stim_potion.yaml delete mode 100644 data/items/strawberry.yaml delete mode 100644 data/items/strawberry_seed.yaml delete mode 100644 data/items/super_amp.yaml delete mode 100644 data/items/super_bio_serum.yaml delete mode 100644 data/items/super_shield.yaml delete mode 100644 data/items/super_stim.yaml delete mode 100644 data/items/super_stim_cell.yaml delete mode 100644 data/items/sweetcorn.yaml delete mode 100644 data/items/sweetcorn_seed.yaml delete mode 100644 data/items/targeting_serum.yaml delete mode 100644 data/items/tarromin.yaml delete mode 100644 data/items/tarromin_potion_unf.yaml delete mode 100644 data/items/tarromin_seed.yaml delete mode 100644 data/items/teak_logs.yaml delete mode 100644 data/items/teak_planks.yaml delete mode 100644 data/items/teak_table.yaml delete mode 100644 data/items/tech_serum.yaml delete mode 100644 data/items/thread.yaml delete mode 100644 data/items/tin_ore.yaml delete mode 100644 data/items/toadflax.yaml delete mode 100644 data/items/toadflax_potion_unf.yaml delete mode 100644 data/items/toadflax_seed.yaml delete mode 100644 data/items/tomato.yaml delete mode 100644 data/items/tomato_seed.yaml create mode 100644 data/items/tools/adamant_axe.yaml create mode 100644 data/items/tools/adamant_pickaxe.yaml create mode 100644 data/items/tools/amulet_mould.yaml create mode 100644 data/items/tools/big_fishing_net.yaml create mode 100644 data/items/tools/black_pickaxe.yaml create mode 100644 data/items/tools/bracelet_mould.yaml create mode 100644 data/items/tools/bronze_axe.yaml create mode 100644 data/items/tools/bronze_pickaxe.yaml create mode 100644 data/items/tools/chisel.yaml create mode 100644 data/items/tools/dragon_pickaxe.yaml create mode 100644 data/items/tools/empty_bucket.yaml create mode 100644 data/items/tools/empty_jug.yaml create mode 100644 data/items/tools/empty_pot.yaml create mode 100644 data/items/tools/firesteel.yaml create mode 100644 data/items/tools/fishing_bait.yaml create mode 100644 data/items/tools/fishing_rod.yaml create mode 100644 data/items/tools/fly_fishing_rod.yaml create mode 100644 data/items/tools/hammer.yaml create mode 100644 data/items/tools/harpoon.yaml create mode 100644 data/items/tools/iron_axe.yaml create mode 100644 data/items/tools/iron_pickaxe.yaml create mode 100644 data/items/tools/knife.yaml create mode 100644 data/items/tools/lighter.yaml create mode 100644 data/items/tools/lobster_pot.yaml create mode 100644 data/items/tools/matches.yaml create mode 100644 data/items/tools/mithril_axe.yaml create mode 100644 data/items/tools/mithril_pickaxe.yaml create mode 100644 data/items/tools/necklace_mould.yaml create mode 100644 data/items/tools/needle.yaml create mode 100644 data/items/tools/plant_pot.yaml create mode 100644 data/items/tools/rake.yaml create mode 100644 data/items/tools/ring_mould.yaml create mode 100644 data/items/tools/rune_axe.yaml create mode 100644 data/items/tools/rune_pickaxe.yaml create mode 100644 data/items/tools/saw.yaml create mode 100644 data/items/tools/shears.yaml create mode 100644 data/items/tools/small_fishing_net.yaml create mode 100644 data/items/tools/spade.yaml create mode 100644 data/items/tools/steel_axe.yaml create mode 100644 data/items/tools/steel_pickaxe.yaml create mode 100644 data/items/tools/unfired_pie_dish.yaml create mode 100644 data/items/tools/unfired_plant_pot.yaml create mode 100644 data/items/tools/unfired_pot.yaml create mode 100644 data/items/tools/watering_can.yaml delete mode 100644 data/items/torstol.yaml delete mode 100644 data/items/torstol_potion_unf.yaml delete mode 100644 data/items/torstol_seed.yaml delete mode 100644 data/items/trout.yaml delete mode 100644 data/items/uncut_diamond.yaml delete mode 100644 data/items/uncut_emerald.yaml delete mode 100644 data/items/uncut_ruby.yaml delete mode 100644 data/items/uncut_sapphire.yaml delete mode 100644 data/items/unfired_pie_dish.yaml delete mode 100644 data/items/unfired_plant_pot.yaml delete mode 100644 data/items/unfired_pot.yaml delete mode 100644 data/items/vial.yaml delete mode 100644 data/items/vial_of_water.yaml delete mode 100644 data/items/watering_can.yaml delete mode 100644 data/items/watermelon.yaml delete mode 100644 data/items/watermelon_seed.yaml delete mode 100644 data/items/white_berries.yaml delete mode 100644 data/items/willow_logs.yaml delete mode 100644 data/items/willow_longbow.yaml delete mode 100644 data/items/willow_longbow_u.yaml delete mode 100644 data/items/willow_shortbow.yaml delete mode 100644 data/items/willow_shortbow_u.yaml delete mode 100644 data/items/wooden_chair.yaml delete mode 100644 data/items/wooden_shelf.yaml delete mode 100644 data/items/wooden_table.yaml delete mode 100644 data/items/wool.yaml delete mode 100644 data/items/yew_logs.yaml delete mode 100644 data/items/yew_longbow.yaml delete mode 100644 data/items/yew_longbow_u.yaml delete mode 100644 data/items/yew_shortbow.yaml delete mode 100644 data/items/yew_shortbow_u.yaml create mode 100644 data/recipes/clean/clean_avantoe.yaml create mode 100644 data/recipes/clean/clean_cadantine.yaml create mode 100644 data/recipes/clean/clean_dwarf_weed.yaml create mode 100644 data/recipes/clean/clean_guam.yaml create mode 100644 data/recipes/clean/clean_harralander.yaml create mode 100644 data/recipes/clean/clean_irit.yaml create mode 100644 data/recipes/clean/clean_kwuarm.yaml create mode 100644 data/recipes/clean/clean_lantadyme.yaml create mode 100644 data/recipes/clean/clean_marrentill.yaml create mode 100644 data/recipes/clean/clean_ranarr.yaml create mode 100644 data/recipes/clean/clean_snapdragon.yaml create mode 100644 data/recipes/clean/clean_tarromin.yaml create mode 100644 data/recipes/clean/clean_toadflax.yaml create mode 100644 data/recipes/clean/clean_torstol.yaml delete mode 100644 data/recipes/clean_avantoe.yaml delete mode 100644 data/recipes/clean_cadantine.yaml delete mode 100644 data/recipes/clean_dwarf_weed.yaml delete mode 100644 data/recipes/clean_guam.yaml delete mode 100644 data/recipes/clean_harralander.yaml delete mode 100644 data/recipes/clean_irit.yaml delete mode 100644 data/recipes/clean_kwuarm.yaml delete mode 100644 data/recipes/clean_lantadyme.yaml delete mode 100644 data/recipes/clean_marrentill.yaml delete mode 100644 data/recipes/clean_ranarr.yaml delete mode 100644 data/recipes/clean_snapdragon.yaml delete mode 100644 data/recipes/clean_tarromin.yaml delete mode 100644 data/recipes/clean_toadflax.yaml delete mode 100644 data/recipes/clean_torstol.yaml delete mode 100644 data/recipes/construct_mahogany_planks.yaml delete mode 100644 data/recipes/construct_mahogany_table.yaml delete mode 100644 data/recipes/construct_oak_planks.yaml delete mode 100644 data/recipes/construct_oak_shelf.yaml delete mode 100644 data/recipes/construct_oak_table.yaml delete mode 100644 data/recipes/construct_planks.yaml delete mode 100644 data/recipes/construct_teak_planks.yaml delete mode 100644 data/recipes/construct_teak_table.yaml delete mode 100644 data/recipes/construct_wooden_chair.yaml delete mode 100644 data/recipes/construct_wooden_shelf.yaml delete mode 100644 data/recipes/construct_wooden_table.yaml create mode 100644 data/recipes/construction/construct_mahogany_planks.yaml create mode 100644 data/recipes/construction/construct_mahogany_table.yaml create mode 100644 data/recipes/construction/construct_oak_planks.yaml create mode 100644 data/recipes/construction/construct_oak_shelf.yaml create mode 100644 data/recipes/construction/construct_oak_table.yaml create mode 100644 data/recipes/construction/construct_planks.yaml create mode 100644 data/recipes/construction/construct_teak_planks.yaml create mode 100644 data/recipes/construction/construct_teak_table.yaml create mode 100644 data/recipes/construction/construct_wooden_chair.yaml create mode 100644 data/recipes/construction/construct_wooden_shelf.yaml create mode 100644 data/recipes/construction/construct_wooden_table.yaml delete mode 100644 data/recipes/cook_anchovies.yaml delete mode 100644 data/recipes/cook_bread.yaml delete mode 100644 data/recipes/cook_herring.yaml delete mode 100644 data/recipes/cook_salmon.yaml delete mode 100644 data/recipes/cook_sardine.yaml delete mode 100644 data/recipes/cook_shrimps.yaml delete mode 100644 data/recipes/cook_trout.yaml create mode 100644 data/recipes/cooking/cook_anchovies.yaml create mode 100644 data/recipes/cooking/cook_bread.yaml create mode 100644 data/recipes/cooking/cook_herring.yaml create mode 100644 data/recipes/cooking/cook_salmon.yaml create mode 100644 data/recipes/cooking/cook_sardine.yaml create mode 100644 data/recipes/cooking/cook_shrimps.yaml create mode 100644 data/recipes/cooking/cook_trout.yaml delete mode 100644 data/recipes/craft_ball_of_wool.yaml delete mode 100644 data/recipes/craft_bowstring.yaml delete mode 100644 data/recipes/craft_coif.yaml delete mode 100644 data/recipes/craft_cut_diamond.yaml delete mode 100644 data/recipes/craft_cut_emerald.yaml delete mode 100644 data/recipes/craft_cut_ruby.yaml delete mode 100644 data/recipes/craft_cut_sapphire.yaml delete mode 100644 data/recipes/craft_diamond_amulet_u.yaml delete mode 100644 data/recipes/craft_diamond_bracelet.yaml delete mode 100644 data/recipes/craft_diamond_necklace.yaml delete mode 100644 data/recipes/craft_diamond_ring.yaml delete mode 100644 data/recipes/craft_emerald_amulet_u.yaml delete mode 100644 data/recipes/craft_emerald_bracelet.yaml delete mode 100644 data/recipes/craft_emerald_necklace.yaml delete mode 100644 data/recipes/craft_emerald_ring.yaml delete mode 100644 data/recipes/craft_gold_amulet_u.yaml delete mode 100644 data/recipes/craft_gold_bracelet.yaml delete mode 100644 data/recipes/craft_gold_necklace.yaml delete mode 100644 data/recipes/craft_gold_ring.yaml delete mode 100644 data/recipes/craft_hard_leather_body.yaml delete mode 100644 data/recipes/craft_hard_leather_shield.yaml delete mode 100644 data/recipes/craft_leather_body.yaml delete mode 100644 data/recipes/craft_leather_boots.yaml delete mode 100644 data/recipes/craft_leather_chaps.yaml delete mode 100644 data/recipes/craft_leather_cowl.yaml delete mode 100644 data/recipes/craft_leather_gloves.yaml delete mode 100644 data/recipes/craft_leather_vambraces.yaml delete mode 100644 data/recipes/craft_pie_dish.yaml delete mode 100644 data/recipes/craft_plant_pot.yaml delete mode 100644 data/recipes/craft_pot.yaml delete mode 100644 data/recipes/craft_ruby_amulet_u.yaml delete mode 100644 data/recipes/craft_ruby_bracelet.yaml delete mode 100644 data/recipes/craft_ruby_necklace.yaml delete mode 100644 data/recipes/craft_ruby_ring.yaml delete mode 100644 data/recipes/craft_sapphire_amulet_u.yaml delete mode 100644 data/recipes/craft_sapphire_bracelet.yaml delete mode 100644 data/recipes/craft_sapphire_necklace.yaml delete mode 100644 data/recipes/craft_sapphire_ring.yaml delete mode 100644 data/recipes/craft_unfired_pie_dish.yaml delete mode 100644 data/recipes/craft_unfired_plant_pot.yaml delete mode 100644 data/recipes/craft_unfired_pot.yaml create mode 100644 data/recipes/crafting/craft_ball_of_wool.yaml create mode 100644 data/recipes/crafting/craft_bowstring.yaml create mode 100644 data/recipes/crafting/craft_coif.yaml create mode 100644 data/recipes/crafting/craft_cut_diamond.yaml create mode 100644 data/recipes/crafting/craft_cut_emerald.yaml create mode 100644 data/recipes/crafting/craft_cut_ruby.yaml create mode 100644 data/recipes/crafting/craft_cut_sapphire.yaml create mode 100644 data/recipes/crafting/craft_diamond_amulet_u.yaml create mode 100644 data/recipes/crafting/craft_diamond_bracelet.yaml create mode 100644 data/recipes/crafting/craft_diamond_necklace.yaml create mode 100644 data/recipes/crafting/craft_diamond_ring.yaml create mode 100644 data/recipes/crafting/craft_emerald_amulet_u.yaml create mode 100644 data/recipes/crafting/craft_emerald_bracelet.yaml create mode 100644 data/recipes/crafting/craft_emerald_necklace.yaml create mode 100644 data/recipes/crafting/craft_emerald_ring.yaml create mode 100644 data/recipes/crafting/craft_gold_amulet_u.yaml create mode 100644 data/recipes/crafting/craft_gold_bracelet.yaml create mode 100644 data/recipes/crafting/craft_gold_necklace.yaml create mode 100644 data/recipes/crafting/craft_gold_ring.yaml create mode 100644 data/recipes/crafting/craft_hard_leather_body.yaml create mode 100644 data/recipes/crafting/craft_hard_leather_shield.yaml create mode 100644 data/recipes/crafting/craft_leather_body.yaml create mode 100644 data/recipes/crafting/craft_leather_boots.yaml create mode 100644 data/recipes/crafting/craft_leather_chaps.yaml create mode 100644 data/recipes/crafting/craft_leather_cowl.yaml create mode 100644 data/recipes/crafting/craft_leather_gloves.yaml create mode 100644 data/recipes/crafting/craft_leather_vambraces.yaml create mode 100644 data/recipes/crafting/craft_pie_dish.yaml create mode 100644 data/recipes/crafting/craft_plant_pot.yaml create mode 100644 data/recipes/crafting/craft_pot.yaml create mode 100644 data/recipes/crafting/craft_ruby_amulet_u.yaml create mode 100644 data/recipes/crafting/craft_ruby_bracelet.yaml create mode 100644 data/recipes/crafting/craft_ruby_necklace.yaml create mode 100644 data/recipes/crafting/craft_ruby_ring.yaml create mode 100644 data/recipes/crafting/craft_sapphire_amulet_u.yaml create mode 100644 data/recipes/crafting/craft_sapphire_bracelet.yaml create mode 100644 data/recipes/crafting/craft_sapphire_necklace.yaml create mode 100644 data/recipes/crafting/craft_sapphire_ring.yaml create mode 100644 data/recipes/crafting/craft_unfired_pie_dish.yaml create mode 100644 data/recipes/crafting/craft_unfired_plant_pot.yaml create mode 100644 data/recipes/crafting/craft_unfired_pot.yaml delete mode 100644 data/recipes/fletch_adamant_arrow.yaml delete mode 100644 data/recipes/fletch_adamant_bolts.yaml delete mode 100644 data/recipes/fletch_arrow_shaft.yaml delete mode 100644 data/recipes/fletch_arrow_shaft_magic.yaml delete mode 100644 data/recipes/fletch_arrow_shaft_maple.yaml delete mode 100644 data/recipes/fletch_arrow_shaft_oak.yaml delete mode 100644 data/recipes/fletch_arrow_shaft_willow.yaml delete mode 100644 data/recipes/fletch_arrow_shaft_yew.yaml delete mode 100644 data/recipes/fletch_bronze_arrow.yaml delete mode 100644 data/recipes/fletch_bronze_bolts.yaml delete mode 100644 data/recipes/fletch_diamond_bolt_tips.yaml delete mode 100644 data/recipes/fletch_diamond_bolts.yaml delete mode 100644 data/recipes/fletch_emerald_bolt_tips.yaml delete mode 100644 data/recipes/fletch_emerald_bolts.yaml delete mode 100644 data/recipes/fletch_headless_arrow.yaml delete mode 100644 data/recipes/fletch_iron_arrow.yaml delete mode 100644 data/recipes/fletch_iron_bolts.yaml delete mode 100644 data/recipes/fletch_longbow.yaml delete mode 100644 data/recipes/fletch_longbow_u.yaml delete mode 100644 data/recipes/fletch_magic_longbow.yaml delete mode 100644 data/recipes/fletch_magic_longbow_u.yaml delete mode 100644 data/recipes/fletch_magic_shortbow.yaml delete mode 100644 data/recipes/fletch_magic_shortbow_u.yaml delete mode 100644 data/recipes/fletch_maple_longbow.yaml delete mode 100644 data/recipes/fletch_maple_longbow_u.yaml delete mode 100644 data/recipes/fletch_maple_shortbow.yaml delete mode 100644 data/recipes/fletch_maple_shortbow_u.yaml delete mode 100644 data/recipes/fletch_mithril_arrow.yaml delete mode 100644 data/recipes/fletch_mithril_bolts.yaml delete mode 100644 data/recipes/fletch_oak_longbow.yaml delete mode 100644 data/recipes/fletch_oak_longbow_u.yaml delete mode 100644 data/recipes/fletch_oak_shortbow.yaml delete mode 100644 data/recipes/fletch_oak_shortbow_u.yaml delete mode 100644 data/recipes/fletch_ruby_bolt_tips.yaml delete mode 100644 data/recipes/fletch_ruby_bolts.yaml delete mode 100644 data/recipes/fletch_rune_arrow.yaml delete mode 100644 data/recipes/fletch_rune_bolts.yaml delete mode 100644 data/recipes/fletch_sapphire_bolt_tips.yaml delete mode 100644 data/recipes/fletch_sapphire_bolts.yaml delete mode 100644 data/recipes/fletch_shortbow.yaml delete mode 100644 data/recipes/fletch_shortbow_u.yaml delete mode 100644 data/recipes/fletch_steel_arrow.yaml delete mode 100644 data/recipes/fletch_steel_bolts.yaml delete mode 100644 data/recipes/fletch_willow_longbow.yaml delete mode 100644 data/recipes/fletch_willow_longbow_u.yaml delete mode 100644 data/recipes/fletch_willow_shortbow.yaml delete mode 100644 data/recipes/fletch_willow_shortbow_u.yaml delete mode 100644 data/recipes/fletch_yew_longbow.yaml delete mode 100644 data/recipes/fletch_yew_longbow_u.yaml delete mode 100644 data/recipes/fletch_yew_shortbow.yaml delete mode 100644 data/recipes/fletch_yew_shortbow_u.yaml create mode 100644 data/recipes/fletching/fletch_adamant_arrow.yaml create mode 100644 data/recipes/fletching/fletch_adamant_bolts.yaml create mode 100644 data/recipes/fletching/fletch_arrow_shaft.yaml create mode 100644 data/recipes/fletching/fletch_arrow_shaft_magic.yaml create mode 100644 data/recipes/fletching/fletch_arrow_shaft_maple.yaml create mode 100644 data/recipes/fletching/fletch_arrow_shaft_oak.yaml create mode 100644 data/recipes/fletching/fletch_arrow_shaft_willow.yaml create mode 100644 data/recipes/fletching/fletch_arrow_shaft_yew.yaml create mode 100644 data/recipes/fletching/fletch_bronze_arrow.yaml create mode 100644 data/recipes/fletching/fletch_bronze_bolts.yaml create mode 100644 data/recipes/fletching/fletch_diamond_bolt_tips.yaml create mode 100644 data/recipes/fletching/fletch_diamond_bolts.yaml create mode 100644 data/recipes/fletching/fletch_emerald_bolt_tips.yaml create mode 100644 data/recipes/fletching/fletch_emerald_bolts.yaml create mode 100644 data/recipes/fletching/fletch_headless_arrow.yaml create mode 100644 data/recipes/fletching/fletch_iron_arrow.yaml create mode 100644 data/recipes/fletching/fletch_iron_bolts.yaml create mode 100644 data/recipes/fletching/fletch_longbow.yaml create mode 100644 data/recipes/fletching/fletch_longbow_u.yaml create mode 100644 data/recipes/fletching/fletch_magic_longbow.yaml create mode 100644 data/recipes/fletching/fletch_magic_longbow_u.yaml create mode 100644 data/recipes/fletching/fletch_magic_shortbow.yaml create mode 100644 data/recipes/fletching/fletch_magic_shortbow_u.yaml create mode 100644 data/recipes/fletching/fletch_maple_longbow.yaml create mode 100644 data/recipes/fletching/fletch_maple_longbow_u.yaml create mode 100644 data/recipes/fletching/fletch_maple_shortbow.yaml create mode 100644 data/recipes/fletching/fletch_maple_shortbow_u.yaml create mode 100644 data/recipes/fletching/fletch_mithril_arrow.yaml create mode 100644 data/recipes/fletching/fletch_mithril_bolts.yaml create mode 100644 data/recipes/fletching/fletch_oak_longbow.yaml create mode 100644 data/recipes/fletching/fletch_oak_longbow_u.yaml create mode 100644 data/recipes/fletching/fletch_oak_shortbow.yaml create mode 100644 data/recipes/fletching/fletch_oak_shortbow_u.yaml create mode 100644 data/recipes/fletching/fletch_ruby_bolt_tips.yaml create mode 100644 data/recipes/fletching/fletch_ruby_bolts.yaml create mode 100644 data/recipes/fletching/fletch_rune_arrow.yaml create mode 100644 data/recipes/fletching/fletch_rune_bolts.yaml create mode 100644 data/recipes/fletching/fletch_sapphire_bolt_tips.yaml create mode 100644 data/recipes/fletching/fletch_sapphire_bolts.yaml create mode 100644 data/recipes/fletching/fletch_shortbow.yaml create mode 100644 data/recipes/fletching/fletch_shortbow_u.yaml create mode 100644 data/recipes/fletching/fletch_steel_arrow.yaml create mode 100644 data/recipes/fletching/fletch_steel_bolts.yaml create mode 100644 data/recipes/fletching/fletch_willow_longbow.yaml create mode 100644 data/recipes/fletching/fletch_willow_longbow_u.yaml create mode 100644 data/recipes/fletching/fletch_willow_shortbow.yaml create mode 100644 data/recipes/fletching/fletch_willow_shortbow_u.yaml create mode 100644 data/recipes/fletching/fletch_yew_longbow.yaml create mode 100644 data/recipes/fletching/fletch_yew_longbow_u.yaml create mode 100644 data/recipes/fletching/fletch_yew_shortbow.yaml create mode 100644 data/recipes/fletching/fletch_yew_shortbow_u.yaml delete mode 100644 data/recipes/mix_amp_potion.yaml delete mode 100644 data/recipes/mix_bio_serum.yaml delete mode 100644 data/recipes/mix_full_restore.yaml delete mode 100644 data/recipes/mix_nano_restore.yaml delete mode 100644 data/recipes/mix_restoration_compound.yaml delete mode 100644 data/recipes/mix_science_serum.yaml delete mode 100644 data/recipes/mix_shield_potion.yaml delete mode 100644 data/recipes/mix_stim_cell.yaml delete mode 100644 data/recipes/mix_stim_potion.yaml delete mode 100644 data/recipes/mix_super_amp.yaml delete mode 100644 data/recipes/mix_super_bio_serum.yaml delete mode 100644 data/recipes/mix_super_shield.yaml delete mode 100644 data/recipes/mix_super_stim.yaml delete mode 100644 data/recipes/mix_super_stim_cell.yaml delete mode 100644 data/recipes/mix_targeting_serum.yaml delete mode 100644 data/recipes/mix_tech_serum.yaml create mode 100644 data/recipes/mixing/mix_amp_potion.yaml create mode 100644 data/recipes/mixing/mix_bio_serum.yaml create mode 100644 data/recipes/mixing/mix_full_restore.yaml create mode 100644 data/recipes/mixing/mix_nano_restore.yaml create mode 100644 data/recipes/mixing/mix_restoration_compound.yaml create mode 100644 data/recipes/mixing/mix_science_serum.yaml create mode 100644 data/recipes/mixing/mix_shield_potion.yaml create mode 100644 data/recipes/mixing/mix_stim_cell.yaml create mode 100644 data/recipes/mixing/mix_stim_potion.yaml create mode 100644 data/recipes/mixing/mix_super_amp.yaml create mode 100644 data/recipes/mixing/mix_super_bio_serum.yaml create mode 100644 data/recipes/mixing/mix_super_shield.yaml create mode 100644 data/recipes/mixing/mix_super_stim.yaml create mode 100644 data/recipes/mixing/mix_super_stim_cell.yaml create mode 100644 data/recipes/mixing/mix_targeting_serum.yaml create mode 100644 data/recipes/mixing/mix_tech_serum.yaml delete mode 100644 data/recipes/smelt_adamantite.yaml delete mode 100644 data/recipes/smelt_bronze.yaml delete mode 100644 data/recipes/smelt_gold.yaml delete mode 100644 data/recipes/smelt_iron.yaml delete mode 100644 data/recipes/smelt_mithril.yaml delete mode 100644 data/recipes/smelt_runite.yaml delete mode 100644 data/recipes/smelt_silver.yaml delete mode 100644 data/recipes/smelt_steel.yaml create mode 100644 data/recipes/smelting/smelt_adamantite.yaml create mode 100644 data/recipes/smelting/smelt_bronze.yaml create mode 100644 data/recipes/smelting/smelt_gold.yaml create mode 100644 data/recipes/smelting/smelt_iron.yaml create mode 100644 data/recipes/smelting/smelt_mithril.yaml create mode 100644 data/recipes/smelting/smelt_runite.yaml create mode 100644 data/recipes/smelting/smelt_silver.yaml create mode 100644 data/recipes/smelting/smelt_steel.yaml delete mode 100644 data/recipes/smith_adamant_arrowtips.yaml delete mode 100644 data/recipes/smith_adamant_bolts_unf.yaml delete mode 100644 data/recipes/smith_adamant_dagger.yaml delete mode 100644 data/recipes/smith_adamant_full_helm.yaml delete mode 100644 data/recipes/smith_adamant_med_helm.yaml delete mode 100644 data/recipes/smith_adamant_nails.yaml delete mode 100644 data/recipes/smith_adamant_platebody.yaml delete mode 100644 data/recipes/smith_adamant_sword.yaml delete mode 100644 data/recipes/smith_bronze_arrowtips.yaml delete mode 100644 data/recipes/smith_bronze_bolts_unf.yaml delete mode 100644 data/recipes/smith_bronze_dagger.yaml delete mode 100644 data/recipes/smith_bronze_full_helm.yaml delete mode 100644 data/recipes/smith_bronze_med_helm.yaml delete mode 100644 data/recipes/smith_bronze_nails.yaml delete mode 100644 data/recipes/smith_bronze_platebody.yaml delete mode 100644 data/recipes/smith_bronze_sword.yaml delete mode 100644 data/recipes/smith_iron_arrowtips.yaml delete mode 100644 data/recipes/smith_iron_bolts_unf.yaml delete mode 100644 data/recipes/smith_iron_dagger.yaml delete mode 100644 data/recipes/smith_iron_full_helm.yaml delete mode 100644 data/recipes/smith_iron_med_helm.yaml delete mode 100644 data/recipes/smith_iron_nails.yaml delete mode 100644 data/recipes/smith_iron_platebody.yaml delete mode 100644 data/recipes/smith_iron_sword.yaml delete mode 100644 data/recipes/smith_mithril_arrowtips.yaml delete mode 100644 data/recipes/smith_mithril_bolts_unf.yaml delete mode 100644 data/recipes/smith_mithril_dagger.yaml delete mode 100644 data/recipes/smith_mithril_full_helm.yaml delete mode 100644 data/recipes/smith_mithril_med_helm.yaml delete mode 100644 data/recipes/smith_mithril_nails.yaml delete mode 100644 data/recipes/smith_mithril_platebody.yaml delete mode 100644 data/recipes/smith_mithril_sword.yaml delete mode 100644 data/recipes/smith_rune_arrowtips.yaml delete mode 100644 data/recipes/smith_rune_bolts_unf.yaml delete mode 100644 data/recipes/smith_rune_dagger.yaml delete mode 100644 data/recipes/smith_rune_full_helm.yaml delete mode 100644 data/recipes/smith_rune_med_helm.yaml delete mode 100644 data/recipes/smith_rune_nails.yaml delete mode 100644 data/recipes/smith_rune_platebody.yaml delete mode 100644 data/recipes/smith_rune_sword.yaml delete mode 100644 data/recipes/smith_steel_arrowtips.yaml delete mode 100644 data/recipes/smith_steel_bolts_unf.yaml delete mode 100644 data/recipes/smith_steel_dagger.yaml delete mode 100644 data/recipes/smith_steel_full_helm.yaml delete mode 100644 data/recipes/smith_steel_med_helm.yaml delete mode 100644 data/recipes/smith_steel_nails.yaml delete mode 100644 data/recipes/smith_steel_platebody.yaml delete mode 100644 data/recipes/smith_steel_sword.yaml create mode 100644 data/recipes/smithing/smith_adamant_arrowtips.yaml create mode 100644 data/recipes/smithing/smith_adamant_bolts_unf.yaml create mode 100644 data/recipes/smithing/smith_adamant_dagger.yaml create mode 100644 data/recipes/smithing/smith_adamant_full_helm.yaml create mode 100644 data/recipes/smithing/smith_adamant_med_helm.yaml create mode 100644 data/recipes/smithing/smith_adamant_nails.yaml create mode 100644 data/recipes/smithing/smith_adamant_platebody.yaml create mode 100644 data/recipes/smithing/smith_adamant_sword.yaml create mode 100644 data/recipes/smithing/smith_bronze_arrowtips.yaml create mode 100644 data/recipes/smithing/smith_bronze_bolts_unf.yaml create mode 100644 data/recipes/smithing/smith_bronze_dagger.yaml create mode 100644 data/recipes/smithing/smith_bronze_full_helm.yaml create mode 100644 data/recipes/smithing/smith_bronze_med_helm.yaml create mode 100644 data/recipes/smithing/smith_bronze_nails.yaml create mode 100644 data/recipes/smithing/smith_bronze_platebody.yaml create mode 100644 data/recipes/smithing/smith_bronze_sword.yaml create mode 100644 data/recipes/smithing/smith_iron_arrowtips.yaml create mode 100644 data/recipes/smithing/smith_iron_bolts_unf.yaml create mode 100644 data/recipes/smithing/smith_iron_dagger.yaml create mode 100644 data/recipes/smithing/smith_iron_full_helm.yaml create mode 100644 data/recipes/smithing/smith_iron_med_helm.yaml create mode 100644 data/recipes/smithing/smith_iron_nails.yaml create mode 100644 data/recipes/smithing/smith_iron_platebody.yaml create mode 100644 data/recipes/smithing/smith_iron_sword.yaml create mode 100644 data/recipes/smithing/smith_mithril_arrowtips.yaml create mode 100644 data/recipes/smithing/smith_mithril_bolts_unf.yaml create mode 100644 data/recipes/smithing/smith_mithril_dagger.yaml create mode 100644 data/recipes/smithing/smith_mithril_full_helm.yaml create mode 100644 data/recipes/smithing/smith_mithril_med_helm.yaml create mode 100644 data/recipes/smithing/smith_mithril_nails.yaml create mode 100644 data/recipes/smithing/smith_mithril_platebody.yaml create mode 100644 data/recipes/smithing/smith_mithril_sword.yaml create mode 100644 data/recipes/smithing/smith_rune_arrowtips.yaml create mode 100644 data/recipes/smithing/smith_rune_bolts_unf.yaml create mode 100644 data/recipes/smithing/smith_rune_dagger.yaml create mode 100644 data/recipes/smithing/smith_rune_full_helm.yaml create mode 100644 data/recipes/smithing/smith_rune_med_helm.yaml create mode 100644 data/recipes/smithing/smith_rune_nails.yaml create mode 100644 data/recipes/smithing/smith_rune_platebody.yaml create mode 100644 data/recipes/smithing/smith_rune_sword.yaml create mode 100644 data/recipes/smithing/smith_steel_arrowtips.yaml create mode 100644 data/recipes/smithing/smith_steel_bolts_unf.yaml create mode 100644 data/recipes/smithing/smith_steel_dagger.yaml create mode 100644 data/recipes/smithing/smith_steel_full_helm.yaml create mode 100644 data/recipes/smithing/smith_steel_med_helm.yaml create mode 100644 data/recipes/smithing/smith_steel_nails.yaml create mode 100644 data/recipes/smithing/smith_steel_platebody.yaml create mode 100644 data/recipes/smithing/smith_steel_sword.yaml delete mode 100644 data/rooms/1.yaml delete mode 100644 data/rooms/10.yaml delete mode 100644 data/rooms/11.yaml delete mode 100644 data/rooms/12.yaml delete mode 100644 data/rooms/13.yaml delete mode 100644 data/rooms/14.yaml delete mode 100644 data/rooms/15.yaml delete mode 100644 data/rooms/150.yaml delete mode 100644 data/rooms/151.yaml delete mode 100644 data/rooms/152.yaml delete mode 100644 data/rooms/16.yaml delete mode 100644 data/rooms/160.yaml delete mode 100644 data/rooms/161.yaml delete mode 100644 data/rooms/162.yaml delete mode 100644 data/rooms/17.yaml delete mode 100644 data/rooms/170.yaml delete mode 100644 data/rooms/171.yaml delete mode 100644 data/rooms/18.yaml delete mode 100644 data/rooms/19.yaml delete mode 100644 data/rooms/2.yaml delete mode 100644 data/rooms/20.yaml delete mode 100644 data/rooms/200.yaml delete mode 100644 data/rooms/201.yaml delete mode 100644 data/rooms/202.yaml delete mode 100644 data/rooms/203.yaml delete mode 100644 data/rooms/204.yaml delete mode 100644 data/rooms/205.yaml delete mode 100644 data/rooms/21.yaml delete mode 100644 data/rooms/210.yaml delete mode 100644 data/rooms/211.yaml delete mode 100644 data/rooms/212.yaml delete mode 100644 data/rooms/213.yaml delete mode 100644 data/rooms/214.yaml delete mode 100644 data/rooms/215.yaml delete mode 100644 data/rooms/22.yaml delete mode 100644 data/rooms/220.yaml delete mode 100644 data/rooms/221.yaml delete mode 100644 data/rooms/222.yaml delete mode 100644 data/rooms/223.yaml delete mode 100644 data/rooms/224.yaml delete mode 100644 data/rooms/225.yaml delete mode 100644 data/rooms/226.yaml delete mode 100644 data/rooms/23.yaml delete mode 100644 data/rooms/24.yaml delete mode 100644 data/rooms/25.yaml delete mode 100644 data/rooms/26.yaml delete mode 100644 data/rooms/27.yaml delete mode 100644 data/rooms/28.yaml delete mode 100644 data/rooms/3.yaml delete mode 100644 data/rooms/30.yaml delete mode 100644 data/rooms/31.yaml delete mode 100644 data/rooms/4.yaml delete mode 100644 data/rooms/5.yaml delete mode 100644 data/rooms/50.yaml delete mode 100644 data/rooms/51.yaml delete mode 100644 data/rooms/52.yaml delete mode 100644 data/rooms/53.yaml delete mode 100644 data/rooms/54.yaml delete mode 100644 data/rooms/55.yaml delete mode 100644 data/rooms/56.yaml delete mode 100644 data/rooms/57.yaml delete mode 100644 data/rooms/58.yaml delete mode 100644 data/rooms/59.yaml delete mode 100644 data/rooms/6.yaml delete mode 100644 data/rooms/60.yaml delete mode 100644 data/rooms/61.yaml delete mode 100644 data/rooms/62.yaml delete mode 100644 data/rooms/63.yaml delete mode 100644 data/rooms/64.yaml delete mode 100644 data/rooms/65.yaml delete mode 100644 data/rooms/66.yaml delete mode 100644 data/rooms/67.yaml delete mode 100644 data/rooms/68.yaml delete mode 100644 data/rooms/7.yaml delete mode 100644 data/rooms/8.yaml delete mode 100644 data/rooms/9.yaml create mode 100644 data/rooms/agility/200.yaml create mode 100644 data/rooms/agility/201.yaml create mode 100644 data/rooms/agility/202.yaml create mode 100644 data/rooms/agility/203.yaml create mode 100644 data/rooms/agility/204.yaml create mode 100644 data/rooms/agility/205.yaml create mode 100644 data/rooms/agility/210.yaml create mode 100644 data/rooms/agility/211.yaml create mode 100644 data/rooms/agility/212.yaml create mode 100644 data/rooms/agility/213.yaml create mode 100644 data/rooms/agility/214.yaml create mode 100644 data/rooms/agility/215.yaml create mode 100644 data/rooms/agility/220.yaml create mode 100644 data/rooms/agility/221.yaml create mode 100644 data/rooms/agility/222.yaml create mode 100644 data/rooms/agility/223.yaml create mode 100644 data/rooms/agility/224.yaml create mode 100644 data/rooms/agility/225.yaml create mode 100644 data/rooms/agility/226.yaml delete mode 100644 data/rooms/player_housing/200.yaml delete mode 100644 data/rooms/player_housing/201.yaml create mode 100644 data/rooms/player_housing/300.yaml create mode 100644 data/rooms/player_housing/301.yaml create mode 100644 data/rooms/town/1.yaml create mode 100644 data/rooms/town/10.yaml create mode 100644 data/rooms/town/11.yaml create mode 100644 data/rooms/town/12.yaml create mode 100644 data/rooms/town/13.yaml create mode 100644 data/rooms/town/14.yaml create mode 100644 data/rooms/town/15.yaml create mode 100644 data/rooms/town/16.yaml create mode 100644 data/rooms/town/17.yaml create mode 100644 data/rooms/town/18.yaml create mode 100644 data/rooms/town/19.yaml create mode 100644 data/rooms/town/2.yaml create mode 100644 data/rooms/town/20.yaml create mode 100644 data/rooms/town/21.yaml create mode 100644 data/rooms/town/22.yaml create mode 100644 data/rooms/town/23.yaml create mode 100644 data/rooms/town/24.yaml create mode 100644 data/rooms/town/25.yaml create mode 100644 data/rooms/town/26.yaml create mode 100644 data/rooms/town/27.yaml create mode 100644 data/rooms/town/28.yaml create mode 100644 data/rooms/town/3.yaml create mode 100644 data/rooms/town/30.yaml create mode 100644 data/rooms/town/31.yaml create mode 100644 data/rooms/town/4.yaml create mode 100644 data/rooms/town/5.yaml create mode 100644 data/rooms/town/6.yaml create mode 100644 data/rooms/town/7.yaml create mode 100644 data/rooms/town/8.yaml create mode 100644 data/rooms/town/9.yaml create mode 100644 data/rooms/underground/50.yaml create mode 100644 data/rooms/underground/51.yaml create mode 100644 data/rooms/underground/52.yaml create mode 100644 data/rooms/underground/53.yaml create mode 100644 data/rooms/underground/54.yaml create mode 100644 data/rooms/underground/55.yaml create mode 100644 data/rooms/underground/56.yaml create mode 100644 data/rooms/underground/57.yaml create mode 100644 data/rooms/underground/58.yaml create mode 100644 data/rooms/underground/59.yaml create mode 100644 data/rooms/underground/60.yaml create mode 100644 data/rooms/underground/61.yaml create mode 100644 data/rooms/underground/62.yaml create mode 100644 data/rooms/underground/63.yaml create mode 100644 data/rooms/underground/64.yaml create mode 100644 data/rooms/underground/65.yaml create mode 100644 data/rooms/underground/66.yaml create mode 100644 data/rooms/underground/67.yaml create mode 100644 data/rooms/underground/68.yaml create mode 100644 data/rooms/wilderness/150.yaml create mode 100644 data/rooms/wilderness/151.yaml create mode 100644 data/rooms/wilderness/152.yaml create mode 100644 data/rooms/wilderness/160.yaml create mode 100644 data/rooms/wilderness/161.yaml create mode 100644 data/rooms/wilderness/162.yaml create mode 100644 data/rooms/wilderness/170.yaml create mode 100644 data/rooms/wilderness/171.yaml delete mode 100644 internal/game/aggro.go delete mode 100644 internal/game/assassin.go delete mode 100644 internal/game/buff.go create mode 100644 internal/game/cmd_consume.go delete mode 100644 internal/game/cmd_drink.go delete mode 100644 internal/game/cmd_eat.go delete mode 100644 internal/game/cmd_handlers.go create mode 100644 internal/game/cmd_trigger_combat.go create mode 100644 internal/game/cmd_trigger_enchant.go create mode 100644 internal/game/cmd_trigger_transport.go create mode 100644 internal/game/cmd_trigger_utility.go delete mode 100644 internal/game/color.go delete mode 100644 internal/game/construction.go create mode 100644 internal/game/core_course.go create mode 100644 internal/game/core_equip.go create mode 100644 internal/game/core_flags.go create mode 100644 internal/game/core_hacking.go create mode 100644 internal/game/core_login_account.go create mode 100644 internal/game/core_login_char.go create mode 100644 internal/game/core_messages.go create mode 100644 internal/game/core_production.go create mode 100644 internal/game/core_skill.go create mode 100644 internal/game/core_startup.go create mode 100644 internal/game/core_stations.go create mode 100644 internal/game/core_types.go create mode 100644 internal/game/core_utils.go delete mode 100644 internal/game/course.go delete mode 100644 internal/game/death.go delete mode 100644 internal/game/equip_stats.go delete mode 100644 internal/game/hacking.go delete mode 100644 internal/game/help.go delete mode 100644 internal/game/login_account.go delete mode 100644 internal/game/login_char.go delete mode 100644 internal/game/map.go delete mode 100644 internal/game/messages.go delete mode 100644 internal/game/player_flags.go delete mode 100644 internal/game/production_core.go delete mode 100644 internal/game/production_menu.go delete mode 100644 internal/game/prompt.go delete mode 100644 internal/game/science.go delete mode 100644 internal/game/stations.go create mode 100644 internal/game/sys_assassin.go create mode 100644 internal/game/sys_buff.go create mode 100644 internal/game/sys_combat.go create mode 100644 internal/game/sys_construction.go create mode 100644 internal/game/sys_science.go create mode 100644 internal/game/sys_technology.go delete mode 100644 internal/game/table.go delete mode 100644 internal/game/tech.go delete mode 100644 internal/game/types.go create mode 100644 internal/game/ui_color.go create mode 100644 internal/game/ui_help.go create mode 100644 internal/game/ui_map.go create mode 100644 internal/game/ui_prompt.go create mode 100644 internal/game/ui_table.go delete mode 100644 internal/game/utils.go diff --git a/AGENTS.md b/AGENTS.md index 67b653e..7464f3d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,87 +7,52 @@ Set on a terraformed asteroid where technology has regressed. "Technology" repla ## Build & Run ```bash -make build # go build -o tc ./cmd/mud +make build # go build -o thoi ./cmd/mud make run # build + run with DATA_DIR=./data -make test # go test ./... -timeout 60s +make test # DATA_DIR=$(PWD)/data go test ./... -timeout 60s make vet # go vet ./... ``` -Binary accepts `--config ` (defaults to `config.yaml`). If no config found, starts telnet on :4000. +Binary accepts `--config ` (defaults to `config.yaml`). If no config found it creates one with defaults (telnet :4000, http :8888, tick 600ms). Dependencies: `gopkg.in/yaml.v3`, `github.com/gorilla/websocket`. -Config: -```yaml -game: - tick_length: 600 # ms per game tick (default 600, min 50) -``` - ## Package Map ``` -cmd/mud/main.go Entry point — config loading, multi-listener, tick engine +cmd/mud/main.go Entry point — config loading, multi-listener, tick subscriber registration internal/ - config/ YAML config (telnet, http, https listeners) - net/ Conn interface (tcp + websocket), session states, hub, IAC echo - game/ Login flow, command dispatch, input sanitization, all game logic - action/ Behavior structs (GatherConfig, TalkConfig, etc.), Action, drop tables, SuccessChance - player/ Player struct, skills, inventory, XP (RSC table), name/password validation, accounts - world/ Room, MobDef, MobInstance, ObjState, ground items, wandering, drop tables - combat/ Combat state tracking, OSRS-style combat formulas - object/ ItemDef, ObjectDef, item/object YAML loaders, EquipSlot, WeaponType, ItemStats + config/ YAML config (telnet, telnet_tls, http, https listeners, color targets) + net/ Conn interface (tcpConn, wsConn), Hub, Session, session states, IAC echo + game/ Game struct, HandleSession state machine, command registry, all game logic + hacking/ Minigame interface + 3 implementations (Wumpus, Mastermind, Liar's Dice) + action/ Behavior structs (GatherConfig, TalkConfig, UseConfig), RecipeStore, SuccessChance + player/ Player struct, skills, inventory, bank, equipment, accounts, XP, validation + world/ World, RoomDef, MobDef, MobInstance, ObjState, ground items, wandering + combat/ Combat state tracking, OSRS-style formulas (HitChance, MaxHit, AttackRoll) + object/ ItemDef, ObjectDef, ItemStore, ObjectStore, EquipSlot, WeaponType, ItemStats engine/ Tick scheduler — configurable ms interval, subscriber pattern, ToTicks() - color/ xterm-256 color system with auto ANSI downgrade, numeric palette (0-255), gradients, inline tags + color/ xterm-256 color system with auto ANSI downgrade, gradients, inline tags ``` -`internal/game/` is the largest package. Key files: +`internal/game/` is organized by file name prefix for easy navigation: -| File | Purpose | -|---|---| -| `game.go` | Game struct, HandleSession state machine, command dispatch, ProcessQueuedCommands | -| `login_account.go` | Account auth, creation, password handling, main menu, account rename/purge | -| `login_char.go` | Character creation, connection, rename, delete | -| `cmd_*.go` | Command handlers for each command (see Commands section) | -| `action.go` | StartAction, CancelAction, AdvanceActions, checkCondition, verbAliases, verbSkill | -| `action_*.go` | Action lifecycle per type (gather, talk, use, production) | -| `action_burn.go` | Burn/stoke firemaking (standalone, not behavior-YAML-driven) | -| `action_search.go` | Search bird's nests for loot | -| `action_room.go` | RunEnterSteps (on_enter scripts), BroadcastRespawns | -| `action_state.go` | ActionType consts, ActionState struct, Description() for look display | -| `action_default_target.go` | Smart auto-selection for gather/attack | -| `tick.go` | DisconnectTick, RegenTick, WanderTick, SharedDepletionTick, MoveTick, VisualTick, TechTick | -| `map.go` | BFS graph builder, tiny map, full map, display utilities (strip, trim) | -| `types.go` | EquipSlots, itemMatch, xpGain, deathDrop | -| `utils.go` | Helper functions (plural, parseQty, parseChoiceIndex, formatPickupList, etc.) | -| `help.go` | Help topic YAML loading and display | -| `color.go` | colorMode(), colorize(), colorTag() helpers | -| `table.go` | Unicode/ASCII table rendering for score/option/help/crafting menus | -| `tech.go` | TechDef struct, 25 hardcoded tech definitions, techLevelBonus, applyTechProtection, totalTechBonus | -| `cmd_tech.go` | doTech, toggleTech, doTechList, doTechQuick — technology command handlers | -| `cmd_stats.go` | doStats — equipment bonus totals, attack roll, max hit display | -| `cmd_clean.go` | doClean — background herb cleaning (Pharmacy) | -| `cmd_mix.go` | doMix — potion mixing via production system (Pharmacy) | -| `cmd_shop.go` | handleShopInput — buy/sell/browse/leave in shop interface | -| `action_steal.go` | doSteal, startSteal, advanceSteal — thieving action lifecycle | -| `cmd_sneak.go` | doSneak, SneakTick — sneak toggle + guard watch notifications | -| `action_clean.go` | advanceClean — background clean action lifecycle | -| `equip_stats.go` | playerEquipBonuses — sums all equipped items into one ItemStats | -| `aggro.go` | checkAggro — aggressive mob attack on room enter | -| `cmd_bank.go` | handleBankInput — deposit/withdraw/browse in bank interface | -| `cmd_construct.go` | doConstruct — construction production command at workbench | -| `cmd_estate_directory.go` | startEstateDirectory, lookEstateDirectory — player house directory, homeowner scanning, teleport | -| `course.go` | CourseStore, CourseConfig, ObstacleDef, ObstacleInfo — agility course YAML loader, room-to-obstacle lookup, obstacleVerbs | -| `cmd_agility.go` | doObstacle — agility obstacle command handler | -| `action_agility.go` | startObstacle, advanceObstacle, obstacleFail, calcFailChance — 3-phase obstacle lifecycle | -| `hacking.go` | HackingMinigame interface, HackingSession, terminalDefs, handleHackingInput, endHacking, hackingXP | -| `hacking_wumpus.go` | WumpusGame — Hunt the Rogue AI (20-node dodecahedron, probes, hazards) | -| `hacking_mastermind.go` | MastermindGame — Code Breaker (4-digit cipher, 10 guesses, feedback) | -| `hacking_liars_dice.go` | LiarsDiceGame — Signal Bluff (hidden dice bidding vs AI, wilds, exact calls) | -| `cmd_jack.go` | doJack, findTerminalInRoom — jack into terminals command handler | +| Prefix | Purpose | Count | +|---|---|---| +| `game.go`, `cmd_registry.go`, `tick.go` | Core state machine, command dispatch, tick callbacks | 3 | +| `core_*.go` | Infrastructure — types, utils, login, production engine, skill XP, flags, courses, equipment, stations, messages, startup validation | 13 | +| `action_*.go` | Tick-based action lifecycles — gather, firemaking, talk, use, search, thieving, farming, agility, scavenging, assassin, fletching, cleaning, room scripts, targeting | 16 | +| `cmd_*.go` | Command handlers — one file per command or command group | 49 | +| `sys_*.go` | Game subsystems — technology, science, combat (death + aggro), assassin tasks, buffs, construction | 6 | +| `ui_*.go` | Display/output — color, prompt, table, map, help | 5 | +| `hacking/` | Hacking sub-package — Minigame interface, TerminalDef, CalcXP, WumpusGame, MastermindGame, LiarsDiceGame | 4 | + +**To add a new command:** create `cmd_.go` with the handler, add one line to `cmd_registry.go`. +**To add a new skill:** create `action_.go` with `start*`/`advance*` methods dispatched from `action.go`. ## Key Conventions -**YAML-driven.** Rooms, items, objects, mobs, behaviors, drops are YAML files under `data/`. Read from disk on every access — edit a room description and it takes effect immediately, no restart. +**YAML-driven.** Rooms, items, objects, mobs, drops, recipes, modules, courses are YAML files under `data/`. Read from disk on every access — edit and it takes effect immediately, no restart. Items, rooms, and recipes are organized into subdirectories by category (items: `equipment/`, `tools/`, etc.; rooms: `town/`, `wilderness/`, etc.; recipes: `smithing/`, `crafting/`, etc.). All IDs remain globally unique across subdirectories via path-indexed loading. **Live state.** Player data (characters, accounts) is written to YAML on every state change. Ground items, mob instances, and object states live in memory only and are lost on restart. @@ -95,11 +60,11 @@ internal/ **Transport-agnostic.** The `Conn` interface (`internal/net/conn.go`) abstracts the transport layer. `tcpConn` wraps a raw `net.Conn` for telnet. `wsConn` wraps `gorilla/websocket.Conn` for the web client. Game code works with `*Session` regardless of transport. -**Input sanitization.** `HandleSession` strips Unicode control characters from every input line via `player.StripControlCharacters` before dispatch. Account/character names validated to `[A-Za-z0-9 ]{1,30}`. Input truncated to 1024 bytes. Password echo suppressed via IAC ECHO (telnet) and OSC sequences (web). WebSocket origin checked against host header + loopback. +**Input sanitization.** `HandleSession` strips Unicode control characters from every input line via `player.StripControlCharacters`. Account/character names validated to `[A-Za-z0-9 ]{1,30}`. Input truncated to 1024 bytes. Password echo suppressed via IAC ECHO (telnet) and OSC sequences (web). WebSocket origin checked against host header + loopback. -**Tick-driven.** The world runs on a configurable tick (default 600ms). Combat, gathering, regen, wandering, respawns, shared depletion, fire ticks all advance per tick. +**Tick-driven.** The world runs on a configurable tick (default 600ms, min 50ms). All game advancement happens per tick. -**Fractional ticks.** All YAML timer fields (tool_speed, speed, base_wait, deplete_timer, etc.) accept `float64` values. `engine.ToTicks(base)` probabilistically rounds to an integer — a tool_speed of 4.5 means each action cycle has a 50% chance of 4 ticks and 50% of 5 ticks. +**Fractional ticks.** All YAML timer fields accept `float64` values. `engine.ToTicks(base)` probabilistically rounds to an integer — a tool_speed of 4.5 means each action cycle has a 50% chance of 4 ticks and 50% of 5 ticks. **Concurrency.** Every state-bearing package uses its own `sync.Mutex`: - `world.World` — groundItems, objStates, seeded, objMoves @@ -119,181 +84,163 @@ The pattern is: lock, snapshot/unmarshal, unlock, then process. The engine creat ## Data Files ``` -data/rooms/.yaml Room definitions (exits, objects, mobs, spawns, on_enter) +data/rooms/.yaml Room definitions (exits, objects, mobs, item_spawns, on_enter) +data/rooms/player_housing/ Player house rooms data/items/.yaml Item definitions (stats, equip_slot, tool_type, burn_ticks, search_table, etc.) -data/mobs/.yaml Mob definitions (combat stats, drops, behavior — NO wander config) -data/objects/.yaml Object definitions (name, behavior, hidden, inroom_description, removal_item, props) -data/behaviors/.yaml Behaviors (gather, talk, use) -data/drops/.yaml Shared drop tables (weighted item lists) +data/mobs/.yaml Mob definitions (combat stats, drops, behavior, steal config) +data/objects/.yaml Object definitions (name, behavior, hidden, inroom_description, removal_item) +data/drops/.yaml Shared drop tables (weighted item lists, sub-table references) data/help/.yaml Help topics -data/recipes/.yaml Recipe definitions (cooking, crafting, smithing, etc.) +data/recipes/.yaml Recipe definitions (cooking, smithing, crafting, fletching, etc.) +data/modules/.yaml Science module definitions (id, level, max_hit, base_xp, junk_cost, category) +data/courses/.yaml Agility course definitions (name, required_level, start_room, obstacles) data/players/accounts/ Account YAML (gitignored) data/players/characters/ Character YAML (gitignored) ``` -Wander config (`wander_rooms`, `wander_interval`) is set per-instance in room YAML — mob defs are generic. Mobs wander via legal (unconditioned) room exits; objects teleport between rooms in their list. +Wander config (`wander_rooms`, `wander_interval`) is set per-instance in room YAML — mob defs are generic. Mobs wander via legal (unconditioned) room exits; objects teleport between rooms in their assigned list. See `worldbuilding_guide/` for full YAML format reference with examples. +## Startup Validation + +At startup, the server runs comprehensive integrity checks on all data files. Errors cause the server to exit; warnings are informational. + +**Duplicate ID checks** across all data directories (items, rooms, mobs, objects, drops, recipes, courses, modules, help). Detects collision from two files with the same ID in different subdirectories. + +**Referential integrity checks:** +- Room exits → target rooms exist +- Room mobs/objects/spawns → mob defs/object defs/items exist +- Mob drops, steal tables, finishing blow items → referenced items/drop tables exist +- Object removal items, steal tables, guard mobs, use_interaction items → exist +- Object gather config drops → items/tables exist; bait items exist +- Object talk config node actions (give_item, take_item, teleport, shop items) → exist +- Item search tables, made_from items/byproducts, farm_product → exist +- Recipe consume items, output, fail product → exist +- Drop table sub-references → exist +- Course start_room and obstacle rooms → exist + +**World wiring checks** (config-driven): +- Orphan rooms (no exit from any room leads to them) + +### Config: `startup_validation` + +```yaml +game: + tick_length: 600 + startup_validation: + check_sources: [1] # rooms to start reachability walk from + ignore_unreachable: [] # suppress "no exit leads here" for these rooms +``` + +Defaults: `check_sources: [1]`, ignore list empty. Set `check_sources` to include rooms accessible only via teleport (e.g., `[1, 1000]`) to suppress false orphan warnings. Use `ignore_unreachable_to` for rooms that are intentionally isolated. + ## Inline Color Tags -Room descriptions (and prompts) support inline color tags using `{spec}text{/}` syntax. Untagged text in room descriptions uses the `room_desc` color target. +Room descriptions and prompts support inline color tags using `{spec}text{/}` syntax. ```yaml description: "On the table lies a {182 bold}mysterious vase{/} with a rose in it." ``` -Tag spec format matches the color command: `{<0-255> [bold] [dim] [underline]}text{/}`. +Tag spec format: `{<0-255> [bold] [dim] [underline]}text{/}`. -Gradients are supported: `{g:196,82}gradient text{/}`. Multi-stop: `{g:45,39,59}three stops{/}`. +Gradients: `{g:196,82}gradient text{/}`. Multi-stop: `{g:45,39,59}three stops{/}`. Item and object YAML `color` fields also support gradient syntax: `color: "g:196,208,226"`. Gradients interpolate in RGB space across the xterm-256 palette. In ANSI mode, each character maps to the nearest ANSI color. -Item and object YAML `color` fields also support gradient syntax: `color: "g:196,208,226"`. - -## Commands - -### Instant (execute immediately, no queue) -| Command | Description | -|---------|-------------| -| `say ` | Room chat (preserves case from raw input) | -| `score` / `sc` | Character stats and skills | -| `inventory` / `i` / `inv` | Inventory contents (28 slots) | -| `equip` / `eq` / `equipment` / `wear` / `wield` | View or change equipped items (no args = view, with args = equip) | -| `look` / `l` | Room view (mobs, objects, ground items, exits, players) | -| `look ` / `l ` | Examine mobs, objects, items, players, directions | -| `exits` | List available exits | -| `help [topic]` | Help topics from data/help/ | -| `map` | BFS ASCII map centered on player | -| `option` / `options [name] [value]` | Account-wide settings (see Option System) | -| `alias ` | Account-wide command alias with arg passthrough | -| `unalias ` | Remove an alias | -| `description` / `desc` | Set custom player description | -| `prompt ` | Set custom per-character command prompt | -| `queued` | Show pending tick actions | -| `color` / `colors [target] [value]` | Customize display colors (account-wide) | -| `color reset ` | Reset a color target to server default | -| `color off` | Disable color for a specific target | -| `colortable` | Display xterm-256 color reference chart | -| `style ` | Set combat style: accurate, aggressive, defensive, balanced (prefix match) | -| `stats` | Show total equipment bonuses, attack type, attack roll, max hit | -| `tech [name]` / `t` | Toggle tech on/off, `tech list` shows all, `tech quick ` sets quick tech | - -### Free (stackable, execute before active) -| Command | Description | -|---------|-------------| -| `equip` / `wear` / `wield ` | Equip item to correct slot. `equip all` auto-equips best per slot | -| `remove` / `unwear` / `unwield ` | Unequip item back to inventory. `remove all` unequips everything | -| `eat ` | Eat food to heal (3-tick cooldown, can eat during combat) | -| `fletch [item]` | Fletch logs/items into bows, arrows, etc. (background action) | -| `clean [herb]` | Clean grimy herbs (background action, Pharmacy skill) | - -### Active (replaces previous active, queued per tick) -| Command | Description | -|---------|-------------| -| `n` / `s` / `e` / `w` / `u` / `d` | Movement (multi-tick, equipment-dependent speed, flee during combat) | -| `get` / `take` / `grab` / `pick ` | Pick up item from ground (reservation-aware) | -| `get all` / `get all ` | Pick up all (or matching) items | -| `drop ` | Drop item to ground | -| `drop all` / `drop all ` | Drop all (or matching) items | -| `attack` / `kill ` | Combat with numbered targeting and smart default | -| `mine` / `chop` / `cut` / `fish ` | Gathering with smart default (verbAliases map to "gather") | -| `use [on/with] ` | Universal item interaction: recipes, crafting, gathering shortcuts | -| `cook ` | Cook raw food on a fire or cooking range (Cooking skill) | -| `smelt [item]` | Smelt ore into bars at a furnace (Smithing skill) | -| `smith [item]` | Smith bars into items at an anvil with a hammer (Smithing skill) | -| `mix [item]` | Mix potions from unfinished potions and reagents (Pharmacy skill) | -| `talk` / `speak` / `ask ` | NPC conversations (objects or mobs with behavior) | -| `pull` / `push ` | Interact with objects (shortcut for use) | -| `search ` | Search bird's nests / searchable items (rolls on search_table) | -| `burn [item]` | Start a fire (smart default: auto-select single log type) | -| `stoke [item]` | Add logs to existing fire for XP | -| `walk ` | BFS pathfinding to a room by number | -| `walk ` | Direction sequence like `3n2e1u` (capped by agility level) | -| `construct` / `make [item]` | Construction: make planks or furniture at a workbench (Active, production system) | -| `bank` / `use bank` | Open bank interface at a bank booth (deposit, withdraw, browse, leave) | -| `scramble` / `jump` / `swing` / `balance` / `climb` / `crawl` / `vault` / `leap` / `slide` | Agility obstacle verbs (Active, per-room validation) | -| `jack` / `jackin [terminal]` | Jack into a terminal for hacking minigames (Active) | -| `quit` | 10-tick rest sequence, then return to menu (blocked during combat) | - ## Command Dispatch -`handleGameCommand()` in `internal/game/game.go`: -1. Cancel rest timer -2. Resolve account aliases (alias expansion BEFORE command lookup — can shadow built-ins) -3. Classify command (Instant / Free / Active / Unknown) -4. Instant runs immediately; Free/Active queue for next tick +`handleGameCommand()` in `game.go`: +1. Expands account aliases (aliases can shadow built-in commands) +2. Splits input, lowercases the command word +3. Special-cases `equip`/`wear`/`wield` with no args → display equipment directly +4. Calls `classifyCommand(cmd)` from `cmd_registry.go` → `ClassInstant` / `ClassFree` / `ClassActive` / `ClassUnknown` +5. ClassInstant executes `executeCommand()` immediately + writes prompt +6. ClassFree appends to `freeQueue[playerName]` for next tick +7. ClassActive replaces entry in `activeQueue[playerName]`, sorted by timestamp on execution +8. ClassUnknown falls through to `verbAliases` and `obstacleVerbs` maps, then prints error ## Tick-Based Action Queue -`ProcessQueuedCommands` runs each tick: -1. Clears stale ActionState from one-tick actions (move, get, drop) +`ProcessQueuedCommands()` runs each tick: +1. Clears stale `ActionState` from one-tick actions (move, get, drop) 2. Executes all free commands per player in queued order 3. Executes all active commands sorted globally by timestamp (first-to-queue wins conflicts) 4. Advances walk sequences (one step per tick) 5. Flushes pending shared depletions -**Conflict resolution:** multi-player attack on same mob or get on same item — first to queue wins (timestamp-order). Shared depletion defers to award all successful gatherers on depletion tick. +**Conflict resolution:** multi-player attack on same mob, get on same item, etc. — first to queue wins (timestamp-order). Shared depletion awards all successful gatherers on depletion tick. -**ActionState** tracks player activity for `look` display. Timed actions (gather, combat, burn, stoke, use, rest, walk) persist until interrupted. One-tick actions (move, get, drop) clear after one tick. +**ActionState** tracks player activity for `look` display. Timed actions persist until interrupted; one-tick actions (move, get, drop) clear after one tick. -Queue feedback controlled by `queue_silently` option (default on). +Queue feedback is suppressed by default via the `queue_silently` option. ## Action System -Actions that interact with objects/mobs route through `StartAction()` in `action.go`: +Actions that interact with objects/mobs route through `startAction()` in `action.go`: 1. Normalizes verb via `verbAliases` map (mine/chop/fish/cut → gather, talk/speak/ask → talk) 2. Multiple object types → "That's ambiguous, which one?" 3. Searches object instances in room (numbered targeting via `N.name`) 4. Falls back to mob instances if no object matches 5. Loads the behavior from YAML -6. Routes to type-specific handler (startGather, startTalk, startUse) +6. Routes to type-specific handler (startGather, startMobTalk, startTalk, startUse) The `verbSkill` map maps verb → skill name for default target resolution: - mine → mining, chop/cut → woodcutting, fish → fishing -### Action Types +### Action Types (from action_state.go) -| ActionType | Trigger | Description | +| ActionType | Trigger | Type | |---|---|---| -| `gathering` | mine/chop/cut/fish | Resource gathering with skill checks, tool reqs, depletion | -| `combating` | attack/kill | Combat with attack/defense rolls | -| `using` | use | Crafting — consume items, produce output | -| `talking` | talk/speak/ask | NPC conversation trees with choices/conditions/actions | -| `burning` | burn | Firemaking startup (3 phases) | -| `stoking` | stoke | Adding logs to existing fire | -| `searching` | search | Search bird's nests / items with search_table | -| `resting` | quit | 10-tick rest before disconnect | -| `walking` | walk | Multi-step movement (one dir per tick) | -| `moving` | n/s/e/w/u/d | Multi-tick movement state | -| `picking_up` | get | One-tick pickup state | -| `dropping` | drop | One-tick drop state | -| `cooking` | cook | Cooking food on fire/range | -| `smelting` | smelt | Smelting ore into bars at furnace | -| `smithing` | smith | Smithing bars into items at anvil | -| `cleaning` | clean | Cleaning grimy herbs (background action) | -| `mixing` | mix | Mixing potions (Pharmacy) | -| `constructing` | construct/make | Construction via production system (workbench) | - -### Behavior Types (YAML-driven) - -| Type | Verbs | Use | +| `gathering` | mine/chop/cut/fish | Active | +| `combating` | attack/kill | Active | +| `using` | use / pull / push | Active | +| `talking` | talk/speak/ask | Active | +| `burning` | burn | Active | +| `stoking` | stoke | Active | +| `searching` | search | Active | +| `resting` | quit | Active | +| `walking` | walk | Active | +| `moving` | n/s/e/w/u/d | Active | +| `picking_up` | get | Active | +| `dropping` | drop | Active | +| `producing` | cook/smelt/smith/craft/mix/construct | Active | +| `fletching` | fletch | Free (background) | +| `eating` | eat | Free | +| `cleaning` | clean | Free (background) | +| `identifying` | identify/id | Active | +| `stealing` | steal/thieve | Active | +| `planting` | plant | Active | +| `harvesting_crop` | harvest | Active | +| `raking` | rake | Active | +| `watering` | water | Active | +| `curing` | cure | Active | +| `traversing` | obstacle verbs (scramble/jump/etc.) | Active | +| `hacking` | jack/jackin | Active | + +### Behavior Types (YAML-driven in behavior.go) + +| Type | Verbs | Description | |---|---|---| | `gather` | mine, chop, cut, fish | Resource gathering with skill checks, tool requirements, depletion/respawn | | `use` | use | Crafting stations — consume items, produce output, optional skill checks | -| `talk` | talk, speak, ask | NPC conversation trees with choices, conditions, actions | +| `talk` | talk, speak, ask | NPC conversation trees with choices, conditions, node actions | -### Behaviors Not in YAML (hardcoded) +### Hardcoded Actions (not YAML-driven) | Action | File | Description | |---|---|---| -| burn | `action_burn.go` | 3-phase firemaking: drop log → try burn → skill check → create fire object | -| stoke | `action_burn.go` | Add logs to fire, XP per log, increments fire quality | +| burn/stoke | `action_burn.go` | 3-phase firemaking: drop log → try → skill check → create fire. Stoke adds logs. | | search | `action_search.go` | Search items with search_table, consumes one, rolls on drop table | -| cook | `action_production.go` | Recipe-driven cooking on fire/range stations | -| smelt | `action_production.go` | Recipe-driven smelting of ore into bars at furnace | -| smith | `action_production.go` | Recipe-driven smithing of bars into items at anvil (requires hammer) | -| steal | `action_steal.go` | Thieving: pickpocket mobs, steal from objects, guard watching, sneak mode | +| cook/smelt/smith/craft/mix | `production_core.go` | Unified recipe-driven production — station checks, timed loops, success/fail, XP, byproducts | +| fletch | `action_fletch.go` | Background fletching — instant or timed, stackable output | +| clean | `action_clean.go` | Background herb cleaning via recipe matching | +| steal | `action_steal.go` | Thieving — pickpocket, stall stealing, guard watching, sneak mode | +| agility | `action_agility.go` | 3-phase obstacle traversal with fail chance, course lap tracking | +| farm | `action_farm.go` | Planting, growth stages (500-tick), watering, disease, harvesting | +| identify | `action_identify.go` | Scavenging — scrap_metal → junk at altars | +| finishing blow | `action_finishing_blow.go` | Assassin special item on mob at 1 HP | ### GatherConfig Fields @@ -305,7 +252,7 @@ The `verbSkill` map maps verb → skill name for default target resolution: | `base_wait` | Base ticks per action cycle | | `tools` | Required tool_type list | | `bait` | Required bait item | -| `success` | SuccessFormula (base + per_level, capped) | +| `success` | SuccessFormula (base + per_level * (level - required), capped) | | `drops` | Weighted drop entries (item_id, table ref, depletes, quantity, message, level, xp) | | `respawn_timer` | Ticks until depleted object respawns | | `deplete_timer` | Ticks for shared depletion (trees) | @@ -318,8 +265,7 @@ The `verbSkill` map maps verb → skill name for default target resolution: ### SuccessChance Formula -`SuccessChance(cfg SuccessFormula, level int, requiredLevel int) float64`: -``` +```go chance = cfg.Base + (level - requiredLevel) * cfg.PerLevel clamped to [0, cfg.Cap] ``` @@ -335,7 +281,9 @@ clamped to [0, cfg.Cap] | `teleport` | Moves player to a room ID | | `heal` | Restores hitpoints | | `cost` | Deducts credits from player | -| `shop` | Opens a buy/sell interface (see Shop section) | +| `shop` | Opens a buy/sell interface | +| `assign_task` / `skip_task` / `extend_task` | Assassin task management | +| `sawmill` | Opens sawmill interface (construction) | ### Condition System @@ -343,80 +291,96 @@ Used by exits, talk options, on-enter scripts, and use_interactions checks: | Field | Scope | Example | |---|---|---| -| `flag` | World (shared by all players) | `flag: gate_open` | -| `player_flag` | Per-character (quest progress) | `player_flag: finished_tutorial` | -| `has_item` | Player inventory check | `has_item: bronze_key` | -| `all_of` | All sub-conditions must pass | Nested list | +| `flag` | World (shared by all) | `flag: gate_open` | +| `player_flag` | Per-character | `player_flag: finished_tutorial` | +| `has_item` | Player inventory | `has_item: bronze_key` | +| `min_credits` | Player credits | `min_credits: 100` | +| `all_of` | All sub-conditions pass | Nested list | | `any_of` | Any sub-condition passes | Nested list | | `not` | Invert the check | `not: true` | -### Firemaking (burn/stoke) - -See `internal/game/action_burn.go`. - -**Burn flow (3 phases):** -- Phase 0 (inventory only): Drops 1 log to ground, outputs "You drop the X and begin to make a fire..." -- Phase 1: "You try burning the X on the ground..." (waits tool_speed ticks) -- Phase 2: Skill check (chance = 0.5 + (level - fireLevel) * 0.02, capped [0.05, 0.95]). On success creates `fire` object (quality = log's burn_ticks), gives XP, broadcasts. On fail retries Phase 1. - -**Stoke flow:** 10-tick loop → "You throw X onto the fire", gives XP, adds burn_ticks/2 to fire quality. Ends when out of item. - -**Fire objects:** Created via `World.AddObjInstance()`, tracked by `ObjState.Quality`. Each tick `FireTick()` decrements quality; at 0, `RemoveObjInstance()` cleans up and drops `removal_item` (e.g., ashes). - -**Fire tools:** `matches` (stackable, consumed), `firesteel` (non-consumable), `lighter` (quality-based, `MaxQuality: 100`, decreases per use). Tool search: main hand → inventory. - -**Item fields for firemaking:** `burn_ticks`, `fire_level`, `fire_xp`, `quality`, `max_quality`. - ## Two Depletion Mechanics **Per-drop depletion** (mining, regular trees): Set `depletes: true` on a drop entry. The resource depletes on first successful gather of that drop. -**Shared depletion** (higher-tier trees): Set `deplete_timer: ` on the behavior. A shared timer counts down while anyone is chopping; when it hits 0, the next successful gather depletes the tree for all players. Timer regenerates when no one is chopping. Managed by `SharedDepletionTick` in `tick.go`. +**Shared depletion** (higher-tier trees): Set `deplete_timer: ` on the behavior. A shared timer counts down while anyone is chopping; when it hits 0, the next successful gather depletes the tree for all players. Timer regenerates when no one is chopping. Managed by `SharedDepletionTick`. ## Ground Item System - `DropDespawnTicks = 1000` — dropped items despawn after 1000 ticks - `ReserveTicks = 100` — mob loot is reserved for the killer for 100 ticks -- Items with same ID in the same room are NOT merged — each entry has independent despawn timer -- Spawn items respawn after their respawn delay; nearby matching items are merged on respawn +- Items with same ID in the same room are NOT merged — independent despawn timers +- Spawn items respawn after their delay; nearby matching items are merged on respawn - Despawn timers visible via `despawn` option; reserve info via `reserve` option ## Combat System -**Attack types.** Weapons have an `attack_type` field (stab/slash/crush/ranged/science). The attack type determines which of the player's 5 attack bonuses is used for accuracy and which of the mob's 5 defense bonuses is used. Equipment stats use per-type fields: `stab_attack`, `slash_attack`, `crush_attack`, `science_attack`, `ranged_attack` (and matching defense fields). - -**OSRS accuracy formula.** `HitChance(attackRoll, defenseRoll)` uses a continuous probability curve: if `a > d`, chance = `1 - (d+2)/(2*(a+1))`; otherwise `a/(2*(d+1))`. Equal rolls ≈ 50% hit chance. +**Attack types.** Weapons have an `attack_type` field (stab/slash/crush/ranged/science). The attack type determines which player attack bonus and which mob defense bonus to use. -**Ranged combat.** When `weapon_type` is "ranged", uses Ranged level for attack rolls, `ranged_attack` for accuracy, `ranged_strength` from ammo for max hit. Consumes 1 ammo per attack. If ammo runs out, combat ends. XP: 75% Ranged, 25% Hitpoints (all styles). +**OSRS accuracy formula.** `HitChance(a, d)`: if `a > d` → `1 - (d+2)/(2*(a+1))`, else `a/(2*(d+1))`. Equal rolls ≈ 50%. -**Aggressive mobs.** Mobs with `aggressive: true` auto-attack players entering their room (1-tick delay). Only aggros if `playerLevel <= mobLevel * 2` (OSRS rule). Checked on room enter and login via `checkAggro()`. +**Ranged combat.** Weapon type "ranged" uses Ranged level for attack rolls, consumes 1 ammo per attack. If ammo runs out, combat ends. XP: 75% Ranged, 25% Hitpoints. -**Equipment requirements.** Items can have `requirements: { attack: 20, defense: 10 }`. Checked in `doWear` and `doWearAll` before equipping. Displayed when examining items. +**Agile mobs.** Mobs with `aggressive: true` auto-attack players entering their room (1-tick delay) if `playerLevel <= mobLevel * 2`. -**Technology in combat.** Active tech boosts (Clarity, Amplifier, etc.) add percentage-based level bonuses to attack/strength/defense/ranged. Protection techs (Kinetic Barrier, Projectile Screen, Neural Firewall) reduce incoming damage by 40%. Dead Man's Switch deals 25% max HP damage to the mob on player death. +**Equipment requirements.** Items can have `requirements: { attack: 20, defense: 10 }` — checked before equipping. -**Fleeing combat:** Players can move in any direction to attempt to flee. Movement takes the normal tick delay (default 4, reduced by equipment). During the countdown, the mob continues attacking. If the mob lands a hit, the escape fails ("Can't escape!") and combat resumes. If no hit lands, the player escapes. With Cape of Agility, fleeing is instant. The `run_countdown` option shows tick-by-tick countdown messages. +**Fleeing combat:** Movement during combat is a flee attempt. Mobs continue attacking during the movement countdown; a hit aborts the flee ("Can't escape!"). Cape of Agility makes fleeing instant. -**Death mechanic:** Player drops credits to ground. If player has >3 items (inventory + equipment), the 3 most valuable are kept and rest are dropped. Player teleports to room 1 at full HP. All active techs deactivated on death. +**Death mechanic:** Player drops credits to ground. If >3 items total (inventory + equipment), the 3 most valuable are kept, rest dropped. Player teleports to room 1 at full HP. All active techs deactivated. **XP formula:** `baseXP = dmg * 4`, distributed by attack style: -- Accurate: 75% Attack, 25% Hitpoints -- Aggressive: 75% Strength, 25% Hitpoints -- Defensive: 75% Defense, 25% Hitpoints -- Balanced: 25% each Attack/Strength/Defense/Hitpoints -- Ranged (all styles): 75% Ranged, 25% Hitpoints +- Accurate: +3 attack, 75% Attack XP / 25% HP +- Aggressive: +3 strength, 75% Strength XP / 25% HP +- Defensive: +3 defense, 75% Defense XP / 25% HP +- Balanced: +1 each, 25% each Attack/Strength/Defense/HP +- Ranged styles: varied bonus, 75% Ranged XP / 25% HP -**Mob combat level:** `base = (def + hp) / 4`, `offensive = max(melee=(atk+str)/4, ranged=rng*3/8, science=sci*3/8)`, `level = floor(base + offensive)`. +**Mob combat level:** `floor((def+hp)/4 + max((atk+str)/4, rng*3/8, sci*3/8))`. -**Player combat level:** Ranged-or-melee dominant calculation. Includes Technology (0.25) and Science (0.125). - -**Mob respawn:** Default 30 ticks. Broadcasts spawn messages if `mob_spawn` option is on. +**Player combat level:** Ranged-or-melee dominant, includes Technology (0.25) and Science (0.125). **Mob DropTable:** `Remains` (guaranteed drop item), `Loot` (weighted DropEntry table). +## Technology System (tech.go) + +25 hardcoded techs in 4 categories, unlocked by Technology level: +- **Attack/Strength/Defense/Ranged/Science tiers:** I/II/III at 5%/10%/15% level boost +- **Protection techs:** Kinetic Barrier (melee), Projectile Screen (ranged), Neural Firewall (science) — 40% damage reduction each +- **Utility:** Nano Repair (2x HP regen), Rapid Repair (4x), Power Saver (20% drain reduction), Dead Man's Switch (25% max HP retribution on death) +- **Combo:** Overclock (15% atk+str), Fortify (15% def + 2x regen) + +Battery = Technology level (float64). Each tech has a drain rate (0.05–0.25 per tick). Equipment TechnologyBonus reduces drain (capped at 50%). Active techs deactivate when battery hits 0. 1-tick "flicking" grace period supported. + +## Science System (science.go) + +Mods loaded from `data/modules/` — categories: mods, enchant, chip, processing, transport, combat. Junk cost for casting, deck equipment provides junk. Trigger command for casting, autotrigger for automation. Mod list viewable with `mods` command. + +## Hacking System (game/hacking/) + +Minigame interface: `Init(level) string`, `HandleInput(input) (output, done, won)`, `Name() string`. + +Three minigames at 3 terminal levels (1, 20, 40): +- **WumpusGame** — Hunt the Rogue AI: 20-node dodecahedron, probes, hazards +- **MastermindGame** — Code Breaker: 4-digit cipher, 10 guesses, feedback +- **LiarsDiceGame** — Signal Bluff: hidden dice bidding vs AI, wilds, exact calls + +XP scales with Hacking level. + +## Skills (23 total, 1-99, RSC XP table) + +| Category | Skills | +|---|---| +| Combat | Attack, Strength, Defense, Hitpoints, Ranged, Science, Technology, Assassin | +| Gathering | Fishing, Woodcutting, Mining, Hacking, Scavenging, Farming, Thieving | +| Production | Cooking, Smithing, Crafting, Fletching, Pharmacy, Construction, Firemaking | +| Utility | Agility | + +All fully implemented. + ## Option System -Account-wide options set via `option `. Options are stored in the account YAML and shared by all characters on the same account. +Account-wide options set via `option `. Stored in account YAML, shared by all characters on the account. | Option | Type | Default | Description | |---|---|---|---| @@ -424,34 +388,64 @@ Account-wide options set via `option `. Options are stored in the | `tiny_map` | string | "right" | off/right/left — mini-map display | | `xp_drops` | bool | true | XP drop messages | | `exits` | bool | true | Long exit display in look | -| `mob_enter` | bool | true | Messages when mobs enter the room | -| `mob_leave` | bool | true | Messages when mobs leave the room | +| `mob_enter` | bool | true | Messages when mobs enter | +| `mob_leave` | bool | true | Messages when mobs leave | | `mob_spawn` | bool | true | Messages when mobs spawn | | `reserve` | bool | true | Show full reserved item details | -| `depletion` | bool | false | Show depletion and despawn timers | +| `depletion` | bool | false | Show depletion timers | | `despawn` | bool | false | Show ground item despawn timers | | `color` | string | "xterm256" | none/ansi/xterm256 — color output mode | | `mapwidth` | int | 30 | Map viewport width | | `mapheight` | int | 20 | Map viewport height | | `mappadding` | string | "none" | none/x/y/xy — blank-row stripping | -| `automap` | bool | false | Show map automatically after moving | +| `automap` | bool | false | Auto-show map after moving | | `queue_silently` | bool | true | Suppress queue messages | | `room_desc_width` | int | 70 | Room desc line wrap width | | `unicode` | bool | true | Unicode box-drawing characters | -| `run_countdown` | bool | false | Show countdown messages when fleeing combat | -| `visual_ticks` | bool | false | Display a tick marker every game tick | -| `visual_tick_count` | int | 0 | Cycle length for tick counter (0 = no counter) | -| `visual_tick_text` | string | "TICK" | Text displayed for visual ticks | - -Prompt is NOT an option — it is a per-character setting via the `prompt` command. Default: `"> "`. `prompt none` sets it to blank. Stored in character YAML as `prompt:`. +| `run_countdown` | bool | false | Flee countdown messages | +| `visual_ticks` | bool | false | Tick marker display | +| `visual_tick_count` | int | 0 | Tick counter cycle length | +| `visual_tick_text` | string | "Tick" | Text for visual tick marker | +| `fletch_all` | bool | false | Auto-start fletching | +| `smith_all` | bool | false | Auto-start smithing | +| `cook_all` | bool | false | Auto-start cooking | +| `smelt_all` | bool | false | Auto-start smelting | +| `mix_all` | bool | false | Auto-start mixing | +| `construct_all` | bool | false | Auto-start constructing | +| `craft_all` | bool | false | Auto-start crafting | + +Prompt is NOT an option — per-character via the `prompt` command. Default: `"> "`. `prompt none` sets it to blank. Prompt variables: `%h` (HP), `%H` (max HP), `%b` (battery), `%B` (max battery), `%c` (credits), `%i` (free slots), `%s` (style short), `%S` (style long), `%m` (mob HP), `%M` (mob max HP), `%X_` (XP), `%x_` (XP to next). -New accounts are asked "Should I disable color? [y/N]" after password creation. Pressing enter defaults to No (xterm256 enabled). Choosing Y sets color to "none". +## Session States (net/server.go) -## ItemDef Fields +| State | Purpose | +|---|---| +| `StateAccountName` | Entering account name | +| `StatePassword` | Entering password | +| `StateNewAccountPass` | Setting password for new account | +| `StateNewAccountConfirm` | Confirming password | +| `StateColorChoice` | New account: "Should I disable color?" | +| `StateMenu` | Main menu | +| `StateNewCharName` | Naming new character or selecting for connection | +| `StateRenameAccount` | Renaming account | +| `StateRenameChar` | Selecting character to rename | +| `StateRenameCharName` | Entering new character name | +| `StateDeleteChar` | Confirming character deletion | +| `StatePurgeAccount` | Confirming account purge | +| `StateGame` | In-game command mode | +| `StateChangeDescription` | Setting player description | +| `StateTalk` | NPC conversation input | +| `StateDropAllConfirm` | Confirming `drop all` | +| `StateRecipeChoice` | Recipe/product selection (by number or name) | +| `StateHowMany` | "How many?" production count | +| `StateSmithProduct` / `StateFletchProduct` / `StateCraftProduct` / `StateProductChoice` | Product selection table menus | +| `StateShop` | Shop interface (buy, sell, browse, leave) | +| `StateBank` | Bank interface (deposit, withdraw, browse, leave) | +| `StateHacking` | Jacked into a terminal running a minigame | -From `internal/object/item.go`: +## ItemDef Fields (object/item.go) | Field | Description | |---|---| @@ -462,88 +456,41 @@ From `internal/object/item.go`: | `value` | Credit value | | `stackable` | Can stack in inventory | | `equip_slot` | head/neck/torso/legs/hands/feet/back/ammo/main_hand/off_hand/ring | -| `weapon_type` | "melee" / "ranged" / "science" | -| `attack_type` | "stab" / "slash" / "crush" / "ranged" / "science" | -| `stats` | Per-type attack/defense bonuses, strength, ranged strength, science damage, technology bonus | -| `speed` | Attack speed | -| `requirements` | Skill level requirements to equip (e.g., `{attack: 20, defense: 10}`) | +| `weapon_type` | melee / ranged / science | +| `attack_type` | stab / slash / crush / ranged / science | +| `stats` | Per-type attack/defense bonuses, strength, ranged_strength, science_damage, technology_bonus | +| `speed` | Attack speed in ticks | +| `requirements` | Skill level requirements to equip | | `tool_type` | Tool type string for gather requirements | | `tool_speed` | Speed bonus for gathering | | `burn_ticks` | Burn duration for firemaking | | `fire_level` | Required firemaking level | | `fire_xp` | XP for burning | -| `quality` | Default quality (e.g., lighter butane) | -| `max_quality` | Maximum quality | -| `search_table` | Drop table for searching this item | -| `search_misc_table` | Secondary drop table | +| `quality` / `max_quality` | Default and maximum quality | +| `search_table` / `search_misc_table` | Drop tables for searching this item | | `search_ticks` | Ticks per search action | | `search_message` | Custom search message | -| `made_from` | MadeFrom entries for item-on-item combinations (byproducts supported) | +| `made_from` | MadeFrom entries for item-on-item combinations (with byproducts) | | `ticks` | Ticks per production cycle for MadeFrom combines (default 2) | +| `farming` | Farming-related fields (seed type, patch, yield, level, xp) | +| `potion` | Potion properties (buff levels for attack/strength/defense/agility) | -## ObjectDef Fields - -From `internal/object/object.go`: - -| Field | Description | -|---|---| -| `id` | Unique identifier | -| `name` | Display name | -| `behavior` | Behavior ID for interaction | -| `hidden` | Interactable but not shown in room listing | -| `inroom_description` | Custom "A X is here." text | -| `removal_item` | Item dropped when instance is removed (fire → ashes) | -| `description` | Text shown when examining the object (supports `{quality}` placeholder for quality-based objects) | -| `use_interactions` | List of item-on-object interactions with conditions and actions (see worldbuilding guide) | - -## World ObjState Fields - -From `internal/world/world.go`: - -| Field | Description | -|---|---| -| `DefID` | Object definition ID | -| `Name` | Display name | -| `Index` | Index for duplicate objects in same room | -| `RoomID` | Current room | -| `Depleted` | Resource is depleted | -| `DepleteTimer` | Ticks until respawn | -| `SharedMax` | Max shared depletion timer | -| `SharedTimer` | Current shared timer value | -| `WanderRooms` | Rooms for object wandering | -| `WanderInterval` | Ticks between wanders | -| `Quality` | Fire quality, resource health, etc. | -| `JustRespawned` | Flag for respawn broadcast | - -## Session States - -From `internal/net/server.go`: +## Places to Be Careful -| State | Purpose | -|---|---| -| `StateAccountName` | Entering account name | -| `StatePassword` | Entering password | -| `StateNewAccountPass` | Setting password for new account | -| `StateNewAccountConfirm` | Confirming password | -| `StateColorChoice` | New account: "Should I disable color?" | -| `StateMenu` | Main menu | -| `StateNewCharName` | Naming new character | -| `StateRenameAccount` | Renaming account | -| `StateRenameChar` | Selecting character to rename | -| `StateRenameCharName` | Entering new character name | -| `StateDeleteChar` | Confirming character deletion | -| `StatePurgeAccount` | Confirming account purge | -| `StateGame` | In-game command mode | -| `StateChangeDescription` | Setting player description | -| `StateTalk` | NPC conversation input | -| `StateDropAllConfirm` | Confirming `drop all` | -| `StateRecipeChoice` | Recipe/product selection table menu (number or name input, enter cancels) | -| `StateHowMany` | "How many?" production count prompt | -| `StateSmithProduct` | Smith product selection with numbered table (#, name, or partial name input) | -| `StateShop` | Buy/sell/browse in shop (buy, sell, browse, leave commands) | -| `StateBank` | Bank interface (deposit, withdraw, browse, leave commands) | -| `StateHacking` | Jacked into a terminal running a minigame | -| `StateColorChoice` | New account color preference | +- `startAction` searches objects first, then mobs. A mob must have `behavior:` set on its YAML def to be interactable. +- Exits changed from `map[ExitDir]int` to `map[ExitDir]ExitDef` — old `north: 2` still works via custom `UnmarshalYAML`. Same pattern for `RoomMob`. +- `checkCondition` is the single condition evaluator — used by exits, talk options, on-enter scripts, and use_interactions. +- Object `hidden: true` means the object doesn't appear in room listings but is still interactable. +- Alias expansion happens before command dispatch and can shadow built-in commands. +- `say` preserves case from raw input. +- `get`, `drop`, and `quit` cancel the player's active action. +- `findGroundMatches` and `findInventoryMatches` support bidirectional prefix matching — `"iron ax"` matches `"iron axe"`. +- Mob wander config is per-instance in room YAML via `RoomMob`, not on `MobDef`. +- Walk distance capped by agility level. +- `wear all` equips the highest-value item per slot; `remove all` unequips everything. +- Cape of Agility makes movement instant (1 tick). Graceful pieces each reduce by 0.25 ticks; full set +0.5 bonus for 2 ticks total. Cape overrides Graceful. +- During combat, movement is a flee attempt. Mob hits during countdown abort the flee. +- Level-up messages output `*** You are now level N ! ***` across all skills that gain XP. ## Adding a New Skill @@ -554,54 +501,20 @@ From `internal/net/server.go`: 5. Place the object in a room YAML in `data/rooms/` 6. Create any resource items in `data/items/` -Set `xp` on the behavior to award XP on successful gathers. Set `deplete_timer` for tree-style depletion, or use per-drop `depletes: true` for rock-style depletion. - ## Adding a New Production Skill -Production skills (cooking, smelting, smithing) share a unified system in `action_production.go`: +Production skills share a unified system in `core_production.go`: -1. Create recipe YAMLs in `data/recipes/` with the new `type` (e.g., `type: fletching`) +1. Create recipe YAMLs in `data/recipes/` with the new `type` 2. Create a station object in `data/objects/` if needed -3. Add a `cmd_.go` command handler following the `cmd_cook.go` pattern -4. Add the command to `classifyCommand()` and `executeCommand()` in `game.go` -5. Add the action type string to `AdvanceActions` in `action.go` -6. Add a case in `startProductionFromRecipe()` for default messages +3. Add a `cmd_.go` command handler following existing patterns +4. Add the command to `commandRegistry` in `cmd_registry.go` with the appropriate class +5. Wire up the `auto_start` option if desired -The unified production cycle handles: "How many?" prompt, start message, timed loops, success/fail rolls, XP, output quantity, stackable stacking, byproducts, and end message. Tool requirements (e.g., hammer for smithing, needle for crafting) are checked in the command handler before calling `promptHowMany`. +The unified production cycle handles: HowMany prompt, start message, timed loops, success/fail rolls, XP, output quantity, stackable stacking, byproducts, and end message. Tool requirements are checked in the command handler before calling `promptHowMany`. ## Adding a New Command -1. Add a `cmd_*.go` file in `internal/game/` with the handler -2. Add a case in `handleGameCommand()` and entry in `classifyCommand()` in `internal/game/game.go` +1. Add a `cmd_*.go` file in `internal/game/` with the handler function `func (g *Game) executeXxx(sess *net.Session, args []string, rawInput string)` +2. Add the command to `commandRegistry` in `cmd_registry.go` with the appropriate `CommandClass` 3. Update `data/help/` YAML files - -## Skills (23 total, 1-99, RSC XP table) - -| Category | Skills | -|---|---| -| Combat | Attack, Strength, Defense, Hitpoints, Ranged, Science, Technology, Assassin | -| Gathering | Fishing, Woodcutting, Mining, Hacking, Scavenging, Farming, Thieving | -| Production | Cooking, Smithing, Crafting, Fletching, Pharmacy, Construction, Firemaking | -| Utility | Agility | - -Implemented: Mining, Fishing, Woodcutting, Firemaking, Cooking, Smithing (smelting + smithing), Fletching, Pharmacy (herb cleaning + potion mixing), Technology (25 techs, battery drain, 1-tick flicking, combat integration), Construction (planks, furniture, player houses), Agility (3 obstacle courses, 9 verbs, lap tracking), Hacking (3 minigames, terminals, StateHacking). The rest are stubs (skill defined, XP tracked, but no behaviors/objects/items yet). - -## Places to Be Careful - -- `StartAction` searches objects first, then mobs. A mob must have `behavior:` set on its YAML def to be interactable. -- Exits changed from `map[ExitDir]int` to `map[ExitDir]ExitDef` — old `north: 2` still works via custom `UnmarshalYAML`. Same pattern for `RoomMob`. -- `checkCondition` is the single condition evaluator — used by exits, talk options, on-enter scripts, and use_interactions checks. -- Object `Hidden: true` means the object doesn't appear in room listings but is still interactable. -- Alias expansion happens before command dispatch and can shadow built-in commands. -- `say` preserves case (alias expansion preserves case, dispatch extracts original input text). -- `get`, `drop`, and `quit` cancel the player's active action (gathering, use, etc.). -- `findGroundMatches` and `findInventoryMatches` support bidirectional prefix matching — `"iron ax"` matches `"iron axe"`. -- Mob wander config is per-instance in room YAML via `RoomMob`, not on `MobDef`. -- Walk distance capped by agility level (`len(dirs) > agilityLevel`). -- `wear all` auto-equips the highest-value item per slot from inventory. -- `remove all` unequips everything if inventory has room. -- Movement takes multiple ticks (default 4, reduced by Graceful set and Cape of Agility). Cape of Agility makes movement instant (1 tick). Graceful pieces each reduce by 0.25 ticks; full set bonus adds 0.5 for 2 ticks total. Cape overrides Graceful. -- During combat, movement is a flee attempt. Mob hits during the countdown abort the flee ("Can't escape!"). -- Level-up messages output `*** You are now level N ! ***` across all skills that gain XP. - -Skills provide specialized instructions and workflows for specific tasks. diff --git a/cmd/mud/main.go b/cmd/mud/main.go index 497f427..ef4a560 100644 --- a/cmd/mud/main.go +++ b/cmd/mud/main.go @@ -35,7 +35,7 @@ func main() { } } - g := game.New(dataDir, &cfg.Colors) + g := game.New(dataDir, &cfg.Colors, cfg.Game.StartupValidation) g.Ticks.Start(cfg.Game.TickLength) defer g.Ticks.Stop() diff --git a/data/items/abyssal_bracelet.yaml b/data/items/abyssal_bracelet.yaml deleted file mode 100644 index 3b424c3..0000000 --- a/data/items/abyssal_bracelet.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: abyssal_bracelet -name: abyssal bracelet -color: "255" -description: "An enchanted diamond bracelet that increases scavenging output." -value: 6000 -equip_slot: hands diff --git a/data/items/acid_vial.yaml b/data/items/acid_vial.yaml deleted file mode 100644 index 7a49e2d..0000000 --- a/data/items/acid_vial.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: acid_vial -name: acid vial -color: "46" -description: "A small vial of concentrated acid. Used to dissolve crawlers." -value: 10 -stackable: true diff --git a/data/items/adamant_arrow.yaml b/data/items/adamant_arrow.yaml deleted file mode 100644 index bbcdcab..0000000 --- a/data/items/adamant_arrow.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: adamant_arrow -name: adamant arrow -color: "120" -description: "An adamant-tipped arrow." -value: 20 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 31 diff --git a/data/items/adamant_arrowtips.yaml b/data/items/adamant_arrowtips.yaml deleted file mode 100644 index 49ddb57..0000000 --- a/data/items/adamant_arrowtips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: adamant_arrowtips -name: adamant arrowtips -color: "120" -description: "A set of adamant arrowtips." -value: 16 -stackable: true diff --git a/data/items/adamant_axe.yaml b/data/items/adamant_axe.yaml deleted file mode 100644 index 81232fe..0000000 --- a/data/items/adamant_axe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: adamant_axe -name: adamant axe -color: "120" -description: "A sturdy adamant axe, good for woodcutting." -value: 500 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: -2 - slash_attack: 29 - crush_attack: 22 - strength_bonus: 24 -speed: 5 -tool_type: axe -tool_speed: 2 -requirements: - attack: 30 diff --git a/data/items/adamant_bolts.yaml b/data/items/adamant_bolts.yaml deleted file mode 100644 index 47d088f..0000000 --- a/data/items/adamant_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: adamant_bolts -name: adamant bolts -color: "120" -description: "Adamant crossbow bolts." -value: 24 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 43 diff --git a/data/items/adamant_bolts_unf.yaml b/data/items/adamant_bolts_unf.yaml deleted file mode 100644 index db709db..0000000 --- a/data/items/adamant_bolts_unf.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: adamant_bolts_unf -name: adamant bolts (unf) -color: "120" -description: "Unfinished adamant crossbow bolts." -value: 20 -stackable: true diff --git a/data/items/adamant_dagger.yaml b/data/items/adamant_dagger.yaml deleted file mode 100644 index d78ecdc..0000000 --- a/data/items/adamant_dagger.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: adamant_dagger -name: adamant dagger -color: "120" -description: "A small adamant dagger." -value: 400 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 23 - slash_attack: 14 - crush_attack: -1 - strength_bonus: 19 -speed: 3 -requirements: - attack: 30 diff --git a/data/items/adamant_full_helm.yaml b/data/items/adamant_full_helm.yaml deleted file mode 100644 index 3c36c62..0000000 --- a/data/items/adamant_full_helm.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: adamant_full_helm -name: adamant full helm -color: "120" -description: "An adamant full helmet." -value: 1000 -stackable: false -equip_slot: head -stats: - stab_defense: 22 - slash_defense: 24 - crush_defense: 16 - science_defense: -8 - ranged_defense: 22 -requirements: - defense: 30 diff --git a/data/items/adamant_med_helm.yaml b/data/items/adamant_med_helm.yaml deleted file mode 100644 index 1fb6785..0000000 --- a/data/items/adamant_med_helm.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: adamant_med_helm -name: adamant med helm -color: "120" -description: "An adamant medium helmet." -value: 400 -stackable: false -equip_slot: head -stats: - stab_defense: 14 - slash_defense: 16 - crush_defense: 10 - science_defense: -3 - ranged_defense: 14 -requirements: - defense: 30 diff --git a/data/items/adamant_nails.yaml b/data/items/adamant_nails.yaml deleted file mode 100644 index c40d228..0000000 --- a/data/items/adamant_nails.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: adamant_nails -name: adamant nails -color: "120" -description: "A set of adamant nails." -value: 16 -stackable: true diff --git a/data/items/adamant_pickaxe.yaml b/data/items/adamant_pickaxe.yaml deleted file mode 100644 index 4296b0d..0000000 --- a/data/items/adamant_pickaxe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: adamant_pickaxe -name: adamant pickaxe -color: "120" -description: "A sturdy adamant pickaxe, good for mining." -value: 500 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 23 - slash_attack: -2 - crush_attack: 10 - strength_bonus: 16 -speed: 5 -tool_type: pickaxe -tool_speed: 0.75 -requirements: - attack: 30 diff --git a/data/items/adamant_platebody.yaml b/data/items/adamant_platebody.yaml deleted file mode 100644 index a37b781..0000000 --- a/data/items/adamant_platebody.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: adamant_platebody -name: adamant platebody -color: "120" -description: "An adamant platebody." -value: 5000 -stackable: false -equip_slot: torso -stats: - stab_defense: 49 - slash_defense: 55 - crush_defense: 40 - science_defense: -25 - ranged_defense: 49 -requirements: - defense: 30 diff --git a/data/items/adamant_sword.yaml b/data/items/adamant_sword.yaml deleted file mode 100644 index 035b615..0000000 --- a/data/items/adamant_sword.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: adamant_sword -name: adamant sword -color: "120" -description: "An adamant sword." -value: 700 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: 20 - slash_attack: 40 - crush_attack: -2 - strength_bonus: 27 -speed: 4 -requirements: - attack: 30 diff --git a/data/items/adamantite_bar.yaml b/data/items/adamantite_bar.yaml deleted file mode 100644 index 5a9b827..0000000 --- a/data/items/adamantite_bar.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: adamantite_bar -name: adamantite bar -color: "71" -description: "A bar of adamantite metal, extremely durable." -value: 200 -stackable: false diff --git a/data/items/adamantite_ore.yaml b/data/items/adamantite_ore.yaml deleted file mode 100644 index fabe0da..0000000 --- a/data/items/adamantite_ore.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: adamantite_ore -name: adamantite ore -color: "120" -description: "A chunk of dark green adamantite ore." -value: 100 -stackable: false diff --git a/data/items/advanced_bio_deck.yaml b/data/items/advanced_bio_deck.yaml deleted file mode 100644 index 1411a16..0000000 --- a/data/items/advanced_bio_deck.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: advanced_bio_deck -name: advanced bio deck -color: "196 bold" -description: "A high-powered bio deck with enhanced circuitry. Provides unlimited biojunk and removes the scrap requirement." -value: 15000 -equip_slot: main_hand -weapon_type: science -speed: 5 -stats: - science_attack: 20 -provides_junk: biojunk diff --git a/data/items/advanced_eco_deck.yaml b/data/items/advanced_eco_deck.yaml deleted file mode 100644 index c844f47..0000000 --- a/data/items/advanced_eco_deck.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: advanced_eco_deck -name: advanced eco deck -color: "34 bold" -description: "A high-powered eco deck with enhanced circuitry. Provides unlimited ecojunk and removes the scrap requirement." -value: 15000 -equip_slot: main_hand -weapon_type: science -speed: 5 -stats: - science_attack: 20 -provides_junk: ecojunk diff --git a/data/items/advanced_hydro_deck.yaml b/data/items/advanced_hydro_deck.yaml deleted file mode 100644 index 2910931..0000000 --- a/data/items/advanced_hydro_deck.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: advanced_hydro_deck -name: advanced hydro deck -color: "39 bold" -description: "A high-powered hydro deck with enhanced circuitry. Provides unlimited hydrojunk and removes the scrap requirement." -value: 15000 -equip_slot: main_hand -weapon_type: science -speed: 5 -stats: - science_attack: 20 -provides_junk: hydrojunk diff --git a/data/items/advanced_solar_deck.yaml b/data/items/advanced_solar_deck.yaml deleted file mode 100644 index 002845c..0000000 --- a/data/items/advanced_solar_deck.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: advanced_solar_deck -name: advanced solar deck -color: "220 bold" -description: "A high-powered solar deck with enhanced circuitry. Provides unlimited solarjunk and removes the scrap requirement." -value: 15000 -equip_slot: main_hand -weapon_type: science -speed: 5 -stats: - science_attack: 20 -provides_junk: solarjunk diff --git a/data/items/ammo/adamant_arrow.yaml b/data/items/ammo/adamant_arrow.yaml new file mode 100644 index 0000000..bbcdcab --- /dev/null +++ b/data/items/ammo/adamant_arrow.yaml @@ -0,0 +1,9 @@ +id: adamant_arrow +name: adamant arrow +color: "120" +description: "An adamant-tipped arrow." +value: 20 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 31 diff --git a/data/items/ammo/adamant_arrowtips.yaml b/data/items/ammo/adamant_arrowtips.yaml new file mode 100644 index 0000000..49ddb57 --- /dev/null +++ b/data/items/ammo/adamant_arrowtips.yaml @@ -0,0 +1,6 @@ +id: adamant_arrowtips +name: adamant arrowtips +color: "120" +description: "A set of adamant arrowtips." +value: 16 +stackable: true diff --git a/data/items/ammo/adamant_bolts.yaml b/data/items/ammo/adamant_bolts.yaml new file mode 100644 index 0000000..47d088f --- /dev/null +++ b/data/items/ammo/adamant_bolts.yaml @@ -0,0 +1,9 @@ +id: adamant_bolts +name: adamant bolts +color: "120" +description: "Adamant crossbow bolts." +value: 24 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 43 diff --git a/data/items/ammo/adamant_bolts_unf.yaml b/data/items/ammo/adamant_bolts_unf.yaml new file mode 100644 index 0000000..db709db --- /dev/null +++ b/data/items/ammo/adamant_bolts_unf.yaml @@ -0,0 +1,6 @@ +id: adamant_bolts_unf +name: adamant bolts (unf) +color: "120" +description: "Unfinished adamant crossbow bolts." +value: 20 +stackable: true diff --git a/data/items/ammo/arrow_shaft.yaml b/data/items/ammo/arrow_shaft.yaml new file mode 100644 index 0000000..715a3e6 --- /dev/null +++ b/data/items/ammo/arrow_shaft.yaml @@ -0,0 +1,6 @@ +id: arrow_shaft +name: arrow shaft +color: "137" +description: "A wooden arrow shaft. Needs feathers and a head." +value: 1 +stackable: true diff --git a/data/items/ammo/bronze_arrow.yaml b/data/items/ammo/bronze_arrow.yaml new file mode 100644 index 0000000..eb73a48 --- /dev/null +++ b/data/items/ammo/bronze_arrow.yaml @@ -0,0 +1,9 @@ +id: bronze_arrow +name: bronze arrow +color: "178" +description: "A bronze-tipped arrow." +value: 1 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 7 diff --git a/data/items/ammo/bronze_arrowtips.yaml b/data/items/ammo/bronze_arrowtips.yaml new file mode 100644 index 0000000..df42e59 --- /dev/null +++ b/data/items/ammo/bronze_arrowtips.yaml @@ -0,0 +1,6 @@ +id: bronze_arrowtips +name: bronze arrowtips +color: "178" +description: "A set of bronze arrowtips." +value: 1 +stackable: true diff --git a/data/items/ammo/bronze_bolts.yaml b/data/items/ammo/bronze_bolts.yaml new file mode 100644 index 0000000..0d3afae --- /dev/null +++ b/data/items/ammo/bronze_bolts.yaml @@ -0,0 +1,9 @@ +id: bronze_bolts +name: bronze bolts +color: "178" +description: "Bronze crossbow bolts." +value: 1 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 10 diff --git a/data/items/ammo/bronze_bolts_unf.yaml b/data/items/ammo/bronze_bolts_unf.yaml new file mode 100644 index 0000000..538d8ab --- /dev/null +++ b/data/items/ammo/bronze_bolts_unf.yaml @@ -0,0 +1,6 @@ +id: bronze_bolts_unf +name: bronze bolts (unf) +color: "178" +description: "Unfinished bronze crossbow bolts." +value: 1 +stackable: true diff --git a/data/items/ammo/diamond_bolt_tips.yaml b/data/items/ammo/diamond_bolt_tips.yaml new file mode 100644 index 0000000..1529b11 --- /dev/null +++ b/data/items/ammo/diamond_bolt_tips.yaml @@ -0,0 +1,6 @@ +id: diamond_bolt_tips +name: diamond bolt tips +color: "255" +description: "Bolt tips cut from a diamond." +value: 200 +stackable: true diff --git a/data/items/ammo/diamond_bolts.yaml b/data/items/ammo/diamond_bolts.yaml new file mode 100644 index 0000000..efe8013 --- /dev/null +++ b/data/items/ammo/diamond_bolts.yaml @@ -0,0 +1,9 @@ +id: diamond_bolts +name: diamond bolts +color: "255" +description: "Bolts tipped with diamond. Can be enchanted via science." +value: 130 +stackable: true +equip_slot: ammo +stats: + ranged_attack: 9 diff --git a/data/items/ammo/diamond_bolts_e.yaml b/data/items/ammo/diamond_bolts_e.yaml new file mode 100644 index 0000000..93ade4c --- /dev/null +++ b/data/items/ammo/diamond_bolts_e.yaml @@ -0,0 +1,9 @@ +id: diamond_bolts_e +name: diamond bolts e +color: "255 bold" +description: "Enchanted diamond-tipped bolts. Have a chance to ignore the target's defense." +value: 180 +stackable: true +equip_slot: ammo +stats: + ranged_attack: 10 diff --git a/data/items/ammo/emerald_bolt_tips.yaml b/data/items/ammo/emerald_bolt_tips.yaml new file mode 100644 index 0000000..afd285b --- /dev/null +++ b/data/items/ammo/emerald_bolt_tips.yaml @@ -0,0 +1,6 @@ +id: emerald_bolt_tips +name: emerald bolt tips +color: "83" +description: "Bolt tips cut from an emerald." +value: 50 +stackable: true diff --git a/data/items/ammo/emerald_bolts.yaml b/data/items/ammo/emerald_bolts.yaml new file mode 100644 index 0000000..1afdcd0 --- /dev/null +++ b/data/items/ammo/emerald_bolts.yaml @@ -0,0 +1,9 @@ +id: emerald_bolts +name: emerald bolts +color: "34" +description: "Bolts tipped with emerald. Can be enchanted via science." +value: 40 +stackable: true +equip_slot: ammo +stats: + ranged_attack: 5 diff --git a/data/items/ammo/emerald_bolts_e.yaml b/data/items/ammo/emerald_bolts_e.yaml new file mode 100644 index 0000000..4cb7cbd --- /dev/null +++ b/data/items/ammo/emerald_bolts_e.yaml @@ -0,0 +1,9 @@ +id: emerald_bolts_e +name: emerald bolts e +color: "34 bold" +description: "Enchanted emerald-tipped bolts. Have a chance to poison the target." +value: 55 +stackable: true +equip_slot: ammo +stats: + ranged_attack: 6 diff --git a/data/items/ammo/headless_arrow.yaml b/data/items/ammo/headless_arrow.yaml new file mode 100644 index 0000000..acf1384 --- /dev/null +++ b/data/items/ammo/headless_arrow.yaml @@ -0,0 +1,6 @@ +id: headless_arrow +name: headless arrow +color: "137" +description: "An arrow shaft with feathers attached. Needs a head." +value: 1 +stackable: true diff --git a/data/items/ammo/iron_arrow.yaml b/data/items/ammo/iron_arrow.yaml new file mode 100644 index 0000000..ebadaec --- /dev/null +++ b/data/items/ammo/iron_arrow.yaml @@ -0,0 +1,9 @@ +id: iron_arrow +name: iron arrow +color: "250" +description: "An iron-tipped arrow." +value: 2 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 10 diff --git a/data/items/ammo/iron_arrowtips.yaml b/data/items/ammo/iron_arrowtips.yaml new file mode 100644 index 0000000..54ffd11 --- /dev/null +++ b/data/items/ammo/iron_arrowtips.yaml @@ -0,0 +1,6 @@ +id: iron_arrowtips +name: iron arrowtips +color: "250" +description: "A set of iron arrowtips." +value: 2 +stackable: true diff --git a/data/items/ammo/iron_bolts.yaml b/data/items/ammo/iron_bolts.yaml new file mode 100644 index 0000000..ed81578 --- /dev/null +++ b/data/items/ammo/iron_bolts.yaml @@ -0,0 +1,9 @@ +id: iron_bolts +name: iron bolts +color: "250" +description: "Iron crossbow bolts." +value: 3 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 17 diff --git a/data/items/ammo/iron_bolts_unf.yaml b/data/items/ammo/iron_bolts_unf.yaml new file mode 100644 index 0000000..0a51ca0 --- /dev/null +++ b/data/items/ammo/iron_bolts_unf.yaml @@ -0,0 +1,6 @@ +id: iron_bolts_unf +name: iron bolts (unf) +color: "250" +description: "Unfinished iron crossbow bolts." +value: 2 +stackable: true diff --git a/data/items/ammo/mithril_arrow.yaml b/data/items/ammo/mithril_arrow.yaml new file mode 100644 index 0000000..23464e9 --- /dev/null +++ b/data/items/ammo/mithril_arrow.yaml @@ -0,0 +1,9 @@ +id: mithril_arrow +name: mithril arrow +color: "75" +description: "A mithril-tipped arrow." +value: 10 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 22 diff --git a/data/items/ammo/mithril_arrowtips.yaml b/data/items/ammo/mithril_arrowtips.yaml new file mode 100644 index 0000000..8f68a34 --- /dev/null +++ b/data/items/ammo/mithril_arrowtips.yaml @@ -0,0 +1,6 @@ +id: mithril_arrowtips +name: mithril arrowtips +color: "75" +description: "A set of mithril arrowtips." +value: 8 +stackable: true diff --git a/data/items/ammo/mithril_bolts.yaml b/data/items/ammo/mithril_bolts.yaml new file mode 100644 index 0000000..e160065 --- /dev/null +++ b/data/items/ammo/mithril_bolts.yaml @@ -0,0 +1,9 @@ +id: mithril_bolts +name: mithril bolts +color: "75" +description: "Mithril crossbow bolts." +value: 12 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 32 diff --git a/data/items/ammo/mithril_bolts_unf.yaml b/data/items/ammo/mithril_bolts_unf.yaml new file mode 100644 index 0000000..8015f1a --- /dev/null +++ b/data/items/ammo/mithril_bolts_unf.yaml @@ -0,0 +1,6 @@ +id: mithril_bolts_unf +name: mithril bolts (unf) +color: "75" +description: "Unfinished mithril crossbow bolts." +value: 10 +stackable: true diff --git a/data/items/ammo/ruby_bolt_tips.yaml b/data/items/ammo/ruby_bolt_tips.yaml new file mode 100644 index 0000000..6ebe1a0 --- /dev/null +++ b/data/items/ammo/ruby_bolt_tips.yaml @@ -0,0 +1,6 @@ +id: ruby_bolt_tips +name: ruby bolt tips +color: "196" +description: "Bolt tips cut from a ruby." +value: 100 +stackable: true diff --git a/data/items/ammo/ruby_bolts.yaml b/data/items/ammo/ruby_bolts.yaml new file mode 100644 index 0000000..b83bec2 --- /dev/null +++ b/data/items/ammo/ruby_bolts.yaml @@ -0,0 +1,9 @@ +id: ruby_bolts +name: ruby bolts +color: "196" +description: "Bolts tipped with ruby. Can be enchanted via science." +value: 75 +stackable: true +equip_slot: ammo +stats: + ranged_attack: 7 diff --git a/data/items/ammo/ruby_bolts_e.yaml b/data/items/ammo/ruby_bolts_e.yaml new file mode 100644 index 0000000..14954c2 --- /dev/null +++ b/data/items/ammo/ruby_bolts_e.yaml @@ -0,0 +1,9 @@ +id: ruby_bolts_e +name: ruby bolts e +color: "196 bold" +description: "Enchanted ruby-tipped bolts. Have a chance to deal extra damage based on the target's remaining HP." +value: 100 +stackable: true +equip_slot: ammo +stats: + ranged_attack: 8 diff --git a/data/items/ammo/rune_arrow.yaml b/data/items/ammo/rune_arrow.yaml new file mode 100644 index 0000000..b00e922 --- /dev/null +++ b/data/items/ammo/rune_arrow.yaml @@ -0,0 +1,9 @@ +id: rune_arrow +name: rune arrow +color: "87" +description: "A rune-tipped arrow." +value: 40 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 49 diff --git a/data/items/ammo/rune_arrowtips.yaml b/data/items/ammo/rune_arrowtips.yaml new file mode 100644 index 0000000..c2d80e0 --- /dev/null +++ b/data/items/ammo/rune_arrowtips.yaml @@ -0,0 +1,6 @@ +id: rune_arrowtips +name: rune arrowtips +color: "87" +description: "A set of rune arrowtips." +value: 30 +stackable: true diff --git a/data/items/ammo/rune_bolts.yaml b/data/items/ammo/rune_bolts.yaml new file mode 100644 index 0000000..82ac597 --- /dev/null +++ b/data/items/ammo/rune_bolts.yaml @@ -0,0 +1,9 @@ +id: rune_bolts +name: rune bolts +color: "87" +description: "Rune crossbow bolts." +value: 48 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 55 diff --git a/data/items/ammo/rune_bolts_unf.yaml b/data/items/ammo/rune_bolts_unf.yaml new file mode 100644 index 0000000..ecaf494 --- /dev/null +++ b/data/items/ammo/rune_bolts_unf.yaml @@ -0,0 +1,6 @@ +id: rune_bolts_unf +name: rune bolts (unf) +color: "87" +description: "Unfinished rune crossbow bolts." +value: 40 +stackable: true diff --git a/data/items/ammo/sapphire_bolt_tips.yaml b/data/items/ammo/sapphire_bolt_tips.yaml new file mode 100644 index 0000000..7513fd3 --- /dev/null +++ b/data/items/ammo/sapphire_bolt_tips.yaml @@ -0,0 +1,6 @@ +id: sapphire_bolt_tips +name: sapphire bolt tips +color: "69" +description: "Bolt tips cut from a sapphire." +value: 25 +stackable: true diff --git a/data/items/ammo/sapphire_bolts.yaml b/data/items/ammo/sapphire_bolts.yaml new file mode 100644 index 0000000..a7102c9 --- /dev/null +++ b/data/items/ammo/sapphire_bolts.yaml @@ -0,0 +1,9 @@ +id: sapphire_bolts +name: sapphire bolts +color: "39" +description: "Bolts tipped with sapphire. Can be enchanted via science." +value: 20 +stackable: true +equip_slot: ammo +stats: + ranged_attack: 3 diff --git a/data/items/ammo/sapphire_bolts_e.yaml b/data/items/ammo/sapphire_bolts_e.yaml new file mode 100644 index 0000000..dc378cc --- /dev/null +++ b/data/items/ammo/sapphire_bolts_e.yaml @@ -0,0 +1,9 @@ +id: sapphire_bolts_e +name: sapphire bolts e +color: "39 bold" +description: "Enchanted sapphire-tipped bolts. Have a chance to drain the target's Science level." +value: 30 +stackable: true +equip_slot: ammo +stats: + ranged_attack: 4 diff --git a/data/items/ammo/steel_arrow.yaml b/data/items/ammo/steel_arrow.yaml new file mode 100644 index 0000000..e14171f --- /dev/null +++ b/data/items/ammo/steel_arrow.yaml @@ -0,0 +1,9 @@ +id: steel_arrow +name: steel arrow +color: "253" +description: "A steel-tipped arrow." +value: 5 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 16 diff --git a/data/items/ammo/steel_arrowtips.yaml b/data/items/ammo/steel_arrowtips.yaml new file mode 100644 index 0000000..49000d2 --- /dev/null +++ b/data/items/ammo/steel_arrowtips.yaml @@ -0,0 +1,6 @@ +id: steel_arrowtips +name: steel arrowtips +color: "253" +description: "A set of steel arrowtips." +value: 4 +stackable: true diff --git a/data/items/ammo/steel_bolts.yaml b/data/items/ammo/steel_bolts.yaml new file mode 100644 index 0000000..7dfadf1 --- /dev/null +++ b/data/items/ammo/steel_bolts.yaml @@ -0,0 +1,9 @@ +id: steel_bolts +name: steel bolts +color: "253" +description: "Steel crossbow bolts." +value: 6 +stackable: true +equip_slot: ammo +stats: + ranged_strength: 25 diff --git a/data/items/ammo/steel_bolts_unf.yaml b/data/items/ammo/steel_bolts_unf.yaml new file mode 100644 index 0000000..b65d5fa --- /dev/null +++ b/data/items/ammo/steel_bolts_unf.yaml @@ -0,0 +1,6 @@ +id: steel_bolts_unf +name: steel bolts (unf) +color: "253" +description: "Unfinished steel crossbow bolts." +value: 5 +stackable: true diff --git a/data/items/amp_potion.yaml b/data/items/amp_potion.yaml deleted file mode 100644 index 8167932..0000000 --- a/data/items/amp_potion.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: amp_potion -name: "amp potion" -color: "220" -description: "A glowing gold potion that amplifies physical strength." -value: 55 -stackable: false -potion_effect: "strength" -potion_bonus: 10 -potion_duration: 200 diff --git a/data/items/amulet_mould.yaml b/data/items/amulet_mould.yaml deleted file mode 100644 index a8153cb..0000000 --- a/data/items/amulet_mould.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: amulet_mould -name: amulet mould -color: "250" -description: "A mould for casting amulets." -value: 5 diff --git a/data/items/anchovies.yaml b/data/items/anchovies.yaml deleted file mode 100644 index 0abd846..0000000 --- a/data/items/anchovies.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: anchovies -name: anchovies -color: "209" -description: "Some nicely cooked anchovies." -value: 5 -stackable: false -heal_value: 3 -eat_message: "You eat the anchovies." diff --git a/data/items/antitoxin_powder.yaml b/data/items/antitoxin_powder.yaml deleted file mode 100644 index dedba43..0000000 --- a/data/items/antitoxin_powder.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: antitoxin_powder -name: "antitoxin powder" -color: "255" -description: "A fine white powder derived from synthetic horn material. Neutralizes biological toxins." -value: 15 -stackable: false diff --git a/data/items/apple.yaml b/data/items/apple.yaml deleted file mode 100644 index 10c09c1..0000000 --- a/data/items/apple.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: apple -name: apple -color: "196" -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 diff --git a/data/items/arachnid_enzyme.yaml b/data/items/arachnid_enzyme.yaml deleted file mode 100644 index 4be2f65..0000000 --- a/data/items/arachnid_enzyme.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: arachnid_enzyme -name: "arachnid enzyme" -color: "196" -description: "A viscous red enzyme harvested from spider egg sacs. Potent catalytic agent." -value: 12 -stackable: false diff --git a/data/items/arrow_shaft.yaml b/data/items/arrow_shaft.yaml deleted file mode 100644 index 715a3e6..0000000 --- a/data/items/arrow_shaft.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: arrow_shaft -name: arrow shaft -color: "137" -description: "A wooden arrow shaft. Needs feathers and a head." -value: 1 -stackable: true diff --git a/data/items/ashes.yaml b/data/items/ashes.yaml deleted file mode 100644 index 0b83f77..0000000 --- a/data/items/ashes.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ashes -name: ashes -color: "243" -description: "A pile of cold ashes. What was once ablaze is now mere dust." -value: 1 -stackable: false diff --git a/data/items/avantoe.yaml b/data/items/avantoe.yaml deleted file mode 100644 index d596096..0000000 --- a/data/items/avantoe.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: avantoe -name: "avantoe" -color: "48" -description: "A clean avantoe leaf, ready for use in pharmacy." -value: 48 -stackable: true diff --git a/data/items/avantoe_potion_unf.yaml b/data/items/avantoe_potion_unf.yaml deleted file mode 100644 index 8b23f35..0000000 --- a/data/items/avantoe_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: avantoe_potion_unf -name: "avantoe potion (unf)" -color: "48" -description: "An unfinished potion with avantoe floating in water." -value: 50 -stackable: false -made_from: - - items: [avantoe] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/avantoe_seed.yaml b/data/items/avantoe_seed.yaml deleted file mode 100644 index fb7b427..0000000 --- a/data/items/avantoe_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: avantoe_seed -name: avantoe seed -color: "34" -description: "An avantoe seed for planting in a herb patch." -value: 60 -stackable: true -farm_patch_type: herb -farm_level: 50 -farm_plant_xp: 55 -farm_harvest_xp: 62 -farm_stages: 4 -farm_product: avantoe -farm_min_yield: 3 -farm_max_yield: 10 diff --git a/data/items/ball_of_wool.yaml b/data/items/ball_of_wool.yaml deleted file mode 100644 index 1a680a4..0000000 --- a/data/items/ball_of_wool.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ball_of_wool -name: ball of wool -color: "255" -description: "A ball of spun wool." -value: 5 -stackable: false diff --git a/data/items/basic_deck.yaml b/data/items/basic_deck.yaml deleted file mode 100644 index ef2549a..0000000 --- a/data/items/basic_deck.yaml +++ /dev/null @@ -1,10 +0,0 @@ -id: basic_deck -name: basic deck -color: "245" -description: "A simple programmable deck. Removes the scrap requirement for triggering mods, but provides no elemental junk." -value: 500 -equip_slot: main_hand -weapon_type: science -speed: 5 -stats: - science_attack: 5 diff --git a/data/items/big_fishing_net.yaml b/data/items/big_fishing_net.yaml deleted file mode 100644 index a8b5352..0000000 --- a/data/items/big_fishing_net.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: big_fishing_net -name: big fishing net -color: "230" -description: "A larger fishing net for catching bigger fish." -value: 20 -stackable: false -equip_slot: main_hand -weapon_type: melee -stats: - attack_bonus: 0 - strength_bonus: 0 - defense_bonus: 0 -speed: 5 -tool_type: big_net -tool_speed: 1 diff --git a/data/items/binding_necklace.yaml b/data/items/binding_necklace.yaml deleted file mode 100644 index e9e7559..0000000 --- a/data/items/binding_necklace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: binding_necklace -name: binding necklace -color: "34" -description: "An enchanted emerald necklace. Provides a 100 percent success rate when identifying junk at altars." -value: 1200 -equip_slot: neck diff --git a/data/items/bio_deck.yaml b/data/items/bio_deck.yaml deleted file mode 100644 index 8de2036..0000000 --- a/data/items/bio_deck.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: bio_deck -name: bio deck -color: "196" -description: "A programmable deck infused with bio-synthetic membranes. Provides unlimited biojunk and removes the scrap requirement." -value: 1500 -equip_slot: main_hand -weapon_type: science -speed: 5 -stats: - science_attack: 10 -provides_junk: biojunk diff --git a/data/items/bio_identifier.yaml b/data/items/bio_identifier.yaml deleted file mode 100644 index 1b5a941..0000000 --- a/data/items/bio_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: bio_identifier -name: bio identifier -color: "196" -description: "A handheld scanner calibrated to isolate bio-frequency signatures in scrap metal. Required to produce biojunk at a bio altar." -value: 5000 diff --git a/data/items/bio_serum.yaml b/data/items/bio_serum.yaml deleted file mode 100644 index b397e46..0000000 --- a/data/items/bio_serum.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: bio_serum -name: "bio serum" -color: "48" -description: "A green serum that neutralizes biological toxins and restores health." -value: 45 -stackable: false -potion_effect: "heal" -potion_bonus: 60 -potion_duration: 0 diff --git a/data/items/biojunk.yaml b/data/items/biojunk.yaml deleted file mode 100644 index 8832a20..0000000 --- a/data/items/biojunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: biojunk -name: biojunk -color: "196" -description: "A fragment of reclaimed bio circuitry. Used as a universal energy medium." -value: 50 -stackable: true diff --git a/data/items/birds_nest.yaml b/data/items/birds_nest.yaml deleted file mode 100644 index 1366b5d..0000000 --- a/data/items/birds_nest.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: birds_nest -name: bird's nest -color: "179" -description: "A bird's nest. You can search it for treasure." -value: 5 -stackable: false -search_table: birds_nest_drop -search_ticks: 3 -search_message: "digging through the bird's nest" diff --git a/data/items/black_axe.yaml b/data/items/black_axe.yaml deleted file mode 100644 index e708645..0000000 --- a/data/items/black_axe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: black_axe -name: black axe -color: "240" -description: "A black axe, good for woodcutting." -value: 150 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: -2 - slash_attack: 18 - crush_attack: 14 - strength_bonus: 14 -speed: 5 -tool_type: axe -tool_speed: 2.5 -requirements: - attack: 10 diff --git a/data/items/black_pickaxe.yaml b/data/items/black_pickaxe.yaml deleted file mode 100644 index c3df955..0000000 --- a/data/items/black_pickaxe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: black_pickaxe -name: black pickaxe -color: "240" -description: "A black pickaxe, good for mining." -value: 150 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 14 - slash_attack: -2 - crush_attack: 6 - strength_bonus: 9 -speed: 5 -tool_type: pickaxe -tool_speed: 1 -requirements: - attack: 10 diff --git a/data/items/blight_spore.yaml b/data/items/blight_spore.yaml deleted file mode 100644 index add0f6e..0000000 --- a/data/items/blight_spore.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: blight_spore -name: "blight spore" -color: "58" -description: "A desiccated fungal spore from the deadlands. Pulsing with residual bio-energy." -value: 20 -stackable: false diff --git a/data/items/blood_identifier.yaml b/data/items/blood_identifier.yaml deleted file mode 100644 index 3540179..0000000 --- a/data/items/blood_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: blood_identifier -name: blood identifier -color: "124" -description: "A handheld scanner calibrated to isolate blood-frequency signatures in scrap metal. Required to produce bloodjunk at a blood altar." -value: 15000 diff --git a/data/items/bloodjunk.yaml b/data/items/bloodjunk.yaml deleted file mode 100644 index b837137..0000000 --- a/data/items/bloodjunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: bloodjunk -name: bloodjunk -color: "124" -description: "A fragment of reclaimed blood circuitry. Used as a universal energy medium." -value: 90 -stackable: true diff --git a/data/items/bones.yaml b/data/items/bones.yaml deleted file mode 100644 index 25097d3..0000000 --- a/data/items/bones.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: bones -name: bones -color: "253" -description: "A pile of bones." -value: 2 -stackable: false diff --git a/data/items/bowstring.yaml b/data/items/bowstring.yaml deleted file mode 100644 index a180081..0000000 --- a/data/items/bowstring.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: bowstring -name: bowstring -color: "230" -description: "A string used for stringing bows." -value: 10 diff --git a/data/items/bracelet_mould.yaml b/data/items/bracelet_mould.yaml deleted file mode 100644 index 78bc099..0000000 --- a/data/items/bracelet_mould.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: bracelet_mould -name: bracelet mould -color: "250" -description: "A mould for casting bracelets." -value: 5 diff --git a/data/items/bracelet_of_clay.yaml b/data/items/bracelet_of_clay.yaml deleted file mode 100644 index d8cd881..0000000 --- a/data/items/bracelet_of_clay.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: bracelet_of_clay -name: bracelet of clay -color: "39" -description: "An enchanted sapphire bracelet. Softens clay for easier crafting." -value: 500 -equip_slot: hands diff --git a/data/items/bracelet_of_slaughter.yaml b/data/items/bracelet_of_slaughter.yaml deleted file mode 100644 index 2bbbbec..0000000 --- a/data/items/bracelet_of_slaughter.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: bracelet_of_slaughter -name: bracelet of slaughter -color: "34" -description: "An enchanted emerald bracelet that provides bonus XP on kills." -value: 1200 -equip_slot: hands diff --git a/data/items/bread.yaml b/data/items/bread.yaml deleted file mode 100644 index 68cefdc..0000000 --- a/data/items/bread.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: bread -name: bread -color: "222" -description: "A fresh loaf of bread, still warm from the oven." -value: 5 -stackable: false -heal_value: 5 -eat_message: "You eat the bread. Warm and satisfying." diff --git a/data/items/bread_dough.yaml b/data/items/bread_dough.yaml deleted file mode 100644 index 98ab297..0000000 --- a/data/items/bread_dough.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: bread_dough -name: bread dough -color: "222" -description: "A ball of uncooked bread dough. It needs to be baked." -value: 3 -stackable: false -ticks: 2 -made_from: - - items: [pot_of_flour] - qty: 1 - byproducts: [empty_pot] - - items: [bucket_of_water, jug_of_water] - qty: 1 - byproducts: [empty_bucket, empty_jug] diff --git a/data/items/bronze_arrow.yaml b/data/items/bronze_arrow.yaml deleted file mode 100644 index eb73a48..0000000 --- a/data/items/bronze_arrow.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: bronze_arrow -name: bronze arrow -color: "178" -description: "A bronze-tipped arrow." -value: 1 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 7 diff --git a/data/items/bronze_arrowtips.yaml b/data/items/bronze_arrowtips.yaml deleted file mode 100644 index df42e59..0000000 --- a/data/items/bronze_arrowtips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: bronze_arrowtips -name: bronze arrowtips -color: "178" -description: "A set of bronze arrowtips." -value: 1 -stackable: true diff --git a/data/items/bronze_axe.yaml b/data/items/bronze_axe.yaml deleted file mode 100644 index 84b2762..0000000 --- a/data/items/bronze_axe.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: bronze_axe -name: bronze axe -color: "178" -description: "A sturdy bronze axe, good for woodcutting." -value: 10 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: -2 - slash_attack: 7 - crush_attack: 5 - strength_bonus: 5 -speed: 5 -tool_type: axe -tool_speed: 4 diff --git a/data/items/bronze_bar.yaml b/data/items/bronze_bar.yaml deleted file mode 100644 index 053cfe8..0000000 --- a/data/items/bronze_bar.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: bronze_bar -name: bronze bar -color: "178" -description: "A bar of bronze metal, smelted from copper and tin ore." -value: 4 -stackable: false diff --git a/data/items/bronze_bolts.yaml b/data/items/bronze_bolts.yaml deleted file mode 100644 index 0d3afae..0000000 --- a/data/items/bronze_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: bronze_bolts -name: bronze bolts -color: "178" -description: "Bronze crossbow bolts." -value: 1 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 10 diff --git a/data/items/bronze_bolts_unf.yaml b/data/items/bronze_bolts_unf.yaml deleted file mode 100644 index 538d8ab..0000000 --- a/data/items/bronze_bolts_unf.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: bronze_bolts_unf -name: bronze bolts (unf) -color: "178" -description: "Unfinished bronze crossbow bolts." -value: 1 -stackable: true diff --git a/data/items/bronze_dagger.yaml b/data/items/bronze_dagger.yaml deleted file mode 100644 index 95ec968..0000000 --- a/data/items/bronze_dagger.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: bronze_dagger -name: bronze dagger -color: "178" -description: "A small bronze dagger." -value: 8 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 5 - slash_attack: 3 - crush_attack: -1 - strength_bonus: 4 -speed: 3 diff --git a/data/items/bronze_full_helm.yaml b/data/items/bronze_full_helm.yaml deleted file mode 100644 index ed006a8..0000000 --- a/data/items/bronze_full_helm.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: bronze_full_helm -name: bronze full helm -color: "178" -description: "A bronze full helmet." -value: 20 -stackable: false -equip_slot: head -stats: - stab_defense: 5 - slash_defense: 6 - crush_defense: 4 - science_defense: -3 - ranged_defense: 5 diff --git a/data/items/bronze_med_helm.yaml b/data/items/bronze_med_helm.yaml deleted file mode 100644 index c9635cf..0000000 --- a/data/items/bronze_med_helm.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: bronze_med_helm -name: bronze med helm -color: "178" -description: "A bronze medium helmet." -value: 8 -stackable: false -equip_slot: head -stats: - stab_defense: 3 - slash_defense: 4 - crush_defense: 2 - science_defense: -1 - ranged_defense: 3 diff --git a/data/items/bronze_nails.yaml b/data/items/bronze_nails.yaml deleted file mode 100644 index 513e9c4..0000000 --- a/data/items/bronze_nails.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: bronze_nails -name: bronze nails -color: "178" -description: "A set of bronze nails." -value: 1 -stackable: true diff --git a/data/items/bronze_pickaxe.yaml b/data/items/bronze_pickaxe.yaml deleted file mode 100644 index b581fc0..0000000 --- a/data/items/bronze_pickaxe.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: bronze_pickaxe -name: bronze pickaxe -color: "178" -description: "A sturdy bronze pickaxe, good for mining." -value: 10 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 4 - slash_attack: -2 - crush_attack: 2 - strength_bonus: 3 -speed: 5 -tool_type: pickaxe -tool_speed: 2 diff --git a/data/items/bronze_platebody.yaml b/data/items/bronze_platebody.yaml deleted file mode 100644 index 8e6dd2c..0000000 --- a/data/items/bronze_platebody.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: bronze_platebody -name: bronze platebody -color: "178" -description: "A bronze platebody." -value: 60 -stackable: false -equip_slot: torso -stats: - stab_defense: 12 - slash_defense: 15 - crush_defense: 10 - science_defense: -10 - ranged_defense: 12 diff --git a/data/items/bronze_sword.yaml b/data/items/bronze_sword.yaml deleted file mode 100644 index 0cfdd0e..0000000 --- a/data/items/bronze_sword.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: bronze_sword -name: bronze sword -color: "178" -description: "A basic bronze sword." -value: 12 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: 4 - slash_attack: 10 - crush_attack: -2 - strength_bonus: 7 -speed: 4 diff --git a/data/items/bucket_of_water.yaml b/data/items/bucket_of_water.yaml deleted file mode 100644 index 3449cdd..0000000 --- a/data/items/bucket_of_water.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: bucket_of_water -name: bucket of water -color: "81" -description: "A wooden bucket filled with fresh water." -value: 5 -stackable: false diff --git a/data/items/burnt_fish.yaml b/data/items/burnt_fish.yaml deleted file mode 100644 index 7af9f03..0000000 --- a/data/items/burnt_fish.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: burnt_fish -name: burnt fish -color: "243" -description: "A badly burnt fish. Completely inedible." -value: 0 -stackable: true diff --git a/data/items/burnt_meat.yaml b/data/items/burnt_meat.yaml deleted file mode 100644 index 92c339c..0000000 --- a/data/items/burnt_meat.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: burnt_meat -name: burnt meat -color: "243" -description: "A piece of badly burnt meat. Completely inedible." -value: 0 -stackable: true diff --git a/data/items/cabbage.yaml b/data/items/cabbage.yaml deleted file mode 100644 index c04fd4e..0000000 --- a/data/items/cabbage.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: cabbage -name: cabbage -color: "71" -description: "A freshly harvested cabbage." -value: 3 -stackable: true -heal_value: 1 -eat_message: "You eat the cabbage." diff --git a/data/items/cabbage_seed.yaml b/data/items/cabbage_seed.yaml deleted file mode 100644 index 8a6db33..0000000 --- a/data/items/cabbage_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: cabbage_seed -name: cabbage seed -color: "71" -description: "A seed for growing cabbages." -value: 2 -stackable: true -farm_patch_type: allotment -farm_level: 7 -farm_plant_xp: 10 -farm_harvest_xp: 12 -farm_stages: 4 -farm_product: cabbage -farm_min_yield: 3 -farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/cadantine.yaml b/data/items/cadantine.yaml deleted file mode 100644 index f684f0d..0000000 --- a/data/items/cadantine.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: cadantine -name: "cadantine" -color: "48" -description: "A clean cadantine leaf, ready for use in pharmacy." -value: 70 -stackable: true diff --git a/data/items/cadantine_potion_unf.yaml b/data/items/cadantine_potion_unf.yaml deleted file mode 100644 index 416d938..0000000 --- a/data/items/cadantine_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: cadantine_potion_unf -name: "cadantine potion (unf)" -color: "48" -description: "An unfinished potion with cadantine floating in water." -value: 72 -stackable: false -made_from: - - items: [cadantine] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/cadantine_seed.yaml b/data/items/cadantine_seed.yaml deleted file mode 100644 index 8326033..0000000 --- a/data/items/cadantine_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: cadantine_seed -name: cadantine seed -color: "30" -description: "A cadantine seed for planting in a herb patch." -value: 120 -stackable: true -farm_patch_type: herb -farm_level: 67 -farm_plant_xp: 97 -farm_harvest_xp: 120 -farm_stages: 4 -farm_product: cadantine -farm_min_yield: 3 -farm_max_yield: 9 diff --git a/data/items/capacitor_gloves.yaml b/data/items/capacitor_gloves.yaml deleted file mode 100644 index e5af9ed..0000000 --- a/data/items/capacitor_gloves.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: capacitor_gloves -name: Capacitor Gloves -description: "Gloves woven with superconducting filaments." -color: "250" -value: 300 -equip_slot: hands -stats: - stab_defense: 2 - slash_defense: 2 - crush_defense: 2 - technology_bonus: 2 diff --git a/data/items/cape_of_agility.yaml b/data/items/cape_of_agility.yaml deleted file mode 100644 index 5567e73..0000000 --- a/data/items/cape_of_agility.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: cape_of_agility -name: cape of agility -color: "g:223,231,223" -description: "A lightweight cape that allows the wearer to move with extraordinary speed." -value: 500 -equip_slot: back diff --git a/data/items/catalyst_wine.yaml b/data/items/catalyst_wine.yaml deleted file mode 100644 index fcfe1a0..0000000 --- a/data/items/catalyst_wine.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: catalyst_wine -name: "catalyst wine" -color: "124" -description: "A volatile crimson wine infused with unstable compounds. Handle with care." -value: 30 -stackable: false diff --git a/data/items/chaos_identifier.yaml b/data/items/chaos_identifier.yaml deleted file mode 100644 index 82a7ccf..0000000 --- a/data/items/chaos_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: chaos_identifier -name: chaos identifier -color: "226" -description: "A handheld scanner calibrated to isolate chaos-frequency signatures in scrap metal. Required to produce chaosjunk at a chaos altar." -value: 7500 diff --git a/data/items/chaosjunk.yaml b/data/items/chaosjunk.yaml deleted file mode 100644 index 99515df..0000000 --- a/data/items/chaosjunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: chaosjunk -name: chaosjunk -color: "226" -description: "A fragment of reclaimed chaos circuitry. Used as a universal energy medium." -value: 40 -stackable: true diff --git a/data/items/cheese.yaml b/data/items/cheese.yaml deleted file mode 100644 index 79d9fe8..0000000 --- a/data/items/cheese.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: cheese -name: cheese -color: "226" -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 diff --git a/data/items/chisel.yaml b/data/items/chisel.yaml deleted file mode 100644 index a99c828..0000000 --- a/data/items/chisel.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: chisel -name: chisel -color: "250" -description: "A chisel used for cutting gems." -value: 5 -tool_type: chisel diff --git a/data/items/chitin_plate.yaml b/data/items/chitin_plate.yaml deleted file mode 100644 index 4148a2a..0000000 --- a/data/items/chitin_plate.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: chitin_plate -name: chitin plate -color: "130" -description: "A thick plate of biological armor from a crawler's exoskeleton." -value: 50 -stackable: false diff --git a/data/items/chocolate_dust.yaml b/data/items/chocolate_dust.yaml deleted file mode 100644 index 56a6666..0000000 --- a/data/items/chocolate_dust.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: chocolate_dust -name: "chocolate dust" -color: "94" -description: "Finely ground chocolate. A surprisingly effective pharmaceutical binding agent." -value: 5 -stackable: false diff --git a/data/items/christmas_cracker.yaml b/data/items/christmas_cracker.yaml deleted file mode 100644 index c296443..0000000 --- a/data/items/christmas_cracker.yaml +++ /dev/null @@ -1,10 +0,0 @@ -id: christmas_cracker -name: christmas cracker -color: "196" -description: "A festive party cracker. Pull it apart to see what's inside!" -value: 10 -stackable: true -search_table: christmas_cracker_hat -search_misc_table: christmas_cracker_misc -search_ticks: 3 -search_message: "digging through the christmas cracker" diff --git a/data/items/circuit_board.yaml b/data/items/circuit_board.yaml deleted file mode 100644 index 5b4db83..0000000 --- a/data/items/circuit_board.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: circuit_board -name: circuit board -color: "40" -description: "A scorched circuit board salvaged from a destroyed drone." -value: 25 -stackable: false diff --git a/data/items/clay.yaml b/data/items/clay.yaml deleted file mode 100644 index 55c9b2b..0000000 --- a/data/items/clay.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: clay -name: clay -color: "173" -description: "Some soft clay, useful for crafting and pottery." -value: 1 -stackable: false diff --git a/data/items/coal.yaml b/data/items/coal.yaml deleted file mode 100644 index 7b79f08..0000000 --- a/data/items/coal.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: coal -name: coal -color: "240" -description: "A lump of coal, useful for smelting." -value: 5 -stackable: false diff --git a/data/items/coif.yaml b/data/items/coif.yaml deleted file mode 100644 index 8d910d7..0000000 --- a/data/items/coif.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: coif -name: coif -color: "94" -description: "A hard leather coif." -value: 45 -equip_slot: head -stats: - stab_defense: 2 - slash_defense: 4 - crush_defense: 2 - science_defense: 4 - ranged_defense: 6 - ranged_attack: 2 -requirements: - defense: 20 - ranged: 20 diff --git a/data/items/consumables/acid_vial.yaml b/data/items/consumables/acid_vial.yaml new file mode 100644 index 0000000..7a49e2d --- /dev/null +++ b/data/items/consumables/acid_vial.yaml @@ -0,0 +1,6 @@ +id: acid_vial +name: acid vial +color: "46" +description: "A small vial of concentrated acid. Used to dissolve crawlers." +value: 10 +stackable: true diff --git a/data/items/consumables/amp_potion.yaml b/data/items/consumables/amp_potion.yaml new file mode 100644 index 0000000..8167932 --- /dev/null +++ b/data/items/consumables/amp_potion.yaml @@ -0,0 +1,9 @@ +id: amp_potion +name: "amp potion" +color: "220" +description: "A glowing gold potion that amplifies physical strength." +value: 55 +stackable: false +potion_effect: "strength" +potion_bonus: 10 +potion_duration: 200 diff --git a/data/items/consumables/anchovies.yaml b/data/items/consumables/anchovies.yaml new file mode 100644 index 0000000..0abd846 --- /dev/null +++ b/data/items/consumables/anchovies.yaml @@ -0,0 +1,8 @@ +id: anchovies +name: anchovies +color: "209" +description: "Some nicely cooked anchovies." +value: 5 +stackable: false +heal_value: 3 +eat_message: "You eat the anchovies." diff --git a/data/items/consumables/antitoxin_powder.yaml b/data/items/consumables/antitoxin_powder.yaml new file mode 100644 index 0000000..dedba43 --- /dev/null +++ b/data/items/consumables/antitoxin_powder.yaml @@ -0,0 +1,6 @@ +id: antitoxin_powder +name: "antitoxin powder" +color: "255" +description: "A fine white powder derived from synthetic horn material. Neutralizes biological toxins." +value: 15 +stackable: false diff --git a/data/items/consumables/apple.yaml b/data/items/consumables/apple.yaml new file mode 100644 index 0000000..10c09c1 --- /dev/null +++ b/data/items/consumables/apple.yaml @@ -0,0 +1,8 @@ +id: apple +name: apple +color: "196" +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 diff --git a/data/items/consumables/avantoe_potion_unf.yaml b/data/items/consumables/avantoe_potion_unf.yaml new file mode 100644 index 0000000..62f2218 --- /dev/null +++ b/data/items/consumables/avantoe_potion_unf.yaml @@ -0,0 +1,12 @@ +id: avantoe_potion_unf +name: "avantoe potion (unf)" +color: "48" +description: "An unfinished potion with avantoe floating in water." +value: 50 +stackable: false +made_from: + - items: [avantoe] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/bio_serum.yaml b/data/items/consumables/bio_serum.yaml new file mode 100644 index 0000000..b397e46 --- /dev/null +++ b/data/items/consumables/bio_serum.yaml @@ -0,0 +1,9 @@ +id: bio_serum +name: "bio serum" +color: "48" +description: "A green serum that neutralizes biological toxins and restores health." +value: 45 +stackable: false +potion_effect: "heal" +potion_bonus: 60 +potion_duration: 0 diff --git a/data/items/consumables/blight_spore.yaml b/data/items/consumables/blight_spore.yaml new file mode 100644 index 0000000..add0f6e --- /dev/null +++ b/data/items/consumables/blight_spore.yaml @@ -0,0 +1,6 @@ +id: blight_spore +name: "blight spore" +color: "58" +description: "A desiccated fungal spore from the deadlands. Pulsing with residual bio-energy." +value: 20 +stackable: false diff --git a/data/items/consumables/bread.yaml b/data/items/consumables/bread.yaml new file mode 100644 index 0000000..68cefdc --- /dev/null +++ b/data/items/consumables/bread.yaml @@ -0,0 +1,8 @@ +id: bread +name: bread +color: "222" +description: "A fresh loaf of bread, still warm from the oven." +value: 5 +stackable: false +heal_value: 5 +eat_message: "You eat the bread. Warm and satisfying." diff --git a/data/items/consumables/bread_dough.yaml b/data/items/consumables/bread_dough.yaml new file mode 100644 index 0000000..73ac998 --- /dev/null +++ b/data/items/consumables/bread_dough.yaml @@ -0,0 +1,14 @@ +id: bread_dough +name: bread dough +color: "222" +description: "A ball of uncooked bread dough. It needs to be baked." +value: 3 +stackable: false +ticks: 2 +made_from: + - items: [pot_of_flour] + quantity: 1 + byproducts: [empty_pot] + - items: [bucket_of_water, jug_of_water] + quantity: 1 + byproducts: [empty_bucket, empty_jug] diff --git a/data/items/consumables/bucket_of_water.yaml b/data/items/consumables/bucket_of_water.yaml new file mode 100644 index 0000000..3449cdd --- /dev/null +++ b/data/items/consumables/bucket_of_water.yaml @@ -0,0 +1,6 @@ +id: bucket_of_water +name: bucket of water +color: "81" +description: "A wooden bucket filled with fresh water." +value: 5 +stackable: false diff --git a/data/items/consumables/burnt_fish.yaml b/data/items/consumables/burnt_fish.yaml new file mode 100644 index 0000000..7af9f03 --- /dev/null +++ b/data/items/consumables/burnt_fish.yaml @@ -0,0 +1,6 @@ +id: burnt_fish +name: burnt fish +color: "243" +description: "A badly burnt fish. Completely inedible." +value: 0 +stackable: true diff --git a/data/items/consumables/burnt_meat.yaml b/data/items/consumables/burnt_meat.yaml new file mode 100644 index 0000000..92c339c --- /dev/null +++ b/data/items/consumables/burnt_meat.yaml @@ -0,0 +1,6 @@ +id: burnt_meat +name: burnt meat +color: "243" +description: "A piece of badly burnt meat. Completely inedible." +value: 0 +stackable: true diff --git a/data/items/consumables/cabbage.yaml b/data/items/consumables/cabbage.yaml new file mode 100644 index 0000000..c04fd4e --- /dev/null +++ b/data/items/consumables/cabbage.yaml @@ -0,0 +1,8 @@ +id: cabbage +name: cabbage +color: "71" +description: "A freshly harvested cabbage." +value: 3 +stackable: true +heal_value: 1 +eat_message: "You eat the cabbage." diff --git a/data/items/consumables/cadantine_potion_unf.yaml b/data/items/consumables/cadantine_potion_unf.yaml new file mode 100644 index 0000000..d1f13c6 --- /dev/null +++ b/data/items/consumables/cadantine_potion_unf.yaml @@ -0,0 +1,12 @@ +id: cadantine_potion_unf +name: "cadantine potion (unf)" +color: "48" +description: "An unfinished potion with cadantine floating in water." +value: 72 +stackable: false +made_from: + - items: [cadantine] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/catalyst_wine.yaml b/data/items/consumables/catalyst_wine.yaml new file mode 100644 index 0000000..fcfe1a0 --- /dev/null +++ b/data/items/consumables/catalyst_wine.yaml @@ -0,0 +1,6 @@ +id: catalyst_wine +name: "catalyst wine" +color: "124" +description: "A volatile crimson wine infused with unstable compounds. Handle with care." +value: 30 +stackable: false diff --git a/data/items/consumables/cheese.yaml b/data/items/consumables/cheese.yaml new file mode 100644 index 0000000..79d9fe8 --- /dev/null +++ b/data/items/consumables/cheese.yaml @@ -0,0 +1,8 @@ +id: cheese +name: cheese +color: "226" +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 diff --git a/data/items/consumables/dwarf_weed_potion_unf.yaml b/data/items/consumables/dwarf_weed_potion_unf.yaml new file mode 100644 index 0000000..64f7faa --- /dev/null +++ b/data/items/consumables/dwarf_weed_potion_unf.yaml @@ -0,0 +1,12 @@ +id: dwarf_weed_potion_unf +name: "dwarf weed potion (unf)" +color: "48" +description: "An unfinished potion with dwarf weed floating in water." +value: 88 +stackable: false +made_from: + - items: [dwarf_weed] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/full_restore.yaml b/data/items/consumables/full_restore.yaml new file mode 100644 index 0000000..96f6036 --- /dev/null +++ b/data/items/consumables/full_restore.yaml @@ -0,0 +1,9 @@ +id: full_restore +name: "full restore" +color: "208" +description: "A powerful orange potion that completely restores health." +value: 200 +stackable: false +potion_effect: "heal" +potion_bonus: 500 +potion_duration: 0 diff --git a/data/items/consumables/guam_potion_unf.yaml b/data/items/consumables/guam_potion_unf.yaml new file mode 100644 index 0000000..ba81e93 --- /dev/null +++ b/data/items/consumables/guam_potion_unf.yaml @@ -0,0 +1,12 @@ +id: guam_potion_unf +name: "guam potion (unf)" +color: "48" +description: "An unfinished potion with guam floating in water." +value: 5 +stackable: false +made_from: + - items: [guam] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/harralander_potion_unf.yaml b/data/items/consumables/harralander_potion_unf.yaml new file mode 100644 index 0000000..522f8ea --- /dev/null +++ b/data/items/consumables/harralander_potion_unf.yaml @@ -0,0 +1,12 @@ +id: harralander_potion_unf +name: "harralander potion (unf)" +color: "48" +description: "An unfinished potion with harralander floating in water." +value: 18 +stackable: false +made_from: + - items: [harralander] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/herring.yaml b/data/items/consumables/herring.yaml new file mode 100644 index 0000000..adbbd95 --- /dev/null +++ b/data/items/consumables/herring.yaml @@ -0,0 +1,8 @@ +id: herring +name: herring +color: "209" +description: "A nicely cooked herring." +value: 7 +stackable: false +heal_value: 5 +eat_message: "You eat the herring." diff --git a/data/items/consumables/irit_potion_unf.yaml b/data/items/consumables/irit_potion_unf.yaml new file mode 100644 index 0000000..76a8577 --- /dev/null +++ b/data/items/consumables/irit_potion_unf.yaml @@ -0,0 +1,12 @@ +id: irit_potion_unf +name: "irit potion (unf)" +color: "48" +description: "An unfinished potion with irit floating in water." +value: 42 +stackable: false +made_from: + - items: [irit] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/jug_of_water.yaml b/data/items/consumables/jug_of_water.yaml new file mode 100644 index 0000000..04d3b8f --- /dev/null +++ b/data/items/consumables/jug_of_water.yaml @@ -0,0 +1,6 @@ +id: jug_of_water +name: jug of water +color: "81" +description: "A ceramic jug filled with fresh water." +value: 5 +stackable: false diff --git a/data/items/consumables/kwuarm_potion_unf.yaml b/data/items/consumables/kwuarm_potion_unf.yaml new file mode 100644 index 0000000..0448145 --- /dev/null +++ b/data/items/consumables/kwuarm_potion_unf.yaml @@ -0,0 +1,12 @@ +id: kwuarm_potion_unf +name: "kwuarm potion (unf)" +color: "48" +description: "An unfinished potion with kwuarm floating in water." +value: 56 +stackable: false +made_from: + - items: [kwuarm] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/lantadyme_potion_unf.yaml b/data/items/consumables/lantadyme_potion_unf.yaml new file mode 100644 index 0000000..3460a18 --- /dev/null +++ b/data/items/consumables/lantadyme_potion_unf.yaml @@ -0,0 +1,12 @@ +id: lantadyme_potion_unf +name: "lantadyme potion (unf)" +color: "48" +description: "An unfinished potion with lantadyme floating in water." +value: 80 +stackable: false +made_from: + - items: [lantadyme] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/marrentill_potion_unf.yaml b/data/items/consumables/marrentill_potion_unf.yaml new file mode 100644 index 0000000..4424e5e --- /dev/null +++ b/data/items/consumables/marrentill_potion_unf.yaml @@ -0,0 +1,12 @@ +id: marrentill_potion_unf +name: "marrentill potion (unf)" +color: "48" +description: "An unfinished potion with marrentill floating in water." +value: 8 +stackable: false +made_from: + - items: [marrentill] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/nano_restore.yaml b/data/items/consumables/nano_restore.yaml new file mode 100644 index 0000000..e430b49 --- /dev/null +++ b/data/items/consumables/nano_restore.yaml @@ -0,0 +1,9 @@ +id: nano_restore +name: "nano restore" +color: "208" +description: "An orange potion containing nanobots that restore diminished attributes." +value: 70 +stackable: false +potion_effect: "heal" +potion_bonus: 100 +potion_duration: 0 diff --git a/data/items/consumables/onion.yaml b/data/items/consumables/onion.yaml new file mode 100644 index 0000000..0d0aca7 --- /dev/null +++ b/data/items/consumables/onion.yaml @@ -0,0 +1,8 @@ +id: onion +name: onion +color: "229" +description: "A freshly harvested onion." +value: 3 +stackable: true +heal_value: 1 +eat_message: "You eat the onion. It's surprisingly sweet." diff --git a/data/items/consumables/pastry_dough.yaml b/data/items/consumables/pastry_dough.yaml new file mode 100644 index 0000000..b607c83 --- /dev/null +++ b/data/items/consumables/pastry_dough.yaml @@ -0,0 +1,11 @@ +id: pastry_dough +name: pastry dough +color: "222" +description: "A ball of uncooked pastry dough. It needs to be baked." +value: 3 +stackable: false +made_from: + - items: [pot_of_flour] + quantity: 1 + - items: [bucket_of_water] + quantity: 1 diff --git a/data/items/consumables/pie_dish.yaml b/data/items/consumables/pie_dish.yaml new file mode 100644 index 0000000..bd6100b --- /dev/null +++ b/data/items/consumables/pie_dish.yaml @@ -0,0 +1,5 @@ +id: pie_dish +name: pie dish +color: "130" +description: "A clay pie dish for baking pies." +value: 5 diff --git a/data/items/consumables/pizza_dough.yaml b/data/items/consumables/pizza_dough.yaml new file mode 100644 index 0000000..12d8b14 --- /dev/null +++ b/data/items/consumables/pizza_dough.yaml @@ -0,0 +1,11 @@ +id: pizza_dough +name: pizza dough +color: "222" +description: "A ball of uncooked pizza dough. It needs to be baked." +value: 3 +stackable: false +made_from: + - items: [pot_of_flour] + quantity: 1 + - items: [bucket_of_water] + quantity: 1 diff --git a/data/items/consumables/plant_cure.yaml b/data/items/consumables/plant_cure.yaml new file mode 100644 index 0000000..64ebe91 --- /dev/null +++ b/data/items/consumables/plant_cure.yaml @@ -0,0 +1,6 @@ +id: plant_cure +name: plant cure +color: "120" +description: "A bio-engineered solution that cures diseased plants." +value: 25 +stackable: true diff --git a/data/items/consumables/pot_of_flour.yaml b/data/items/consumables/pot_of_flour.yaml new file mode 100644 index 0000000..c05c065 --- /dev/null +++ b/data/items/consumables/pot_of_flour.yaml @@ -0,0 +1,6 @@ +id: pot_of_flour +name: pot of flour +color: "255" +description: "A clay pot filled with finely ground flour." +value: 5 +stackable: false diff --git a/data/items/consumables/potato.yaml b/data/items/consumables/potato.yaml new file mode 100644 index 0000000..d9f521a --- /dev/null +++ b/data/items/consumables/potato.yaml @@ -0,0 +1,8 @@ +id: potato +name: potato +color: "180" +description: "A freshly harvested potato." +value: 2 +stackable: true +heal_value: 1 +eat_message: "You eat the potato." diff --git a/data/items/consumables/ranarr_potion_unf.yaml b/data/items/consumables/ranarr_potion_unf.yaml new file mode 100644 index 0000000..d2c475d --- /dev/null +++ b/data/items/consumables/ranarr_potion_unf.yaml @@ -0,0 +1,12 @@ +id: ranarr_potion_unf +name: "ranarr potion (unf)" +color: "48" +description: "An unfinished potion with ranarr floating in water." +value: 38 +stackable: false +made_from: + - items: [ranarr] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/raw_anchovies.yaml b/data/items/consumables/raw_anchovies.yaml new file mode 100644 index 0000000..cf5b75f --- /dev/null +++ b/data/items/consumables/raw_anchovies.yaml @@ -0,0 +1,6 @@ +id: raw_anchovies +name: raw anchovies +color: "75" +description: "Some tiny raw anchovies." +value: 2 +stackable: false diff --git a/data/items/consumables/raw_anglerfish.yaml b/data/items/consumables/raw_anglerfish.yaml new file mode 100644 index 0000000..b1c7262 --- /dev/null +++ b/data/items/consumables/raw_anglerfish.yaml @@ -0,0 +1,6 @@ +id: raw_anglerfish +name: raw anglerfish +color: "80" +description: "An ugly but delicious raw anglerfish." +value: 20 +stackable: false diff --git a/data/items/consumables/raw_bass.yaml b/data/items/consumables/raw_bass.yaml new file mode 100644 index 0000000..34dddc1 --- /dev/null +++ b/data/items/consumables/raw_bass.yaml @@ -0,0 +1,6 @@ +id: raw_bass +name: raw bass +color: "69" +description: "A freshly caught raw bass." +value: 10 +stackable: false diff --git a/data/items/consumables/raw_beef.yaml b/data/items/consumables/raw_beef.yaml new file mode 100644 index 0000000..59695b0 --- /dev/null +++ b/data/items/consumables/raw_beef.yaml @@ -0,0 +1,6 @@ +id: raw_beef +name: raw beef +color: "196" +description: "A slab of raw beef." +value: 2 +stackable: false diff --git a/data/items/consumables/raw_cave_eel.yaml b/data/items/consumables/raw_cave_eel.yaml new file mode 100644 index 0000000..000f93c --- /dev/null +++ b/data/items/consumables/raw_cave_eel.yaml @@ -0,0 +1,6 @@ +id: raw_cave_eel +name: raw cave eel +color: "80" +description: "A pale eel from deep underground waters." +value: 12 +stackable: false diff --git a/data/items/consumables/raw_cod.yaml b/data/items/consumables/raw_cod.yaml new file mode 100644 index 0000000..fe94f35 --- /dev/null +++ b/data/items/consumables/raw_cod.yaml @@ -0,0 +1,6 @@ +id: raw_cod +name: raw cod +color: "69" +description: "A freshly caught raw cod." +value: 6 +stackable: false diff --git a/data/items/consumables/raw_herring.yaml b/data/items/consumables/raw_herring.yaml new file mode 100644 index 0000000..730eca5 --- /dev/null +++ b/data/items/consumables/raw_herring.yaml @@ -0,0 +1,6 @@ +id: raw_herring +name: raw herring +color: "75" +description: "A freshly caught raw herring." +value: 5 +stackable: false diff --git a/data/items/consumables/raw_lobster.yaml b/data/items/consumables/raw_lobster.yaml new file mode 100644 index 0000000..908c931 --- /dev/null +++ b/data/items/consumables/raw_lobster.yaml @@ -0,0 +1,6 @@ +id: raw_lobster +name: raw lobster +color: "33" +description: "A freshly caught raw lobster." +value: 15 +stackable: false diff --git a/data/items/consumables/raw_mackerel.yaml b/data/items/consumables/raw_mackerel.yaml new file mode 100644 index 0000000..42e1d09 --- /dev/null +++ b/data/items/consumables/raw_mackerel.yaml @@ -0,0 +1,6 @@ +id: raw_mackerel +name: raw mackerel +color: "69" +description: "A freshly caught raw mackerel." +value: 4 +stackable: false diff --git a/data/items/consumables/raw_pike.yaml b/data/items/consumables/raw_pike.yaml new file mode 100644 index 0000000..625c019 --- /dev/null +++ b/data/items/consumables/raw_pike.yaml @@ -0,0 +1,6 @@ +id: raw_pike +name: raw pike +color: "69" +description: "A freshly caught raw pike." +value: 8 +stackable: false diff --git a/data/items/consumables/raw_rainbow_fish.yaml b/data/items/consumables/raw_rainbow_fish.yaml new file mode 100644 index 0000000..311c9f1 --- /dev/null +++ b/data/items/consumables/raw_rainbow_fish.yaml @@ -0,0 +1,6 @@ +id: raw_rainbow_fish +name: raw rainbow fish +color: "177" +description: "A shimmering raw rainbow fish." +value: 10 +stackable: false diff --git a/data/items/consumables/raw_salmon.yaml b/data/items/consumables/raw_salmon.yaml new file mode 100644 index 0000000..d5ae9bd --- /dev/null +++ b/data/items/consumables/raw_salmon.yaml @@ -0,0 +1,6 @@ +id: raw_salmon +name: raw salmon +color: "69" +description: "A freshly caught raw salmon." +value: 8 +stackable: false diff --git a/data/items/consumables/raw_sardine.yaml b/data/items/consumables/raw_sardine.yaml new file mode 100644 index 0000000..d27a155 --- /dev/null +++ b/data/items/consumables/raw_sardine.yaml @@ -0,0 +1,6 @@ +id: raw_sardine +name: raw sardine +color: "75" +description: "A freshly caught raw sardine." +value: 3 +stackable: false diff --git a/data/items/consumables/raw_shark.yaml b/data/items/consumables/raw_shark.yaml new file mode 100644 index 0000000..999ccb9 --- /dev/null +++ b/data/items/consumables/raw_shark.yaml @@ -0,0 +1,6 @@ +id: raw_shark +name: raw shark +color: "27" +description: "A freshly caught raw shark." +value: 30 +stackable: false diff --git a/data/items/consumables/raw_shrimps.yaml b/data/items/consumables/raw_shrimps.yaml new file mode 100644 index 0000000..1127fda --- /dev/null +++ b/data/items/consumables/raw_shrimps.yaml @@ -0,0 +1,6 @@ +id: raw_shrimps +name: raw shrimps +color: "75" +description: "Some small raw shrimps." +value: 2 +stackable: false diff --git a/data/items/consumables/raw_slimy_eel.yaml b/data/items/consumables/raw_slimy_eel.yaml new file mode 100644 index 0000000..40820e5 --- /dev/null +++ b/data/items/consumables/raw_slimy_eel.yaml @@ -0,0 +1,6 @@ +id: raw_slimy_eel +name: raw slimy eel +color: "108" +description: "A slippery raw eel covered in slime." +value: 10 +stackable: false diff --git a/data/items/consumables/raw_swordfish.yaml b/data/items/consumables/raw_swordfish.yaml new file mode 100644 index 0000000..e162460 --- /dev/null +++ b/data/items/consumables/raw_swordfish.yaml @@ -0,0 +1,6 @@ +id: raw_swordfish +name: raw swordfish +color: "33" +description: "A freshly caught raw swordfish." +value: 18 +stackable: false diff --git a/data/items/consumables/raw_trout.yaml b/data/items/consumables/raw_trout.yaml new file mode 100644 index 0000000..c1d98aa --- /dev/null +++ b/data/items/consumables/raw_trout.yaml @@ -0,0 +1,6 @@ +id: raw_trout +name: raw trout +color: "69" +description: "A freshly caught trout. Needs cooking." +value: 3 +stackable: false diff --git a/data/items/consumables/raw_tuna.yaml b/data/items/consumables/raw_tuna.yaml new file mode 100644 index 0000000..6079f92 --- /dev/null +++ b/data/items/consumables/raw_tuna.yaml @@ -0,0 +1,6 @@ +id: raw_tuna +name: raw tuna +color: "33" +description: "A freshly caught raw tuna." +value: 12 +stackable: false diff --git a/data/items/consumables/restoration_compound.yaml b/data/items/consumables/restoration_compound.yaml new file mode 100644 index 0000000..913153f --- /dev/null +++ b/data/items/consumables/restoration_compound.yaml @@ -0,0 +1,9 @@ +id: restoration_compound +name: "restoration compound" +color: "51" +description: "A teal compound that enhances all combat capabilities." +value: 250 +stackable: false +potion_effect: "all_combat" +potion_bonus: 15 +potion_duration: 150 diff --git a/data/items/consumables/salmon.yaml b/data/items/consumables/salmon.yaml new file mode 100644 index 0000000..59b8237 --- /dev/null +++ b/data/items/consumables/salmon.yaml @@ -0,0 +1,8 @@ +id: salmon +name: salmon +color: "209" +description: "A nicely cooked salmon." +value: 10 +stackable: false +heal_value: 9 +eat_message: "You eat the salmon. Savory and satisfying!" diff --git a/data/items/consumables/sardine.yaml b/data/items/consumables/sardine.yaml new file mode 100644 index 0000000..c11b42b --- /dev/null +++ b/data/items/consumables/sardine.yaml @@ -0,0 +1,8 @@ +id: sardine +name: sardine +color: "209" +description: "A nicely cooked sardine." +value: 5 +stackable: false +heal_value: 4 +eat_message: "You eat the sardine." diff --git a/data/items/consumables/science_serum.yaml b/data/items/consumables/science_serum.yaml new file mode 100644 index 0000000..e78f915 --- /dev/null +++ b/data/items/consumables/science_serum.yaml @@ -0,0 +1,9 @@ +id: science_serum +name: "science serum" +color: "141" +description: "A violet serum that heightens scientific cognition." +value: 200 +stackable: false +potion_effect: "science" +potion_bonus: 10 +potion_duration: 200 diff --git a/data/items/consumables/shield_potion.yaml b/data/items/consumables/shield_potion.yaml new file mode 100644 index 0000000..4cd91e8 --- /dev/null +++ b/data/items/consumables/shield_potion.yaml @@ -0,0 +1,9 @@ +id: shield_potion +name: "shield potion" +color: "21" +description: "A deep blue potion that reinforces defensive capability." +value: 85 +stackable: false +potion_effect: "defense" +potion_bonus: 10 +potion_duration: 200 diff --git a/data/items/consumables/shrimps.yaml b/data/items/consumables/shrimps.yaml new file mode 100644 index 0000000..9c280c8 --- /dev/null +++ b/data/items/consumables/shrimps.yaml @@ -0,0 +1,8 @@ +id: shrimps +name: shrimps +color: "209" +description: "Some nicely cooked shrimps." +value: 5 +stackable: false +heal_value: 3 +eat_message: "You eat the shrimps. Tasty!" diff --git a/data/items/consumables/snapdragon_potion_unf.yaml b/data/items/consumables/snapdragon_potion_unf.yaml new file mode 100644 index 0000000..ee8e366 --- /dev/null +++ b/data/items/consumables/snapdragon_potion_unf.yaml @@ -0,0 +1,12 @@ +id: snapdragon_potion_unf +name: "snapdragon potion (unf)" +color: "48" +description: "An unfinished potion with snapdragon floating in water." +value: 68 +stackable: false +made_from: + - items: [snapdragon] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/stim_potion.yaml b/data/items/consumables/stim_potion.yaml new file mode 100644 index 0000000..de51291 --- /dev/null +++ b/data/items/consumables/stim_potion.yaml @@ -0,0 +1,9 @@ +id: stim_potion +name: "stim potion" +color: "196" +description: "A bubbling red potion that temporarily boosts attack capability." +value: 30 +stackable: false +potion_effect: "attack" +potion_bonus: 10 +potion_duration: 200 diff --git a/data/items/consumables/strawberry.yaml b/data/items/consumables/strawberry.yaml new file mode 100644 index 0000000..337a65e --- /dev/null +++ b/data/items/consumables/strawberry.yaml @@ -0,0 +1,8 @@ +id: strawberry +name: strawberry +color: "197" +description: "A freshly harvested strawberry." +value: 10 +stackable: true +heal_value: 3 +eat_message: "You eat the strawberry." diff --git a/data/items/consumables/super_amp.yaml b/data/items/consumables/super_amp.yaml new file mode 100644 index 0000000..3bea59b --- /dev/null +++ b/data/items/consumables/super_amp.yaml @@ -0,0 +1,9 @@ +id: super_amp +name: "super amp" +color: "220" +description: "A concentrated gold potion that significantly amplifies physical strength." +value: 155 +stackable: false +potion_effect: "strength" +potion_bonus: 20 +potion_duration: 200 diff --git a/data/items/consumables/super_bio_serum.yaml b/data/items/consumables/super_bio_serum.yaml new file mode 100644 index 0000000..fbc5ebe --- /dev/null +++ b/data/items/consumables/super_bio_serum.yaml @@ -0,0 +1,9 @@ +id: super_bio_serum +name: "super bio serum" +color: "48" +description: "A concentrated green serum that powerfully restores health." +value: 130 +stackable: false +potion_effect: "heal" +potion_bonus: 120 +potion_duration: 0 diff --git a/data/items/consumables/super_shield.yaml b/data/items/consumables/super_shield.yaml new file mode 100644 index 0000000..7545b2e --- /dev/null +++ b/data/items/consumables/super_shield.yaml @@ -0,0 +1,9 @@ +id: super_shield +name: "super shield" +color: "21" +description: "A concentrated blue potion that provides significant defensive enhancement." +value: 175 +stackable: false +potion_effect: "defense" +potion_bonus: 20 +potion_duration: 200 diff --git a/data/items/consumables/super_stim.yaml b/data/items/consumables/super_stim.yaml new file mode 100644 index 0000000..c290c5f --- /dev/null +++ b/data/items/consumables/super_stim.yaml @@ -0,0 +1,9 @@ +id: super_stim +name: "super stim" +color: "196" +description: "A potent red potion that dramatically boosts attack capability." +value: 120 +stackable: false +potion_effect: "attack" +potion_bonus: 20 +potion_duration: 200 diff --git a/data/items/consumables/super_stim_cell.yaml b/data/items/consumables/super_stim_cell.yaml new file mode 100644 index 0000000..1f25597 --- /dev/null +++ b/data/items/consumables/super_stim_cell.yaml @@ -0,0 +1,9 @@ +id: super_stim_cell +name: "super stim cell" +color: "226" +description: "A concentrated yellow energy supplement that fully restores stamina." +value: 140 +stackable: false +potion_effect: "battery" +potion_bonus: 50 +potion_duration: 0 diff --git a/data/items/consumables/sweetcorn.yaml b/data/items/consumables/sweetcorn.yaml new file mode 100644 index 0000000..32f5a70 --- /dev/null +++ b/data/items/consumables/sweetcorn.yaml @@ -0,0 +1,8 @@ +id: sweetcorn +name: sweetcorn +color: "226" +description: "A freshly harvested ear of sweetcorn." +value: 6 +stackable: true +heal_value: 2 +eat_message: "You eat the sweetcorn." diff --git a/data/items/consumables/targeting_serum.yaml b/data/items/consumables/targeting_serum.yaml new file mode 100644 index 0000000..b10ebc5 --- /dev/null +++ b/data/items/consumables/targeting_serum.yaml @@ -0,0 +1,9 @@ +id: targeting_serum +name: "targeting serum" +color: "202" +description: "A pink serum that sharpens ranged targeting." +value: 190 +stackable: false +potion_effect: "ranged" +potion_bonus: 10 +potion_duration: 200 diff --git a/data/items/consumables/tarromin_potion_unf.yaml b/data/items/consumables/tarromin_potion_unf.yaml new file mode 100644 index 0000000..abc6438 --- /dev/null +++ b/data/items/consumables/tarromin_potion_unf.yaml @@ -0,0 +1,12 @@ +id: tarromin_potion_unf +name: "tarromin potion (unf)" +color: "48" +description: "An unfinished potion with tarromin floating in water." +value: 12 +stackable: false +made_from: + - items: [tarromin] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/tech_serum.yaml b/data/items/consumables/tech_serum.yaml new file mode 100644 index 0000000..aac3fdc --- /dev/null +++ b/data/items/consumables/tech_serum.yaml @@ -0,0 +1,9 @@ +id: tech_serum +name: "tech serum" +color: "75" +description: "A cyan serum that enhances technology interface." +value: 100 +stackable: false +potion_effect: "technology" +potion_bonus: 10 +potion_duration: 200 diff --git a/data/items/consumables/toadflax_potion_unf.yaml b/data/items/consumables/toadflax_potion_unf.yaml new file mode 100644 index 0000000..f05b406 --- /dev/null +++ b/data/items/consumables/toadflax_potion_unf.yaml @@ -0,0 +1,12 @@ +id: toadflax_potion_unf +name: "toadflax potion (unf)" +color: "48" +description: "An unfinished potion with toadflax floating in water." +value: 28 +stackable: false +made_from: + - items: [toadflax] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/tomato.yaml b/data/items/consumables/tomato.yaml new file mode 100644 index 0000000..d2ad349 --- /dev/null +++ b/data/items/consumables/tomato.yaml @@ -0,0 +1,8 @@ +id: tomato +name: tomato +color: "196" +description: "A freshly harvested tomato." +value: 4 +stackable: true +heal_value: 2 +eat_message: "You eat the tomato." diff --git a/data/items/consumables/torstol_potion_unf.yaml b/data/items/consumables/torstol_potion_unf.yaml new file mode 100644 index 0000000..cf551df --- /dev/null +++ b/data/items/consumables/torstol_potion_unf.yaml @@ -0,0 +1,12 @@ +id: torstol_potion_unf +name: "torstol potion (unf)" +color: "48" +description: "An unfinished potion with torstol floating in water." +value: 102 +stackable: false +made_from: + - items: [torstol] + quantity: 1 + - items: [vial_of_water] + quantity: 1 +ticks: 0 diff --git a/data/items/consumables/trout.yaml b/data/items/consumables/trout.yaml new file mode 100644 index 0000000..df6cdcc --- /dev/null +++ b/data/items/consumables/trout.yaml @@ -0,0 +1,8 @@ +id: trout +name: trout +color: "209" +description: "A nicely cooked trout." +value: 8 +stackable: false +heal_value: 7 +eat_message: "You eat the trout. Delicious!" diff --git a/data/items/consumables/vial_of_water.yaml b/data/items/consumables/vial_of_water.yaml new file mode 100644 index 0000000..c3e2995 --- /dev/null +++ b/data/items/consumables/vial_of_water.yaml @@ -0,0 +1,6 @@ +id: vial_of_water +name: "vial of water" +color: "39" +description: "A small glass vial filled with purified water. The base for all potions." +value: 2 +stackable: false diff --git a/data/items/consumables/watermelon.yaml b/data/items/consumables/watermelon.yaml new file mode 100644 index 0000000..3374687 --- /dev/null +++ b/data/items/consumables/watermelon.yaml @@ -0,0 +1,8 @@ +id: watermelon +name: watermelon +color: "34" +description: "A freshly harvested watermelon." +value: 18 +stackable: true +heal_value: 4 +eat_message: "You eat the watermelon." diff --git a/data/items/copper_ore.yaml b/data/items/copper_ore.yaml deleted file mode 100644 index 392879a..0000000 --- a/data/items/copper_ore.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: copper_ore -name: copper ore -color: "178" -description: "A chunk of copper-bearing rock. Can be smelted into a bronze bar." -value: 1 -stackable: false diff --git a/data/items/cosmic_identifier.yaml b/data/items/cosmic_identifier.yaml deleted file mode 100644 index 97cb89a..0000000 --- a/data/items/cosmic_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: cosmic_identifier -name: cosmic identifier -color: "201" -description: "A handheld scanner calibrated to isolate cosmic-frequency signatures in scrap metal. Required to produce cosmicjunk at a cosmic altar." -value: 5000 diff --git a/data/items/cosmicjunk.yaml b/data/items/cosmicjunk.yaml deleted file mode 100644 index d9acc21..0000000 --- a/data/items/cosmicjunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: cosmicjunk -name: cosmicjunk -color: "201" -description: "A fragment of reclaimed cosmic circuitry. Used as a universal energy medium." -value: 30 -stackable: true diff --git a/data/items/cowhide.yaml b/data/items/cowhide.yaml deleted file mode 100644 index 2cb192e..0000000 --- a/data/items/cowhide.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: cowhide -name: cowhide -color: "130" -description: "A fresh cowhide. A tanner can turn this into leather." -value: 5 -stackable: false diff --git a/data/items/credit_stick.yaml b/data/items/credit_stick.yaml deleted file mode 100644 index 46b3050..0000000 --- a/data/items/credit_stick.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: credit_stick -name: credit stick -color: "220" -description: "A small electronic stick loaded with credits. You can search it to extract the credits." -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 diff --git a/data/items/credits.yaml b/data/items/credits.yaml deleted file mode 100644 index 7e2de10..0000000 --- a/data/items/credits.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: credits -name: credits -color: "220" -description: "A handful of universal credits." -value: 1 -stackable: true diff --git a/data/items/crushed_nest.yaml b/data/items/crushed_nest.yaml deleted file mode 100644 index 533d942..0000000 --- a/data/items/crushed_nest.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: crushed_nest -name: "crushed nest" -color: "94" -description: "Finely crushed bird's nest material. Contains trace minerals used in advanced pharmacy." -value: 25 -stackable: false diff --git a/data/items/death_identifier.yaml b/data/items/death_identifier.yaml deleted file mode 100644 index 778bca5..0000000 --- a/data/items/death_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: death_identifier -name: death identifier -color: "52" -description: "A handheld scanner calibrated to isolate death-frequency signatures in scrap metal. Required to produce deathjunk at a death altar." -value: 10000 diff --git a/data/items/deathjunk.yaml b/data/items/deathjunk.yaml deleted file mode 100644 index 7dcaba8..0000000 --- a/data/items/deathjunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: deathjunk -name: deathjunk -color: "52" -description: "A fragment of reclaimed death circuitry. Used as a universal energy medium." -value: 70 -stackable: true diff --git a/data/items/decks/advanced_bio_deck.yaml b/data/items/decks/advanced_bio_deck.yaml new file mode 100644 index 0000000..1411a16 --- /dev/null +++ b/data/items/decks/advanced_bio_deck.yaml @@ -0,0 +1,11 @@ +id: advanced_bio_deck +name: advanced bio deck +color: "196 bold" +description: "A high-powered bio deck with enhanced circuitry. Provides unlimited biojunk and removes the scrap requirement." +value: 15000 +equip_slot: main_hand +weapon_type: science +speed: 5 +stats: + science_attack: 20 +provides_junk: biojunk diff --git a/data/items/decks/advanced_eco_deck.yaml b/data/items/decks/advanced_eco_deck.yaml new file mode 100644 index 0000000..c844f47 --- /dev/null +++ b/data/items/decks/advanced_eco_deck.yaml @@ -0,0 +1,11 @@ +id: advanced_eco_deck +name: advanced eco deck +color: "34 bold" +description: "A high-powered eco deck with enhanced circuitry. Provides unlimited ecojunk and removes the scrap requirement." +value: 15000 +equip_slot: main_hand +weapon_type: science +speed: 5 +stats: + science_attack: 20 +provides_junk: ecojunk diff --git a/data/items/decks/advanced_hydro_deck.yaml b/data/items/decks/advanced_hydro_deck.yaml new file mode 100644 index 0000000..2910931 --- /dev/null +++ b/data/items/decks/advanced_hydro_deck.yaml @@ -0,0 +1,11 @@ +id: advanced_hydro_deck +name: advanced hydro deck +color: "39 bold" +description: "A high-powered hydro deck with enhanced circuitry. Provides unlimited hydrojunk and removes the scrap requirement." +value: 15000 +equip_slot: main_hand +weapon_type: science +speed: 5 +stats: + science_attack: 20 +provides_junk: hydrojunk diff --git a/data/items/decks/advanced_solar_deck.yaml b/data/items/decks/advanced_solar_deck.yaml new file mode 100644 index 0000000..002845c --- /dev/null +++ b/data/items/decks/advanced_solar_deck.yaml @@ -0,0 +1,11 @@ +id: advanced_solar_deck +name: advanced solar deck +color: "220 bold" +description: "A high-powered solar deck with enhanced circuitry. Provides unlimited solarjunk and removes the scrap requirement." +value: 15000 +equip_slot: main_hand +weapon_type: science +speed: 5 +stats: + science_attack: 20 +provides_junk: solarjunk diff --git a/data/items/decks/basic_deck.yaml b/data/items/decks/basic_deck.yaml new file mode 100644 index 0000000..ef2549a --- /dev/null +++ b/data/items/decks/basic_deck.yaml @@ -0,0 +1,10 @@ +id: basic_deck +name: basic deck +color: "245" +description: "A simple programmable deck. Removes the scrap requirement for triggering mods, but provides no elemental junk." +value: 500 +equip_slot: main_hand +weapon_type: science +speed: 5 +stats: + science_attack: 5 diff --git a/data/items/decks/bio_deck.yaml b/data/items/decks/bio_deck.yaml new file mode 100644 index 0000000..8de2036 --- /dev/null +++ b/data/items/decks/bio_deck.yaml @@ -0,0 +1,11 @@ +id: bio_deck +name: bio deck +color: "196" +description: "A programmable deck infused with bio-synthetic membranes. Provides unlimited biojunk and removes the scrap requirement." +value: 1500 +equip_slot: main_hand +weapon_type: science +speed: 5 +stats: + science_attack: 10 +provides_junk: biojunk diff --git a/data/items/decks/bio_identifier.yaml b/data/items/decks/bio_identifier.yaml new file mode 100644 index 0000000..1b5a941 --- /dev/null +++ b/data/items/decks/bio_identifier.yaml @@ -0,0 +1,5 @@ +id: bio_identifier +name: bio identifier +color: "196" +description: "A handheld scanner calibrated to isolate bio-frequency signatures in scrap metal. Required to produce biojunk at a bio altar." +value: 5000 diff --git a/data/items/decks/biojunk.yaml b/data/items/decks/biojunk.yaml new file mode 100644 index 0000000..8832a20 --- /dev/null +++ b/data/items/decks/biojunk.yaml @@ -0,0 +1,6 @@ +id: biojunk +name: biojunk +color: "196" +description: "A fragment of reclaimed bio circuitry. Used as a universal energy medium." +value: 50 +stackable: true diff --git a/data/items/decks/blood_identifier.yaml b/data/items/decks/blood_identifier.yaml new file mode 100644 index 0000000..3540179 --- /dev/null +++ b/data/items/decks/blood_identifier.yaml @@ -0,0 +1,5 @@ +id: blood_identifier +name: blood identifier +color: "124" +description: "A handheld scanner calibrated to isolate blood-frequency signatures in scrap metal. Required to produce bloodjunk at a blood altar." +value: 15000 diff --git a/data/items/decks/bloodjunk.yaml b/data/items/decks/bloodjunk.yaml new file mode 100644 index 0000000..b837137 --- /dev/null +++ b/data/items/decks/bloodjunk.yaml @@ -0,0 +1,6 @@ +id: bloodjunk +name: bloodjunk +color: "124" +description: "A fragment of reclaimed blood circuitry. Used as a universal energy medium." +value: 90 +stackable: true diff --git a/data/items/decks/chaos_identifier.yaml b/data/items/decks/chaos_identifier.yaml new file mode 100644 index 0000000..82a7ccf --- /dev/null +++ b/data/items/decks/chaos_identifier.yaml @@ -0,0 +1,5 @@ +id: chaos_identifier +name: chaos identifier +color: "226" +description: "A handheld scanner calibrated to isolate chaos-frequency signatures in scrap metal. Required to produce chaosjunk at a chaos altar." +value: 7500 diff --git a/data/items/decks/chaosjunk.yaml b/data/items/decks/chaosjunk.yaml new file mode 100644 index 0000000..99515df --- /dev/null +++ b/data/items/decks/chaosjunk.yaml @@ -0,0 +1,6 @@ +id: chaosjunk +name: chaosjunk +color: "226" +description: "A fragment of reclaimed chaos circuitry. Used as a universal energy medium." +value: 40 +stackable: true diff --git a/data/items/decks/cosmic_identifier.yaml b/data/items/decks/cosmic_identifier.yaml new file mode 100644 index 0000000..97cb89a --- /dev/null +++ b/data/items/decks/cosmic_identifier.yaml @@ -0,0 +1,5 @@ +id: cosmic_identifier +name: cosmic identifier +color: "201" +description: "A handheld scanner calibrated to isolate cosmic-frequency signatures in scrap metal. Required to produce cosmicjunk at a cosmic altar." +value: 5000 diff --git a/data/items/decks/cosmicjunk.yaml b/data/items/decks/cosmicjunk.yaml new file mode 100644 index 0000000..d9acc21 --- /dev/null +++ b/data/items/decks/cosmicjunk.yaml @@ -0,0 +1,6 @@ +id: cosmicjunk +name: cosmicjunk +color: "201" +description: "A fragment of reclaimed cosmic circuitry. Used as a universal energy medium." +value: 30 +stackable: true diff --git a/data/items/decks/death_identifier.yaml b/data/items/decks/death_identifier.yaml new file mode 100644 index 0000000..778bca5 --- /dev/null +++ b/data/items/decks/death_identifier.yaml @@ -0,0 +1,5 @@ +id: death_identifier +name: death identifier +color: "52" +description: "A handheld scanner calibrated to isolate death-frequency signatures in scrap metal. Required to produce deathjunk at a death altar." +value: 10000 diff --git a/data/items/decks/deathjunk.yaml b/data/items/decks/deathjunk.yaml new file mode 100644 index 0000000..7dcaba8 --- /dev/null +++ b/data/items/decks/deathjunk.yaml @@ -0,0 +1,6 @@ +id: deathjunk +name: deathjunk +color: "52" +description: "A fragment of reclaimed death circuitry. Used as a universal energy medium." +value: 70 +stackable: true diff --git a/data/items/decks/eco_deck.yaml b/data/items/decks/eco_deck.yaml new file mode 100644 index 0000000..ef1a991 --- /dev/null +++ b/data/items/decks/eco_deck.yaml @@ -0,0 +1,11 @@ +id: eco_deck +name: eco deck +color: "34" +description: "A programmable deck threaded with eco-organic circuits. Provides unlimited ecojunk and removes the scrap requirement." +value: 1500 +equip_slot: main_hand +weapon_type: science +speed: 5 +stats: + science_attack: 10 +provides_junk: ecojunk diff --git a/data/items/decks/eco_identifier.yaml b/data/items/decks/eco_identifier.yaml new file mode 100644 index 0000000..d0af516 --- /dev/null +++ b/data/items/decks/eco_identifier.yaml @@ -0,0 +1,5 @@ +id: eco_identifier +name: eco identifier +color: "34" +description: "A handheld scanner calibrated to isolate eco-frequency signatures in scrap metal. Required to produce ecojunk at an eco altar." +value: 2500 diff --git a/data/items/decks/ecojunk.yaml b/data/items/decks/ecojunk.yaml new file mode 100644 index 0000000..c050049 --- /dev/null +++ b/data/items/decks/ecojunk.yaml @@ -0,0 +1,6 @@ +id: ecojunk +name: ecojunk +color: "34" +description: "A fragment of reclaimed eco circuitry. Used as a universal energy medium." +value: 30 +stackable: true diff --git a/data/items/decks/hydro_deck.yaml b/data/items/decks/hydro_deck.yaml new file mode 100644 index 0000000..0e417a2 --- /dev/null +++ b/data/items/decks/hydro_deck.yaml @@ -0,0 +1,11 @@ +id: hydro_deck +name: hydro deck +color: "39" +description: "A programmable deck infused with hydro circuitry. Provides unlimited hydrojunk and removes the scrap requirement." +value: 1500 +equip_slot: main_hand +weapon_type: science +speed: 5 +stats: + science_attack: 10 +provides_junk: hydrojunk diff --git a/data/items/decks/hydro_identifier.yaml b/data/items/decks/hydro_identifier.yaml new file mode 100644 index 0000000..3eb7d98 --- /dev/null +++ b/data/items/decks/hydro_identifier.yaml @@ -0,0 +1,5 @@ +id: hydro_identifier +name: hydro identifier +color: "39" +description: "A handheld scanner calibrated to isolate hydro-frequency signatures in scrap metal. Required to produce hydrojunk at a hydro altar." +value: 1000 diff --git a/data/items/decks/hydrojunk.yaml b/data/items/decks/hydrojunk.yaml new file mode 100644 index 0000000..bfcd64a --- /dev/null +++ b/data/items/decks/hydrojunk.yaml @@ -0,0 +1,6 @@ +id: hydrojunk +name: hydrojunk +color: "39" +description: "A fragment of reclaimed hydro circuitry. Used as a universal energy medium." +value: 18 +stackable: true diff --git a/data/items/decks/law_identifier.yaml b/data/items/decks/law_identifier.yaml new file mode 100644 index 0000000..25700e1 --- /dev/null +++ b/data/items/decks/law_identifier.yaml @@ -0,0 +1,5 @@ +id: law_identifier +name: law identifier +color: "27" +description: "A handheld scanner calibrated to isolate law-frequency signatures in scrap metal. Required to produce lawjunk at a law altar." +value: 10000 diff --git a/data/items/decks/lawjunk.yaml b/data/items/decks/lawjunk.yaml new file mode 100644 index 0000000..b46bf9e --- /dev/null +++ b/data/items/decks/lawjunk.yaml @@ -0,0 +1,6 @@ +id: lawjunk +name: lawjunk +color: "27" +description: "A fragment of reclaimed law circuitry. Used as a universal energy medium." +value: 60 +stackable: true diff --git a/data/items/decks/nature_identifier.yaml b/data/items/decks/nature_identifier.yaml new file mode 100644 index 0000000..dc441cf --- /dev/null +++ b/data/items/decks/nature_identifier.yaml @@ -0,0 +1,5 @@ +id: nature_identifier +name: nature identifier +color: "46" +description: "A handheld scanner calibrated to isolate nature-frequency signatures in scrap metal. Required to produce naturejunk at a nature altar." +value: 10000 diff --git a/data/items/decks/naturejunk.yaml b/data/items/decks/naturejunk.yaml new file mode 100644 index 0000000..49ed1ff --- /dev/null +++ b/data/items/decks/naturejunk.yaml @@ -0,0 +1,6 @@ +id: naturejunk +name: naturejunk +color: "46" +description: "A fragment of reclaimed nature circuitry. Used as a universal energy medium." +value: 50 +stackable: true diff --git a/data/items/decks/solar_deck.yaml b/data/items/decks/solar_deck.yaml new file mode 100644 index 0000000..72b7e9e --- /dev/null +++ b/data/items/decks/solar_deck.yaml @@ -0,0 +1,11 @@ +id: solar_deck +name: solar deck +color: "220" +description: "A programmable deck pulsing with solar energy. Provides unlimited solarjunk and removes the scrap requirement." +value: 1500 +equip_slot: main_hand +weapon_type: science +speed: 5 +stats: + science_attack: 10 +provides_junk: solarjunk diff --git a/data/items/decks/solar_identifier.yaml b/data/items/decks/solar_identifier.yaml new file mode 100644 index 0000000..663bd9f --- /dev/null +++ b/data/items/decks/solar_identifier.yaml @@ -0,0 +1,5 @@ +id: solar_identifier +name: solar identifier +color: "220" +description: "A handheld scanner calibrated to isolate solar-frequency signatures in scrap metal. Required to produce solarjunk at a solar altar." +value: 500 diff --git a/data/items/decks/solarjunk.yaml b/data/items/decks/solarjunk.yaml new file mode 100644 index 0000000..ab4d5d5 --- /dev/null +++ b/data/items/decks/solarjunk.yaml @@ -0,0 +1,6 @@ +id: solarjunk +name: solarjunk +color: "220" +description: "A fragment of reclaimed solar circuitry. Used as a universal energy medium." +value: 10 +stackable: true diff --git a/data/items/diamond.yaml b/data/items/diamond.yaml deleted file mode 100644 index 2ec703f..0000000 --- a/data/items/diamond.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: diamond -name: diamond -color: "255" -description: "A beautifully cut diamond." -value: 400 -stackable: false diff --git a/data/items/diamond_amulet_u.yaml b/data/items/diamond_amulet_u.yaml deleted file mode 100644 index 55eaf45..0000000 --- a/data/items/diamond_amulet_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: diamond_amulet_u -name: diamond amulet (u) -color: "255" -description: "An unstrung gold amulet set with a diamond." -value: 200 diff --git a/data/items/diamond_bolt_tips.yaml b/data/items/diamond_bolt_tips.yaml deleted file mode 100644 index 1529b11..0000000 --- a/data/items/diamond_bolt_tips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: diamond_bolt_tips -name: diamond bolt tips -color: "255" -description: "Bolt tips cut from a diamond." -value: 200 -stackable: true diff --git a/data/items/diamond_bolts.yaml b/data/items/diamond_bolts.yaml deleted file mode 100644 index efe8013..0000000 --- a/data/items/diamond_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: diamond_bolts -name: diamond bolts -color: "255" -description: "Bolts tipped with diamond. Can be enchanted via science." -value: 130 -stackable: true -equip_slot: ammo -stats: - ranged_attack: 9 diff --git a/data/items/diamond_bolts_e.yaml b/data/items/diamond_bolts_e.yaml deleted file mode 100644 index 93ade4c..0000000 --- a/data/items/diamond_bolts_e.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: diamond_bolts_e -name: diamond bolts e -color: "255 bold" -description: "Enchanted diamond-tipped bolts. Have a chance to ignore the target's defense." -value: 180 -stackable: true -equip_slot: ammo -stats: - ranged_attack: 10 diff --git a/data/items/diamond_bracelet.yaml b/data/items/diamond_bracelet.yaml deleted file mode 100644 index 5ba5778..0000000 --- a/data/items/diamond_bracelet.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: diamond_bracelet -name: diamond bracelet -color: "255" -description: "A bracelet set with a diamond. Can be enchanted." -value: 1500 -equip_slot: hands diff --git a/data/items/diamond_necklace.yaml b/data/items/diamond_necklace.yaml deleted file mode 100644 index 5629b8c..0000000 --- a/data/items/diamond_necklace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: diamond_necklace -name: diamond necklace -color: "255" -description: "A necklace set with a diamond. Can be enchanted." -value: 1600 -equip_slot: neck diff --git a/data/items/diamond_ring.yaml b/data/items/diamond_ring.yaml deleted file mode 100644 index 54023c3..0000000 --- a/data/items/diamond_ring.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: diamond_ring -name: diamond ring -color: "255" -description: "A ring set with a diamond. Can be enchanted." -value: 1500 -equip_slot: ring diff --git a/data/items/digsite_pendant.yaml b/data/items/digsite_pendant.yaml deleted file mode 100644 index b28e3e3..0000000 --- a/data/items/digsite_pendant.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: digsite_pendant -name: digsite pendant -color: "196" -description: "An enchanted ruby necklace that can teleport you to dig sites." -value: 2500 -equip_slot: neck diff --git a/data/items/dragon_axe.yaml b/data/items/dragon_axe.yaml deleted file mode 100644 index ddc9758..0000000 --- a/data/items/dragon_axe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: dragon_axe -name: dragon axe -color: "196" -description: "A powerful dragon axe." -value: 50000 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: -2 - slash_attack: 43 - crush_attack: 32 - strength_bonus: 36 -speed: 5 -tool_type: axe -tool_speed: 1 -requirements: - attack: 60 diff --git a/data/items/dragon_pickaxe.yaml b/data/items/dragon_pickaxe.yaml deleted file mode 100644 index 6f187b8..0000000 --- a/data/items/dragon_pickaxe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: dragon_pickaxe -name: dragon pickaxe -color: "196" -description: "A powerful dragon pickaxe." -value: 50000 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 34 - slash_attack: -2 - crush_attack: 16 - strength_bonus: 26 -speed: 5 -tool_type: pickaxe -tool_speed: 0.25 -requirements: - attack: 60 diff --git a/data/items/dwarf_weed.yaml b/data/items/dwarf_weed.yaml deleted file mode 100644 index 559edf3..0000000 --- a/data/items/dwarf_weed.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: dwarf_weed -name: "dwarf weed" -color: "48" -description: "A clean dwarf weed leaf, ready for use in pharmacy." -value: 85 -stackable: true diff --git a/data/items/dwarf_weed_potion_unf.yaml b/data/items/dwarf_weed_potion_unf.yaml deleted file mode 100644 index 1a9516e..0000000 --- a/data/items/dwarf_weed_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: dwarf_weed_potion_unf -name: "dwarf weed potion (unf)" -color: "48" -description: "An unfinished potion with dwarf weed floating in water." -value: 88 -stackable: false -made_from: - - items: [dwarf_weed] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/dwarf_weed_seed.yaml b/data/items/dwarf_weed_seed.yaml deleted file mode 100644 index c8ba6f2..0000000 --- a/data/items/dwarf_weed_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: dwarf_weed_seed -name: dwarf weed seed -color: "100" -description: "A dwarf weed seed for planting in a herb patch." -value: 140 -stackable: true -farm_patch_type: herb -farm_level: 79 -farm_plant_xp: 120 -farm_harvest_xp: 150 -farm_stages: 4 -farm_product: dwarf_weed -farm_min_yield: 3 -farm_max_yield: 8 diff --git a/data/items/eco_deck.yaml b/data/items/eco_deck.yaml deleted file mode 100644 index ef1a991..0000000 --- a/data/items/eco_deck.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: eco_deck -name: eco deck -color: "34" -description: "A programmable deck threaded with eco-organic circuits. Provides unlimited ecojunk and removes the scrap requirement." -value: 1500 -equip_slot: main_hand -weapon_type: science -speed: 5 -stats: - science_attack: 10 -provides_junk: ecojunk diff --git a/data/items/eco_identifier.yaml b/data/items/eco_identifier.yaml deleted file mode 100644 index d0af516..0000000 --- a/data/items/eco_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: eco_identifier -name: eco identifier -color: "34" -description: "A handheld scanner calibrated to isolate eco-frequency signatures in scrap metal. Required to produce ecojunk at an eco altar." -value: 2500 diff --git a/data/items/ecojunk.yaml b/data/items/ecojunk.yaml deleted file mode 100644 index c050049..0000000 --- a/data/items/ecojunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ecojunk -name: ecojunk -color: "34" -description: "A fragment of reclaimed eco circuitry. Used as a universal energy medium." -value: 30 -stackable: true diff --git a/data/items/ectoplasm.yaml b/data/items/ectoplasm.yaml deleted file mode 100644 index 8417e2d..0000000 --- a/data/items/ectoplasm.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ectoplasm -name: ectoplasm -color: "159" -description: "A shimmering residue left behind by a destroyed phantom." -value: 75 -stackable: false diff --git a/data/items/emerald.yaml b/data/items/emerald.yaml deleted file mode 100644 index 9a0c71d..0000000 --- a/data/items/emerald.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: emerald -name: emerald -color: "83" -description: "A beautifully cut emerald." -value: 100 -stackable: false diff --git a/data/items/emerald_amulet_u.yaml b/data/items/emerald_amulet_u.yaml deleted file mode 100644 index 87261d4..0000000 --- a/data/items/emerald_amulet_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: emerald_amulet_u -name: emerald amulet (u) -color: "83" -description: "An unstrung gold amulet set with a emerald." -value: 110 diff --git a/data/items/emerald_bolt_tips.yaml b/data/items/emerald_bolt_tips.yaml deleted file mode 100644 index afd285b..0000000 --- a/data/items/emerald_bolt_tips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: emerald_bolt_tips -name: emerald bolt tips -color: "83" -description: "Bolt tips cut from an emerald." -value: 50 -stackable: true diff --git a/data/items/emerald_bolts.yaml b/data/items/emerald_bolts.yaml deleted file mode 100644 index 1afdcd0..0000000 --- a/data/items/emerald_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: emerald_bolts -name: emerald bolts -color: "34" -description: "Bolts tipped with emerald. Can be enchanted via science." -value: 40 -stackable: true -equip_slot: ammo -stats: - ranged_attack: 5 diff --git a/data/items/emerald_bolts_e.yaml b/data/items/emerald_bolts_e.yaml deleted file mode 100644 index 4cb7cbd..0000000 --- a/data/items/emerald_bolts_e.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: emerald_bolts_e -name: emerald bolts e -color: "34 bold" -description: "Enchanted emerald-tipped bolts. Have a chance to poison the target." -value: 55 -stackable: true -equip_slot: ammo -stats: - ranged_attack: 6 diff --git a/data/items/emerald_bracelet.yaml b/data/items/emerald_bracelet.yaml deleted file mode 100644 index 04e4979..0000000 --- a/data/items/emerald_bracelet.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: emerald_bracelet -name: emerald bracelet -color: "34" -description: "A bracelet set with an emerald. Can be enchanted." -value: 400 -equip_slot: hands diff --git a/data/items/emerald_necklace.yaml b/data/items/emerald_necklace.yaml deleted file mode 100644 index 2107ca4..0000000 --- a/data/items/emerald_necklace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: emerald_necklace -name: emerald necklace -color: "34" -description: "A necklace set with an emerald. Can be enchanted." -value: 450 -equip_slot: neck diff --git a/data/items/emerald_ring.yaml b/data/items/emerald_ring.yaml deleted file mode 100644 index 253f872..0000000 --- a/data/items/emerald_ring.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: emerald_ring -name: emerald ring -color: "34" -description: "A ring set with an emerald. Can be enchanted." -value: 400 -equip_slot: ring diff --git a/data/items/empty_bucket.yaml b/data/items/empty_bucket.yaml deleted file mode 100644 index 6debb02..0000000 --- a/data/items/empty_bucket.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: empty_bucket -name: empty bucket -color: "137" -description: "An empty wooden bucket." -value: 1 -stackable: false diff --git a/data/items/empty_jug.yaml b/data/items/empty_jug.yaml deleted file mode 100644 index c6774a5..0000000 --- a/data/items/empty_jug.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: empty_jug -name: empty jug -color: "137" -description: "An empty ceramic jug." -value: 1 -stackable: false diff --git a/data/items/empty_pot.yaml b/data/items/empty_pot.yaml deleted file mode 100644 index a57b441..0000000 --- a/data/items/empty_pot.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: empty_pot -name: empty pot -color: "130" -description: "An empty clay pot." -value: 1 -stackable: false diff --git a/data/items/equipment/abyssal_bracelet.yaml b/data/items/equipment/abyssal_bracelet.yaml new file mode 100644 index 0000000..3b424c3 --- /dev/null +++ b/data/items/equipment/abyssal_bracelet.yaml @@ -0,0 +1,6 @@ +id: abyssal_bracelet +name: abyssal bracelet +color: "255" +description: "An enchanted diamond bracelet that increases scavenging output." +value: 6000 +equip_slot: hands diff --git a/data/items/equipment/adamant_dagger.yaml b/data/items/equipment/adamant_dagger.yaml new file mode 100644 index 0000000..d78ecdc --- /dev/null +++ b/data/items/equipment/adamant_dagger.yaml @@ -0,0 +1,17 @@ +id: adamant_dagger +name: adamant dagger +color: "120" +description: "A small adamant dagger." +value: 400 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 23 + slash_attack: 14 + crush_attack: -1 + strength_bonus: 19 +speed: 3 +requirements: + attack: 30 diff --git a/data/items/equipment/adamant_full_helm.yaml b/data/items/equipment/adamant_full_helm.yaml new file mode 100644 index 0000000..3c36c62 --- /dev/null +++ b/data/items/equipment/adamant_full_helm.yaml @@ -0,0 +1,15 @@ +id: adamant_full_helm +name: adamant full helm +color: "120" +description: "An adamant full helmet." +value: 1000 +stackable: false +equip_slot: head +stats: + stab_defense: 22 + slash_defense: 24 + crush_defense: 16 + science_defense: -8 + ranged_defense: 22 +requirements: + defense: 30 diff --git a/data/items/equipment/adamant_med_helm.yaml b/data/items/equipment/adamant_med_helm.yaml new file mode 100644 index 0000000..1fb6785 --- /dev/null +++ b/data/items/equipment/adamant_med_helm.yaml @@ -0,0 +1,15 @@ +id: adamant_med_helm +name: adamant med helm +color: "120" +description: "An adamant medium helmet." +value: 400 +stackable: false +equip_slot: head +stats: + stab_defense: 14 + slash_defense: 16 + crush_defense: 10 + science_defense: -3 + ranged_defense: 14 +requirements: + defense: 30 diff --git a/data/items/equipment/adamant_platebody.yaml b/data/items/equipment/adamant_platebody.yaml new file mode 100644 index 0000000..a37b781 --- /dev/null +++ b/data/items/equipment/adamant_platebody.yaml @@ -0,0 +1,15 @@ +id: adamant_platebody +name: adamant platebody +color: "120" +description: "An adamant platebody." +value: 5000 +stackable: false +equip_slot: torso +stats: + stab_defense: 49 + slash_defense: 55 + crush_defense: 40 + science_defense: -25 + ranged_defense: 49 +requirements: + defense: 30 diff --git a/data/items/equipment/adamant_sword.yaml b/data/items/equipment/adamant_sword.yaml new file mode 100644 index 0000000..035b615 --- /dev/null +++ b/data/items/equipment/adamant_sword.yaml @@ -0,0 +1,17 @@ +id: adamant_sword +name: adamant sword +color: "120" +description: "An adamant sword." +value: 700 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: 20 + slash_attack: 40 + crush_attack: -2 + strength_bonus: 27 +speed: 4 +requirements: + attack: 30 diff --git a/data/items/equipment/binding_necklace.yaml b/data/items/equipment/binding_necklace.yaml new file mode 100644 index 0000000..e9e7559 --- /dev/null +++ b/data/items/equipment/binding_necklace.yaml @@ -0,0 +1,6 @@ +id: binding_necklace +name: binding necklace +color: "34" +description: "An enchanted emerald necklace. Provides a 100 percent success rate when identifying junk at altars." +value: 1200 +equip_slot: neck diff --git a/data/items/equipment/black_axe.yaml b/data/items/equipment/black_axe.yaml new file mode 100644 index 0000000..e708645 --- /dev/null +++ b/data/items/equipment/black_axe.yaml @@ -0,0 +1,19 @@ +id: black_axe +name: black axe +color: "240" +description: "A black axe, good for woodcutting." +value: 150 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: -2 + slash_attack: 18 + crush_attack: 14 + strength_bonus: 14 +speed: 5 +tool_type: axe +tool_speed: 2.5 +requirements: + attack: 10 diff --git a/data/items/equipment/bracelet_of_clay.yaml b/data/items/equipment/bracelet_of_clay.yaml new file mode 100644 index 0000000..d8cd881 --- /dev/null +++ b/data/items/equipment/bracelet_of_clay.yaml @@ -0,0 +1,6 @@ +id: bracelet_of_clay +name: bracelet of clay +color: "39" +description: "An enchanted sapphire bracelet. Softens clay for easier crafting." +value: 500 +equip_slot: hands diff --git a/data/items/equipment/bracelet_of_slaughter.yaml b/data/items/equipment/bracelet_of_slaughter.yaml new file mode 100644 index 0000000..2bbbbec --- /dev/null +++ b/data/items/equipment/bracelet_of_slaughter.yaml @@ -0,0 +1,6 @@ +id: bracelet_of_slaughter +name: bracelet of slaughter +color: "34" +description: "An enchanted emerald bracelet that provides bonus XP on kills." +value: 1200 +equip_slot: hands diff --git a/data/items/equipment/bronze_dagger.yaml b/data/items/equipment/bronze_dagger.yaml new file mode 100644 index 0000000..95ec968 --- /dev/null +++ b/data/items/equipment/bronze_dagger.yaml @@ -0,0 +1,15 @@ +id: bronze_dagger +name: bronze dagger +color: "178" +description: "A small bronze dagger." +value: 8 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 5 + slash_attack: 3 + crush_attack: -1 + strength_bonus: 4 +speed: 3 diff --git a/data/items/equipment/bronze_full_helm.yaml b/data/items/equipment/bronze_full_helm.yaml new file mode 100644 index 0000000..ed006a8 --- /dev/null +++ b/data/items/equipment/bronze_full_helm.yaml @@ -0,0 +1,13 @@ +id: bronze_full_helm +name: bronze full helm +color: "178" +description: "A bronze full helmet." +value: 20 +stackable: false +equip_slot: head +stats: + stab_defense: 5 + slash_defense: 6 + crush_defense: 4 + science_defense: -3 + ranged_defense: 5 diff --git a/data/items/equipment/bronze_med_helm.yaml b/data/items/equipment/bronze_med_helm.yaml new file mode 100644 index 0000000..c9635cf --- /dev/null +++ b/data/items/equipment/bronze_med_helm.yaml @@ -0,0 +1,13 @@ +id: bronze_med_helm +name: bronze med helm +color: "178" +description: "A bronze medium helmet." +value: 8 +stackable: false +equip_slot: head +stats: + stab_defense: 3 + slash_defense: 4 + crush_defense: 2 + science_defense: -1 + ranged_defense: 3 diff --git a/data/items/equipment/bronze_platebody.yaml b/data/items/equipment/bronze_platebody.yaml new file mode 100644 index 0000000..8e6dd2c --- /dev/null +++ b/data/items/equipment/bronze_platebody.yaml @@ -0,0 +1,13 @@ +id: bronze_platebody +name: bronze platebody +color: "178" +description: "A bronze platebody." +value: 60 +stackable: false +equip_slot: torso +stats: + stab_defense: 12 + slash_defense: 15 + crush_defense: 10 + science_defense: -10 + ranged_defense: 12 diff --git a/data/items/equipment/bronze_sword.yaml b/data/items/equipment/bronze_sword.yaml new file mode 100644 index 0000000..0cfdd0e --- /dev/null +++ b/data/items/equipment/bronze_sword.yaml @@ -0,0 +1,15 @@ +id: bronze_sword +name: bronze sword +color: "178" +description: "A basic bronze sword." +value: 12 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: 4 + slash_attack: 10 + crush_attack: -2 + strength_bonus: 7 +speed: 4 diff --git a/data/items/equipment/capacitor_gloves.yaml b/data/items/equipment/capacitor_gloves.yaml new file mode 100644 index 0000000..e5af9ed --- /dev/null +++ b/data/items/equipment/capacitor_gloves.yaml @@ -0,0 +1,11 @@ +id: capacitor_gloves +name: Capacitor Gloves +description: "Gloves woven with superconducting filaments." +color: "250" +value: 300 +equip_slot: hands +stats: + stab_defense: 2 + slash_defense: 2 + crush_defense: 2 + technology_bonus: 2 diff --git a/data/items/equipment/cape_of_agility.yaml b/data/items/equipment/cape_of_agility.yaml new file mode 100644 index 0000000..5567e73 --- /dev/null +++ b/data/items/equipment/cape_of_agility.yaml @@ -0,0 +1,6 @@ +id: cape_of_agility +name: cape of agility +color: "g:223,231,223" +description: "A lightweight cape that allows the wearer to move with extraordinary speed." +value: 500 +equip_slot: back diff --git a/data/items/equipment/chitin_plate.yaml b/data/items/equipment/chitin_plate.yaml new file mode 100644 index 0000000..4148a2a --- /dev/null +++ b/data/items/equipment/chitin_plate.yaml @@ -0,0 +1,6 @@ +id: chitin_plate +name: chitin plate +color: "130" +description: "A thick plate of biological armor from a crawler's exoskeleton." +value: 50 +stackable: false diff --git a/data/items/equipment/coif.yaml b/data/items/equipment/coif.yaml new file mode 100644 index 0000000..8d910d7 --- /dev/null +++ b/data/items/equipment/coif.yaml @@ -0,0 +1,16 @@ +id: coif +name: coif +color: "94" +description: "A hard leather coif." +value: 45 +equip_slot: head +stats: + stab_defense: 2 + slash_defense: 4 + crush_defense: 2 + science_defense: 4 + ranged_defense: 6 + ranged_attack: 2 +requirements: + defense: 20 + ranged: 20 diff --git a/data/items/equipment/diamond_amulet_u.yaml b/data/items/equipment/diamond_amulet_u.yaml new file mode 100644 index 0000000..55eaf45 --- /dev/null +++ b/data/items/equipment/diamond_amulet_u.yaml @@ -0,0 +1,5 @@ +id: diamond_amulet_u +name: diamond amulet (u) +color: "255" +description: "An unstrung gold amulet set with a diamond." +value: 200 diff --git a/data/items/equipment/diamond_bracelet.yaml b/data/items/equipment/diamond_bracelet.yaml new file mode 100644 index 0000000..5ba5778 --- /dev/null +++ b/data/items/equipment/diamond_bracelet.yaml @@ -0,0 +1,6 @@ +id: diamond_bracelet +name: diamond bracelet +color: "255" +description: "A bracelet set with a diamond. Can be enchanted." +value: 1500 +equip_slot: hands diff --git a/data/items/equipment/diamond_necklace.yaml b/data/items/equipment/diamond_necklace.yaml new file mode 100644 index 0000000..5629b8c --- /dev/null +++ b/data/items/equipment/diamond_necklace.yaml @@ -0,0 +1,6 @@ +id: diamond_necklace +name: diamond necklace +color: "255" +description: "A necklace set with a diamond. Can be enchanted." +value: 1600 +equip_slot: neck diff --git a/data/items/equipment/diamond_ring.yaml b/data/items/equipment/diamond_ring.yaml new file mode 100644 index 0000000..54023c3 --- /dev/null +++ b/data/items/equipment/diamond_ring.yaml @@ -0,0 +1,6 @@ +id: diamond_ring +name: diamond ring +color: "255" +description: "A ring set with a diamond. Can be enchanted." +value: 1500 +equip_slot: ring diff --git a/data/items/equipment/digsite_pendant.yaml b/data/items/equipment/digsite_pendant.yaml new file mode 100644 index 0000000..b28e3e3 --- /dev/null +++ b/data/items/equipment/digsite_pendant.yaml @@ -0,0 +1,6 @@ +id: digsite_pendant +name: digsite pendant +color: "196" +description: "An enchanted ruby necklace that can teleport you to dig sites." +value: 2500 +equip_slot: neck diff --git a/data/items/equipment/dragon_axe.yaml b/data/items/equipment/dragon_axe.yaml new file mode 100644 index 0000000..ddc9758 --- /dev/null +++ b/data/items/equipment/dragon_axe.yaml @@ -0,0 +1,19 @@ +id: dragon_axe +name: dragon axe +color: "196" +description: "A powerful dragon axe." +value: 50000 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: -2 + slash_attack: 43 + crush_attack: 32 + strength_bonus: 36 +speed: 5 +tool_type: axe +tool_speed: 1 +requirements: + attack: 60 diff --git a/data/items/equipment/emerald_amulet_u.yaml b/data/items/equipment/emerald_amulet_u.yaml new file mode 100644 index 0000000..87261d4 --- /dev/null +++ b/data/items/equipment/emerald_amulet_u.yaml @@ -0,0 +1,5 @@ +id: emerald_amulet_u +name: emerald amulet (u) +color: "83" +description: "An unstrung gold amulet set with a emerald." +value: 110 diff --git a/data/items/equipment/emerald_bracelet.yaml b/data/items/equipment/emerald_bracelet.yaml new file mode 100644 index 0000000..04e4979 --- /dev/null +++ b/data/items/equipment/emerald_bracelet.yaml @@ -0,0 +1,6 @@ +id: emerald_bracelet +name: emerald bracelet +color: "34" +description: "A bracelet set with an emerald. Can be enchanted." +value: 400 +equip_slot: hands diff --git a/data/items/equipment/emerald_necklace.yaml b/data/items/equipment/emerald_necklace.yaml new file mode 100644 index 0000000..2107ca4 --- /dev/null +++ b/data/items/equipment/emerald_necklace.yaml @@ -0,0 +1,6 @@ +id: emerald_necklace +name: emerald necklace +color: "34" +description: "A necklace set with an emerald. Can be enchanted." +value: 450 +equip_slot: neck diff --git a/data/items/equipment/emerald_ring.yaml b/data/items/equipment/emerald_ring.yaml new file mode 100644 index 0000000..253f872 --- /dev/null +++ b/data/items/equipment/emerald_ring.yaml @@ -0,0 +1,6 @@ +id: emerald_ring +name: emerald ring +color: "34" +description: "A ring set with an emerald. Can be enchanted." +value: 400 +equip_slot: ring diff --git a/data/items/equipment/gold_amulet_u.yaml b/data/items/equipment/gold_amulet_u.yaml new file mode 100644 index 0000000..8671941 --- /dev/null +++ b/data/items/equipment/gold_amulet_u.yaml @@ -0,0 +1,5 @@ +id: gold_amulet_u +name: gold amulet (u) +color: "220" +description: "An unstrung gold amulet." +value: 70 diff --git a/data/items/equipment/gold_bracelet.yaml b/data/items/equipment/gold_bracelet.yaml new file mode 100644 index 0000000..2c4534f --- /dev/null +++ b/data/items/equipment/gold_bracelet.yaml @@ -0,0 +1,6 @@ +id: gold_bracelet +name: gold bracelet +color: "220" +description: "A gold bracelet." +value: 65 +equip_slot: hands diff --git a/data/items/equipment/gold_necklace.yaml b/data/items/equipment/gold_necklace.yaml new file mode 100644 index 0000000..4a22ac1 --- /dev/null +++ b/data/items/equipment/gold_necklace.yaml @@ -0,0 +1,6 @@ +id: gold_necklace +name: gold necklace +color: "220" +description: "A gold necklace." +value: 60 +equip_slot: neck diff --git a/data/items/equipment/gold_ring.yaml b/data/items/equipment/gold_ring.yaml new file mode 100644 index 0000000..1a39165 --- /dev/null +++ b/data/items/equipment/gold_ring.yaml @@ -0,0 +1,6 @@ +id: gold_ring +name: gold ring +color: "220" +description: "A simple gold ring." +value: 50 +equip_slot: ring diff --git a/data/items/equipment/graceful_boots.yaml b/data/items/equipment/graceful_boots.yaml new file mode 100644 index 0000000..71e8f84 --- /dev/null +++ b/data/items/equipment/graceful_boots.yaml @@ -0,0 +1,6 @@ +id: graceful_boots +name: graceful boots +color: "230" +description: "Lightweight boots. Part of the graceful set." +value: 80 +equip_slot: feet diff --git a/data/items/equipment/graceful_cape.yaml b/data/items/equipment/graceful_cape.yaml new file mode 100644 index 0000000..1d7c8f0 --- /dev/null +++ b/data/items/equipment/graceful_cape.yaml @@ -0,0 +1,6 @@ +id: graceful_cape +name: graceful cape +color: "230" +description: "A lightweight cape. Part of the graceful set." +value: 100 +equip_slot: back diff --git a/data/items/equipment/graceful_gloves.yaml b/data/items/equipment/graceful_gloves.yaml new file mode 100644 index 0000000..311ded5 --- /dev/null +++ b/data/items/equipment/graceful_gloves.yaml @@ -0,0 +1,6 @@ +id: graceful_gloves +name: graceful gloves +color: "230" +description: "Lightweight gloves. Part of the graceful set." +value: 80 +equip_slot: hands diff --git a/data/items/equipment/graceful_hat.yaml b/data/items/equipment/graceful_hat.yaml new file mode 100644 index 0000000..faec1e3 --- /dev/null +++ b/data/items/equipment/graceful_hat.yaml @@ -0,0 +1,6 @@ +id: graceful_hat +name: graceful hat +color: "230" +description: "A lightweight hat. Part of the graceful set." +value: 100 +equip_slot: head diff --git a/data/items/equipment/graceful_legs.yaml b/data/items/equipment/graceful_legs.yaml new file mode 100644 index 0000000..31eeebf --- /dev/null +++ b/data/items/equipment/graceful_legs.yaml @@ -0,0 +1,6 @@ +id: graceful_legs +name: graceful legs +color: "230" +description: "Lightweight leg armour. Part of the graceful set." +value: 150 +equip_slot: legs diff --git a/data/items/equipment/graceful_torso.yaml b/data/items/equipment/graceful_torso.yaml new file mode 100644 index 0000000..ec1edb7 --- /dev/null +++ b/data/items/equipment/graceful_torso.yaml @@ -0,0 +1,6 @@ +id: graceful_torso +name: graceful torso +color: "230" +description: "A lightweight top. Part of the graceful set." +value: 150 +equip_slot: torso diff --git a/data/items/equipment/hard_leather_body.yaml b/data/items/equipment/hard_leather_body.yaml new file mode 100644 index 0000000..a5fe30f --- /dev/null +++ b/data/items/equipment/hard_leather_body.yaml @@ -0,0 +1,14 @@ +id: hard_leather_body +name: hard leather body +color: "94" +description: "A hardened leather body armour." +value: 60 +equip_slot: torso +stats: + stab_defense: 8 + slash_defense: 12 + crush_defense: 8 + science_defense: 6 + ranged_defense: 14 +requirements: + defense: 10 diff --git a/data/items/equipment/hard_leather_shield.yaml b/data/items/equipment/hard_leather_shield.yaml new file mode 100644 index 0000000..fd7dabf --- /dev/null +++ b/data/items/equipment/hard_leather_shield.yaml @@ -0,0 +1,14 @@ +id: hard_leather_shield +name: hard leather shield +color: "94" +description: "A shield made of hardened leather." +value: 55 +equip_slot: off_hand +stats: + stab_defense: 5 + slash_defense: 7 + crush_defense: 5 + science_defense: 4 + ranged_defense: 8 +requirements: + defense: 10 diff --git a/data/items/equipment/inoculation_bracelet.yaml b/data/items/equipment/inoculation_bracelet.yaml new file mode 100644 index 0000000..9a3a149 --- /dev/null +++ b/data/items/equipment/inoculation_bracelet.yaml @@ -0,0 +1,6 @@ +id: inoculation_bracelet +name: inoculation bracelet +color: "196" +description: "An enchanted ruby bracelet that provides resistance to poison." +value: 2500 +equip_slot: hands diff --git a/data/items/equipment/insulated_gloves.yaml b/data/items/equipment/insulated_gloves.yaml new file mode 100644 index 0000000..3e53614 --- /dev/null +++ b/data/items/equipment/insulated_gloves.yaml @@ -0,0 +1,9 @@ +id: insulated_gloves +name: insulated gloves +color: "214" +description: "Heavy rubber gloves that protect against electrical attacks. Essential when fighting drones." +value: 50 +stackable: false +equip_slot: hands +stats: + defense_bonus: 1 diff --git a/data/items/equipment/iron_dagger.yaml b/data/items/equipment/iron_dagger.yaml new file mode 100644 index 0000000..8fa645c --- /dev/null +++ b/data/items/equipment/iron_dagger.yaml @@ -0,0 +1,15 @@ +id: iron_dagger +name: iron dagger +color: "250" +description: "A small iron dagger." +value: 20 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 8 + slash_attack: 5 + crush_attack: -1 + strength_bonus: 7 +speed: 3 diff --git a/data/items/equipment/iron_full_helm.yaml b/data/items/equipment/iron_full_helm.yaml new file mode 100644 index 0000000..3a2fc0c --- /dev/null +++ b/data/items/equipment/iron_full_helm.yaml @@ -0,0 +1,13 @@ +id: iron_full_helm +name: iron full helm +color: "250" +description: "An iron full helmet." +value: 50 +stackable: false +equip_slot: head +stats: + stab_defense: 8 + slash_defense: 9 + crush_defense: 6 + science_defense: -3 + ranged_defense: 8 diff --git a/data/items/equipment/iron_med_helm.yaml b/data/items/equipment/iron_med_helm.yaml new file mode 100644 index 0000000..6956283 --- /dev/null +++ b/data/items/equipment/iron_med_helm.yaml @@ -0,0 +1,13 @@ +id: iron_med_helm +name: iron med helm +color: "250" +description: "An iron medium helmet." +value: 20 +stackable: false +equip_slot: head +stats: + stab_defense: 5 + slash_defense: 6 + crush_defense: 3 + science_defense: -1 + ranged_defense: 5 diff --git a/data/items/equipment/iron_platebody.yaml b/data/items/equipment/iron_platebody.yaml new file mode 100644 index 0000000..3c0be80 --- /dev/null +++ b/data/items/equipment/iron_platebody.yaml @@ -0,0 +1,13 @@ +id: iron_platebody +name: iron platebody +color: "250" +description: "An iron platebody." +value: 150 +stackable: false +equip_slot: torso +stats: + stab_defense: 18 + slash_defense: 22 + crush_defense: 14 + science_defense: -10 + ranged_defense: 18 diff --git a/data/items/equipment/iron_sword.yaml b/data/items/equipment/iron_sword.yaml new file mode 100644 index 0000000..a5711fc --- /dev/null +++ b/data/items/equipment/iron_sword.yaml @@ -0,0 +1,15 @@ +id: iron_sword +name: iron sword +color: "250" +description: "An iron sword." +value: 30 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: 7 + slash_attack: 15 + crush_attack: -2 + strength_bonus: 10 +speed: 4 diff --git a/data/items/equipment/leather_body.yaml b/data/items/equipment/leather_body.yaml new file mode 100644 index 0000000..e69342c --- /dev/null +++ b/data/items/equipment/leather_body.yaml @@ -0,0 +1,12 @@ +id: leather_body +name: leather body +color: "130" +description: "A leather body armour." +value: 25 +equip_slot: torso +stats: + stab_defense: 4 + slash_defense: 7 + crush_defense: 5 + science_defense: 4 + ranged_defense: 10 diff --git a/data/items/equipment/leather_boots.yaml b/data/items/equipment/leather_boots.yaml new file mode 100644 index 0000000..7716e95 --- /dev/null +++ b/data/items/equipment/leather_boots.yaml @@ -0,0 +1,12 @@ +id: leather_boots +name: leather boots +color: "130" +description: "A pair of leather boots." +value: 12 +equip_slot: feet +stats: + stab_defense: 1 + slash_defense: 1 + crush_defense: 1 + science_defense: 1 + ranged_defense: 2 diff --git a/data/items/equipment/leather_chaps.yaml b/data/items/equipment/leather_chaps.yaml new file mode 100644 index 0000000..1a17c16 --- /dev/null +++ b/data/items/equipment/leather_chaps.yaml @@ -0,0 +1,12 @@ +id: leather_chaps +name: leather chaps +color: "130" +description: "A pair of leather chaps." +value: 20 +equip_slot: legs +stats: + stab_defense: 2 + slash_defense: 4 + crush_defense: 3 + science_defense: 3 + ranged_defense: 6 diff --git a/data/items/equipment/leather_cowl.yaml b/data/items/equipment/leather_cowl.yaml new file mode 100644 index 0000000..aa5965a --- /dev/null +++ b/data/items/equipment/leather_cowl.yaml @@ -0,0 +1,12 @@ +id: leather_cowl +name: leather cowl +color: "130" +description: "A leather cowl." +value: 15 +equip_slot: head +stats: + stab_defense: 1 + slash_defense: 2 + crush_defense: 1 + science_defense: 2 + ranged_defense: 4 diff --git a/data/items/equipment/leather_gloves.yaml b/data/items/equipment/leather_gloves.yaml new file mode 100644 index 0000000..7590fee --- /dev/null +++ b/data/items/equipment/leather_gloves.yaml @@ -0,0 +1,12 @@ +id: leather_gloves +name: leather gloves +color: "130" +description: "A pair of leather gloves." +value: 10 +equip_slot: hands +stats: + stab_defense: 1 + slash_defense: 1 + crush_defense: 1 + science_defense: 1 + ranged_defense: 2 diff --git a/data/items/equipment/leather_vambraces.yaml b/data/items/equipment/leather_vambraces.yaml new file mode 100644 index 0000000..fa59aa9 --- /dev/null +++ b/data/items/equipment/leather_vambraces.yaml @@ -0,0 +1,13 @@ +id: leather_vambraces +name: leather vambraces +color: "130" +description: "A pair of leather vambraces." +value: 18 +equip_slot: hands +stats: + stab_defense: 2 + slash_defense: 2 + crush_defense: 2 + science_defense: 2 + ranged_defense: 4 + ranged_attack: 4 diff --git a/data/items/equipment/longbow.yaml b/data/items/equipment/longbow.yaml new file mode 100644 index 0000000..f40c96d --- /dev/null +++ b/data/items/equipment/longbow.yaml @@ -0,0 +1,11 @@ +id: longbow +name: longbow +color: "137" +description: "A longbow." +value: 20 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 6 +stats: + ranged_attack: 8 diff --git a/data/items/equipment/longbow_u.yaml b/data/items/equipment/longbow_u.yaml new file mode 100644 index 0000000..93e5ff0 --- /dev/null +++ b/data/items/equipment/longbow_u.yaml @@ -0,0 +1,5 @@ +id: longbow_u +name: longbow (u) +color: "137" +description: "An unstrung longbow." +value: 10 diff --git a/data/items/equipment/magic_longbow.yaml b/data/items/equipment/magic_longbow.yaml new file mode 100644 index 0000000..07797fb --- /dev/null +++ b/data/items/equipment/magic_longbow.yaml @@ -0,0 +1,13 @@ +id: magic_longbow +name: magic longbow +color: "63" +description: "A magic longbow." +value: 6000 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 6 +stats: + ranged_attack: 69 +requirements: + ranged: 50 diff --git a/data/items/equipment/magic_longbow_u.yaml b/data/items/equipment/magic_longbow_u.yaml new file mode 100644 index 0000000..65682ed --- /dev/null +++ b/data/items/equipment/magic_longbow_u.yaml @@ -0,0 +1,5 @@ +id: magic_longbow_u +name: magic longbow (u) +color: "63" +description: "An unstrung magic longbow." +value: 3000 diff --git a/data/items/equipment/magic_shortbow.yaml b/data/items/equipment/magic_shortbow.yaml new file mode 100644 index 0000000..893b287 --- /dev/null +++ b/data/items/equipment/magic_shortbow.yaml @@ -0,0 +1,13 @@ +id: magic_shortbow +name: magic shortbow +color: "63" +description: "A magic shortbow." +value: 4000 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 4 +stats: + ranged_attack: 69 +requirements: + ranged: 50 diff --git a/data/items/equipment/magic_shortbow_u.yaml b/data/items/equipment/magic_shortbow_u.yaml new file mode 100644 index 0000000..2075bd1 --- /dev/null +++ b/data/items/equipment/magic_shortbow_u.yaml @@ -0,0 +1,5 @@ +id: magic_shortbow_u +name: magic shortbow (u) +color: "63" +description: "An unstrung magic shortbow." +value: 2000 diff --git a/data/items/equipment/maple_longbow.yaml b/data/items/equipment/maple_longbow.yaml new file mode 100644 index 0000000..1c86128 --- /dev/null +++ b/data/items/equipment/maple_longbow.yaml @@ -0,0 +1,13 @@ +id: maple_longbow +name: maple longbow +color: "172" +description: "A maple longbow." +value: 1280 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 6 +stats: + ranged_attack: 29 +requirements: + ranged: 30 diff --git a/data/items/equipment/maple_longbow_u.yaml b/data/items/equipment/maple_longbow_u.yaml new file mode 100644 index 0000000..120bf1d --- /dev/null +++ b/data/items/equipment/maple_longbow_u.yaml @@ -0,0 +1,5 @@ +id: maple_longbow_u +name: maple longbow (u) +color: "172" +description: "An unstrung maple longbow." +value: 640 diff --git a/data/items/equipment/maple_shortbow.yaml b/data/items/equipment/maple_shortbow.yaml new file mode 100644 index 0000000..38c27b5 --- /dev/null +++ b/data/items/equipment/maple_shortbow.yaml @@ -0,0 +1,13 @@ +id: maple_shortbow +name: maple shortbow +color: "172" +description: "A maple shortbow." +value: 640 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 4 +stats: + ranged_attack: 29 +requirements: + ranged: 30 diff --git a/data/items/equipment/maple_shortbow_u.yaml b/data/items/equipment/maple_shortbow_u.yaml new file mode 100644 index 0000000..6fc6b84 --- /dev/null +++ b/data/items/equipment/maple_shortbow_u.yaml @@ -0,0 +1,5 @@ +id: maple_shortbow_u +name: maple shortbow (u) +color: "172" +description: "An unstrung maple shortbow." +value: 320 diff --git a/data/items/equipment/mithril_dagger.yaml b/data/items/equipment/mithril_dagger.yaml new file mode 100644 index 0000000..8ffe595 --- /dev/null +++ b/data/items/equipment/mithril_dagger.yaml @@ -0,0 +1,17 @@ +id: mithril_dagger +name: mithril dagger +color: "75" +description: "A small mithril dagger." +value: 150 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 17 + slash_attack: 10 + crush_attack: -1 + strength_bonus: 14 +speed: 3 +requirements: + attack: 20 diff --git a/data/items/equipment/mithril_full_helm.yaml b/data/items/equipment/mithril_full_helm.yaml new file mode 100644 index 0000000..d317705 --- /dev/null +++ b/data/items/equipment/mithril_full_helm.yaml @@ -0,0 +1,15 @@ +id: mithril_full_helm +name: mithril full helm +color: "75" +description: "A mithril full helmet." +value: 400 +stackable: false +equip_slot: head +stats: + stab_defense: 16 + slash_defense: 18 + crush_defense: 12 + science_defense: -6 + ranged_defense: 16 +requirements: + defense: 20 diff --git a/data/items/equipment/mithril_med_helm.yaml b/data/items/equipment/mithril_med_helm.yaml new file mode 100644 index 0000000..f244a7c --- /dev/null +++ b/data/items/equipment/mithril_med_helm.yaml @@ -0,0 +1,15 @@ +id: mithril_med_helm +name: mithril med helm +color: "75" +description: "A mithril medium helmet." +value: 150 +stackable: false +equip_slot: head +stats: + stab_defense: 10 + slash_defense: 12 + crush_defense: 7 + science_defense: -3 + ranged_defense: 10 +requirements: + defense: 20 diff --git a/data/items/equipment/mithril_platebody.yaml b/data/items/equipment/mithril_platebody.yaml new file mode 100644 index 0000000..50e8ea0 --- /dev/null +++ b/data/items/equipment/mithril_platebody.yaml @@ -0,0 +1,15 @@ +id: mithril_platebody +name: mithril platebody +color: "75" +description: "A mithril platebody." +value: 1500 +stackable: false +equip_slot: torso +stats: + stab_defense: 36 + slash_defense: 42 + crush_defense: 30 + science_defense: -20 + ranged_defense: 36 +requirements: + defense: 20 diff --git a/data/items/equipment/mithril_sword.yaml b/data/items/equipment/mithril_sword.yaml new file mode 100644 index 0000000..1824f5b --- /dev/null +++ b/data/items/equipment/mithril_sword.yaml @@ -0,0 +1,17 @@ +id: mithril_sword +name: mithril sword +color: "75" +description: "A mithril sword." +value: 250 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: 14 + slash_attack: 30 + crush_attack: -2 + strength_bonus: 20 +speed: 4 +requirements: + attack: 20 diff --git a/data/items/equipment/necklace_of_passage.yaml b/data/items/equipment/necklace_of_passage.yaml new file mode 100644 index 0000000..b5630ed --- /dev/null +++ b/data/items/equipment/necklace_of_passage.yaml @@ -0,0 +1,6 @@ +id: necklace_of_passage +name: necklace of passage +color: "39" +description: "An enchanted sapphire necklace that can teleport the wearer to various locations." +value: 750 +equip_slot: neck diff --git a/data/items/equipment/neural_headband.yaml b/data/items/equipment/neural_headband.yaml new file mode 100644 index 0000000..e01e57d --- /dev/null +++ b/data/items/equipment/neural_headband.yaml @@ -0,0 +1,11 @@ +id: neural_headband +name: Neural Headband +description: "A thin band of circuitry that amplifies neural signals, reducing battery drain." +color: "39" +value: 500 +equip_slot: head +stats: + stab_defense: 1 + slash_defense: 1 + crush_defense: 1 + technology_bonus: 4 diff --git a/data/items/equipment/oak_longbow.yaml b/data/items/equipment/oak_longbow.yaml new file mode 100644 index 0000000..71e7c7c --- /dev/null +++ b/data/items/equipment/oak_longbow.yaml @@ -0,0 +1,13 @@ +id: oak_longbow +name: oak longbow +color: "136" +description: "An oak longbow." +value: 80 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 6 +stats: + ranged_attack: 14 +requirements: + ranged: 5 diff --git a/data/items/equipment/oak_longbow_u.yaml b/data/items/equipment/oak_longbow_u.yaml new file mode 100644 index 0000000..6df0dab --- /dev/null +++ b/data/items/equipment/oak_longbow_u.yaml @@ -0,0 +1,5 @@ +id: oak_longbow_u +name: oak longbow (u) +color: "136" +description: "An unstrung oak longbow." +value: 40 diff --git a/data/items/equipment/oak_shortbow.yaml b/data/items/equipment/oak_shortbow.yaml new file mode 100644 index 0000000..30ebbce --- /dev/null +++ b/data/items/equipment/oak_shortbow.yaml @@ -0,0 +1,13 @@ +id: oak_shortbow +name: oak shortbow +color: "136" +description: "An oak shortbow." +value: 40 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 4 +stats: + ranged_attack: 14 +requirements: + ranged: 5 diff --git a/data/items/equipment/oak_shortbow_u.yaml b/data/items/equipment/oak_shortbow_u.yaml new file mode 100644 index 0000000..5bebc38 --- /dev/null +++ b/data/items/equipment/oak_shortbow_u.yaml @@ -0,0 +1,5 @@ +id: oak_shortbow_u +name: oak shortbow (u) +color: "136" +description: "An unstrung oak shortbow." +value: 20 diff --git a/data/items/equipment/party_hat_blue.yaml b/data/items/equipment/party_hat_blue.yaml new file mode 100644 index 0000000..42d6bb5 --- /dev/null +++ b/data/items/equipment/party_hat_blue.yaml @@ -0,0 +1,7 @@ +id: party_hat_blue +name: blue party hat +color: "69" +description: "A festive blue party hat." +value: 2 +equip_slot: head +stackable: false diff --git a/data/items/equipment/party_hat_green.yaml b/data/items/equipment/party_hat_green.yaml new file mode 100644 index 0000000..82c3bc7 --- /dev/null +++ b/data/items/equipment/party_hat_green.yaml @@ -0,0 +1,7 @@ +id: party_hat_green +name: green party hat +color: "83" +description: "A festive green party hat." +value: 2 +equip_slot: head +stackable: false diff --git a/data/items/equipment/party_hat_pink.yaml b/data/items/equipment/party_hat_pink.yaml new file mode 100644 index 0000000..006e261 --- /dev/null +++ b/data/items/equipment/party_hat_pink.yaml @@ -0,0 +1,7 @@ +id: party_hat_pink +name: pink party hat +color: "213" +description: "A festive pink party hat." +value: 2 +equip_slot: head +stackable: false diff --git a/data/items/equipment/party_hat_red.yaml b/data/items/equipment/party_hat_red.yaml new file mode 100644 index 0000000..005b3dd --- /dev/null +++ b/data/items/equipment/party_hat_red.yaml @@ -0,0 +1,7 @@ +id: party_hat_red +name: red party hat +color: "196" +description: "A festive red party hat." +value: 2 +equip_slot: head +stackable: false diff --git a/data/items/equipment/party_hat_white.yaml b/data/items/equipment/party_hat_white.yaml new file mode 100644 index 0000000..c8e8f86 --- /dev/null +++ b/data/items/equipment/party_hat_white.yaml @@ -0,0 +1,7 @@ +id: party_hat_white +name: white party hat +color: "255" +description: "A festive white party hat." +value: 2 +equip_slot: head +stackable: false diff --git a/data/items/equipment/party_hat_yellow.yaml b/data/items/equipment/party_hat_yellow.yaml new file mode 100644 index 0000000..33a85f8 --- /dev/null +++ b/data/items/equipment/party_hat_yellow.yaml @@ -0,0 +1,7 @@ +id: party_hat_yellow +name: yellow party hat +color: "226" +description: "A festive yellow party hat." +value: 2 +equip_slot: head +stackable: false diff --git a/data/items/equipment/phoenix_necklace.yaml b/data/items/equipment/phoenix_necklace.yaml new file mode 100644 index 0000000..b53fafb --- /dev/null +++ b/data/items/equipment/phoenix_necklace.yaml @@ -0,0 +1,6 @@ +id: phoenix_necklace +name: phoenix necklace +color: "255" +description: "An enchanted diamond necklace that restores HP when you drop below 20 percent health." +value: 5500 +equip_slot: neck diff --git a/data/items/equipment/power_amulet.yaml b/data/items/equipment/power_amulet.yaml new file mode 100644 index 0000000..bd136a4 --- /dev/null +++ b/data/items/equipment/power_amulet.yaml @@ -0,0 +1,8 @@ +id: power_amulet +name: Power Amulet +description: "A pendant containing a miniature power cell that augments tech efficiency." +color: "220" +value: 800 +equip_slot: neck +stats: + technology_bonus: 3 diff --git a/data/items/equipment/ring_of_dueling.yaml b/data/items/equipment/ring_of_dueling.yaml new file mode 100644 index 0000000..0c11e87 --- /dev/null +++ b/data/items/equipment/ring_of_dueling.yaml @@ -0,0 +1,6 @@ +id: ring_of_dueling +name: ring of dueling +color: "34" +description: "An enchanted emerald ring used for teleporting to dueling arenas." +value: 1000 +equip_slot: ring diff --git a/data/items/equipment/ring_of_forging.yaml b/data/items/equipment/ring_of_forging.yaml new file mode 100644 index 0000000..d0792a1 --- /dev/null +++ b/data/items/equipment/ring_of_forging.yaml @@ -0,0 +1,6 @@ +id: ring_of_forging +name: ring of forging +color: "196" +description: "An enchanted ruby ring that prevents ore from failing to smelt." +value: 2000 +equip_slot: ring diff --git a/data/items/equipment/ring_of_life.yaml b/data/items/equipment/ring_of_life.yaml new file mode 100644 index 0000000..ab0b6e3 --- /dev/null +++ b/data/items/equipment/ring_of_life.yaml @@ -0,0 +1,6 @@ +id: ring_of_life +name: ring of life +color: "255" +description: "An enchanted diamond ring that teleports you to safety when your HP drops critically low." +value: 5000 +equip_slot: ring diff --git a/data/items/equipment/ring_of_recoil.yaml b/data/items/equipment/ring_of_recoil.yaml new file mode 100644 index 0000000..c143f68 --- /dev/null +++ b/data/items/equipment/ring_of_recoil.yaml @@ -0,0 +1,6 @@ +id: ring_of_recoil +name: ring of recoil +color: "39" +description: "An enchanted sapphire ring that reflects a portion of melee damage back to the attacker." +value: 500 +equip_slot: ring diff --git a/data/items/equipment/ruby_amulet_u.yaml b/data/items/equipment/ruby_amulet_u.yaml new file mode 100644 index 0000000..031bf8b --- /dev/null +++ b/data/items/equipment/ruby_amulet_u.yaml @@ -0,0 +1,5 @@ +id: ruby_amulet_u +name: ruby amulet (u) +color: "196" +description: "An unstrung gold amulet set with a ruby." +value: 145 diff --git a/data/items/equipment/ruby_bracelet.yaml b/data/items/equipment/ruby_bracelet.yaml new file mode 100644 index 0000000..e5f3f70 --- /dev/null +++ b/data/items/equipment/ruby_bracelet.yaml @@ -0,0 +1,6 @@ +id: ruby_bracelet +name: ruby bracelet +color: "196" +description: "A bracelet set with a ruby. Can be enchanted." +value: 800 +equip_slot: hands diff --git a/data/items/equipment/ruby_necklace.yaml b/data/items/equipment/ruby_necklace.yaml new file mode 100644 index 0000000..e181777 --- /dev/null +++ b/data/items/equipment/ruby_necklace.yaml @@ -0,0 +1,6 @@ +id: ruby_necklace +name: ruby necklace +color: "196" +description: "A necklace set with a ruby. Can be enchanted." +value: 850 +equip_slot: neck diff --git a/data/items/equipment/ruby_ring.yaml b/data/items/equipment/ruby_ring.yaml new file mode 100644 index 0000000..cb0cfde --- /dev/null +++ b/data/items/equipment/ruby_ring.yaml @@ -0,0 +1,6 @@ +id: ruby_ring +name: ruby ring +color: "196" +description: "A ring set with a ruby. Can be enchanted." +value: 800 +equip_slot: ring diff --git a/data/items/equipment/rune_dagger.yaml b/data/items/equipment/rune_dagger.yaml new file mode 100644 index 0000000..9e8507b --- /dev/null +++ b/data/items/equipment/rune_dagger.yaml @@ -0,0 +1,17 @@ +id: rune_dagger +name: rune dagger +color: "87" +description: "A small rune dagger." +value: 5000 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 30 + slash_attack: 18 + crush_attack: -1 + strength_bonus: 24 +speed: 3 +requirements: + attack: 40 diff --git a/data/items/equipment/rune_full_helm.yaml b/data/items/equipment/rune_full_helm.yaml new file mode 100644 index 0000000..87d6973 --- /dev/null +++ b/data/items/equipment/rune_full_helm.yaml @@ -0,0 +1,15 @@ +id: rune_full_helm +name: rune full helm +color: "87" +description: "A rune full helmet." +value: 12000 +stackable: false +equip_slot: head +stats: + stab_defense: 30 + slash_defense: 33 + crush_defense: 22 + science_defense: -11 + ranged_defense: 30 +requirements: + defense: 40 diff --git a/data/items/equipment/rune_med_helm.yaml b/data/items/equipment/rune_med_helm.yaml new file mode 100644 index 0000000..895d257 --- /dev/null +++ b/data/items/equipment/rune_med_helm.yaml @@ -0,0 +1,15 @@ +id: rune_med_helm +name: rune med helm +color: "87" +description: "A rune medium helmet." +value: 5000 +stackable: false +equip_slot: head +stats: + stab_defense: 19 + slash_defense: 22 + crush_defense: 13 + science_defense: -4 + ranged_defense: 19 +requirements: + defense: 40 diff --git a/data/items/equipment/rune_platebody.yaml b/data/items/equipment/rune_platebody.yaml new file mode 100644 index 0000000..d1e5fb1 --- /dev/null +++ b/data/items/equipment/rune_platebody.yaml @@ -0,0 +1,15 @@ +id: rune_platebody +name: rune platebody +color: "87" +description: "A rune platebody." +value: 40000 +stackable: false +equip_slot: torso +stats: + stab_defense: 65 + slash_defense: 72 + crush_defense: 52 + science_defense: -30 + ranged_defense: 65 +requirements: + defense: 40 diff --git a/data/items/equipment/rune_sword.yaml b/data/items/equipment/rune_sword.yaml new file mode 100644 index 0000000..e0bfb74 --- /dev/null +++ b/data/items/equipment/rune_sword.yaml @@ -0,0 +1,17 @@ +id: rune_sword +name: rune sword +color: "87" +description: "A rune sword." +value: 10000 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: 27 + slash_attack: 52 + crush_attack: -2 + strength_bonus: 36 +speed: 4 +requirements: + attack: 40 diff --git a/data/items/equipment/sapphire_amulet_u.yaml b/data/items/equipment/sapphire_amulet_u.yaml new file mode 100644 index 0000000..22ef39c --- /dev/null +++ b/data/items/equipment/sapphire_amulet_u.yaml @@ -0,0 +1,5 @@ +id: sapphire_amulet_u +name: sapphire amulet (u) +color: "69" +description: "An unstrung gold amulet set with a sapphire." +value: 100 diff --git a/data/items/equipment/sapphire_bracelet.yaml b/data/items/equipment/sapphire_bracelet.yaml new file mode 100644 index 0000000..a2996eb --- /dev/null +++ b/data/items/equipment/sapphire_bracelet.yaml @@ -0,0 +1,6 @@ +id: sapphire_bracelet +name: sapphire bracelet +color: "39" +description: "A bracelet set with a sapphire. Can be enchanted." +value: 200 +equip_slot: hands diff --git a/data/items/equipment/sapphire_necklace.yaml b/data/items/equipment/sapphire_necklace.yaml new file mode 100644 index 0000000..e553973 --- /dev/null +++ b/data/items/equipment/sapphire_necklace.yaml @@ -0,0 +1,6 @@ +id: sapphire_necklace +name: sapphire necklace +color: "39" +description: "A necklace set with a sapphire. Can be enchanted." +value: 250 +equip_slot: neck diff --git a/data/items/equipment/sapphire_ring.yaml b/data/items/equipment/sapphire_ring.yaml new file mode 100644 index 0000000..40e8cc5 --- /dev/null +++ b/data/items/equipment/sapphire_ring.yaml @@ -0,0 +1,6 @@ +id: sapphire_ring +name: sapphire ring +color: "39" +description: "A ring set with a sapphire. Can be enchanted." +value: 200 +equip_slot: ring diff --git a/data/items/equipment/shortbow.yaml b/data/items/equipment/shortbow.yaml new file mode 100644 index 0000000..ecd3630 --- /dev/null +++ b/data/items/equipment/shortbow.yaml @@ -0,0 +1,11 @@ +id: shortbow +name: shortbow +color: "137" +description: "A shortbow." +value: 10 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 4 +stats: + ranged_attack: 8 diff --git a/data/items/equipment/shortbow_u.yaml b/data/items/equipment/shortbow_u.yaml new file mode 100644 index 0000000..6ffcafc --- /dev/null +++ b/data/items/equipment/shortbow_u.yaml @@ -0,0 +1,5 @@ +id: shortbow_u +name: shortbow (u) +color: "137" +description: "An unstrung shortbow." +value: 5 diff --git a/data/items/equipment/spectral_visor.yaml b/data/items/equipment/spectral_visor.yaml new file mode 100644 index 0000000..851a929 --- /dev/null +++ b/data/items/equipment/spectral_visor.yaml @@ -0,0 +1,9 @@ +id: spectral_visor +name: spectral visor +color: "141" +description: "A visor fitted with spectral frequency filters. Dampens psychic attacks from phantoms." +value: 75 +stackable: false +equip_slot: head +stats: + defense_bonus: 2 diff --git a/data/items/equipment/steel_dagger.yaml b/data/items/equipment/steel_dagger.yaml new file mode 100644 index 0000000..e52b882 --- /dev/null +++ b/data/items/equipment/steel_dagger.yaml @@ -0,0 +1,17 @@ +id: steel_dagger +name: steel dagger +color: "253" +description: "A small steel dagger." +value: 60 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 12 + slash_attack: 7 + crush_attack: -1 + strength_bonus: 10 +speed: 3 +requirements: + attack: 5 diff --git a/data/items/equipment/steel_full_helm.yaml b/data/items/equipment/steel_full_helm.yaml new file mode 100644 index 0000000..7152ded --- /dev/null +++ b/data/items/equipment/steel_full_helm.yaml @@ -0,0 +1,15 @@ +id: steel_full_helm +name: steel full helm +color: "253" +description: "A steel full helmet." +value: 150 +stackable: false +equip_slot: head +stats: + stab_defense: 12 + slash_defense: 13 + crush_defense: 9 + science_defense: -5 + ranged_defense: 12 +requirements: + defense: 5 diff --git a/data/items/equipment/steel_med_helm.yaml b/data/items/equipment/steel_med_helm.yaml new file mode 100644 index 0000000..9e15fdd --- /dev/null +++ b/data/items/equipment/steel_med_helm.yaml @@ -0,0 +1,15 @@ +id: steel_med_helm +name: steel med helm +color: "253" +description: "A steel medium helmet." +value: 60 +stackable: false +equip_slot: head +stats: + stab_defense: 7 + slash_defense: 9 + crush_defense: 5 + science_defense: -2 + ranged_defense: 7 +requirements: + defense: 5 diff --git a/data/items/equipment/steel_platebody.yaml b/data/items/equipment/steel_platebody.yaml new file mode 100644 index 0000000..f44dfa3 --- /dev/null +++ b/data/items/equipment/steel_platebody.yaml @@ -0,0 +1,15 @@ +id: steel_platebody +name: steel platebody +color: "253" +description: "A steel platebody." +value: 500 +stackable: false +equip_slot: torso +stats: + stab_defense: 27 + slash_defense: 32 + crush_defense: 22 + science_defense: -15 + ranged_defense: 27 +requirements: + defense: 5 diff --git a/data/items/equipment/steel_sword.yaml b/data/items/equipment/steel_sword.yaml new file mode 100644 index 0000000..e096dc9 --- /dev/null +++ b/data/items/equipment/steel_sword.yaml @@ -0,0 +1,17 @@ +id: steel_sword +name: steel sword +color: "253" +description: "A steel sword." +value: 100 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: 10 + slash_attack: 22 + crush_attack: -2 + strength_bonus: 14 +speed: 4 +requirements: + attack: 5 diff --git a/data/items/equipment/willow_longbow.yaml b/data/items/equipment/willow_longbow.yaml new file mode 100644 index 0000000..e30528c --- /dev/null +++ b/data/items/equipment/willow_longbow.yaml @@ -0,0 +1,13 @@ +id: willow_longbow +name: willow longbow +color: "107" +description: "A willow longbow." +value: 320 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 6 +stats: + ranged_attack: 20 +requirements: + ranged: 20 diff --git a/data/items/equipment/willow_longbow_u.yaml b/data/items/equipment/willow_longbow_u.yaml new file mode 100644 index 0000000..5e4e9da --- /dev/null +++ b/data/items/equipment/willow_longbow_u.yaml @@ -0,0 +1,5 @@ +id: willow_longbow_u +name: willow longbow (u) +color: "107" +description: "An unstrung willow longbow." +value: 160 diff --git a/data/items/equipment/willow_shortbow.yaml b/data/items/equipment/willow_shortbow.yaml new file mode 100644 index 0000000..f75cfe9 --- /dev/null +++ b/data/items/equipment/willow_shortbow.yaml @@ -0,0 +1,13 @@ +id: willow_shortbow +name: willow shortbow +color: "107" +description: "A willow shortbow." +value: 160 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 4 +stats: + ranged_attack: 20 +requirements: + ranged: 20 diff --git a/data/items/equipment/willow_shortbow_u.yaml b/data/items/equipment/willow_shortbow_u.yaml new file mode 100644 index 0000000..b467455 --- /dev/null +++ b/data/items/equipment/willow_shortbow_u.yaml @@ -0,0 +1,5 @@ +id: willow_shortbow_u +name: willow shortbow (u) +color: "107" +description: "An unstrung willow shortbow." +value: 80 diff --git a/data/items/equipment/yew_longbow.yaml b/data/items/equipment/yew_longbow.yaml new file mode 100644 index 0000000..1e7c0f5 --- /dev/null +++ b/data/items/equipment/yew_longbow.yaml @@ -0,0 +1,13 @@ +id: yew_longbow +name: yew longbow +color: "94" +description: "A yew longbow." +value: 2000 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 6 +stats: + ranged_attack: 47 +requirements: + ranged: 40 diff --git a/data/items/equipment/yew_longbow_u.yaml b/data/items/equipment/yew_longbow_u.yaml new file mode 100644 index 0000000..ac4fdb2 --- /dev/null +++ b/data/items/equipment/yew_longbow_u.yaml @@ -0,0 +1,5 @@ +id: yew_longbow_u +name: yew longbow (u) +color: "94" +description: "An unstrung yew longbow." +value: 1000 diff --git a/data/items/equipment/yew_shortbow.yaml b/data/items/equipment/yew_shortbow.yaml new file mode 100644 index 0000000..c302a38 --- /dev/null +++ b/data/items/equipment/yew_shortbow.yaml @@ -0,0 +1,13 @@ +id: yew_shortbow +name: yew shortbow +color: "94" +description: "A yew shortbow." +value: 1600 +equip_slot: main_hand +weapon_type: ranged +attack_type: ranged +speed: 4 +stats: + ranged_attack: 47 +requirements: + ranged: 40 diff --git a/data/items/equipment/yew_shortbow_u.yaml b/data/items/equipment/yew_shortbow_u.yaml new file mode 100644 index 0000000..4c2124b --- /dev/null +++ b/data/items/equipment/yew_shortbow_u.yaml @@ -0,0 +1,5 @@ +id: yew_shortbow_u +name: yew shortbow (u) +color: "94" +description: "An unstrung yew shortbow." +value: 800 diff --git a/data/items/eye_of_newt.yaml b/data/items/eye_of_newt.yaml deleted file mode 100644 index baf5ebe..0000000 --- a/data/items/eye_of_newt.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: eye_of_newt -name: "eye of newt" -color: "215" -description: "A preserved eye of newt, suspended in synthetic fluid. Used in pharmacy." -value: 3 -stackable: false diff --git a/data/items/feather.yaml b/data/items/feather.yaml deleted file mode 100644 index 25afc2a..0000000 --- a/data/items/feather.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: feather -name: feather -color: "230" -description: "A colorful feather. Used as fly fishing bait." -value: 1 -stackable: true diff --git a/data/items/firesteel.yaml b/data/items/firesteel.yaml deleted file mode 100644 index b3f9302..0000000 --- a/data/items/firesteel.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: firesteel -name: firesteel -color: "250" -description: "A rugged firesteel that never wears out." -value: 20 -stackable: false -tool_type: fire -tool_speed: 4 diff --git a/data/items/fishing_bait.yaml b/data/items/fishing_bait.yaml deleted file mode 100644 index 2336a7d..0000000 --- a/data/items/fishing_bait.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: fishing_bait -name: fishing bait -color: "222" -description: "A handful of wriggling bait. Used with a fishing rod." -value: 1 -stackable: true diff --git a/data/items/fishing_rod.yaml b/data/items/fishing_rod.yaml deleted file mode 100644 index a48c0a1..0000000 --- a/data/items/fishing_rod.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: fishing_rod -name: fishing rod -color: "107" -description: "A simple fishing rod. Use with fishing bait." -value: 5 -stackable: false -equip_slot: main_hand -weapon_type: melee -stats: - attack_bonus: 0 - strength_bonus: 0 - defense_bonus: 0 -speed: 5 -tool_type: fishing_rod -tool_speed: 0 diff --git a/data/items/flax.yaml b/data/items/flax.yaml deleted file mode 100644 index 36f7082..0000000 --- a/data/items/flax.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: flax -name: flax -color: "113" -description: "A bundle of flax. Can be spun into a bowstring." -value: 5 -stackable: false diff --git a/data/items/fly_fishing_rod.yaml b/data/items/fly_fishing_rod.yaml deleted file mode 100644 index c0f3f78..0000000 --- a/data/items/fly_fishing_rod.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: fly_fishing_rod -name: fly fishing rod -color: "107" -description: "A flexible rod for fly fishing with artificial flies." -value: 20 -stackable: false -equip_slot: main_hand -weapon_type: melee -stats: - attack_bonus: 0 - strength_bonus: 0 - defense_bonus: 0 -speed: 5 -tool_type: fly_rod -tool_speed: 1 diff --git a/data/items/full_restore.yaml b/data/items/full_restore.yaml deleted file mode 100644 index 96f6036..0000000 --- a/data/items/full_restore.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: full_restore -name: "full restore" -color: "208" -description: "A powerful orange potion that completely restores health." -value: 200 -stackable: false -potion_effect: "heal" -potion_bonus: 500 -potion_duration: 0 diff --git a/data/items/gold_amulet_u.yaml b/data/items/gold_amulet_u.yaml deleted file mode 100644 index 8671941..0000000 --- a/data/items/gold_amulet_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: gold_amulet_u -name: gold amulet (u) -color: "220" -description: "An unstrung gold amulet." -value: 70 diff --git a/data/items/gold_bar.yaml b/data/items/gold_bar.yaml deleted file mode 100644 index 3272b04..0000000 --- a/data/items/gold_bar.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: gold_bar -name: gold bar -color: "220" -description: "A bar of gold metal." -value: 50 -stackable: false diff --git a/data/items/gold_bracelet.yaml b/data/items/gold_bracelet.yaml deleted file mode 100644 index 2c4534f..0000000 --- a/data/items/gold_bracelet.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: gold_bracelet -name: gold bracelet -color: "220" -description: "A gold bracelet." -value: 65 -equip_slot: hands diff --git a/data/items/gold_necklace.yaml b/data/items/gold_necklace.yaml deleted file mode 100644 index 4a22ac1..0000000 --- a/data/items/gold_necklace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: gold_necklace -name: gold necklace -color: "220" -description: "A gold necklace." -value: 60 -equip_slot: neck diff --git a/data/items/gold_ore.yaml b/data/items/gold_ore.yaml deleted file mode 100644 index e45ca03..0000000 --- a/data/items/gold_ore.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: gold_ore -name: gold ore -color: "220" -description: "A glittering chunk of gold ore." -value: 25 -stackable: false diff --git a/data/items/gold_ring.yaml b/data/items/gold_ring.yaml deleted file mode 100644 index 1a39165..0000000 --- a/data/items/gold_ring.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: gold_ring -name: gold ring -color: "220" -description: "A simple gold ring." -value: 50 -equip_slot: ring diff --git a/data/items/graceful_boots.yaml b/data/items/graceful_boots.yaml deleted file mode 100644 index 71e8f84..0000000 --- a/data/items/graceful_boots.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: graceful_boots -name: graceful boots -color: "230" -description: "Lightweight boots. Part of the graceful set." -value: 80 -equip_slot: feet diff --git a/data/items/graceful_cape.yaml b/data/items/graceful_cape.yaml deleted file mode 100644 index 1d7c8f0..0000000 --- a/data/items/graceful_cape.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: graceful_cape -name: graceful cape -color: "230" -description: "A lightweight cape. Part of the graceful set." -value: 100 -equip_slot: back diff --git a/data/items/graceful_gloves.yaml b/data/items/graceful_gloves.yaml deleted file mode 100644 index 311ded5..0000000 --- a/data/items/graceful_gloves.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: graceful_gloves -name: graceful gloves -color: "230" -description: "Lightweight gloves. Part of the graceful set." -value: 80 -equip_slot: hands diff --git a/data/items/graceful_hat.yaml b/data/items/graceful_hat.yaml deleted file mode 100644 index faec1e3..0000000 --- a/data/items/graceful_hat.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: graceful_hat -name: graceful hat -color: "230" -description: "A lightweight hat. Part of the graceful set." -value: 100 -equip_slot: head diff --git a/data/items/graceful_legs.yaml b/data/items/graceful_legs.yaml deleted file mode 100644 index 31eeebf..0000000 --- a/data/items/graceful_legs.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: graceful_legs -name: graceful legs -color: "230" -description: "Lightweight leg armour. Part of the graceful set." -value: 150 -equip_slot: legs diff --git a/data/items/graceful_torso.yaml b/data/items/graceful_torso.yaml deleted file mode 100644 index ec1edb7..0000000 --- a/data/items/graceful_torso.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: graceful_torso -name: graceful torso -color: "230" -description: "A lightweight top. Part of the graceful set." -value: 150 -equip_slot: torso diff --git a/data/items/grimy_avantoe.yaml b/data/items/grimy_avantoe.yaml deleted file mode 100644 index 4f84679..0000000 --- a/data/items/grimy_avantoe.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_avantoe -name: "grimy avantoe" -color: "65" -description: "A grimy avantoe leaf. It needs to be cleaned before it can be used." -value: 35 -stackable: false diff --git a/data/items/grimy_cadantine.yaml b/data/items/grimy_cadantine.yaml deleted file mode 100644 index 0eb88f8..0000000 --- a/data/items/grimy_cadantine.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_cadantine -name: "grimy cadantine" -color: "65" -description: "A grimy cadantine leaf. It needs to be cleaned before it can be used." -value: 55 -stackable: false diff --git a/data/items/grimy_dwarf_weed.yaml b/data/items/grimy_dwarf_weed.yaml deleted file mode 100644 index 8f24595..0000000 --- a/data/items/grimy_dwarf_weed.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_dwarf_weed -name: "grimy dwarf weed" -color: "65" -description: "A grimy dwarf weed leaf. It needs to be cleaned before it can be used." -value: 65 -stackable: false diff --git a/data/items/grimy_guam.yaml b/data/items/grimy_guam.yaml deleted file mode 100644 index fb408af..0000000 --- a/data/items/grimy_guam.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_guam -name: "grimy guam" -color: "65" -description: "A grimy guam leaf. It needs to be cleaned before it can be used." -value: 2 -stackable: false diff --git a/data/items/grimy_harralander.yaml b/data/items/grimy_harralander.yaml deleted file mode 100644 index deea973..0000000 --- a/data/items/grimy_harralander.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_harralander -name: "grimy harralander" -color: "65" -description: "A grimy harralander leaf. It needs to be cleaned before it can be used." -value: 12 -stackable: false diff --git a/data/items/grimy_irit.yaml b/data/items/grimy_irit.yaml deleted file mode 100644 index 54f66f8..0000000 --- a/data/items/grimy_irit.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_irit -name: "grimy irit" -color: "65" -description: "A grimy irit leaf. It needs to be cleaned before it can be used." -value: 30 -stackable: false diff --git a/data/items/grimy_kwuarm.yaml b/data/items/grimy_kwuarm.yaml deleted file mode 100644 index 88630f8..0000000 --- a/data/items/grimy_kwuarm.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_kwuarm -name: "grimy kwuarm" -color: "65" -description: "A grimy kwuarm leaf. It needs to be cleaned before it can be used." -value: 40 -stackable: false diff --git a/data/items/grimy_lantadyme.yaml b/data/items/grimy_lantadyme.yaml deleted file mode 100644 index 8003931..0000000 --- a/data/items/grimy_lantadyme.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_lantadyme -name: "grimy lantadyme" -color: "65" -description: "A grimy lantadyme leaf. It needs to be cleaned before it can be used." -value: 60 -stackable: false diff --git a/data/items/grimy_marrentill.yaml b/data/items/grimy_marrentill.yaml deleted file mode 100644 index 7548fe5..0000000 --- a/data/items/grimy_marrentill.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_marrentill -name: "grimy marrentill" -color: "65" -description: "A grimy marrentill leaf. It needs to be cleaned before it can be used." -value: 4 -stackable: false diff --git a/data/items/grimy_ranarr.yaml b/data/items/grimy_ranarr.yaml deleted file mode 100644 index 1f82277..0000000 --- a/data/items/grimy_ranarr.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_ranarr -name: "grimy ranarr" -color: "65" -description: "A grimy ranarr leaf. It needs to be cleaned before it can be used." -value: 25 -stackable: false diff --git a/data/items/grimy_snapdragon.yaml b/data/items/grimy_snapdragon.yaml deleted file mode 100644 index f15c604..0000000 --- a/data/items/grimy_snapdragon.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_snapdragon -name: "grimy snapdragon" -color: "65" -description: "A grimy snapdragon leaf. It needs to be cleaned before it can be used." -value: 50 -stackable: false diff --git a/data/items/grimy_tarromin.yaml b/data/items/grimy_tarromin.yaml deleted file mode 100644 index 712061c..0000000 --- a/data/items/grimy_tarromin.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_tarromin -name: "grimy tarromin" -color: "65" -description: "A grimy tarromin leaf. It needs to be cleaned before it can be used." -value: 7 -stackable: false diff --git a/data/items/grimy_toadflax.yaml b/data/items/grimy_toadflax.yaml deleted file mode 100644 index c489566..0000000 --- a/data/items/grimy_toadflax.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_toadflax -name: "grimy toadflax" -color: "65" -description: "A grimy toadflax leaf. It needs to be cleaned before it can be used." -value: 18 -stackable: false diff --git a/data/items/grimy_torstol.yaml b/data/items/grimy_torstol.yaml deleted file mode 100644 index 47db8d7..0000000 --- a/data/items/grimy_torstol.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: grimy_torstol -name: "grimy torstol" -color: "65" -description: "A grimy torstol leaf. It needs to be cleaned before it can be used." -value: 75 -stackable: false diff --git a/data/items/guam.yaml b/data/items/guam.yaml deleted file mode 100644 index 8fe7972..0000000 --- a/data/items/guam.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: guam -name: "guam" -color: "48" -description: "A clean guam leaf, ready for use in pharmacy." -value: 3 -stackable: true diff --git a/data/items/guam_potion_unf.yaml b/data/items/guam_potion_unf.yaml deleted file mode 100644 index 970a9d2..0000000 --- a/data/items/guam_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: guam_potion_unf -name: "guam potion (unf)" -color: "48" -description: "An unfinished potion with guam floating in water." -value: 5 -stackable: false -made_from: - - items: [guam] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/guam_seed.yaml b/data/items/guam_seed.yaml deleted file mode 100644 index b55e1a8..0000000 --- a/data/items/guam_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: guam_seed -name: guam seed -color: "34" -description: "A guam seed for planting in a herb patch." -value: 1 -stackable: true -farm_patch_type: herb -farm_level: 9 -farm_plant_xp: 11 -farm_harvest_xp: 13 -farm_stages: 4 -farm_product: guam -farm_min_yield: 3 -farm_max_yield: 12 diff --git a/data/items/hammer.yaml b/data/items/hammer.yaml deleted file mode 100644 index 74302a4..0000000 --- a/data/items/hammer.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: hammer -name: hammer -color: "250" -description: "A sturdy hammer for smithing metal on an anvil." -value: 10 -stackable: false -tool_type: hammer diff --git a/data/items/hard_leather.yaml b/data/items/hard_leather.yaml deleted file mode 100644 index e04030c..0000000 --- a/data/items/hard_leather.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: hard_leather -name: hard leather -color: "94" -description: "A piece of hardened leather, suitable for sturdy armour." -value: 55 -stackable: false diff --git a/data/items/hard_leather_body.yaml b/data/items/hard_leather_body.yaml deleted file mode 100644 index a5fe30f..0000000 --- a/data/items/hard_leather_body.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: hard_leather_body -name: hard leather body -color: "94" -description: "A hardened leather body armour." -value: 60 -equip_slot: torso -stats: - stab_defense: 8 - slash_defense: 12 - crush_defense: 8 - science_defense: 6 - ranged_defense: 14 -requirements: - defense: 10 diff --git a/data/items/hard_leather_shield.yaml b/data/items/hard_leather_shield.yaml deleted file mode 100644 index fd7dabf..0000000 --- a/data/items/hard_leather_shield.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: hard_leather_shield -name: hard leather shield -color: "94" -description: "A shield made of hardened leather." -value: 55 -equip_slot: off_hand -stats: - stab_defense: 5 - slash_defense: 7 - crush_defense: 5 - science_defense: 4 - ranged_defense: 8 -requirements: - defense: 10 diff --git a/data/items/harpoon.yaml b/data/items/harpoon.yaml deleted file mode 100644 index 1412d5c..0000000 --- a/data/items/harpoon.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: harpoon -name: harpoon -color: "250" -description: "A barbed harpoon for spearing large fish." -value: 30 -stackable: false -equip_slot: main_hand -weapon_type: melee -stats: - attack_bonus: 0 - strength_bonus: 0 - defense_bonus: 0 -speed: 5 -tool_type: harpoon -tool_speed: 0 diff --git a/data/items/harralander.yaml b/data/items/harralander.yaml deleted file mode 100644 index 08e66ed..0000000 --- a/data/items/harralander.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: harralander -name: "harralander" -color: "48" -description: "A clean harralander leaf, ready for use in pharmacy." -value: 16 -stackable: true diff --git a/data/items/harralander_potion_unf.yaml b/data/items/harralander_potion_unf.yaml deleted file mode 100644 index bd578c2..0000000 --- a/data/items/harralander_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: harralander_potion_unf -name: "harralander potion (unf)" -color: "48" -description: "An unfinished potion with harralander floating in water." -value: 18 -stackable: false -made_from: - - items: [harralander] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/harralander_seed.yaml b/data/items/harralander_seed.yaml deleted file mode 100644 index 5be3571..0000000 --- a/data/items/harralander_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: harralander_seed -name: harralander seed -color: "70" -description: "A harralander seed for planting in a herb patch." -value: 5 -stackable: true -farm_patch_type: herb -farm_level: 26 -farm_plant_xp: 22 -farm_harvest_xp: 24 -farm_stages: 4 -farm_product: harralander -farm_min_yield: 3 -farm_max_yield: 12 diff --git a/data/items/headless_arrow.yaml b/data/items/headless_arrow.yaml deleted file mode 100644 index acf1384..0000000 --- a/data/items/headless_arrow.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: headless_arrow -name: headless arrow -color: "137" -description: "An arrow shaft with feathers attached. Needs a head." -value: 1 -stackable: true diff --git a/data/items/herring.yaml b/data/items/herring.yaml deleted file mode 100644 index adbbd95..0000000 --- a/data/items/herring.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: herring -name: herring -color: "209" -description: "A nicely cooked herring." -value: 7 -stackable: false -heal_value: 5 -eat_message: "You eat the herring." diff --git a/data/items/hydro_deck.yaml b/data/items/hydro_deck.yaml deleted file mode 100644 index 0e417a2..0000000 --- a/data/items/hydro_deck.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: hydro_deck -name: hydro deck -color: "39" -description: "A programmable deck infused with hydro circuitry. Provides unlimited hydrojunk and removes the scrap requirement." -value: 1500 -equip_slot: main_hand -weapon_type: science -speed: 5 -stats: - science_attack: 10 -provides_junk: hydrojunk diff --git a/data/items/hydro_identifier.yaml b/data/items/hydro_identifier.yaml deleted file mode 100644 index 3eb7d98..0000000 --- a/data/items/hydro_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: hydro_identifier -name: hydro identifier -color: "39" -description: "A handheld scanner calibrated to isolate hydro-frequency signatures in scrap metal. Required to produce hydrojunk at a hydro altar." -value: 1000 diff --git a/data/items/hydrojunk.yaml b/data/items/hydrojunk.yaml deleted file mode 100644 index bfcd64a..0000000 --- a/data/items/hydrojunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: hydrojunk -name: hydrojunk -color: "39" -description: "A fragment of reclaimed hydro circuitry. Used as a universal energy medium." -value: 18 -stackable: true diff --git a/data/items/inoculation_bracelet.yaml b/data/items/inoculation_bracelet.yaml deleted file mode 100644 index 9a3a149..0000000 --- a/data/items/inoculation_bracelet.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: inoculation_bracelet -name: inoculation bracelet -color: "196" -description: "An enchanted ruby bracelet that provides resistance to poison." -value: 2500 -equip_slot: hands diff --git a/data/items/insulated_gloves.yaml b/data/items/insulated_gloves.yaml deleted file mode 100644 index 3e53614..0000000 --- a/data/items/insulated_gloves.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: insulated_gloves -name: insulated gloves -color: "214" -description: "Heavy rubber gloves that protect against electrical attacks. Essential when fighting drones." -value: 50 -stackable: false -equip_slot: hands -stats: - defense_bonus: 1 diff --git a/data/items/irit.yaml b/data/items/irit.yaml deleted file mode 100644 index 40f1956..0000000 --- a/data/items/irit.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: irit -name: "irit" -color: "48" -description: "A clean irit leaf, ready for use in pharmacy." -value: 40 -stackable: true diff --git a/data/items/irit_potion_unf.yaml b/data/items/irit_potion_unf.yaml deleted file mode 100644 index d10a19a..0000000 --- a/data/items/irit_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: irit_potion_unf -name: "irit potion (unf)" -color: "48" -description: "An unfinished potion with irit floating in water." -value: 42 -stackable: false -made_from: - - items: [irit] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/irit_seed.yaml b/data/items/irit_seed.yaml deleted file mode 100644 index 4b8bad2..0000000 --- a/data/items/irit_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: irit_seed -name: irit seed -color: "114" -description: "An irit seed for planting in a herb patch." -value: 40 -stackable: true -farm_patch_type: herb -farm_level: 44 -farm_plant_xp: 43 -farm_harvest_xp: 49 -farm_stages: 4 -farm_product: irit -farm_min_yield: 3 -farm_max_yield: 10 diff --git a/data/items/iron_arrow.yaml b/data/items/iron_arrow.yaml deleted file mode 100644 index ebadaec..0000000 --- a/data/items/iron_arrow.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: iron_arrow -name: iron arrow -color: "250" -description: "An iron-tipped arrow." -value: 2 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 10 diff --git a/data/items/iron_arrowtips.yaml b/data/items/iron_arrowtips.yaml deleted file mode 100644 index 54ffd11..0000000 --- a/data/items/iron_arrowtips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: iron_arrowtips -name: iron arrowtips -color: "250" -description: "A set of iron arrowtips." -value: 2 -stackable: true diff --git a/data/items/iron_axe.yaml b/data/items/iron_axe.yaml deleted file mode 100644 index 3f989ca..0000000 --- a/data/items/iron_axe.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: iron_axe -name: iron axe -color: "250" -description: "A sturdy iron axe, good for woodcutting." -value: 25 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: -2 - slash_attack: 10 - crush_attack: 7 - strength_bonus: 8 -speed: 5 -tool_type: axe -tool_speed: 3.5 diff --git a/data/items/iron_bar.yaml b/data/items/iron_bar.yaml deleted file mode 100644 index 26c8352..0000000 --- a/data/items/iron_bar.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: iron_bar -name: iron bar -color: "250" -description: "A bar of iron metal." -value: 12 -stackable: false diff --git a/data/items/iron_bolts.yaml b/data/items/iron_bolts.yaml deleted file mode 100644 index ed81578..0000000 --- a/data/items/iron_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: iron_bolts -name: iron bolts -color: "250" -description: "Iron crossbow bolts." -value: 3 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 17 diff --git a/data/items/iron_bolts_unf.yaml b/data/items/iron_bolts_unf.yaml deleted file mode 100644 index 0a51ca0..0000000 --- a/data/items/iron_bolts_unf.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: iron_bolts_unf -name: iron bolts (unf) -color: "250" -description: "Unfinished iron crossbow bolts." -value: 2 -stackable: true diff --git a/data/items/iron_dagger.yaml b/data/items/iron_dagger.yaml deleted file mode 100644 index 8fa645c..0000000 --- a/data/items/iron_dagger.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: iron_dagger -name: iron dagger -color: "250" -description: "A small iron dagger." -value: 20 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 8 - slash_attack: 5 - crush_attack: -1 - strength_bonus: 7 -speed: 3 diff --git a/data/items/iron_full_helm.yaml b/data/items/iron_full_helm.yaml deleted file mode 100644 index 3a2fc0c..0000000 --- a/data/items/iron_full_helm.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: iron_full_helm -name: iron full helm -color: "250" -description: "An iron full helmet." -value: 50 -stackable: false -equip_slot: head -stats: - stab_defense: 8 - slash_defense: 9 - crush_defense: 6 - science_defense: -3 - ranged_defense: 8 diff --git a/data/items/iron_med_helm.yaml b/data/items/iron_med_helm.yaml deleted file mode 100644 index 6956283..0000000 --- a/data/items/iron_med_helm.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: iron_med_helm -name: iron med helm -color: "250" -description: "An iron medium helmet." -value: 20 -stackable: false -equip_slot: head -stats: - stab_defense: 5 - slash_defense: 6 - crush_defense: 3 - science_defense: -1 - ranged_defense: 5 diff --git a/data/items/iron_nails.yaml b/data/items/iron_nails.yaml deleted file mode 100644 index 77323c9..0000000 --- a/data/items/iron_nails.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: iron_nails -name: iron nails -color: "250" -description: "A set of iron nails." -value: 2 -stackable: true diff --git a/data/items/iron_ore.yaml b/data/items/iron_ore.yaml deleted file mode 100644 index 78e82a5..0000000 --- a/data/items/iron_ore.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: iron_ore -name: iron ore -color: "250" -description: "A chunk of iron ore, ready for smelting." -value: 5 -stackable: false diff --git a/data/items/iron_pickaxe.yaml b/data/items/iron_pickaxe.yaml deleted file mode 100644 index d120fde..0000000 --- a/data/items/iron_pickaxe.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: iron_pickaxe -name: iron pickaxe -color: "250" -description: "A sturdy iron pickaxe, good for mining." -value: 25 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 7 - slash_attack: -2 - crush_attack: 3 - strength_bonus: 5 -speed: 5 -tool_type: pickaxe -tool_speed: 1.5 diff --git a/data/items/iron_platebody.yaml b/data/items/iron_platebody.yaml deleted file mode 100644 index 3c0be80..0000000 --- a/data/items/iron_platebody.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: iron_platebody -name: iron platebody -color: "250" -description: "An iron platebody." -value: 150 -stackable: false -equip_slot: torso -stats: - stab_defense: 18 - slash_defense: 22 - crush_defense: 14 - science_defense: -10 - ranged_defense: 18 diff --git a/data/items/iron_sword.yaml b/data/items/iron_sword.yaml deleted file mode 100644 index a5711fc..0000000 --- a/data/items/iron_sword.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: iron_sword -name: iron sword -color: "250" -description: "An iron sword." -value: 30 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: 7 - slash_attack: 15 - crush_attack: -2 - strength_bonus: 10 -speed: 4 diff --git a/data/items/jug_of_water.yaml b/data/items/jug_of_water.yaml deleted file mode 100644 index 04d3b8f..0000000 --- a/data/items/jug_of_water.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: jug_of_water -name: jug of water -color: "81" -description: "A ceramic jug filled with fresh water." -value: 5 -stackable: false diff --git a/data/items/knife.yaml b/data/items/knife.yaml deleted file mode 100644 index fddf120..0000000 --- a/data/items/knife.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: knife -name: knife -color: "250" -description: "A small knife used for cutting wood and fletching." -value: 5 -tool_type: knife diff --git a/data/items/kwuarm.yaml b/data/items/kwuarm.yaml deleted file mode 100644 index ab0d7ff..0000000 --- a/data/items/kwuarm.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: kwuarm -name: "kwuarm" -color: "48" -description: "A clean kwuarm leaf, ready for use in pharmacy." -value: 54 -stackable: true diff --git a/data/items/kwuarm_potion_unf.yaml b/data/items/kwuarm_potion_unf.yaml deleted file mode 100644 index 750a47a..0000000 --- a/data/items/kwuarm_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: kwuarm_potion_unf -name: "kwuarm potion (unf)" -color: "48" -description: "An unfinished potion with kwuarm floating in water." -value: 56 -stackable: false -made_from: - - items: [kwuarm] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/kwuarm_seed.yaml b/data/items/kwuarm_seed.yaml deleted file mode 100644 index 053c2f3..0000000 --- a/data/items/kwuarm_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: kwuarm_seed -name: kwuarm seed -color: "178" -description: "A kwuarm seed for planting in a herb patch." -value: 80 -stackable: true -farm_patch_type: herb -farm_level: 56 -farm_plant_xp: 69 -farm_harvest_xp: 78 -farm_stages: 4 -farm_product: kwuarm -farm_min_yield: 3 -farm_max_yield: 9 diff --git a/data/items/lantadyme.yaml b/data/items/lantadyme.yaml deleted file mode 100644 index d38b7da..0000000 --- a/data/items/lantadyme.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: lantadyme -name: "lantadyme" -color: "48" -description: "A clean lantadyme leaf, ready for use in pharmacy." -value: 78 -stackable: true diff --git a/data/items/lantadyme_potion_unf.yaml b/data/items/lantadyme_potion_unf.yaml deleted file mode 100644 index bc66c3c..0000000 --- a/data/items/lantadyme_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: lantadyme_potion_unf -name: "lantadyme potion (unf)" -color: "48" -description: "An unfinished potion with lantadyme floating in water." -value: 80 -stackable: false -made_from: - - items: [lantadyme] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/lantadyme_seed.yaml b/data/items/lantadyme_seed.yaml deleted file mode 100644 index f4be89c..0000000 --- a/data/items/lantadyme_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: lantadyme_seed -name: lantadyme seed -color: "36" -description: "A lantadyme seed for planting in a herb patch." -value: 130 -stackable: true -farm_patch_type: herb -farm_level: 73 -farm_plant_xp: 105 -farm_harvest_xp: 135 -farm_stages: 4 -farm_product: lantadyme -farm_min_yield: 3 -farm_max_yield: 8 diff --git a/data/items/law_identifier.yaml b/data/items/law_identifier.yaml deleted file mode 100644 index 25700e1..0000000 --- a/data/items/law_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: law_identifier -name: law identifier -color: "27" -description: "A handheld scanner calibrated to isolate law-frequency signatures in scrap metal. Required to produce lawjunk at a law altar." -value: 10000 diff --git a/data/items/lawjunk.yaml b/data/items/lawjunk.yaml deleted file mode 100644 index b46bf9e..0000000 --- a/data/items/lawjunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: lawjunk -name: lawjunk -color: "27" -description: "A fragment of reclaimed law circuitry. Used as a universal energy medium." -value: 60 -stackable: true diff --git a/data/items/leather.yaml b/data/items/leather.yaml deleted file mode 100644 index 82d0696..0000000 --- a/data/items/leather.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: leather -name: leather -color: "130" -description: "A piece of tanned leather, ready for crafting." -value: 15 -stackable: false diff --git a/data/items/leather_body.yaml b/data/items/leather_body.yaml deleted file mode 100644 index e69342c..0000000 --- a/data/items/leather_body.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: leather_body -name: leather body -color: "130" -description: "A leather body armour." -value: 25 -equip_slot: torso -stats: - stab_defense: 4 - slash_defense: 7 - crush_defense: 5 - science_defense: 4 - ranged_defense: 10 diff --git a/data/items/leather_boots.yaml b/data/items/leather_boots.yaml deleted file mode 100644 index 7716e95..0000000 --- a/data/items/leather_boots.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: leather_boots -name: leather boots -color: "130" -description: "A pair of leather boots." -value: 12 -equip_slot: feet -stats: - stab_defense: 1 - slash_defense: 1 - crush_defense: 1 - science_defense: 1 - ranged_defense: 2 diff --git a/data/items/leather_chaps.yaml b/data/items/leather_chaps.yaml deleted file mode 100644 index 1a17c16..0000000 --- a/data/items/leather_chaps.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: leather_chaps -name: leather chaps -color: "130" -description: "A pair of leather chaps." -value: 20 -equip_slot: legs -stats: - stab_defense: 2 - slash_defense: 4 - crush_defense: 3 - science_defense: 3 - ranged_defense: 6 diff --git a/data/items/leather_cowl.yaml b/data/items/leather_cowl.yaml deleted file mode 100644 index aa5965a..0000000 --- a/data/items/leather_cowl.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: leather_cowl -name: leather cowl -color: "130" -description: "A leather cowl." -value: 15 -equip_slot: head -stats: - stab_defense: 1 - slash_defense: 2 - crush_defense: 1 - science_defense: 2 - ranged_defense: 4 diff --git a/data/items/leather_gloves.yaml b/data/items/leather_gloves.yaml deleted file mode 100644 index 7590fee..0000000 --- a/data/items/leather_gloves.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: leather_gloves -name: leather gloves -color: "130" -description: "A pair of leather gloves." -value: 10 -equip_slot: hands -stats: - stab_defense: 1 - slash_defense: 1 - crush_defense: 1 - science_defense: 1 - ranged_defense: 2 diff --git a/data/items/leather_vambraces.yaml b/data/items/leather_vambraces.yaml deleted file mode 100644 index fa59aa9..0000000 --- a/data/items/leather_vambraces.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: leather_vambraces -name: leather vambraces -color: "130" -description: "A pair of leather vambraces." -value: 18 -equip_slot: hands -stats: - stab_defense: 2 - slash_defense: 2 - crush_defense: 2 - science_defense: 2 - ranged_defense: 4 - ranged_attack: 4 diff --git a/data/items/lighter.yaml b/data/items/lighter.yaml deleted file mode 100644 index 567f42e..0000000 --- a/data/items/lighter.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: lighter -name: lighter -color: "81" -description: "A reliable butane lighter." -value: 15 -stackable: false -equip_slot: main_hand -tool_type: fire -tool_speed: 4 -quality: 100 -max_quality: 100 diff --git a/data/items/limpwurt_root.yaml b/data/items/limpwurt_root.yaml deleted file mode 100644 index 49dd0dc..0000000 --- a/data/items/limpwurt_root.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: limpwurt_root -name: "limpwurt root" -color: "130" -description: "A thick, gnarled root with natural stimulant properties." -value: 8 -stackable: false diff --git a/data/items/lobster_pot.yaml b/data/items/lobster_pot.yaml deleted file mode 100644 index 79771c1..0000000 --- a/data/items/lobster_pot.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: lobster_pot -name: lobster pot -color: "250" -description: "A wire cage for trapping lobsters." -value: 20 -stackable: false -equip_slot: main_hand -weapon_type: melee -stats: - attack_bonus: 0 - strength_bonus: 0 - defense_bonus: 0 -speed: 5 -tool_type: lobster_pot -tool_speed: 0 diff --git a/data/items/logs.yaml b/data/items/logs.yaml deleted file mode 100644 index 1395d94..0000000 --- a/data/items/logs.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: logs -name: logs -color: "107" -description: "Some regular logs, good for firemaking and fletching." -value: 2 -stackable: false -fire_level: 1 -fire_xp: 40 -burn_ticks: 24 diff --git a/data/items/longbow.yaml b/data/items/longbow.yaml deleted file mode 100644 index f40c96d..0000000 --- a/data/items/longbow.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: longbow -name: longbow -color: "137" -description: "A longbow." -value: 20 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 6 -stats: - ranged_attack: 8 diff --git a/data/items/longbow_u.yaml b/data/items/longbow_u.yaml deleted file mode 100644 index 93e5ff0..0000000 --- a/data/items/longbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: longbow_u -name: longbow (u) -color: "137" -description: "An unstrung longbow." -value: 10 diff --git a/data/items/magic_logs.yaml b/data/items/magic_logs.yaml deleted file mode 100644 index 01a804e..0000000 --- a/data/items/magic_logs.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: magic_logs -name: magic logs -color: "135" -description: "Some mystical magic logs." -value: 80 -stackable: false -fire_level: 75 -fire_xp: 303 -burn_ticks: 52 diff --git a/data/items/magic_longbow.yaml b/data/items/magic_longbow.yaml deleted file mode 100644 index 07797fb..0000000 --- a/data/items/magic_longbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: magic_longbow -name: magic longbow -color: "63" -description: "A magic longbow." -value: 6000 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 6 -stats: - ranged_attack: 69 -requirements: - ranged: 50 diff --git a/data/items/magic_longbow_u.yaml b/data/items/magic_longbow_u.yaml deleted file mode 100644 index 65682ed..0000000 --- a/data/items/magic_longbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: magic_longbow_u -name: magic longbow (u) -color: "63" -description: "An unstrung magic longbow." -value: 3000 diff --git a/data/items/magic_shortbow.yaml b/data/items/magic_shortbow.yaml deleted file mode 100644 index 893b287..0000000 --- a/data/items/magic_shortbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: magic_shortbow -name: magic shortbow -color: "63" -description: "A magic shortbow." -value: 4000 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 4 -stats: - ranged_attack: 69 -requirements: - ranged: 50 diff --git a/data/items/magic_shortbow_u.yaml b/data/items/magic_shortbow_u.yaml deleted file mode 100644 index 2075bd1..0000000 --- a/data/items/magic_shortbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: magic_shortbow_u -name: magic shortbow (u) -color: "63" -description: "An unstrung magic shortbow." -value: 2000 diff --git a/data/items/mahogany_logs.yaml b/data/items/mahogany_logs.yaml deleted file mode 100644 index 67b9a6c..0000000 --- a/data/items/mahogany_logs.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: mahogany_logs -name: mahogany logs -color: "131" -description: "Some rich mahogany logs." -value: 20 -stackable: false -fire_level: 50 -fire_xp: 158 -burn_ticks: 44 diff --git a/data/items/mahogany_planks.yaml b/data/items/mahogany_planks.yaml deleted file mode 100644 index d551321..0000000 --- a/data/items/mahogany_planks.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: mahogany_planks -name: mahogany planks -color: "96" -description: "Luxurious mahogany planks with a deep reddish hue." -value: 120 -stackable: false diff --git a/data/items/mahogany_table.yaml b/data/items/mahogany_table.yaml deleted file mode 100644 index 245b929..0000000 --- a/data/items/mahogany_table.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: mahogany_table -name: mahogany table -color: "96" -description: "A luxurious mahogany table, the centerpiece of any room." -value: 240 -stackable: false diff --git a/data/items/maple_logs.yaml b/data/items/maple_logs.yaml deleted file mode 100644 index 6b081e1..0000000 --- a/data/items/maple_logs.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: maple_logs -name: maple logs -color: "173" -description: "Some smooth maple logs." -value: 16 -stackable: false -fire_level: 45 -fire_xp: 135 -burn_ticks: 40 diff --git a/data/items/maple_longbow.yaml b/data/items/maple_longbow.yaml deleted file mode 100644 index 1c86128..0000000 --- a/data/items/maple_longbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: maple_longbow -name: maple longbow -color: "172" -description: "A maple longbow." -value: 1280 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 6 -stats: - ranged_attack: 29 -requirements: - ranged: 30 diff --git a/data/items/maple_longbow_u.yaml b/data/items/maple_longbow_u.yaml deleted file mode 100644 index 120bf1d..0000000 --- a/data/items/maple_longbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: maple_longbow_u -name: maple longbow (u) -color: "172" -description: "An unstrung maple longbow." -value: 640 diff --git a/data/items/maple_shortbow.yaml b/data/items/maple_shortbow.yaml deleted file mode 100644 index 38c27b5..0000000 --- a/data/items/maple_shortbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: maple_shortbow -name: maple shortbow -color: "172" -description: "A maple shortbow." -value: 640 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 4 -stats: - ranged_attack: 29 -requirements: - ranged: 30 diff --git a/data/items/maple_shortbow_u.yaml b/data/items/maple_shortbow_u.yaml deleted file mode 100644 index 6fc6b84..0000000 --- a/data/items/maple_shortbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: maple_shortbow_u -name: maple shortbow (u) -color: "172" -description: "An unstrung maple shortbow." -value: 320 diff --git a/data/items/marrentill.yaml b/data/items/marrentill.yaml deleted file mode 100644 index 4bd492d..0000000 --- a/data/items/marrentill.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: marrentill -name: "marrentill" -color: "48" -description: "A clean marrentill leaf, ready for use in pharmacy." -value: 6 -stackable: true diff --git a/data/items/marrentill_potion_unf.yaml b/data/items/marrentill_potion_unf.yaml deleted file mode 100644 index e7b3817..0000000 --- a/data/items/marrentill_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: marrentill_potion_unf -name: "marrentill potion (unf)" -color: "48" -description: "An unfinished potion with marrentill floating in water." -value: 8 -stackable: false -made_from: - - items: [marrentill] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/marrentill_seed.yaml b/data/items/marrentill_seed.yaml deleted file mode 100644 index 4b42353..0000000 --- a/data/items/marrentill_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: marrentill_seed -name: marrentill seed -color: "34" -description: "A marrentill seed for planting in a herb patch." -value: 2 -stackable: true -farm_patch_type: herb -farm_level: 14 -farm_plant_xp: 14 -farm_harvest_xp: 15 -farm_stages: 4 -farm_product: marrentill -farm_min_yield: 3 -farm_max_yield: 12 diff --git a/data/items/matches.yaml b/data/items/matches.yaml deleted file mode 100644 index d816cbc..0000000 --- a/data/items/matches.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: matches -name: matches -color: "196" -description: "A small box of matches for starting fires." -value: 5 -stackable: true -equip_slot: main_hand -tool_type: fire -tool_speed: 4 diff --git a/data/items/materials/adamant_nails.yaml b/data/items/materials/adamant_nails.yaml new file mode 100644 index 0000000..c40d228 --- /dev/null +++ b/data/items/materials/adamant_nails.yaml @@ -0,0 +1,6 @@ +id: adamant_nails +name: adamant nails +color: "120" +description: "A set of adamant nails." +value: 16 +stackable: true diff --git a/data/items/materials/adamantite_bar.yaml b/data/items/materials/adamantite_bar.yaml new file mode 100644 index 0000000..5a9b827 --- /dev/null +++ b/data/items/materials/adamantite_bar.yaml @@ -0,0 +1,6 @@ +id: adamantite_bar +name: adamantite bar +color: "71" +description: "A bar of adamantite metal, extremely durable." +value: 200 +stackable: false diff --git a/data/items/materials/adamantite_ore.yaml b/data/items/materials/adamantite_ore.yaml new file mode 100644 index 0000000..fabe0da --- /dev/null +++ b/data/items/materials/adamantite_ore.yaml @@ -0,0 +1,6 @@ +id: adamantite_ore +name: adamantite ore +color: "120" +description: "A chunk of dark green adamantite ore." +value: 100 +stackable: false diff --git a/data/items/materials/arachnid_enzyme.yaml b/data/items/materials/arachnid_enzyme.yaml new file mode 100644 index 0000000..4be2f65 --- /dev/null +++ b/data/items/materials/arachnid_enzyme.yaml @@ -0,0 +1,6 @@ +id: arachnid_enzyme +name: "arachnid enzyme" +color: "196" +description: "A viscous red enzyme harvested from spider egg sacs. Potent catalytic agent." +value: 12 +stackable: false diff --git a/data/items/materials/ashes.yaml b/data/items/materials/ashes.yaml new file mode 100644 index 0000000..0b83f77 --- /dev/null +++ b/data/items/materials/ashes.yaml @@ -0,0 +1,6 @@ +id: ashes +name: ashes +color: "243" +description: "A pile of cold ashes. What was once ablaze is now mere dust." +value: 1 +stackable: false diff --git a/data/items/materials/avantoe.yaml b/data/items/materials/avantoe.yaml new file mode 100644 index 0000000..d596096 --- /dev/null +++ b/data/items/materials/avantoe.yaml @@ -0,0 +1,6 @@ +id: avantoe +name: "avantoe" +color: "48" +description: "A clean avantoe leaf, ready for use in pharmacy." +value: 48 +stackable: true diff --git a/data/items/materials/ball_of_wool.yaml b/data/items/materials/ball_of_wool.yaml new file mode 100644 index 0000000..1a680a4 --- /dev/null +++ b/data/items/materials/ball_of_wool.yaml @@ -0,0 +1,6 @@ +id: ball_of_wool +name: ball of wool +color: "255" +description: "A ball of spun wool." +value: 5 +stackable: false diff --git a/data/items/materials/bones.yaml b/data/items/materials/bones.yaml new file mode 100644 index 0000000..25097d3 --- /dev/null +++ b/data/items/materials/bones.yaml @@ -0,0 +1,6 @@ +id: bones +name: bones +color: "253" +description: "A pile of bones." +value: 2 +stackable: false diff --git a/data/items/materials/bowstring.yaml b/data/items/materials/bowstring.yaml new file mode 100644 index 0000000..a180081 --- /dev/null +++ b/data/items/materials/bowstring.yaml @@ -0,0 +1,5 @@ +id: bowstring +name: bowstring +color: "230" +description: "A string used for stringing bows." +value: 10 diff --git a/data/items/materials/bronze_bar.yaml b/data/items/materials/bronze_bar.yaml new file mode 100644 index 0000000..053cfe8 --- /dev/null +++ b/data/items/materials/bronze_bar.yaml @@ -0,0 +1,6 @@ +id: bronze_bar +name: bronze bar +color: "178" +description: "A bar of bronze metal, smelted from copper and tin ore." +value: 4 +stackable: false diff --git a/data/items/materials/bronze_nails.yaml b/data/items/materials/bronze_nails.yaml new file mode 100644 index 0000000..513e9c4 --- /dev/null +++ b/data/items/materials/bronze_nails.yaml @@ -0,0 +1,6 @@ +id: bronze_nails +name: bronze nails +color: "178" +description: "A set of bronze nails." +value: 1 +stackable: true diff --git a/data/items/materials/cadantine.yaml b/data/items/materials/cadantine.yaml new file mode 100644 index 0000000..f684f0d --- /dev/null +++ b/data/items/materials/cadantine.yaml @@ -0,0 +1,6 @@ +id: cadantine +name: "cadantine" +color: "48" +description: "A clean cadantine leaf, ready for use in pharmacy." +value: 70 +stackable: true diff --git a/data/items/materials/chocolate_dust.yaml b/data/items/materials/chocolate_dust.yaml new file mode 100644 index 0000000..56a6666 --- /dev/null +++ b/data/items/materials/chocolate_dust.yaml @@ -0,0 +1,6 @@ +id: chocolate_dust +name: "chocolate dust" +color: "94" +description: "Finely ground chocolate. A surprisingly effective pharmaceutical binding agent." +value: 5 +stackable: false diff --git a/data/items/materials/clay.yaml b/data/items/materials/clay.yaml new file mode 100644 index 0000000..55c9b2b --- /dev/null +++ b/data/items/materials/clay.yaml @@ -0,0 +1,6 @@ +id: clay +name: clay +color: "173" +description: "Some soft clay, useful for crafting and pottery." +value: 1 +stackable: false diff --git a/data/items/materials/coal.yaml b/data/items/materials/coal.yaml new file mode 100644 index 0000000..7b79f08 --- /dev/null +++ b/data/items/materials/coal.yaml @@ -0,0 +1,6 @@ +id: coal +name: coal +color: "240" +description: "A lump of coal, useful for smelting." +value: 5 +stackable: false diff --git a/data/items/materials/copper_ore.yaml b/data/items/materials/copper_ore.yaml new file mode 100644 index 0000000..392879a --- /dev/null +++ b/data/items/materials/copper_ore.yaml @@ -0,0 +1,6 @@ +id: copper_ore +name: copper ore +color: "178" +description: "A chunk of copper-bearing rock. Can be smelted into a bronze bar." +value: 1 +stackable: false diff --git a/data/items/materials/cowhide.yaml b/data/items/materials/cowhide.yaml new file mode 100644 index 0000000..2cb192e --- /dev/null +++ b/data/items/materials/cowhide.yaml @@ -0,0 +1,6 @@ +id: cowhide +name: cowhide +color: "130" +description: "A fresh cowhide. A tanner can turn this into leather." +value: 5 +stackable: false diff --git a/data/items/materials/crushed_nest.yaml b/data/items/materials/crushed_nest.yaml new file mode 100644 index 0000000..533d942 --- /dev/null +++ b/data/items/materials/crushed_nest.yaml @@ -0,0 +1,6 @@ +id: crushed_nest +name: "crushed nest" +color: "94" +description: "Finely crushed bird's nest material. Contains trace minerals used in advanced pharmacy." +value: 25 +stackable: false diff --git a/data/items/materials/diamond.yaml b/data/items/materials/diamond.yaml new file mode 100644 index 0000000..2ec703f --- /dev/null +++ b/data/items/materials/diamond.yaml @@ -0,0 +1,6 @@ +id: diamond +name: diamond +color: "255" +description: "A beautifully cut diamond." +value: 400 +stackable: false diff --git a/data/items/materials/dwarf_weed.yaml b/data/items/materials/dwarf_weed.yaml new file mode 100644 index 0000000..559edf3 --- /dev/null +++ b/data/items/materials/dwarf_weed.yaml @@ -0,0 +1,6 @@ +id: dwarf_weed +name: "dwarf weed" +color: "48" +description: "A clean dwarf weed leaf, ready for use in pharmacy." +value: 85 +stackable: true diff --git a/data/items/materials/ectoplasm.yaml b/data/items/materials/ectoplasm.yaml new file mode 100644 index 0000000..8417e2d --- /dev/null +++ b/data/items/materials/ectoplasm.yaml @@ -0,0 +1,6 @@ +id: ectoplasm +name: ectoplasm +color: "159" +description: "A shimmering residue left behind by a destroyed phantom." +value: 75 +stackable: false diff --git a/data/items/materials/emerald.yaml b/data/items/materials/emerald.yaml new file mode 100644 index 0000000..9a0c71d --- /dev/null +++ b/data/items/materials/emerald.yaml @@ -0,0 +1,6 @@ +id: emerald +name: emerald +color: "83" +description: "A beautifully cut emerald." +value: 100 +stackable: false diff --git a/data/items/materials/eye_of_newt.yaml b/data/items/materials/eye_of_newt.yaml new file mode 100644 index 0000000..baf5ebe --- /dev/null +++ b/data/items/materials/eye_of_newt.yaml @@ -0,0 +1,6 @@ +id: eye_of_newt +name: "eye of newt" +color: "215" +description: "A preserved eye of newt, suspended in synthetic fluid. Used in pharmacy." +value: 3 +stackable: false diff --git a/data/items/materials/feather.yaml b/data/items/materials/feather.yaml new file mode 100644 index 0000000..25afc2a --- /dev/null +++ b/data/items/materials/feather.yaml @@ -0,0 +1,6 @@ +id: feather +name: feather +color: "230" +description: "A colorful feather. Used as fly fishing bait." +value: 1 +stackable: true diff --git a/data/items/materials/flax.yaml b/data/items/materials/flax.yaml new file mode 100644 index 0000000..36f7082 --- /dev/null +++ b/data/items/materials/flax.yaml @@ -0,0 +1,6 @@ +id: flax +name: flax +color: "113" +description: "A bundle of flax. Can be spun into a bowstring." +value: 5 +stackable: false diff --git a/data/items/materials/gold_bar.yaml b/data/items/materials/gold_bar.yaml new file mode 100644 index 0000000..3272b04 --- /dev/null +++ b/data/items/materials/gold_bar.yaml @@ -0,0 +1,6 @@ +id: gold_bar +name: gold bar +color: "220" +description: "A bar of gold metal." +value: 50 +stackable: false diff --git a/data/items/materials/gold_ore.yaml b/data/items/materials/gold_ore.yaml new file mode 100644 index 0000000..e45ca03 --- /dev/null +++ b/data/items/materials/gold_ore.yaml @@ -0,0 +1,6 @@ +id: gold_ore +name: gold ore +color: "220" +description: "A glittering chunk of gold ore." +value: 25 +stackable: false diff --git a/data/items/materials/grimy_avantoe.yaml b/data/items/materials/grimy_avantoe.yaml new file mode 100644 index 0000000..4f84679 --- /dev/null +++ b/data/items/materials/grimy_avantoe.yaml @@ -0,0 +1,6 @@ +id: grimy_avantoe +name: "grimy avantoe" +color: "65" +description: "A grimy avantoe leaf. It needs to be cleaned before it can be used." +value: 35 +stackable: false diff --git a/data/items/materials/grimy_cadantine.yaml b/data/items/materials/grimy_cadantine.yaml new file mode 100644 index 0000000..0eb88f8 --- /dev/null +++ b/data/items/materials/grimy_cadantine.yaml @@ -0,0 +1,6 @@ +id: grimy_cadantine +name: "grimy cadantine" +color: "65" +description: "A grimy cadantine leaf. It needs to be cleaned before it can be used." +value: 55 +stackable: false diff --git a/data/items/materials/grimy_dwarf_weed.yaml b/data/items/materials/grimy_dwarf_weed.yaml new file mode 100644 index 0000000..8f24595 --- /dev/null +++ b/data/items/materials/grimy_dwarf_weed.yaml @@ -0,0 +1,6 @@ +id: grimy_dwarf_weed +name: "grimy dwarf weed" +color: "65" +description: "A grimy dwarf weed leaf. It needs to be cleaned before it can be used." +value: 65 +stackable: false diff --git a/data/items/materials/grimy_guam.yaml b/data/items/materials/grimy_guam.yaml new file mode 100644 index 0000000..fb408af --- /dev/null +++ b/data/items/materials/grimy_guam.yaml @@ -0,0 +1,6 @@ +id: grimy_guam +name: "grimy guam" +color: "65" +description: "A grimy guam leaf. It needs to be cleaned before it can be used." +value: 2 +stackable: false diff --git a/data/items/materials/grimy_harralander.yaml b/data/items/materials/grimy_harralander.yaml new file mode 100644 index 0000000..deea973 --- /dev/null +++ b/data/items/materials/grimy_harralander.yaml @@ -0,0 +1,6 @@ +id: grimy_harralander +name: "grimy harralander" +color: "65" +description: "A grimy harralander leaf. It needs to be cleaned before it can be used." +value: 12 +stackable: false diff --git a/data/items/materials/grimy_irit.yaml b/data/items/materials/grimy_irit.yaml new file mode 100644 index 0000000..54f66f8 --- /dev/null +++ b/data/items/materials/grimy_irit.yaml @@ -0,0 +1,6 @@ +id: grimy_irit +name: "grimy irit" +color: "65" +description: "A grimy irit leaf. It needs to be cleaned before it can be used." +value: 30 +stackable: false diff --git a/data/items/materials/grimy_kwuarm.yaml b/data/items/materials/grimy_kwuarm.yaml new file mode 100644 index 0000000..88630f8 --- /dev/null +++ b/data/items/materials/grimy_kwuarm.yaml @@ -0,0 +1,6 @@ +id: grimy_kwuarm +name: "grimy kwuarm" +color: "65" +description: "A grimy kwuarm leaf. It needs to be cleaned before it can be used." +value: 40 +stackable: false diff --git a/data/items/materials/grimy_lantadyme.yaml b/data/items/materials/grimy_lantadyme.yaml new file mode 100644 index 0000000..8003931 --- /dev/null +++ b/data/items/materials/grimy_lantadyme.yaml @@ -0,0 +1,6 @@ +id: grimy_lantadyme +name: "grimy lantadyme" +color: "65" +description: "A grimy lantadyme leaf. It needs to be cleaned before it can be used." +value: 60 +stackable: false diff --git a/data/items/materials/grimy_marrentill.yaml b/data/items/materials/grimy_marrentill.yaml new file mode 100644 index 0000000..7548fe5 --- /dev/null +++ b/data/items/materials/grimy_marrentill.yaml @@ -0,0 +1,6 @@ +id: grimy_marrentill +name: "grimy marrentill" +color: "65" +description: "A grimy marrentill leaf. It needs to be cleaned before it can be used." +value: 4 +stackable: false diff --git a/data/items/materials/grimy_ranarr.yaml b/data/items/materials/grimy_ranarr.yaml new file mode 100644 index 0000000..1f82277 --- /dev/null +++ b/data/items/materials/grimy_ranarr.yaml @@ -0,0 +1,6 @@ +id: grimy_ranarr +name: "grimy ranarr" +color: "65" +description: "A grimy ranarr leaf. It needs to be cleaned before it can be used." +value: 25 +stackable: false diff --git a/data/items/materials/grimy_snapdragon.yaml b/data/items/materials/grimy_snapdragon.yaml new file mode 100644 index 0000000..f15c604 --- /dev/null +++ b/data/items/materials/grimy_snapdragon.yaml @@ -0,0 +1,6 @@ +id: grimy_snapdragon +name: "grimy snapdragon" +color: "65" +description: "A grimy snapdragon leaf. It needs to be cleaned before it can be used." +value: 50 +stackable: false diff --git a/data/items/materials/grimy_tarromin.yaml b/data/items/materials/grimy_tarromin.yaml new file mode 100644 index 0000000..712061c --- /dev/null +++ b/data/items/materials/grimy_tarromin.yaml @@ -0,0 +1,6 @@ +id: grimy_tarromin +name: "grimy tarromin" +color: "65" +description: "A grimy tarromin leaf. It needs to be cleaned before it can be used." +value: 7 +stackable: false diff --git a/data/items/materials/grimy_toadflax.yaml b/data/items/materials/grimy_toadflax.yaml new file mode 100644 index 0000000..c489566 --- /dev/null +++ b/data/items/materials/grimy_toadflax.yaml @@ -0,0 +1,6 @@ +id: grimy_toadflax +name: "grimy toadflax" +color: "65" +description: "A grimy toadflax leaf. It needs to be cleaned before it can be used." +value: 18 +stackable: false diff --git a/data/items/materials/grimy_torstol.yaml b/data/items/materials/grimy_torstol.yaml new file mode 100644 index 0000000..47db8d7 --- /dev/null +++ b/data/items/materials/grimy_torstol.yaml @@ -0,0 +1,6 @@ +id: grimy_torstol +name: "grimy torstol" +color: "65" +description: "A grimy torstol leaf. It needs to be cleaned before it can be used." +value: 75 +stackable: false diff --git a/data/items/materials/guam.yaml b/data/items/materials/guam.yaml new file mode 100644 index 0000000..8fe7972 --- /dev/null +++ b/data/items/materials/guam.yaml @@ -0,0 +1,6 @@ +id: guam +name: "guam" +color: "48" +description: "A clean guam leaf, ready for use in pharmacy." +value: 3 +stackable: true diff --git a/data/items/materials/hard_leather.yaml b/data/items/materials/hard_leather.yaml new file mode 100644 index 0000000..e04030c --- /dev/null +++ b/data/items/materials/hard_leather.yaml @@ -0,0 +1,6 @@ +id: hard_leather +name: hard leather +color: "94" +description: "A piece of hardened leather, suitable for sturdy armour." +value: 55 +stackable: false diff --git a/data/items/materials/harralander.yaml b/data/items/materials/harralander.yaml new file mode 100644 index 0000000..08e66ed --- /dev/null +++ b/data/items/materials/harralander.yaml @@ -0,0 +1,6 @@ +id: harralander +name: "harralander" +color: "48" +description: "A clean harralander leaf, ready for use in pharmacy." +value: 16 +stackable: true diff --git a/data/items/materials/irit.yaml b/data/items/materials/irit.yaml new file mode 100644 index 0000000..40f1956 --- /dev/null +++ b/data/items/materials/irit.yaml @@ -0,0 +1,6 @@ +id: irit +name: "irit" +color: "48" +description: "A clean irit leaf, ready for use in pharmacy." +value: 40 +stackable: true diff --git a/data/items/materials/iron_bar.yaml b/data/items/materials/iron_bar.yaml new file mode 100644 index 0000000..26c8352 --- /dev/null +++ b/data/items/materials/iron_bar.yaml @@ -0,0 +1,6 @@ +id: iron_bar +name: iron bar +color: "250" +description: "A bar of iron metal." +value: 12 +stackable: false diff --git a/data/items/materials/iron_nails.yaml b/data/items/materials/iron_nails.yaml new file mode 100644 index 0000000..77323c9 --- /dev/null +++ b/data/items/materials/iron_nails.yaml @@ -0,0 +1,6 @@ +id: iron_nails +name: iron nails +color: "250" +description: "A set of iron nails." +value: 2 +stackable: true diff --git a/data/items/materials/iron_ore.yaml b/data/items/materials/iron_ore.yaml new file mode 100644 index 0000000..78e82a5 --- /dev/null +++ b/data/items/materials/iron_ore.yaml @@ -0,0 +1,6 @@ +id: iron_ore +name: iron ore +color: "250" +description: "A chunk of iron ore, ready for smelting." +value: 5 +stackable: false diff --git a/data/items/materials/kwuarm.yaml b/data/items/materials/kwuarm.yaml new file mode 100644 index 0000000..ab0d7ff --- /dev/null +++ b/data/items/materials/kwuarm.yaml @@ -0,0 +1,6 @@ +id: kwuarm +name: "kwuarm" +color: "48" +description: "A clean kwuarm leaf, ready for use in pharmacy." +value: 54 +stackable: true diff --git a/data/items/materials/lantadyme.yaml b/data/items/materials/lantadyme.yaml new file mode 100644 index 0000000..d38b7da --- /dev/null +++ b/data/items/materials/lantadyme.yaml @@ -0,0 +1,6 @@ +id: lantadyme +name: "lantadyme" +color: "48" +description: "A clean lantadyme leaf, ready for use in pharmacy." +value: 78 +stackable: true diff --git a/data/items/materials/leather.yaml b/data/items/materials/leather.yaml new file mode 100644 index 0000000..82d0696 --- /dev/null +++ b/data/items/materials/leather.yaml @@ -0,0 +1,6 @@ +id: leather +name: leather +color: "130" +description: "A piece of tanned leather, ready for crafting." +value: 15 +stackable: false diff --git a/data/items/materials/limpwurt_root.yaml b/data/items/materials/limpwurt_root.yaml new file mode 100644 index 0000000..49dd0dc --- /dev/null +++ b/data/items/materials/limpwurt_root.yaml @@ -0,0 +1,6 @@ +id: limpwurt_root +name: "limpwurt root" +color: "130" +description: "A thick, gnarled root with natural stimulant properties." +value: 8 +stackable: false diff --git a/data/items/materials/logs.yaml b/data/items/materials/logs.yaml new file mode 100644 index 0000000..1395d94 --- /dev/null +++ b/data/items/materials/logs.yaml @@ -0,0 +1,9 @@ +id: logs +name: logs +color: "107" +description: "Some regular logs, good for firemaking and fletching." +value: 2 +stackable: false +fire_level: 1 +fire_xp: 40 +burn_ticks: 24 diff --git a/data/items/materials/magic_logs.yaml b/data/items/materials/magic_logs.yaml new file mode 100644 index 0000000..01a804e --- /dev/null +++ b/data/items/materials/magic_logs.yaml @@ -0,0 +1,9 @@ +id: magic_logs +name: magic logs +color: "135" +description: "Some mystical magic logs." +value: 80 +stackable: false +fire_level: 75 +fire_xp: 303 +burn_ticks: 52 diff --git a/data/items/materials/mahogany_logs.yaml b/data/items/materials/mahogany_logs.yaml new file mode 100644 index 0000000..67b9a6c --- /dev/null +++ b/data/items/materials/mahogany_logs.yaml @@ -0,0 +1,9 @@ +id: mahogany_logs +name: mahogany logs +color: "131" +description: "Some rich mahogany logs." +value: 20 +stackable: false +fire_level: 50 +fire_xp: 158 +burn_ticks: 44 diff --git a/data/items/materials/mahogany_planks.yaml b/data/items/materials/mahogany_planks.yaml new file mode 100644 index 0000000..d551321 --- /dev/null +++ b/data/items/materials/mahogany_planks.yaml @@ -0,0 +1,6 @@ +id: mahogany_planks +name: mahogany planks +color: "96" +description: "Luxurious mahogany planks with a deep reddish hue." +value: 120 +stackable: false diff --git a/data/items/materials/maple_logs.yaml b/data/items/materials/maple_logs.yaml new file mode 100644 index 0000000..6b081e1 --- /dev/null +++ b/data/items/materials/maple_logs.yaml @@ -0,0 +1,9 @@ +id: maple_logs +name: maple logs +color: "173" +description: "Some smooth maple logs." +value: 16 +stackable: false +fire_level: 45 +fire_xp: 135 +burn_ticks: 40 diff --git a/data/items/materials/marrentill.yaml b/data/items/materials/marrentill.yaml new file mode 100644 index 0000000..4bd492d --- /dev/null +++ b/data/items/materials/marrentill.yaml @@ -0,0 +1,6 @@ +id: marrentill +name: "marrentill" +color: "48" +description: "A clean marrentill leaf, ready for use in pharmacy." +value: 6 +stackable: true diff --git a/data/items/materials/mithril_bar.yaml b/data/items/materials/mithril_bar.yaml new file mode 100644 index 0000000..00e97a4 --- /dev/null +++ b/data/items/materials/mithril_bar.yaml @@ -0,0 +1,6 @@ +id: mithril_bar +name: mithril bar +color: "75" +description: "A bar of mithril metal, light and strong." +value: 100 +stackable: false diff --git a/data/items/materials/mithril_nails.yaml b/data/items/materials/mithril_nails.yaml new file mode 100644 index 0000000..aeb0544 --- /dev/null +++ b/data/items/materials/mithril_nails.yaml @@ -0,0 +1,6 @@ +id: mithril_nails +name: mithril nails +color: "75" +description: "A set of mithril nails." +value: 8 +stackable: true diff --git a/data/items/materials/mithril_ore.yaml b/data/items/materials/mithril_ore.yaml new file mode 100644 index 0000000..55d8d2c --- /dev/null +++ b/data/items/materials/mithril_ore.yaml @@ -0,0 +1,6 @@ +id: mithril_ore +name: mithril ore +color: "75" +description: "A piece of light blue mithril ore." +value: 50 +stackable: false diff --git a/data/items/materials/oak_logs.yaml b/data/items/materials/oak_logs.yaml new file mode 100644 index 0000000..840ebfd --- /dev/null +++ b/data/items/materials/oak_logs.yaml @@ -0,0 +1,9 @@ +id: oak_logs +name: oak logs +color: "113" +description: "Some sturdy oak logs." +value: 4 +stackable: false +fire_level: 15 +fire_xp: 60 +burn_ticks: 28 diff --git a/data/items/materials/oak_planks.yaml b/data/items/materials/oak_planks.yaml new file mode 100644 index 0000000..29376c6 --- /dev/null +++ b/data/items/materials/oak_planks.yaml @@ -0,0 +1,6 @@ +id: oak_planks +name: oak planks +color: "102" +description: "Sturdy oak planks, ideal for furniture." +value: 40 +stackable: false diff --git a/data/items/materials/planks.yaml b/data/items/materials/planks.yaml new file mode 100644 index 0000000..67de72e --- /dev/null +++ b/data/items/materials/planks.yaml @@ -0,0 +1,6 @@ +id: planks +name: planks +color: "137" +description: "Some regular wooden planks, ready for construction." +value: 20 +stackable: false diff --git a/data/items/materials/potato_cactus.yaml b/data/items/materials/potato_cactus.yaml new file mode 100644 index 0000000..1178727 --- /dev/null +++ b/data/items/materials/potato_cactus.yaml @@ -0,0 +1,6 @@ +id: potato_cactus +name: "potato cactus" +color: "106" +description: "A bulbous cactus with medicinal properties. Thrives in the arid zones." +value: 18 +stackable: false diff --git a/data/items/materials/ranarr.yaml b/data/items/materials/ranarr.yaml new file mode 100644 index 0000000..683cce6 --- /dev/null +++ b/data/items/materials/ranarr.yaml @@ -0,0 +1,6 @@ +id: ranarr +name: "ranarr" +color: "48" +description: "A clean ranarr leaf, ready for use in pharmacy." +value: 35 +stackable: true diff --git a/data/items/materials/redwood_logs.yaml b/data/items/materials/redwood_logs.yaml new file mode 100644 index 0000000..5ea1ab0 --- /dev/null +++ b/data/items/materials/redwood_logs.yaml @@ -0,0 +1,9 @@ +id: redwood_logs +name: redwood logs +color: "131" +description: "Some rare redwood logs." +value: 100 +stackable: false +fire_level: 90 +fire_xp: 350 +burn_ticks: 60 diff --git a/data/items/materials/ruby.yaml b/data/items/materials/ruby.yaml new file mode 100644 index 0000000..644e1bf --- /dev/null +++ b/data/items/materials/ruby.yaml @@ -0,0 +1,6 @@ +id: ruby +name: ruby +color: "196" +description: "A beautifully cut ruby." +value: 200 +stackable: false diff --git a/data/items/materials/rune_nails.yaml b/data/items/materials/rune_nails.yaml new file mode 100644 index 0000000..5d2dfc5 --- /dev/null +++ b/data/items/materials/rune_nails.yaml @@ -0,0 +1,6 @@ +id: rune_nails +name: rune nails +color: "87" +description: "A set of rune nails." +value: 30 +stackable: true diff --git a/data/items/materials/runite_bar.yaml b/data/items/materials/runite_bar.yaml new file mode 100644 index 0000000..1faff69 --- /dev/null +++ b/data/items/materials/runite_bar.yaml @@ -0,0 +1,6 @@ +id: runite_bar +name: runite bar +color: "39" +description: "A bar of runite metal, the finest alloy known." +value: 500 +stackable: false diff --git a/data/items/materials/runite_ore.yaml b/data/items/materials/runite_ore.yaml new file mode 100644 index 0000000..05d3248 --- /dev/null +++ b/data/items/materials/runite_ore.yaml @@ -0,0 +1,6 @@ +id: runite_ore +name: runite ore +color: "87" +description: "A rare piece of light blue runite ore." +value: 500 +stackable: false diff --git a/data/items/materials/sacred_eel.yaml b/data/items/materials/sacred_eel.yaml new file mode 100644 index 0000000..9a03940 --- /dev/null +++ b/data/items/materials/sacred_eel.yaml @@ -0,0 +1,6 @@ +id: sacred_eel +name: sacred eel +color: "177" +description: "A glowing eel imbued with sacred energy." +value: 25 +stackable: false diff --git a/data/items/materials/salt.yaml b/data/items/materials/salt.yaml new file mode 100644 index 0000000..d9c1b2a --- /dev/null +++ b/data/items/materials/salt.yaml @@ -0,0 +1,6 @@ +id: salt +name: salt +color: "255" +description: "A packet of coarse industrial salt. Used to destroy slugs." +value: 5 +stackable: true diff --git a/data/items/materials/sapphire.yaml b/data/items/materials/sapphire.yaml new file mode 100644 index 0000000..9710d45 --- /dev/null +++ b/data/items/materials/sapphire.yaml @@ -0,0 +1,6 @@ +id: sapphire +name: sapphire +color: "69" +description: "A beautifully cut sapphire." +value: 50 +stackable: false diff --git a/data/items/materials/silver_bar.yaml b/data/items/materials/silver_bar.yaml new file mode 100644 index 0000000..eccb25f --- /dev/null +++ b/data/items/materials/silver_bar.yaml @@ -0,0 +1,6 @@ +id: silver_bar +name: silver bar +color: "255" +description: "A bar of silver metal." +value: 20 +stackable: false diff --git a/data/items/materials/silver_ore.yaml b/data/items/materials/silver_ore.yaml new file mode 100644 index 0000000..5b40ff0 --- /dev/null +++ b/data/items/materials/silver_ore.yaml @@ -0,0 +1,6 @@ +id: silver_ore +name: silver ore +color: "253" +description: "A piece of silver ore with a faint metallic sheen." +value: 10 +stackable: false diff --git a/data/items/materials/slug_mucus.yaml b/data/items/materials/slug_mucus.yaml new file mode 100644 index 0000000..620038a --- /dev/null +++ b/data/items/materials/slug_mucus.yaml @@ -0,0 +1,6 @@ +id: slug_mucus +name: slug mucus +color: "82" +description: "A glob of toxic slug mucus. Unpleasant." +value: 5 +stackable: false diff --git a/data/items/materials/snapdragon.yaml b/data/items/materials/snapdragon.yaml new file mode 100644 index 0000000..0c3ba2f --- /dev/null +++ b/data/items/materials/snapdragon.yaml @@ -0,0 +1,6 @@ +id: snapdragon +name: "snapdragon" +color: "48" +description: "A clean snapdragon leaf, ready for use in pharmacy." +value: 65 +stackable: true diff --git a/data/items/materials/snape_grass.yaml b/data/items/materials/snape_grass.yaml new file mode 100644 index 0000000..59a9b30 --- /dev/null +++ b/data/items/materials/snape_grass.yaml @@ -0,0 +1,6 @@ +id: snape_grass +name: "snape grass" +color: "120" +description: "A long blade of snape grass. It crackles with faint static charge." +value: 10 +stackable: false diff --git a/data/items/materials/soft_clay.yaml b/data/items/materials/soft_clay.yaml new file mode 100644 index 0000000..018e5ef --- /dev/null +++ b/data/items/materials/soft_clay.yaml @@ -0,0 +1,13 @@ +id: soft_clay +name: soft clay +color: "173" +description: "Soft, workable clay ready for shaping on a pottery wheel." +value: 2 +stackable: false +ticks: 2 +made_from: + - items: [clay] + quantity: 1 + - items: [bucket_of_water, jug_of_water] + quantity: 1 + byproducts: [empty_bucket, empty_jug] diff --git a/data/items/materials/steel_bar.yaml b/data/items/materials/steel_bar.yaml new file mode 100644 index 0000000..450fd5c --- /dev/null +++ b/data/items/materials/steel_bar.yaml @@ -0,0 +1,6 @@ +id: steel_bar +name: steel bar +color: "254" +description: "A bar of steel, forged from iron ore and coal." +value: 30 +stackable: false diff --git a/data/items/materials/steel_nails.yaml b/data/items/materials/steel_nails.yaml new file mode 100644 index 0000000..4890d18 --- /dev/null +++ b/data/items/materials/steel_nails.yaml @@ -0,0 +1,6 @@ +id: steel_nails +name: steel nails +color: "253" +description: "A set of steel nails." +value: 4 +stackable: true diff --git a/data/items/materials/stim_cell.yaml b/data/items/materials/stim_cell.yaml new file mode 100644 index 0000000..b431532 --- /dev/null +++ b/data/items/materials/stim_cell.yaml @@ -0,0 +1,9 @@ +id: stim_cell +name: "stim cell" +color: "226" +description: "A bright yellow energy supplement that restores stamina." +value: 65 +stackable: false +potion_effect: "battery" +potion_bonus: 25 +potion_duration: 0 diff --git a/data/items/materials/tarromin.yaml b/data/items/materials/tarromin.yaml new file mode 100644 index 0000000..5af2573 --- /dev/null +++ b/data/items/materials/tarromin.yaml @@ -0,0 +1,6 @@ +id: tarromin +name: "tarromin" +color: "48" +description: "A clean tarromin leaf, ready for use in pharmacy." +value: 10 +stackable: true diff --git a/data/items/materials/teak_logs.yaml b/data/items/materials/teak_logs.yaml new file mode 100644 index 0000000..c69f807 --- /dev/null +++ b/data/items/materials/teak_logs.yaml @@ -0,0 +1,9 @@ +id: teak_logs +name: teak logs +color: "179" +description: "Some solid teak logs." +value: 12 +stackable: false +fire_level: 35 +fire_xp: 105 +burn_ticks: 36 diff --git a/data/items/materials/teak_planks.yaml b/data/items/materials/teak_planks.yaml new file mode 100644 index 0000000..f0a0642 --- /dev/null +++ b/data/items/materials/teak_planks.yaml @@ -0,0 +1,6 @@ +id: teak_planks +name: teak planks +color: "100" +description: "Fine teak planks with a rich grain." +value: 80 +stackable: false diff --git a/data/items/materials/thread.yaml b/data/items/materials/thread.yaml new file mode 100644 index 0000000..3a9a4f7 --- /dev/null +++ b/data/items/materials/thread.yaml @@ -0,0 +1,6 @@ +id: thread +name: thread +color: "230" +description: "A spool of thread used for leatherworking." +value: 1 +stackable: true diff --git a/data/items/materials/tin_ore.yaml b/data/items/materials/tin_ore.yaml new file mode 100644 index 0000000..0ae1cd0 --- /dev/null +++ b/data/items/materials/tin_ore.yaml @@ -0,0 +1,6 @@ +id: tin_ore +name: tin ore +color: "253" +description: "A lump of tin ore, ready for smelting." +value: 3 +stackable: false diff --git a/data/items/materials/toadflax.yaml b/data/items/materials/toadflax.yaml new file mode 100644 index 0000000..0de8f01 --- /dev/null +++ b/data/items/materials/toadflax.yaml @@ -0,0 +1,6 @@ +id: toadflax +name: "toadflax" +color: "48" +description: "A clean toadflax leaf, ready for use in pharmacy." +value: 25 +stackable: true diff --git a/data/items/materials/torstol.yaml b/data/items/materials/torstol.yaml new file mode 100644 index 0000000..a8b8fbb --- /dev/null +++ b/data/items/materials/torstol.yaml @@ -0,0 +1,6 @@ +id: torstol +name: "torstol" +color: "48" +description: "A clean torstol leaf, ready for use in pharmacy." +value: 100 +stackable: true diff --git a/data/items/materials/uncut_diamond.yaml b/data/items/materials/uncut_diamond.yaml new file mode 100644 index 0000000..cf41d70 --- /dev/null +++ b/data/items/materials/uncut_diamond.yaml @@ -0,0 +1,6 @@ +id: uncut_diamond +name: uncut diamond +color: "255" +description: "An uncut diamond. Can be cut with a chisel." +value: 200 +stackable: false diff --git a/data/items/materials/uncut_emerald.yaml b/data/items/materials/uncut_emerald.yaml new file mode 100644 index 0000000..1ea217a --- /dev/null +++ b/data/items/materials/uncut_emerald.yaml @@ -0,0 +1,6 @@ +id: uncut_emerald +name: uncut emerald +color: "83" +description: "An uncut emerald. Can be cut with a chisel." +value: 50 +stackable: false diff --git a/data/items/materials/uncut_ruby.yaml b/data/items/materials/uncut_ruby.yaml new file mode 100644 index 0000000..dfa8188 --- /dev/null +++ b/data/items/materials/uncut_ruby.yaml @@ -0,0 +1,6 @@ +id: uncut_ruby +name: uncut ruby +color: "196" +description: "An uncut ruby. Can be cut with a chisel." +value: 100 +stackable: false diff --git a/data/items/materials/uncut_sapphire.yaml b/data/items/materials/uncut_sapphire.yaml new file mode 100644 index 0000000..bf073fa --- /dev/null +++ b/data/items/materials/uncut_sapphire.yaml @@ -0,0 +1,6 @@ +id: uncut_sapphire +name: uncut sapphire +color: "69" +description: "An uncut sapphire. Can be cut with a chisel." +value: 25 +stackable: false diff --git a/data/items/materials/vial.yaml b/data/items/materials/vial.yaml new file mode 100644 index 0000000..2a5260a --- /dev/null +++ b/data/items/materials/vial.yaml @@ -0,0 +1,6 @@ +id: vial +name: "vial" +color: "253" +description: "An empty glass vial." +value: 1 +stackable: false diff --git a/data/items/materials/white_berries.yaml b/data/items/materials/white_berries.yaml new file mode 100644 index 0000000..bdaa993 --- /dev/null +++ b/data/items/materials/white_berries.yaml @@ -0,0 +1,6 @@ +id: white_berries +name: "white berries" +color: "255" +description: "Pale berries from a hardy bush. They have defensive biochemical properties." +value: 10 +stackable: false diff --git a/data/items/materials/willow_logs.yaml b/data/items/materials/willow_logs.yaml new file mode 100644 index 0000000..dbd315b --- /dev/null +++ b/data/items/materials/willow_logs.yaml @@ -0,0 +1,9 @@ +id: willow_logs +name: willow logs +color: "114" +description: "Some flexible willow logs." +value: 8 +stackable: false +fire_level: 30 +fire_xp: 90 +burn_ticks: 32 diff --git a/data/items/materials/wool.yaml b/data/items/materials/wool.yaml new file mode 100644 index 0000000..f557aaf --- /dev/null +++ b/data/items/materials/wool.yaml @@ -0,0 +1,6 @@ +id: wool +name: wool +color: "255" +description: "A tuft of sheep's wool. Can be spun into a ball of wool." +value: 1 +stackable: false diff --git a/data/items/materials/yew_logs.yaml b/data/items/materials/yew_logs.yaml new file mode 100644 index 0000000..a5a86a2 --- /dev/null +++ b/data/items/materials/yew_logs.yaml @@ -0,0 +1,9 @@ +id: yew_logs +name: yew logs +color: "108" +description: "Some high-quality yew logs." +value: 40 +stackable: false +fire_level: 60 +fire_xp: 202 +burn_ticks: 48 diff --git a/data/items/misc/birds_nest.yaml b/data/items/misc/birds_nest.yaml new file mode 100644 index 0000000..1366b5d --- /dev/null +++ b/data/items/misc/birds_nest.yaml @@ -0,0 +1,9 @@ +id: birds_nest +name: bird's nest +color: "179" +description: "A bird's nest. You can search it for treasure." +value: 5 +stackable: false +search_table: birds_nest_drop +search_ticks: 3 +search_message: "digging through the bird's nest" diff --git a/data/items/misc/christmas_cracker.yaml b/data/items/misc/christmas_cracker.yaml new file mode 100644 index 0000000..c296443 --- /dev/null +++ b/data/items/misc/christmas_cracker.yaml @@ -0,0 +1,10 @@ +id: christmas_cracker +name: christmas cracker +color: "196" +description: "A festive party cracker. Pull it apart to see what's inside!" +value: 10 +stackable: true +search_table: christmas_cracker_hat +search_misc_table: christmas_cracker_misc +search_ticks: 3 +search_message: "digging through the christmas cracker" diff --git a/data/items/misc/circuit_board.yaml b/data/items/misc/circuit_board.yaml new file mode 100644 index 0000000..5b4db83 --- /dev/null +++ b/data/items/misc/circuit_board.yaml @@ -0,0 +1,6 @@ +id: circuit_board +name: circuit board +color: "40" +description: "A scorched circuit board salvaged from a destroyed drone." +value: 25 +stackable: false diff --git a/data/items/misc/credit_stick.yaml b/data/items/misc/credit_stick.yaml new file mode 100644 index 0000000..46b3050 --- /dev/null +++ b/data/items/misc/credit_stick.yaml @@ -0,0 +1,9 @@ +id: credit_stick +name: credit stick +color: "220" +description: "A small electronic stick loaded with credits. You can search it to extract the credits." +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 diff --git a/data/items/misc/credits.yaml b/data/items/misc/credits.yaml new file mode 100644 index 0000000..7e2de10 --- /dev/null +++ b/data/items/misc/credits.yaml @@ -0,0 +1,6 @@ +id: credits +name: credits +color: "220" +description: "A handful of universal credits." +value: 1 +stackable: true diff --git a/data/items/misc/mahogany_table.yaml b/data/items/misc/mahogany_table.yaml new file mode 100644 index 0000000..245b929 --- /dev/null +++ b/data/items/misc/mahogany_table.yaml @@ -0,0 +1,6 @@ +id: mahogany_table +name: mahogany table +color: "96" +description: "A luxurious mahogany table, the centerpiece of any room." +value: 240 +stackable: false diff --git a/data/items/misc/nutrient_bar.yaml b/data/items/misc/nutrient_bar.yaml new file mode 100644 index 0000000..d33d7de --- /dev/null +++ b/data/items/misc/nutrient_bar.yaml @@ -0,0 +1,8 @@ +id: nutrient_bar +name: nutrient bar +color: "220" +description: "A compressed bar of processed nutrients. Restores a small amount of health." +value: 5 +stackable: true +heal_value: 2 +eat_message: "You eat the nutrient bar." diff --git a/data/items/misc/oak_shelf.yaml b/data/items/misc/oak_shelf.yaml new file mode 100644 index 0000000..0f08fa5 --- /dev/null +++ b/data/items/misc/oak_shelf.yaml @@ -0,0 +1,6 @@ +id: oak_shelf +name: oak shelf +color: "94" +description: "A solid oak shelf, built to last." +value: 80 +stackable: false diff --git a/data/items/misc/oak_table.yaml b/data/items/misc/oak_table.yaml new file mode 100644 index 0000000..e94b372 --- /dev/null +++ b/data/items/misc/oak_table.yaml @@ -0,0 +1,6 @@ +id: oak_table +name: oak table +color: "94" +description: "A fine oak table with carved legs." +value: 100 +stackable: false diff --git a/data/items/misc/pass_stub.yaml b/data/items/misc/pass_stub.yaml new file mode 100644 index 0000000..1068190 --- /dev/null +++ b/data/items/misc/pass_stub.yaml @@ -0,0 +1,6 @@ +id: pass_stub +name: pass stub +color: "222" +description: "A crumpled slip of paper stamped with the guard's seal. Grants one-time access past the gate." +value: 0 +stackable: false diff --git a/data/items/misc/scrap_metal.yaml b/data/items/misc/scrap_metal.yaml new file mode 100644 index 0000000..d9b805e --- /dev/null +++ b/data/items/misc/scrap_metal.yaml @@ -0,0 +1,6 @@ +id: scrap_metal +name: scrap metal +color: "243" +description: "A chunk of salvaged scrap metal." +value: 2 +stackable: false diff --git a/data/items/misc/teak_table.yaml b/data/items/misc/teak_table.yaml new file mode 100644 index 0000000..5c2c5c5 --- /dev/null +++ b/data/items/misc/teak_table.yaml @@ -0,0 +1,6 @@ +id: teak_table +name: teak table +color: "100" +description: "An elegant teak table with a polished surface." +value: 160 +stackable: false diff --git a/data/items/misc/wooden_chair.yaml b/data/items/misc/wooden_chair.yaml new file mode 100644 index 0000000..16220ef --- /dev/null +++ b/data/items/misc/wooden_chair.yaml @@ -0,0 +1,6 @@ +id: wooden_chair +name: wooden chair +color: "130" +description: "A comfortable wooden chair with a smooth finish." +value: 35 +stackable: false diff --git a/data/items/misc/wooden_shelf.yaml b/data/items/misc/wooden_shelf.yaml new file mode 100644 index 0000000..3b0d97d --- /dev/null +++ b/data/items/misc/wooden_shelf.yaml @@ -0,0 +1,6 @@ +id: wooden_shelf +name: wooden shelf +color: "130" +description: "A simple wooden shelf, useful for storing small items." +value: 40 +stackable: false diff --git a/data/items/misc/wooden_table.yaml b/data/items/misc/wooden_table.yaml new file mode 100644 index 0000000..171a9bb --- /dev/null +++ b/data/items/misc/wooden_table.yaml @@ -0,0 +1,6 @@ +id: wooden_table +name: wooden table +color: "130" +description: "A sturdy wooden table, perfect for dining or displaying objects." +value: 50 +stackable: false diff --git a/data/items/mithril_arrow.yaml b/data/items/mithril_arrow.yaml deleted file mode 100644 index 23464e9..0000000 --- a/data/items/mithril_arrow.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: mithril_arrow -name: mithril arrow -color: "75" -description: "A mithril-tipped arrow." -value: 10 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 22 diff --git a/data/items/mithril_arrowtips.yaml b/data/items/mithril_arrowtips.yaml deleted file mode 100644 index 8f68a34..0000000 --- a/data/items/mithril_arrowtips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: mithril_arrowtips -name: mithril arrowtips -color: "75" -description: "A set of mithril arrowtips." -value: 8 -stackable: true diff --git a/data/items/mithril_axe.yaml b/data/items/mithril_axe.yaml deleted file mode 100644 index ca18195..0000000 --- a/data/items/mithril_axe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: mithril_axe -name: mithril axe -color: "75" -description: "A sturdy mithril axe, good for woodcutting." -value: 200 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: -2 - slash_attack: 21 - crush_attack: 16 - strength_bonus: 17 -speed: 5 -tool_type: axe -tool_speed: 2.5 -requirements: - attack: 20 diff --git a/data/items/mithril_bar.yaml b/data/items/mithril_bar.yaml deleted file mode 100644 index 00e97a4..0000000 --- a/data/items/mithril_bar.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: mithril_bar -name: mithril bar -color: "75" -description: "A bar of mithril metal, light and strong." -value: 100 -stackable: false diff --git a/data/items/mithril_bolts.yaml b/data/items/mithril_bolts.yaml deleted file mode 100644 index e160065..0000000 --- a/data/items/mithril_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: mithril_bolts -name: mithril bolts -color: "75" -description: "Mithril crossbow bolts." -value: 12 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 32 diff --git a/data/items/mithril_bolts_unf.yaml b/data/items/mithril_bolts_unf.yaml deleted file mode 100644 index 8015f1a..0000000 --- a/data/items/mithril_bolts_unf.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: mithril_bolts_unf -name: mithril bolts (unf) -color: "75" -description: "Unfinished mithril crossbow bolts." -value: 10 -stackable: true diff --git a/data/items/mithril_dagger.yaml b/data/items/mithril_dagger.yaml deleted file mode 100644 index 8ffe595..0000000 --- a/data/items/mithril_dagger.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: mithril_dagger -name: mithril dagger -color: "75" -description: "A small mithril dagger." -value: 150 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 17 - slash_attack: 10 - crush_attack: -1 - strength_bonus: 14 -speed: 3 -requirements: - attack: 20 diff --git a/data/items/mithril_full_helm.yaml b/data/items/mithril_full_helm.yaml deleted file mode 100644 index d317705..0000000 --- a/data/items/mithril_full_helm.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: mithril_full_helm -name: mithril full helm -color: "75" -description: "A mithril full helmet." -value: 400 -stackable: false -equip_slot: head -stats: - stab_defense: 16 - slash_defense: 18 - crush_defense: 12 - science_defense: -6 - ranged_defense: 16 -requirements: - defense: 20 diff --git a/data/items/mithril_med_helm.yaml b/data/items/mithril_med_helm.yaml deleted file mode 100644 index f244a7c..0000000 --- a/data/items/mithril_med_helm.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: mithril_med_helm -name: mithril med helm -color: "75" -description: "A mithril medium helmet." -value: 150 -stackable: false -equip_slot: head -stats: - stab_defense: 10 - slash_defense: 12 - crush_defense: 7 - science_defense: -3 - ranged_defense: 10 -requirements: - defense: 20 diff --git a/data/items/mithril_nails.yaml b/data/items/mithril_nails.yaml deleted file mode 100644 index aeb0544..0000000 --- a/data/items/mithril_nails.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: mithril_nails -name: mithril nails -color: "75" -description: "A set of mithril nails." -value: 8 -stackable: true diff --git a/data/items/mithril_ore.yaml b/data/items/mithril_ore.yaml deleted file mode 100644 index 55d8d2c..0000000 --- a/data/items/mithril_ore.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: mithril_ore -name: mithril ore -color: "75" -description: "A piece of light blue mithril ore." -value: 50 -stackable: false diff --git a/data/items/mithril_pickaxe.yaml b/data/items/mithril_pickaxe.yaml deleted file mode 100644 index 5da6937..0000000 --- a/data/items/mithril_pickaxe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: mithril_pickaxe -name: mithril pickaxe -color: "75" -description: "A sturdy mithril pickaxe, good for mining." -value: 200 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 17 - slash_attack: -2 - crush_attack: 8 - strength_bonus: 12 -speed: 5 -tool_type: pickaxe -tool_speed: 1 -requirements: - attack: 20 diff --git a/data/items/mithril_platebody.yaml b/data/items/mithril_platebody.yaml deleted file mode 100644 index 50e8ea0..0000000 --- a/data/items/mithril_platebody.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: mithril_platebody -name: mithril platebody -color: "75" -description: "A mithril platebody." -value: 1500 -stackable: false -equip_slot: torso -stats: - stab_defense: 36 - slash_defense: 42 - crush_defense: 30 - science_defense: -20 - ranged_defense: 36 -requirements: - defense: 20 diff --git a/data/items/mithril_sword.yaml b/data/items/mithril_sword.yaml deleted file mode 100644 index 1824f5b..0000000 --- a/data/items/mithril_sword.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: mithril_sword -name: mithril sword -color: "75" -description: "A mithril sword." -value: 250 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: 14 - slash_attack: 30 - crush_attack: -2 - strength_bonus: 20 -speed: 4 -requirements: - attack: 20 diff --git a/data/items/nano_restore.yaml b/data/items/nano_restore.yaml deleted file mode 100644 index e430b49..0000000 --- a/data/items/nano_restore.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: nano_restore -name: "nano restore" -color: "208" -description: "An orange potion containing nanobots that restore diminished attributes." -value: 70 -stackable: false -potion_effect: "heal" -potion_bonus: 100 -potion_duration: 0 diff --git a/data/items/nature_identifier.yaml b/data/items/nature_identifier.yaml deleted file mode 100644 index dc441cf..0000000 --- a/data/items/nature_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: nature_identifier -name: nature identifier -color: "46" -description: "A handheld scanner calibrated to isolate nature-frequency signatures in scrap metal. Required to produce naturejunk at a nature altar." -value: 10000 diff --git a/data/items/naturejunk.yaml b/data/items/naturejunk.yaml deleted file mode 100644 index 49ed1ff..0000000 --- a/data/items/naturejunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: naturejunk -name: naturejunk -color: "46" -description: "A fragment of reclaimed nature circuitry. Used as a universal energy medium." -value: 50 -stackable: true diff --git a/data/items/necklace_mould.yaml b/data/items/necklace_mould.yaml deleted file mode 100644 index bc4df45..0000000 --- a/data/items/necklace_mould.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: necklace_mould -name: necklace mould -color: "250" -description: "A mould for casting necklaces." -value: 5 diff --git a/data/items/necklace_of_passage.yaml b/data/items/necklace_of_passage.yaml deleted file mode 100644 index b5630ed..0000000 --- a/data/items/necklace_of_passage.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: necklace_of_passage -name: necklace of passage -color: "39" -description: "An enchanted sapphire necklace that can teleport the wearer to various locations." -value: 750 -equip_slot: neck diff --git a/data/items/needle.yaml b/data/items/needle.yaml deleted file mode 100644 index 5f53bf3..0000000 --- a/data/items/needle.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: needle -name: needle -color: "250" -description: "A needle for crafting leather goods." -value: 5 -tool_type: needle diff --git a/data/items/neural_headband.yaml b/data/items/neural_headband.yaml deleted file mode 100644 index e01e57d..0000000 --- a/data/items/neural_headband.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: neural_headband -name: Neural Headband -description: "A thin band of circuitry that amplifies neural signals, reducing battery drain." -color: "39" -value: 500 -equip_slot: head -stats: - stab_defense: 1 - slash_defense: 1 - crush_defense: 1 - technology_bonus: 4 diff --git a/data/items/nutrient_bar.yaml b/data/items/nutrient_bar.yaml deleted file mode 100644 index d33d7de..0000000 --- a/data/items/nutrient_bar.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: nutrient_bar -name: nutrient bar -color: "220" -description: "A compressed bar of processed nutrients. Restores a small amount of health." -value: 5 -stackable: true -heal_value: 2 -eat_message: "You eat the nutrient bar." diff --git a/data/items/oak_logs.yaml b/data/items/oak_logs.yaml deleted file mode 100644 index 840ebfd..0000000 --- a/data/items/oak_logs.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: oak_logs -name: oak logs -color: "113" -description: "Some sturdy oak logs." -value: 4 -stackable: false -fire_level: 15 -fire_xp: 60 -burn_ticks: 28 diff --git a/data/items/oak_longbow.yaml b/data/items/oak_longbow.yaml deleted file mode 100644 index 71e7c7c..0000000 --- a/data/items/oak_longbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: oak_longbow -name: oak longbow -color: "136" -description: "An oak longbow." -value: 80 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 6 -stats: - ranged_attack: 14 -requirements: - ranged: 5 diff --git a/data/items/oak_longbow_u.yaml b/data/items/oak_longbow_u.yaml deleted file mode 100644 index 6df0dab..0000000 --- a/data/items/oak_longbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: oak_longbow_u -name: oak longbow (u) -color: "136" -description: "An unstrung oak longbow." -value: 40 diff --git a/data/items/oak_planks.yaml b/data/items/oak_planks.yaml deleted file mode 100644 index 29376c6..0000000 --- a/data/items/oak_planks.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: oak_planks -name: oak planks -color: "102" -description: "Sturdy oak planks, ideal for furniture." -value: 40 -stackable: false diff --git a/data/items/oak_shelf.yaml b/data/items/oak_shelf.yaml deleted file mode 100644 index 0f08fa5..0000000 --- a/data/items/oak_shelf.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: oak_shelf -name: oak shelf -color: "94" -description: "A solid oak shelf, built to last." -value: 80 -stackable: false diff --git a/data/items/oak_shortbow.yaml b/data/items/oak_shortbow.yaml deleted file mode 100644 index 30ebbce..0000000 --- a/data/items/oak_shortbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: oak_shortbow -name: oak shortbow -color: "136" -description: "An oak shortbow." -value: 40 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 4 -stats: - ranged_attack: 14 -requirements: - ranged: 5 diff --git a/data/items/oak_shortbow_u.yaml b/data/items/oak_shortbow_u.yaml deleted file mode 100644 index 5bebc38..0000000 --- a/data/items/oak_shortbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: oak_shortbow_u -name: oak shortbow (u) -color: "136" -description: "An unstrung oak shortbow." -value: 20 diff --git a/data/items/oak_table.yaml b/data/items/oak_table.yaml deleted file mode 100644 index e94b372..0000000 --- a/data/items/oak_table.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: oak_table -name: oak table -color: "94" -description: "A fine oak table with carved legs." -value: 100 -stackable: false diff --git a/data/items/onion.yaml b/data/items/onion.yaml deleted file mode 100644 index 0d0aca7..0000000 --- a/data/items/onion.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: onion -name: onion -color: "229" -description: "A freshly harvested onion." -value: 3 -stackable: true -heal_value: 1 -eat_message: "You eat the onion. It's surprisingly sweet." diff --git a/data/items/onion_seed.yaml b/data/items/onion_seed.yaml deleted file mode 100644 index a1231ad..0000000 --- a/data/items/onion_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: onion_seed -name: onion seed -color: "229" -description: "A seed for growing onions." -value: 2 -stackable: true -farm_patch_type: allotment -farm_level: 5 -farm_plant_xp: 10 -farm_harvest_xp: 11 -farm_stages: 4 -farm_product: onion -farm_min_yield: 3 -farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/party_hat_blue.yaml b/data/items/party_hat_blue.yaml deleted file mode 100644 index 42d6bb5..0000000 --- a/data/items/party_hat_blue.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: party_hat_blue -name: blue party hat -color: "69" -description: "A festive blue party hat." -value: 2 -equip_slot: head -stackable: false diff --git a/data/items/party_hat_green.yaml b/data/items/party_hat_green.yaml deleted file mode 100644 index 82c3bc7..0000000 --- a/data/items/party_hat_green.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: party_hat_green -name: green party hat -color: "83" -description: "A festive green party hat." -value: 2 -equip_slot: head -stackable: false diff --git a/data/items/party_hat_pink.yaml b/data/items/party_hat_pink.yaml deleted file mode 100644 index 006e261..0000000 --- a/data/items/party_hat_pink.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: party_hat_pink -name: pink party hat -color: "213" -description: "A festive pink party hat." -value: 2 -equip_slot: head -stackable: false diff --git a/data/items/party_hat_red.yaml b/data/items/party_hat_red.yaml deleted file mode 100644 index 005b3dd..0000000 --- a/data/items/party_hat_red.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: party_hat_red -name: red party hat -color: "196" -description: "A festive red party hat." -value: 2 -equip_slot: head -stackable: false diff --git a/data/items/party_hat_white.yaml b/data/items/party_hat_white.yaml deleted file mode 100644 index c8e8f86..0000000 --- a/data/items/party_hat_white.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: party_hat_white -name: white party hat -color: "255" -description: "A festive white party hat." -value: 2 -equip_slot: head -stackable: false diff --git a/data/items/party_hat_yellow.yaml b/data/items/party_hat_yellow.yaml deleted file mode 100644 index 33a85f8..0000000 --- a/data/items/party_hat_yellow.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: party_hat_yellow -name: yellow party hat -color: "226" -description: "A festive yellow party hat." -value: 2 -equip_slot: head -stackable: false diff --git a/data/items/pass_stub.yaml b/data/items/pass_stub.yaml deleted file mode 100644 index 1068190..0000000 --- a/data/items/pass_stub.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: pass_stub -name: pass stub -color: "222" -description: "A crumpled slip of paper stamped with the guard's seal. Grants one-time access past the gate." -value: 0 -stackable: false diff --git a/data/items/pastry_dough.yaml b/data/items/pastry_dough.yaml deleted file mode 100644 index c08c0ae..0000000 --- a/data/items/pastry_dough.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: pastry_dough -name: pastry dough -color: "222" -description: "A ball of uncooked pastry dough. It needs to be baked." -value: 3 -stackable: false -made_from: - - items: [pot_of_flour] - qty: 1 - - items: [bucket_of_water] - qty: 1 diff --git a/data/items/phoenix_necklace.yaml b/data/items/phoenix_necklace.yaml deleted file mode 100644 index b53fafb..0000000 --- a/data/items/phoenix_necklace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: phoenix_necklace -name: phoenix necklace -color: "255" -description: "An enchanted diamond necklace that restores HP when you drop below 20 percent health." -value: 5500 -equip_slot: neck diff --git a/data/items/pie_dish.yaml b/data/items/pie_dish.yaml deleted file mode 100644 index bd6100b..0000000 --- a/data/items/pie_dish.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: pie_dish -name: pie dish -color: "130" -description: "A clay pie dish for baking pies." -value: 5 diff --git a/data/items/pizza_dough.yaml b/data/items/pizza_dough.yaml deleted file mode 100644 index 1105c60..0000000 --- a/data/items/pizza_dough.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: pizza_dough -name: pizza dough -color: "222" -description: "A ball of uncooked pizza dough. It needs to be baked." -value: 3 -stackable: false -made_from: - - items: [pot_of_flour] - qty: 1 - - items: [bucket_of_water] - qty: 1 diff --git a/data/items/planks.yaml b/data/items/planks.yaml deleted file mode 100644 index 67de72e..0000000 --- a/data/items/planks.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: planks -name: planks -color: "137" -description: "Some regular wooden planks, ready for construction." -value: 20 -stackable: false diff --git a/data/items/plant_cure.yaml b/data/items/plant_cure.yaml deleted file mode 100644 index 64ebe91..0000000 --- a/data/items/plant_cure.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: plant_cure -name: plant cure -color: "120" -description: "A bio-engineered solution that cures diseased plants." -value: 25 -stackable: true diff --git a/data/items/plant_pot.yaml b/data/items/plant_pot.yaml deleted file mode 100644 index 2f81e08..0000000 --- a/data/items/plant_pot.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: plant_pot -name: plant pot -color: "130" -description: "A clay plant pot for growing plants." -value: 5 diff --git a/data/items/pot_of_flour.yaml b/data/items/pot_of_flour.yaml deleted file mode 100644 index c05c065..0000000 --- a/data/items/pot_of_flour.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: pot_of_flour -name: pot of flour -color: "255" -description: "A clay pot filled with finely ground flour." -value: 5 -stackable: false diff --git a/data/items/potato.yaml b/data/items/potato.yaml deleted file mode 100644 index d9f521a..0000000 --- a/data/items/potato.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: potato -name: potato -color: "180" -description: "A freshly harvested potato." -value: 2 -stackable: true -heal_value: 1 -eat_message: "You eat the potato." diff --git a/data/items/potato_cactus.yaml b/data/items/potato_cactus.yaml deleted file mode 100644 index 1178727..0000000 --- a/data/items/potato_cactus.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: potato_cactus -name: "potato cactus" -color: "106" -description: "A bulbous cactus with medicinal properties. Thrives in the arid zones." -value: 18 -stackable: false diff --git a/data/items/potato_seed.yaml b/data/items/potato_seed.yaml deleted file mode 100644 index 9daee8a..0000000 --- a/data/items/potato_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: potato_seed -name: potato seed -color: "94" -description: "A seed for growing potatoes." -value: 2 -stackable: true -farm_patch_type: allotment -farm_level: 1 -farm_plant_xp: 8 -farm_harvest_xp: 9 -farm_stages: 4 -farm_product: potato -farm_min_yield: 3 -farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/power_amulet.yaml b/data/items/power_amulet.yaml deleted file mode 100644 index bd136a4..0000000 --- a/data/items/power_amulet.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: power_amulet -name: Power Amulet -description: "A pendant containing a miniature power cell that augments tech efficiency." -color: "220" -value: 800 -equip_slot: neck -stats: - technology_bonus: 3 diff --git a/data/items/rake.yaml b/data/items/rake.yaml deleted file mode 100644 index 5949626..0000000 --- a/data/items/rake.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: rake -name: rake -color: "94" -description: "A sturdy rake for clearing weeds and dead plants from farming patches." -value: 8 -stackable: false -tool_type: rake diff --git a/data/items/ranarr.yaml b/data/items/ranarr.yaml deleted file mode 100644 index 683cce6..0000000 --- a/data/items/ranarr.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ranarr -name: "ranarr" -color: "48" -description: "A clean ranarr leaf, ready for use in pharmacy." -value: 35 -stackable: true diff --git a/data/items/ranarr_potion_unf.yaml b/data/items/ranarr_potion_unf.yaml deleted file mode 100644 index 373abb6..0000000 --- a/data/items/ranarr_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: ranarr_potion_unf -name: "ranarr potion (unf)" -color: "48" -description: "An unfinished potion with ranarr floating in water." -value: 38 -stackable: false -made_from: - - items: [ranarr] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/ranarr_seed.yaml b/data/items/ranarr_seed.yaml deleted file mode 100644 index ef54c0d..0000000 --- a/data/items/ranarr_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: ranarr_seed -name: ranarr seed -color: "28" -description: "A rare herb seed with potent alchemical properties." -value: 500 -stackable: true -farm_patch_type: herb -farm_level: 32 -farm_plant_xp: 27 -farm_harvest_xp: 31 -farm_stages: 4 -farm_product: ranarr -farm_min_yield: 3 -farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/raw_anchovies.yaml b/data/items/raw_anchovies.yaml deleted file mode 100644 index cf5b75f..0000000 --- a/data/items/raw_anchovies.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_anchovies -name: raw anchovies -color: "75" -description: "Some tiny raw anchovies." -value: 2 -stackable: false diff --git a/data/items/raw_anglerfish.yaml b/data/items/raw_anglerfish.yaml deleted file mode 100644 index b1c7262..0000000 --- a/data/items/raw_anglerfish.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_anglerfish -name: raw anglerfish -color: "80" -description: "An ugly but delicious raw anglerfish." -value: 20 -stackable: false diff --git a/data/items/raw_bass.yaml b/data/items/raw_bass.yaml deleted file mode 100644 index 34dddc1..0000000 --- a/data/items/raw_bass.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_bass -name: raw bass -color: "69" -description: "A freshly caught raw bass." -value: 10 -stackable: false diff --git a/data/items/raw_beef.yaml b/data/items/raw_beef.yaml deleted file mode 100644 index 59695b0..0000000 --- a/data/items/raw_beef.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_beef -name: raw beef -color: "196" -description: "A slab of raw beef." -value: 2 -stackable: false diff --git a/data/items/raw_cave_eel.yaml b/data/items/raw_cave_eel.yaml deleted file mode 100644 index 000f93c..0000000 --- a/data/items/raw_cave_eel.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_cave_eel -name: raw cave eel -color: "80" -description: "A pale eel from deep underground waters." -value: 12 -stackable: false diff --git a/data/items/raw_cod.yaml b/data/items/raw_cod.yaml deleted file mode 100644 index fe94f35..0000000 --- a/data/items/raw_cod.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_cod -name: raw cod -color: "69" -description: "A freshly caught raw cod." -value: 6 -stackable: false diff --git a/data/items/raw_herring.yaml b/data/items/raw_herring.yaml deleted file mode 100644 index 730eca5..0000000 --- a/data/items/raw_herring.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_herring -name: raw herring -color: "75" -description: "A freshly caught raw herring." -value: 5 -stackable: false diff --git a/data/items/raw_lobster.yaml b/data/items/raw_lobster.yaml deleted file mode 100644 index 908c931..0000000 --- a/data/items/raw_lobster.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_lobster -name: raw lobster -color: "33" -description: "A freshly caught raw lobster." -value: 15 -stackable: false diff --git a/data/items/raw_mackerel.yaml b/data/items/raw_mackerel.yaml deleted file mode 100644 index 42e1d09..0000000 --- a/data/items/raw_mackerel.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_mackerel -name: raw mackerel -color: "69" -description: "A freshly caught raw mackerel." -value: 4 -stackable: false diff --git a/data/items/raw_pike.yaml b/data/items/raw_pike.yaml deleted file mode 100644 index 625c019..0000000 --- a/data/items/raw_pike.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_pike -name: raw pike -color: "69" -description: "A freshly caught raw pike." -value: 8 -stackable: false diff --git a/data/items/raw_rainbow_fish.yaml b/data/items/raw_rainbow_fish.yaml deleted file mode 100644 index 311c9f1..0000000 --- a/data/items/raw_rainbow_fish.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_rainbow_fish -name: raw rainbow fish -color: "177" -description: "A shimmering raw rainbow fish." -value: 10 -stackable: false diff --git a/data/items/raw_salmon.yaml b/data/items/raw_salmon.yaml deleted file mode 100644 index d5ae9bd..0000000 --- a/data/items/raw_salmon.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_salmon -name: raw salmon -color: "69" -description: "A freshly caught raw salmon." -value: 8 -stackable: false diff --git a/data/items/raw_sardine.yaml b/data/items/raw_sardine.yaml deleted file mode 100644 index d27a155..0000000 --- a/data/items/raw_sardine.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_sardine -name: raw sardine -color: "75" -description: "A freshly caught raw sardine." -value: 3 -stackable: false diff --git a/data/items/raw_shark.yaml b/data/items/raw_shark.yaml deleted file mode 100644 index 999ccb9..0000000 --- a/data/items/raw_shark.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_shark -name: raw shark -color: "27" -description: "A freshly caught raw shark." -value: 30 -stackable: false diff --git a/data/items/raw_shrimps.yaml b/data/items/raw_shrimps.yaml deleted file mode 100644 index 1127fda..0000000 --- a/data/items/raw_shrimps.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_shrimps -name: raw shrimps -color: "75" -description: "Some small raw shrimps." -value: 2 -stackable: false diff --git a/data/items/raw_slimy_eel.yaml b/data/items/raw_slimy_eel.yaml deleted file mode 100644 index 40820e5..0000000 --- a/data/items/raw_slimy_eel.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_slimy_eel -name: raw slimy eel -color: "108" -description: "A slippery raw eel covered in slime." -value: 10 -stackable: false diff --git a/data/items/raw_swordfish.yaml b/data/items/raw_swordfish.yaml deleted file mode 100644 index e162460..0000000 --- a/data/items/raw_swordfish.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_swordfish -name: raw swordfish -color: "33" -description: "A freshly caught raw swordfish." -value: 18 -stackable: false diff --git a/data/items/raw_trout.yaml b/data/items/raw_trout.yaml deleted file mode 100644 index c1d98aa..0000000 --- a/data/items/raw_trout.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_trout -name: raw trout -color: "69" -description: "A freshly caught trout. Needs cooking." -value: 3 -stackable: false diff --git a/data/items/raw_tuna.yaml b/data/items/raw_tuna.yaml deleted file mode 100644 index 6079f92..0000000 --- a/data/items/raw_tuna.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: raw_tuna -name: raw tuna -color: "33" -description: "A freshly caught raw tuna." -value: 12 -stackable: false diff --git a/data/items/redwood_logs.yaml b/data/items/redwood_logs.yaml deleted file mode 100644 index 5ea1ab0..0000000 --- a/data/items/redwood_logs.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: redwood_logs -name: redwood logs -color: "131" -description: "Some rare redwood logs." -value: 100 -stackable: false -fire_level: 90 -fire_xp: 350 -burn_ticks: 60 diff --git a/data/items/restoration_compound.yaml b/data/items/restoration_compound.yaml deleted file mode 100644 index 913153f..0000000 --- a/data/items/restoration_compound.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: restoration_compound -name: "restoration compound" -color: "51" -description: "A teal compound that enhances all combat capabilities." -value: 250 -stackable: false -potion_effect: "all_combat" -potion_bonus: 15 -potion_duration: 150 diff --git a/data/items/ring_mould.yaml b/data/items/ring_mould.yaml deleted file mode 100644 index d7846c8..0000000 --- a/data/items/ring_mould.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: ring_mould -name: ring mould -color: "250" -description: "A mould for casting rings." -value: 5 diff --git a/data/items/ring_of_dueling.yaml b/data/items/ring_of_dueling.yaml deleted file mode 100644 index 0c11e87..0000000 --- a/data/items/ring_of_dueling.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ring_of_dueling -name: ring of dueling -color: "34" -description: "An enchanted emerald ring used for teleporting to dueling arenas." -value: 1000 -equip_slot: ring diff --git a/data/items/ring_of_forging.yaml b/data/items/ring_of_forging.yaml deleted file mode 100644 index d0792a1..0000000 --- a/data/items/ring_of_forging.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ring_of_forging -name: ring of forging -color: "196" -description: "An enchanted ruby ring that prevents ore from failing to smelt." -value: 2000 -equip_slot: ring diff --git a/data/items/ring_of_life.yaml b/data/items/ring_of_life.yaml deleted file mode 100644 index ab0b6e3..0000000 --- a/data/items/ring_of_life.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ring_of_life -name: ring of life -color: "255" -description: "An enchanted diamond ring that teleports you to safety when your HP drops critically low." -value: 5000 -equip_slot: ring diff --git a/data/items/ring_of_recoil.yaml b/data/items/ring_of_recoil.yaml deleted file mode 100644 index c143f68..0000000 --- a/data/items/ring_of_recoil.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ring_of_recoil -name: ring of recoil -color: "39" -description: "An enchanted sapphire ring that reflects a portion of melee damage back to the attacker." -value: 500 -equip_slot: ring diff --git a/data/items/ruby.yaml b/data/items/ruby.yaml deleted file mode 100644 index 644e1bf..0000000 --- a/data/items/ruby.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ruby -name: ruby -color: "196" -description: "A beautifully cut ruby." -value: 200 -stackable: false diff --git a/data/items/ruby_amulet_u.yaml b/data/items/ruby_amulet_u.yaml deleted file mode 100644 index 031bf8b..0000000 --- a/data/items/ruby_amulet_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: ruby_amulet_u -name: ruby amulet (u) -color: "196" -description: "An unstrung gold amulet set with a ruby." -value: 145 diff --git a/data/items/ruby_bolt_tips.yaml b/data/items/ruby_bolt_tips.yaml deleted file mode 100644 index 6ebe1a0..0000000 --- a/data/items/ruby_bolt_tips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ruby_bolt_tips -name: ruby bolt tips -color: "196" -description: "Bolt tips cut from a ruby." -value: 100 -stackable: true diff --git a/data/items/ruby_bolts.yaml b/data/items/ruby_bolts.yaml deleted file mode 100644 index b83bec2..0000000 --- a/data/items/ruby_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: ruby_bolts -name: ruby bolts -color: "196" -description: "Bolts tipped with ruby. Can be enchanted via science." -value: 75 -stackable: true -equip_slot: ammo -stats: - ranged_attack: 7 diff --git a/data/items/ruby_bolts_e.yaml b/data/items/ruby_bolts_e.yaml deleted file mode 100644 index 14954c2..0000000 --- a/data/items/ruby_bolts_e.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: ruby_bolts_e -name: ruby bolts e -color: "196 bold" -description: "Enchanted ruby-tipped bolts. Have a chance to deal extra damage based on the target's remaining HP." -value: 100 -stackable: true -equip_slot: ammo -stats: - ranged_attack: 8 diff --git a/data/items/ruby_bracelet.yaml b/data/items/ruby_bracelet.yaml deleted file mode 100644 index e5f3f70..0000000 --- a/data/items/ruby_bracelet.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ruby_bracelet -name: ruby bracelet -color: "196" -description: "A bracelet set with a ruby. Can be enchanted." -value: 800 -equip_slot: hands diff --git a/data/items/ruby_necklace.yaml b/data/items/ruby_necklace.yaml deleted file mode 100644 index e181777..0000000 --- a/data/items/ruby_necklace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ruby_necklace -name: ruby necklace -color: "196" -description: "A necklace set with a ruby. Can be enchanted." -value: 850 -equip_slot: neck diff --git a/data/items/ruby_ring.yaml b/data/items/ruby_ring.yaml deleted file mode 100644 index cb0cfde..0000000 --- a/data/items/ruby_ring.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: ruby_ring -name: ruby ring -color: "196" -description: "A ring set with a ruby. Can be enchanted." -value: 800 -equip_slot: ring diff --git a/data/items/rune_arrow.yaml b/data/items/rune_arrow.yaml deleted file mode 100644 index b00e922..0000000 --- a/data/items/rune_arrow.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: rune_arrow -name: rune arrow -color: "87" -description: "A rune-tipped arrow." -value: 40 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 49 diff --git a/data/items/rune_arrowtips.yaml b/data/items/rune_arrowtips.yaml deleted file mode 100644 index c2d80e0..0000000 --- a/data/items/rune_arrowtips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: rune_arrowtips -name: rune arrowtips -color: "87" -description: "A set of rune arrowtips." -value: 30 -stackable: true diff --git a/data/items/rune_axe.yaml b/data/items/rune_axe.yaml deleted file mode 100644 index a694bdf..0000000 --- a/data/items/rune_axe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: rune_axe -name: rune axe -color: "87" -description: "A sturdy rune axe, good for woodcutting." -value: 5000 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: -2 - slash_attack: 38 - crush_attack: 29 - strength_bonus: 32 -speed: 5 -tool_type: axe -tool_speed: 1.5 -requirements: - attack: 40 diff --git a/data/items/rune_bolts.yaml b/data/items/rune_bolts.yaml deleted file mode 100644 index 82ac597..0000000 --- a/data/items/rune_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: rune_bolts -name: rune bolts -color: "87" -description: "Rune crossbow bolts." -value: 48 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 55 diff --git a/data/items/rune_bolts_unf.yaml b/data/items/rune_bolts_unf.yaml deleted file mode 100644 index ecaf494..0000000 --- a/data/items/rune_bolts_unf.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: rune_bolts_unf -name: rune bolts (unf) -color: "87" -description: "Unfinished rune crossbow bolts." -value: 40 -stackable: true diff --git a/data/items/rune_dagger.yaml b/data/items/rune_dagger.yaml deleted file mode 100644 index 9e8507b..0000000 --- a/data/items/rune_dagger.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: rune_dagger -name: rune dagger -color: "87" -description: "A small rune dagger." -value: 5000 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 30 - slash_attack: 18 - crush_attack: -1 - strength_bonus: 24 -speed: 3 -requirements: - attack: 40 diff --git a/data/items/rune_full_helm.yaml b/data/items/rune_full_helm.yaml deleted file mode 100644 index 87d6973..0000000 --- a/data/items/rune_full_helm.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: rune_full_helm -name: rune full helm -color: "87" -description: "A rune full helmet." -value: 12000 -stackable: false -equip_slot: head -stats: - stab_defense: 30 - slash_defense: 33 - crush_defense: 22 - science_defense: -11 - ranged_defense: 30 -requirements: - defense: 40 diff --git a/data/items/rune_med_helm.yaml b/data/items/rune_med_helm.yaml deleted file mode 100644 index 895d257..0000000 --- a/data/items/rune_med_helm.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: rune_med_helm -name: rune med helm -color: "87" -description: "A rune medium helmet." -value: 5000 -stackable: false -equip_slot: head -stats: - stab_defense: 19 - slash_defense: 22 - crush_defense: 13 - science_defense: -4 - ranged_defense: 19 -requirements: - defense: 40 diff --git a/data/items/rune_nails.yaml b/data/items/rune_nails.yaml deleted file mode 100644 index 5d2dfc5..0000000 --- a/data/items/rune_nails.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: rune_nails -name: rune nails -color: "87" -description: "A set of rune nails." -value: 30 -stackable: true diff --git a/data/items/rune_pickaxe.yaml b/data/items/rune_pickaxe.yaml deleted file mode 100644 index 265231d..0000000 --- a/data/items/rune_pickaxe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: rune_pickaxe -name: rune pickaxe -color: "87" -description: "A sturdy rune pickaxe, good for mining." -value: 5000 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 30 - slash_attack: -2 - crush_attack: 14 - strength_bonus: 22 -speed: 5 -tool_type: pickaxe -tool_speed: 0.5 -requirements: - attack: 40 diff --git a/data/items/rune_platebody.yaml b/data/items/rune_platebody.yaml deleted file mode 100644 index d1e5fb1..0000000 --- a/data/items/rune_platebody.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: rune_platebody -name: rune platebody -color: "87" -description: "A rune platebody." -value: 40000 -stackable: false -equip_slot: torso -stats: - stab_defense: 65 - slash_defense: 72 - crush_defense: 52 - science_defense: -30 - ranged_defense: 65 -requirements: - defense: 40 diff --git a/data/items/rune_sword.yaml b/data/items/rune_sword.yaml deleted file mode 100644 index e0bfb74..0000000 --- a/data/items/rune_sword.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: rune_sword -name: rune sword -color: "87" -description: "A rune sword." -value: 10000 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: 27 - slash_attack: 52 - crush_attack: -2 - strength_bonus: 36 -speed: 4 -requirements: - attack: 40 diff --git a/data/items/runite_bar.yaml b/data/items/runite_bar.yaml deleted file mode 100644 index 1faff69..0000000 --- a/data/items/runite_bar.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: runite_bar -name: runite bar -color: "39" -description: "A bar of runite metal, the finest alloy known." -value: 500 -stackable: false diff --git a/data/items/runite_ore.yaml b/data/items/runite_ore.yaml deleted file mode 100644 index 05d3248..0000000 --- a/data/items/runite_ore.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: runite_ore -name: runite ore -color: "87" -description: "A rare piece of light blue runite ore." -value: 500 -stackable: false diff --git a/data/items/sacred_eel.yaml b/data/items/sacred_eel.yaml deleted file mode 100644 index 9a03940..0000000 --- a/data/items/sacred_eel.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: sacred_eel -name: sacred eel -color: "177" -description: "A glowing eel imbued with sacred energy." -value: 25 -stackable: false diff --git a/data/items/salmon.yaml b/data/items/salmon.yaml deleted file mode 100644 index 59b8237..0000000 --- a/data/items/salmon.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: salmon -name: salmon -color: "209" -description: "A nicely cooked salmon." -value: 10 -stackable: false -heal_value: 9 -eat_message: "You eat the salmon. Savory and satisfying!" diff --git a/data/items/salt.yaml b/data/items/salt.yaml deleted file mode 100644 index d9c1b2a..0000000 --- a/data/items/salt.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: salt -name: salt -color: "255" -description: "A packet of coarse industrial salt. Used to destroy slugs." -value: 5 -stackable: true diff --git a/data/items/sapphire.yaml b/data/items/sapphire.yaml deleted file mode 100644 index 9710d45..0000000 --- a/data/items/sapphire.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: sapphire -name: sapphire -color: "69" -description: "A beautifully cut sapphire." -value: 50 -stackable: false diff --git a/data/items/sapphire_amulet_u.yaml b/data/items/sapphire_amulet_u.yaml deleted file mode 100644 index 22ef39c..0000000 --- a/data/items/sapphire_amulet_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: sapphire_amulet_u -name: sapphire amulet (u) -color: "69" -description: "An unstrung gold amulet set with a sapphire." -value: 100 diff --git a/data/items/sapphire_bolt_tips.yaml b/data/items/sapphire_bolt_tips.yaml deleted file mode 100644 index 7513fd3..0000000 --- a/data/items/sapphire_bolt_tips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: sapphire_bolt_tips -name: sapphire bolt tips -color: "69" -description: "Bolt tips cut from a sapphire." -value: 25 -stackable: true diff --git a/data/items/sapphire_bolts.yaml b/data/items/sapphire_bolts.yaml deleted file mode 100644 index a7102c9..0000000 --- a/data/items/sapphire_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: sapphire_bolts -name: sapphire bolts -color: "39" -description: "Bolts tipped with sapphire. Can be enchanted via science." -value: 20 -stackable: true -equip_slot: ammo -stats: - ranged_attack: 3 diff --git a/data/items/sapphire_bolts_e.yaml b/data/items/sapphire_bolts_e.yaml deleted file mode 100644 index dc378cc..0000000 --- a/data/items/sapphire_bolts_e.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: sapphire_bolts_e -name: sapphire bolts e -color: "39 bold" -description: "Enchanted sapphire-tipped bolts. Have a chance to drain the target's Science level." -value: 30 -stackable: true -equip_slot: ammo -stats: - ranged_attack: 4 diff --git a/data/items/sapphire_bracelet.yaml b/data/items/sapphire_bracelet.yaml deleted file mode 100644 index a2996eb..0000000 --- a/data/items/sapphire_bracelet.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: sapphire_bracelet -name: sapphire bracelet -color: "39" -description: "A bracelet set with a sapphire. Can be enchanted." -value: 200 -equip_slot: hands diff --git a/data/items/sapphire_necklace.yaml b/data/items/sapphire_necklace.yaml deleted file mode 100644 index e553973..0000000 --- a/data/items/sapphire_necklace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: sapphire_necklace -name: sapphire necklace -color: "39" -description: "A necklace set with a sapphire. Can be enchanted." -value: 250 -equip_slot: neck diff --git a/data/items/sapphire_ring.yaml b/data/items/sapphire_ring.yaml deleted file mode 100644 index 40e8cc5..0000000 --- a/data/items/sapphire_ring.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: sapphire_ring -name: sapphire ring -color: "39" -description: "A ring set with a sapphire. Can be enchanted." -value: 200 -equip_slot: ring diff --git a/data/items/sardine.yaml b/data/items/sardine.yaml deleted file mode 100644 index c11b42b..0000000 --- a/data/items/sardine.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: sardine -name: sardine -color: "209" -description: "A nicely cooked sardine." -value: 5 -stackable: false -heal_value: 4 -eat_message: "You eat the sardine." diff --git a/data/items/saw.yaml b/data/items/saw.yaml deleted file mode 100644 index 4a7ad6a..0000000 --- a/data/items/saw.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: saw -name: saw -tool_type: saw -color: "152" -description: "A sharp-toothed saw for cutting planks from logs at a workbench." -value: 30 -stackable: false diff --git a/data/items/science_serum.yaml b/data/items/science_serum.yaml deleted file mode 100644 index e78f915..0000000 --- a/data/items/science_serum.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: science_serum -name: "science serum" -color: "141" -description: "A violet serum that heightens scientific cognition." -value: 200 -stackable: false -potion_effect: "science" -potion_bonus: 10 -potion_duration: 200 diff --git a/data/items/scrap_metal.yaml b/data/items/scrap_metal.yaml deleted file mode 100644 index d9b805e..0000000 --- a/data/items/scrap_metal.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: scrap_metal -name: scrap metal -color: "243" -description: "A chunk of salvaged scrap metal." -value: 2 -stackable: false diff --git a/data/items/seeds/avantoe_seed.yaml b/data/items/seeds/avantoe_seed.yaml new file mode 100644 index 0000000..fb7b427 --- /dev/null +++ b/data/items/seeds/avantoe_seed.yaml @@ -0,0 +1,14 @@ +id: avantoe_seed +name: avantoe seed +color: "34" +description: "An avantoe seed for planting in a herb patch." +value: 60 +stackable: true +farm_patch_type: herb +farm_level: 50 +farm_plant_xp: 55 +farm_harvest_xp: 62 +farm_stages: 4 +farm_product: avantoe +farm_min_yield: 3 +farm_max_yield: 10 diff --git a/data/items/seeds/cabbage_seed.yaml b/data/items/seeds/cabbage_seed.yaml new file mode 100644 index 0000000..8a6db33 --- /dev/null +++ b/data/items/seeds/cabbage_seed.yaml @@ -0,0 +1,14 @@ +id: cabbage_seed +name: cabbage seed +color: "71" +description: "A seed for growing cabbages." +value: 2 +stackable: true +farm_patch_type: allotment +farm_level: 7 +farm_plant_xp: 10 +farm_harvest_xp: 12 +farm_stages: 4 +farm_product: cabbage +farm_min_yield: 3 +farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/seeds/cadantine_seed.yaml b/data/items/seeds/cadantine_seed.yaml new file mode 100644 index 0000000..8326033 --- /dev/null +++ b/data/items/seeds/cadantine_seed.yaml @@ -0,0 +1,14 @@ +id: cadantine_seed +name: cadantine seed +color: "30" +description: "A cadantine seed for planting in a herb patch." +value: 120 +stackable: true +farm_patch_type: herb +farm_level: 67 +farm_plant_xp: 97 +farm_harvest_xp: 120 +farm_stages: 4 +farm_product: cadantine +farm_min_yield: 3 +farm_max_yield: 9 diff --git a/data/items/seeds/dwarf_weed_seed.yaml b/data/items/seeds/dwarf_weed_seed.yaml new file mode 100644 index 0000000..c8ba6f2 --- /dev/null +++ b/data/items/seeds/dwarf_weed_seed.yaml @@ -0,0 +1,14 @@ +id: dwarf_weed_seed +name: dwarf weed seed +color: "100" +description: "A dwarf weed seed for planting in a herb patch." +value: 140 +stackable: true +farm_patch_type: herb +farm_level: 79 +farm_plant_xp: 120 +farm_harvest_xp: 150 +farm_stages: 4 +farm_product: dwarf_weed +farm_min_yield: 3 +farm_max_yield: 8 diff --git a/data/items/seeds/guam_seed.yaml b/data/items/seeds/guam_seed.yaml new file mode 100644 index 0000000..b55e1a8 --- /dev/null +++ b/data/items/seeds/guam_seed.yaml @@ -0,0 +1,14 @@ +id: guam_seed +name: guam seed +color: "34" +description: "A guam seed for planting in a herb patch." +value: 1 +stackable: true +farm_patch_type: herb +farm_level: 9 +farm_plant_xp: 11 +farm_harvest_xp: 13 +farm_stages: 4 +farm_product: guam +farm_min_yield: 3 +farm_max_yield: 12 diff --git a/data/items/seeds/harralander_seed.yaml b/data/items/seeds/harralander_seed.yaml new file mode 100644 index 0000000..5be3571 --- /dev/null +++ b/data/items/seeds/harralander_seed.yaml @@ -0,0 +1,14 @@ +id: harralander_seed +name: harralander seed +color: "70" +description: "A harralander seed for planting in a herb patch." +value: 5 +stackable: true +farm_patch_type: herb +farm_level: 26 +farm_plant_xp: 22 +farm_harvest_xp: 24 +farm_stages: 4 +farm_product: harralander +farm_min_yield: 3 +farm_max_yield: 12 diff --git a/data/items/seeds/irit_seed.yaml b/data/items/seeds/irit_seed.yaml new file mode 100644 index 0000000..4b8bad2 --- /dev/null +++ b/data/items/seeds/irit_seed.yaml @@ -0,0 +1,14 @@ +id: irit_seed +name: irit seed +color: "114" +description: "An irit seed for planting in a herb patch." +value: 40 +stackable: true +farm_patch_type: herb +farm_level: 44 +farm_plant_xp: 43 +farm_harvest_xp: 49 +farm_stages: 4 +farm_product: irit +farm_min_yield: 3 +farm_max_yield: 10 diff --git a/data/items/seeds/kwuarm_seed.yaml b/data/items/seeds/kwuarm_seed.yaml new file mode 100644 index 0000000..053c2f3 --- /dev/null +++ b/data/items/seeds/kwuarm_seed.yaml @@ -0,0 +1,14 @@ +id: kwuarm_seed +name: kwuarm seed +color: "178" +description: "A kwuarm seed for planting in a herb patch." +value: 80 +stackable: true +farm_patch_type: herb +farm_level: 56 +farm_plant_xp: 69 +farm_harvest_xp: 78 +farm_stages: 4 +farm_product: kwuarm +farm_min_yield: 3 +farm_max_yield: 9 diff --git a/data/items/seeds/lantadyme_seed.yaml b/data/items/seeds/lantadyme_seed.yaml new file mode 100644 index 0000000..f4be89c --- /dev/null +++ b/data/items/seeds/lantadyme_seed.yaml @@ -0,0 +1,14 @@ +id: lantadyme_seed +name: lantadyme seed +color: "36" +description: "A lantadyme seed for planting in a herb patch." +value: 130 +stackable: true +farm_patch_type: herb +farm_level: 73 +farm_plant_xp: 105 +farm_harvest_xp: 135 +farm_stages: 4 +farm_product: lantadyme +farm_min_yield: 3 +farm_max_yield: 8 diff --git a/data/items/seeds/marrentill_seed.yaml b/data/items/seeds/marrentill_seed.yaml new file mode 100644 index 0000000..4b42353 --- /dev/null +++ b/data/items/seeds/marrentill_seed.yaml @@ -0,0 +1,14 @@ +id: marrentill_seed +name: marrentill seed +color: "34" +description: "A marrentill seed for planting in a herb patch." +value: 2 +stackable: true +farm_patch_type: herb +farm_level: 14 +farm_plant_xp: 14 +farm_harvest_xp: 15 +farm_stages: 4 +farm_product: marrentill +farm_min_yield: 3 +farm_max_yield: 12 diff --git a/data/items/seeds/onion_seed.yaml b/data/items/seeds/onion_seed.yaml new file mode 100644 index 0000000..a1231ad --- /dev/null +++ b/data/items/seeds/onion_seed.yaml @@ -0,0 +1,14 @@ +id: onion_seed +name: onion seed +color: "229" +description: "A seed for growing onions." +value: 2 +stackable: true +farm_patch_type: allotment +farm_level: 5 +farm_plant_xp: 10 +farm_harvest_xp: 11 +farm_stages: 4 +farm_product: onion +farm_min_yield: 3 +farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/seeds/potato_seed.yaml b/data/items/seeds/potato_seed.yaml new file mode 100644 index 0000000..9daee8a --- /dev/null +++ b/data/items/seeds/potato_seed.yaml @@ -0,0 +1,14 @@ +id: potato_seed +name: potato seed +color: "94" +description: "A seed for growing potatoes." +value: 2 +stackable: true +farm_patch_type: allotment +farm_level: 1 +farm_plant_xp: 8 +farm_harvest_xp: 9 +farm_stages: 4 +farm_product: potato +farm_min_yield: 3 +farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/seeds/ranarr_seed.yaml b/data/items/seeds/ranarr_seed.yaml new file mode 100644 index 0000000..ef54c0d --- /dev/null +++ b/data/items/seeds/ranarr_seed.yaml @@ -0,0 +1,14 @@ +id: ranarr_seed +name: ranarr seed +color: "28" +description: "A rare herb seed with potent alchemical properties." +value: 500 +stackable: true +farm_patch_type: herb +farm_level: 32 +farm_plant_xp: 27 +farm_harvest_xp: 31 +farm_stages: 4 +farm_product: ranarr +farm_min_yield: 3 +farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/seeds/snapdragon_seed.yaml b/data/items/seeds/snapdragon_seed.yaml new file mode 100644 index 0000000..06f2a9e --- /dev/null +++ b/data/items/seeds/snapdragon_seed.yaml @@ -0,0 +1,14 @@ +id: snapdragon_seed +name: snapdragon seed +color: "161" +description: "A bright red snapdragon seed, prized by pharma-crafters." +value: 750 +stackable: true +farm_patch_type: herb +farm_level: 62 +farm_plant_xp: 82 +farm_harvest_xp: 99 +farm_stages: 4 +farm_product: snapdragon +farm_min_yield: 3 +farm_max_yield: 9 \ No newline at end of file diff --git a/data/items/seeds/strawberry_seed.yaml b/data/items/seeds/strawberry_seed.yaml new file mode 100644 index 0000000..8b2f45c --- /dev/null +++ b/data/items/seeds/strawberry_seed.yaml @@ -0,0 +1,14 @@ +id: strawberry_seed +name: strawberry seed +color: "197" +description: "A seed for growing strawberries." +value: 40 +stackable: true +farm_patch_type: allotment +farm_level: 31 +farm_plant_xp: 26 +farm_harvest_xp: 29 +farm_stages: 4 +farm_product: strawberry +farm_min_yield: 3 +farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/seeds/sweetcorn_seed.yaml b/data/items/seeds/sweetcorn_seed.yaml new file mode 100644 index 0000000..d85b35b --- /dev/null +++ b/data/items/seeds/sweetcorn_seed.yaml @@ -0,0 +1,14 @@ +id: sweetcorn_seed +name: sweetcorn seed +color: "226" +description: "A seed for growing sweetcorn." +value: 25 +stackable: true +farm_patch_type: allotment +farm_level: 20 +farm_plant_xp: 17 +farm_harvest_xp: 19 +farm_stages: 4 +farm_product: sweetcorn +farm_min_yield: 3 +farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/seeds/tarromin_seed.yaml b/data/items/seeds/tarromin_seed.yaml new file mode 100644 index 0000000..c10483a --- /dev/null +++ b/data/items/seeds/tarromin_seed.yaml @@ -0,0 +1,14 @@ +id: tarromin_seed +name: tarromin seed +color: "34" +description: "A tarromin seed for planting in a herb patch." +value: 3 +stackable: true +farm_patch_type: herb +farm_level: 19 +farm_plant_xp: 18 +farm_harvest_xp: 18 +farm_stages: 4 +farm_product: tarromin +farm_min_yield: 3 +farm_max_yield: 12 diff --git a/data/items/seeds/toadflax_seed.yaml b/data/items/seeds/toadflax_seed.yaml new file mode 100644 index 0000000..1ef6cb2 --- /dev/null +++ b/data/items/seeds/toadflax_seed.yaml @@ -0,0 +1,14 @@ +id: toadflax_seed +name: toadflax seed +color: "106" +description: "A toadflax seed for planting in a herb patch." +value: 50 +stackable: true +farm_patch_type: herb +farm_level: 38 +farm_plant_xp: 34 +farm_harvest_xp: 39 +farm_stages: 4 +farm_product: toadflax +farm_min_yield: 3 +farm_max_yield: 10 diff --git a/data/items/seeds/tomato_seed.yaml b/data/items/seeds/tomato_seed.yaml new file mode 100644 index 0000000..c1db131 --- /dev/null +++ b/data/items/seeds/tomato_seed.yaml @@ -0,0 +1,14 @@ +id: tomato_seed +name: tomato seed +color: "196" +description: "A seed for growing tomatoes." +value: 3 +stackable: true +farm_patch_type: allotment +farm_level: 12 +farm_plant_xp: 13 +farm_harvest_xp: 14 +farm_stages: 4 +farm_product: tomato +farm_min_yield: 3 +farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/seeds/torstol_seed.yaml b/data/items/seeds/torstol_seed.yaml new file mode 100644 index 0000000..2dfd60c --- /dev/null +++ b/data/items/seeds/torstol_seed.yaml @@ -0,0 +1,14 @@ +id: torstol_seed +name: torstol seed +color: "46" +description: "The rarest of herb seeds. Worth a small fortune." +value: 5000 +stackable: true +farm_patch_type: herb +farm_level: 85 +farm_plant_xp: 142 +farm_harvest_xp: 200 +farm_stages: 4 +farm_product: torstol +farm_min_yield: 3 +farm_max_yield: 8 \ No newline at end of file diff --git a/data/items/seeds/watermelon_seed.yaml b/data/items/seeds/watermelon_seed.yaml new file mode 100644 index 0000000..7ea59c6 --- /dev/null +++ b/data/items/seeds/watermelon_seed.yaml @@ -0,0 +1,14 @@ +id: watermelon_seed +name: watermelon seed +color: "34" +description: "A seed for growing watermelons." +value: 80 +stackable: true +farm_patch_type: allotment +farm_level: 47 +farm_plant_xp: 49 +farm_harvest_xp: 55 +farm_stages: 4 +farm_product: watermelon +farm_min_yield: 3 +farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/shears.yaml b/data/items/shears.yaml deleted file mode 100644 index 4166be3..0000000 --- a/data/items/shears.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: shears -name: shears -color: "250" -description: "A pair of shears for shearing sheep." -value: 5 -tool_type: shears diff --git a/data/items/shield_potion.yaml b/data/items/shield_potion.yaml deleted file mode 100644 index 4cd91e8..0000000 --- a/data/items/shield_potion.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: shield_potion -name: "shield potion" -color: "21" -description: "A deep blue potion that reinforces defensive capability." -value: 85 -stackable: false -potion_effect: "defense" -potion_bonus: 10 -potion_duration: 200 diff --git a/data/items/shortbow.yaml b/data/items/shortbow.yaml deleted file mode 100644 index ecd3630..0000000 --- a/data/items/shortbow.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: shortbow -name: shortbow -color: "137" -description: "A shortbow." -value: 10 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 4 -stats: - ranged_attack: 8 diff --git a/data/items/shortbow_u.yaml b/data/items/shortbow_u.yaml deleted file mode 100644 index 6ffcafc..0000000 --- a/data/items/shortbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: shortbow_u -name: shortbow (u) -color: "137" -description: "An unstrung shortbow." -value: 5 diff --git a/data/items/shrimps.yaml b/data/items/shrimps.yaml deleted file mode 100644 index 9c280c8..0000000 --- a/data/items/shrimps.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: shrimps -name: shrimps -color: "209" -description: "Some nicely cooked shrimps." -value: 5 -stackable: false -heal_value: 3 -eat_message: "You eat the shrimps. Tasty!" diff --git a/data/items/silver_bar.yaml b/data/items/silver_bar.yaml deleted file mode 100644 index eccb25f..0000000 --- a/data/items/silver_bar.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: silver_bar -name: silver bar -color: "255" -description: "A bar of silver metal." -value: 20 -stackable: false diff --git a/data/items/silver_ore.yaml b/data/items/silver_ore.yaml deleted file mode 100644 index 5b40ff0..0000000 --- a/data/items/silver_ore.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: silver_ore -name: silver ore -color: "253" -description: "A piece of silver ore with a faint metallic sheen." -value: 10 -stackable: false diff --git a/data/items/slug_mucus.yaml b/data/items/slug_mucus.yaml deleted file mode 100644 index 620038a..0000000 --- a/data/items/slug_mucus.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: slug_mucus -name: slug mucus -color: "82" -description: "A glob of toxic slug mucus. Unpleasant." -value: 5 -stackable: false diff --git a/data/items/small_fishing_net.yaml b/data/items/small_fishing_net.yaml deleted file mode 100644 index 9e91f8f..0000000 --- a/data/items/small_fishing_net.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: small_fishing_net -name: small fishing net -color: "230" -description: "A small hand-held fishing net." -value: 5 -stackable: false -equip_slot: main_hand -weapon_type: melee -stats: - attack_bonus: 0 - strength_bonus: 0 - defense_bonus: 0 -speed: 5 -tool_type: small_net -tool_speed: 0 diff --git a/data/items/snapdragon.yaml b/data/items/snapdragon.yaml deleted file mode 100644 index 0c3ba2f..0000000 --- a/data/items/snapdragon.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: snapdragon -name: "snapdragon" -color: "48" -description: "A clean snapdragon leaf, ready for use in pharmacy." -value: 65 -stackable: true diff --git a/data/items/snapdragon_potion_unf.yaml b/data/items/snapdragon_potion_unf.yaml deleted file mode 100644 index ac3aba3..0000000 --- a/data/items/snapdragon_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: snapdragon_potion_unf -name: "snapdragon potion (unf)" -color: "48" -description: "An unfinished potion with snapdragon floating in water." -value: 68 -stackable: false -made_from: - - items: [snapdragon] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/snapdragon_seed.yaml b/data/items/snapdragon_seed.yaml deleted file mode 100644 index 06f2a9e..0000000 --- a/data/items/snapdragon_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: snapdragon_seed -name: snapdragon seed -color: "161" -description: "A bright red snapdragon seed, prized by pharma-crafters." -value: 750 -stackable: true -farm_patch_type: herb -farm_level: 62 -farm_plant_xp: 82 -farm_harvest_xp: 99 -farm_stages: 4 -farm_product: snapdragon -farm_min_yield: 3 -farm_max_yield: 9 \ No newline at end of file diff --git a/data/items/snape_grass.yaml b/data/items/snape_grass.yaml deleted file mode 100644 index 59a9b30..0000000 --- a/data/items/snape_grass.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: snape_grass -name: "snape grass" -color: "120" -description: "A long blade of snape grass. It crackles with faint static charge." -value: 10 -stackable: false diff --git a/data/items/soft_clay.yaml b/data/items/soft_clay.yaml deleted file mode 100644 index 1ba07e3..0000000 --- a/data/items/soft_clay.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: soft_clay -name: soft clay -color: "173" -description: "Soft, workable clay ready for shaping on a pottery wheel." -value: 2 -stackable: false -ticks: 2 -made_from: - - items: [clay] - qty: 1 - - items: [bucket_of_water, jug_of_water] - qty: 1 - byproducts: [empty_bucket, empty_jug] diff --git a/data/items/solar_deck.yaml b/data/items/solar_deck.yaml deleted file mode 100644 index 72b7e9e..0000000 --- a/data/items/solar_deck.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: solar_deck -name: solar deck -color: "220" -description: "A programmable deck pulsing with solar energy. Provides unlimited solarjunk and removes the scrap requirement." -value: 1500 -equip_slot: main_hand -weapon_type: science -speed: 5 -stats: - science_attack: 10 -provides_junk: solarjunk diff --git a/data/items/solar_identifier.yaml b/data/items/solar_identifier.yaml deleted file mode 100644 index 663bd9f..0000000 --- a/data/items/solar_identifier.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: solar_identifier -name: solar identifier -color: "220" -description: "A handheld scanner calibrated to isolate solar-frequency signatures in scrap metal. Required to produce solarjunk at a solar altar." -value: 500 diff --git a/data/items/solarjunk.yaml b/data/items/solarjunk.yaml deleted file mode 100644 index ab4d5d5..0000000 --- a/data/items/solarjunk.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: solarjunk -name: solarjunk -color: "220" -description: "A fragment of reclaimed solar circuitry. Used as a universal energy medium." -value: 10 -stackable: true diff --git a/data/items/spade.yaml b/data/items/spade.yaml deleted file mode 100644 index 7d0b465..0000000 --- a/data/items/spade.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: spade -name: spade -color: "241" -description: "A metal spade used for planting seeds and harvesting crops." -value: 8 -stackable: false -tool_type: spade diff --git a/data/items/spectral_visor.yaml b/data/items/spectral_visor.yaml deleted file mode 100644 index 851a929..0000000 --- a/data/items/spectral_visor.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: spectral_visor -name: spectral visor -color: "141" -description: "A visor fitted with spectral frequency filters. Dampens psychic attacks from phantoms." -value: 75 -stackable: false -equip_slot: head -stats: - defense_bonus: 2 diff --git a/data/items/steel_arrow.yaml b/data/items/steel_arrow.yaml deleted file mode 100644 index e14171f..0000000 --- a/data/items/steel_arrow.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: steel_arrow -name: steel arrow -color: "253" -description: "A steel-tipped arrow." -value: 5 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 16 diff --git a/data/items/steel_arrowtips.yaml b/data/items/steel_arrowtips.yaml deleted file mode 100644 index 49000d2..0000000 --- a/data/items/steel_arrowtips.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: steel_arrowtips -name: steel arrowtips -color: "253" -description: "A set of steel arrowtips." -value: 4 -stackable: true diff --git a/data/items/steel_axe.yaml b/data/items/steel_axe.yaml deleted file mode 100644 index 6f2ac99..0000000 --- a/data/items/steel_axe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: steel_axe -name: steel axe -color: "253" -description: "A sturdy steel axe, good for woodcutting." -value: 75 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: -2 - slash_attack: 15 - crush_attack: 11 - strength_bonus: 12 -speed: 5 -tool_type: axe -tool_speed: 3 -requirements: - attack: 5 diff --git a/data/items/steel_bar.yaml b/data/items/steel_bar.yaml deleted file mode 100644 index 450fd5c..0000000 --- a/data/items/steel_bar.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: steel_bar -name: steel bar -color: "254" -description: "A bar of steel, forged from iron ore and coal." -value: 30 -stackable: false diff --git a/data/items/steel_bolts.yaml b/data/items/steel_bolts.yaml deleted file mode 100644 index 7dfadf1..0000000 --- a/data/items/steel_bolts.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: steel_bolts -name: steel bolts -color: "253" -description: "Steel crossbow bolts." -value: 6 -stackable: true -equip_slot: ammo -stats: - ranged_strength: 25 diff --git a/data/items/steel_bolts_unf.yaml b/data/items/steel_bolts_unf.yaml deleted file mode 100644 index b65d5fa..0000000 --- a/data/items/steel_bolts_unf.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: steel_bolts_unf -name: steel bolts (unf) -color: "253" -description: "Unfinished steel crossbow bolts." -value: 5 -stackable: true diff --git a/data/items/steel_dagger.yaml b/data/items/steel_dagger.yaml deleted file mode 100644 index e52b882..0000000 --- a/data/items/steel_dagger.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: steel_dagger -name: steel dagger -color: "253" -description: "A small steel dagger." -value: 60 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 12 - slash_attack: 7 - crush_attack: -1 - strength_bonus: 10 -speed: 3 -requirements: - attack: 5 diff --git a/data/items/steel_full_helm.yaml b/data/items/steel_full_helm.yaml deleted file mode 100644 index 7152ded..0000000 --- a/data/items/steel_full_helm.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: steel_full_helm -name: steel full helm -color: "253" -description: "A steel full helmet." -value: 150 -stackable: false -equip_slot: head -stats: - stab_defense: 12 - slash_defense: 13 - crush_defense: 9 - science_defense: -5 - ranged_defense: 12 -requirements: - defense: 5 diff --git a/data/items/steel_med_helm.yaml b/data/items/steel_med_helm.yaml deleted file mode 100644 index 9e15fdd..0000000 --- a/data/items/steel_med_helm.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: steel_med_helm -name: steel med helm -color: "253" -description: "A steel medium helmet." -value: 60 -stackable: false -equip_slot: head -stats: - stab_defense: 7 - slash_defense: 9 - crush_defense: 5 - science_defense: -2 - ranged_defense: 7 -requirements: - defense: 5 diff --git a/data/items/steel_nails.yaml b/data/items/steel_nails.yaml deleted file mode 100644 index 4890d18..0000000 --- a/data/items/steel_nails.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: steel_nails -name: steel nails -color: "253" -description: "A set of steel nails." -value: 4 -stackable: true diff --git a/data/items/steel_pickaxe.yaml b/data/items/steel_pickaxe.yaml deleted file mode 100644 index cc048a1..0000000 --- a/data/items/steel_pickaxe.yaml +++ /dev/null @@ -1,19 +0,0 @@ -id: steel_pickaxe -name: steel pickaxe -color: "253" -description: "A sturdy steel pickaxe, good for mining." -value: 75 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: stab -stats: - stab_attack: 10 - slash_attack: -2 - crush_attack: 4 - strength_bonus: 7 -speed: 5 -tool_type: pickaxe -tool_speed: 1.25 -requirements: - attack: 5 diff --git a/data/items/steel_platebody.yaml b/data/items/steel_platebody.yaml deleted file mode 100644 index f44dfa3..0000000 --- a/data/items/steel_platebody.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: steel_platebody -name: steel platebody -color: "253" -description: "A steel platebody." -value: 500 -stackable: false -equip_slot: torso -stats: - stab_defense: 27 - slash_defense: 32 - crush_defense: 22 - science_defense: -15 - ranged_defense: 27 -requirements: - defense: 5 diff --git a/data/items/steel_sword.yaml b/data/items/steel_sword.yaml deleted file mode 100644 index e096dc9..0000000 --- a/data/items/steel_sword.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: steel_sword -name: steel sword -color: "253" -description: "A steel sword." -value: 100 -stackable: false -equip_slot: main_hand -weapon_type: melee -attack_type: slash -stats: - stab_attack: 10 - slash_attack: 22 - crush_attack: -2 - strength_bonus: 14 -speed: 4 -requirements: - attack: 5 diff --git a/data/items/stim_cell.yaml b/data/items/stim_cell.yaml deleted file mode 100644 index b431532..0000000 --- a/data/items/stim_cell.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: stim_cell -name: "stim cell" -color: "226" -description: "A bright yellow energy supplement that restores stamina." -value: 65 -stackable: false -potion_effect: "battery" -potion_bonus: 25 -potion_duration: 0 diff --git a/data/items/stim_potion.yaml b/data/items/stim_potion.yaml deleted file mode 100644 index de51291..0000000 --- a/data/items/stim_potion.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: stim_potion -name: "stim potion" -color: "196" -description: "A bubbling red potion that temporarily boosts attack capability." -value: 30 -stackable: false -potion_effect: "attack" -potion_bonus: 10 -potion_duration: 200 diff --git a/data/items/strawberry.yaml b/data/items/strawberry.yaml deleted file mode 100644 index 337a65e..0000000 --- a/data/items/strawberry.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: strawberry -name: strawberry -color: "197" -description: "A freshly harvested strawberry." -value: 10 -stackable: true -heal_value: 3 -eat_message: "You eat the strawberry." diff --git a/data/items/strawberry_seed.yaml b/data/items/strawberry_seed.yaml deleted file mode 100644 index 8b2f45c..0000000 --- a/data/items/strawberry_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: strawberry_seed -name: strawberry seed -color: "197" -description: "A seed for growing strawberries." -value: 40 -stackable: true -farm_patch_type: allotment -farm_level: 31 -farm_plant_xp: 26 -farm_harvest_xp: 29 -farm_stages: 4 -farm_product: strawberry -farm_min_yield: 3 -farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/super_amp.yaml b/data/items/super_amp.yaml deleted file mode 100644 index 3bea59b..0000000 --- a/data/items/super_amp.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: super_amp -name: "super amp" -color: "220" -description: "A concentrated gold potion that significantly amplifies physical strength." -value: 155 -stackable: false -potion_effect: "strength" -potion_bonus: 20 -potion_duration: 200 diff --git a/data/items/super_bio_serum.yaml b/data/items/super_bio_serum.yaml deleted file mode 100644 index fbc5ebe..0000000 --- a/data/items/super_bio_serum.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: super_bio_serum -name: "super bio serum" -color: "48" -description: "A concentrated green serum that powerfully restores health." -value: 130 -stackable: false -potion_effect: "heal" -potion_bonus: 120 -potion_duration: 0 diff --git a/data/items/super_shield.yaml b/data/items/super_shield.yaml deleted file mode 100644 index 7545b2e..0000000 --- a/data/items/super_shield.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: super_shield -name: "super shield" -color: "21" -description: "A concentrated blue potion that provides significant defensive enhancement." -value: 175 -stackable: false -potion_effect: "defense" -potion_bonus: 20 -potion_duration: 200 diff --git a/data/items/super_stim.yaml b/data/items/super_stim.yaml deleted file mode 100644 index c290c5f..0000000 --- a/data/items/super_stim.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: super_stim -name: "super stim" -color: "196" -description: "A potent red potion that dramatically boosts attack capability." -value: 120 -stackable: false -potion_effect: "attack" -potion_bonus: 20 -potion_duration: 200 diff --git a/data/items/super_stim_cell.yaml b/data/items/super_stim_cell.yaml deleted file mode 100644 index 1f25597..0000000 --- a/data/items/super_stim_cell.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: super_stim_cell -name: "super stim cell" -color: "226" -description: "A concentrated yellow energy supplement that fully restores stamina." -value: 140 -stackable: false -potion_effect: "battery" -potion_bonus: 50 -potion_duration: 0 diff --git a/data/items/sweetcorn.yaml b/data/items/sweetcorn.yaml deleted file mode 100644 index 32f5a70..0000000 --- a/data/items/sweetcorn.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: sweetcorn -name: sweetcorn -color: "226" -description: "A freshly harvested ear of sweetcorn." -value: 6 -stackable: true -heal_value: 2 -eat_message: "You eat the sweetcorn." diff --git a/data/items/sweetcorn_seed.yaml b/data/items/sweetcorn_seed.yaml deleted file mode 100644 index d85b35b..0000000 --- a/data/items/sweetcorn_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: sweetcorn_seed -name: sweetcorn seed -color: "226" -description: "A seed for growing sweetcorn." -value: 25 -stackable: true -farm_patch_type: allotment -farm_level: 20 -farm_plant_xp: 17 -farm_harvest_xp: 19 -farm_stages: 4 -farm_product: sweetcorn -farm_min_yield: 3 -farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/targeting_serum.yaml b/data/items/targeting_serum.yaml deleted file mode 100644 index b10ebc5..0000000 --- a/data/items/targeting_serum.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: targeting_serum -name: "targeting serum" -color: "202" -description: "A pink serum that sharpens ranged targeting." -value: 190 -stackable: false -potion_effect: "ranged" -potion_bonus: 10 -potion_duration: 200 diff --git a/data/items/tarromin.yaml b/data/items/tarromin.yaml deleted file mode 100644 index 5af2573..0000000 --- a/data/items/tarromin.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: tarromin -name: "tarromin" -color: "48" -description: "A clean tarromin leaf, ready for use in pharmacy." -value: 10 -stackable: true diff --git a/data/items/tarromin_potion_unf.yaml b/data/items/tarromin_potion_unf.yaml deleted file mode 100644 index 6a3fab6..0000000 --- a/data/items/tarromin_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: tarromin_potion_unf -name: "tarromin potion (unf)" -color: "48" -description: "An unfinished potion with tarromin floating in water." -value: 12 -stackable: false -made_from: - - items: [tarromin] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/tarromin_seed.yaml b/data/items/tarromin_seed.yaml deleted file mode 100644 index c10483a..0000000 --- a/data/items/tarromin_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: tarromin_seed -name: tarromin seed -color: "34" -description: "A tarromin seed for planting in a herb patch." -value: 3 -stackable: true -farm_patch_type: herb -farm_level: 19 -farm_plant_xp: 18 -farm_harvest_xp: 18 -farm_stages: 4 -farm_product: tarromin -farm_min_yield: 3 -farm_max_yield: 12 diff --git a/data/items/teak_logs.yaml b/data/items/teak_logs.yaml deleted file mode 100644 index c69f807..0000000 --- a/data/items/teak_logs.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: teak_logs -name: teak logs -color: "179" -description: "Some solid teak logs." -value: 12 -stackable: false -fire_level: 35 -fire_xp: 105 -burn_ticks: 36 diff --git a/data/items/teak_planks.yaml b/data/items/teak_planks.yaml deleted file mode 100644 index f0a0642..0000000 --- a/data/items/teak_planks.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: teak_planks -name: teak planks -color: "100" -description: "Fine teak planks with a rich grain." -value: 80 -stackable: false diff --git a/data/items/teak_table.yaml b/data/items/teak_table.yaml deleted file mode 100644 index 5c2c5c5..0000000 --- a/data/items/teak_table.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: teak_table -name: teak table -color: "100" -description: "An elegant teak table with a polished surface." -value: 160 -stackable: false diff --git a/data/items/tech_serum.yaml b/data/items/tech_serum.yaml deleted file mode 100644 index aac3fdc..0000000 --- a/data/items/tech_serum.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: tech_serum -name: "tech serum" -color: "75" -description: "A cyan serum that enhances technology interface." -value: 100 -stackable: false -potion_effect: "technology" -potion_bonus: 10 -potion_duration: 200 diff --git a/data/items/thread.yaml b/data/items/thread.yaml deleted file mode 100644 index 3a9a4f7..0000000 --- a/data/items/thread.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: thread -name: thread -color: "230" -description: "A spool of thread used for leatherworking." -value: 1 -stackable: true diff --git a/data/items/tin_ore.yaml b/data/items/tin_ore.yaml deleted file mode 100644 index 0ae1cd0..0000000 --- a/data/items/tin_ore.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: tin_ore -name: tin ore -color: "253" -description: "A lump of tin ore, ready for smelting." -value: 3 -stackable: false diff --git a/data/items/toadflax.yaml b/data/items/toadflax.yaml deleted file mode 100644 index 0de8f01..0000000 --- a/data/items/toadflax.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: toadflax -name: "toadflax" -color: "48" -description: "A clean toadflax leaf, ready for use in pharmacy." -value: 25 -stackable: true diff --git a/data/items/toadflax_potion_unf.yaml b/data/items/toadflax_potion_unf.yaml deleted file mode 100644 index ca2a123..0000000 --- a/data/items/toadflax_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: toadflax_potion_unf -name: "toadflax potion (unf)" -color: "48" -description: "An unfinished potion with toadflax floating in water." -value: 28 -stackable: false -made_from: - - items: [toadflax] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/toadflax_seed.yaml b/data/items/toadflax_seed.yaml deleted file mode 100644 index 1ef6cb2..0000000 --- a/data/items/toadflax_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: toadflax_seed -name: toadflax seed -color: "106" -description: "A toadflax seed for planting in a herb patch." -value: 50 -stackable: true -farm_patch_type: herb -farm_level: 38 -farm_plant_xp: 34 -farm_harvest_xp: 39 -farm_stages: 4 -farm_product: toadflax -farm_min_yield: 3 -farm_max_yield: 10 diff --git a/data/items/tomato.yaml b/data/items/tomato.yaml deleted file mode 100644 index d2ad349..0000000 --- a/data/items/tomato.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: tomato -name: tomato -color: "196" -description: "A freshly harvested tomato." -value: 4 -stackable: true -heal_value: 2 -eat_message: "You eat the tomato." diff --git a/data/items/tomato_seed.yaml b/data/items/tomato_seed.yaml deleted file mode 100644 index c1db131..0000000 --- a/data/items/tomato_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: tomato_seed -name: tomato seed -color: "196" -description: "A seed for growing tomatoes." -value: 3 -stackable: true -farm_patch_type: allotment -farm_level: 12 -farm_plant_xp: 13 -farm_harvest_xp: 14 -farm_stages: 4 -farm_product: tomato -farm_min_yield: 3 -farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/tools/adamant_axe.yaml b/data/items/tools/adamant_axe.yaml new file mode 100644 index 0000000..81232fe --- /dev/null +++ b/data/items/tools/adamant_axe.yaml @@ -0,0 +1,19 @@ +id: adamant_axe +name: adamant axe +color: "120" +description: "A sturdy adamant axe, good for woodcutting." +value: 500 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: -2 + slash_attack: 29 + crush_attack: 22 + strength_bonus: 24 +speed: 5 +tool_type: axe +tool_speed: 2 +requirements: + attack: 30 diff --git a/data/items/tools/adamant_pickaxe.yaml b/data/items/tools/adamant_pickaxe.yaml new file mode 100644 index 0000000..4296b0d --- /dev/null +++ b/data/items/tools/adamant_pickaxe.yaml @@ -0,0 +1,19 @@ +id: adamant_pickaxe +name: adamant pickaxe +color: "120" +description: "A sturdy adamant pickaxe, good for mining." +value: 500 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 23 + slash_attack: -2 + crush_attack: 10 + strength_bonus: 16 +speed: 5 +tool_type: pickaxe +tool_speed: 0.75 +requirements: + attack: 30 diff --git a/data/items/tools/amulet_mould.yaml b/data/items/tools/amulet_mould.yaml new file mode 100644 index 0000000..a8153cb --- /dev/null +++ b/data/items/tools/amulet_mould.yaml @@ -0,0 +1,5 @@ +id: amulet_mould +name: amulet mould +color: "250" +description: "A mould for casting amulets." +value: 5 diff --git a/data/items/tools/big_fishing_net.yaml b/data/items/tools/big_fishing_net.yaml new file mode 100644 index 0000000..a8b5352 --- /dev/null +++ b/data/items/tools/big_fishing_net.yaml @@ -0,0 +1,15 @@ +id: big_fishing_net +name: big fishing net +color: "230" +description: "A larger fishing net for catching bigger fish." +value: 20 +stackable: false +equip_slot: main_hand +weapon_type: melee +stats: + attack_bonus: 0 + strength_bonus: 0 + defense_bonus: 0 +speed: 5 +tool_type: big_net +tool_speed: 1 diff --git a/data/items/tools/black_pickaxe.yaml b/data/items/tools/black_pickaxe.yaml new file mode 100644 index 0000000..c3df955 --- /dev/null +++ b/data/items/tools/black_pickaxe.yaml @@ -0,0 +1,19 @@ +id: black_pickaxe +name: black pickaxe +color: "240" +description: "A black pickaxe, good for mining." +value: 150 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 14 + slash_attack: -2 + crush_attack: 6 + strength_bonus: 9 +speed: 5 +tool_type: pickaxe +tool_speed: 1 +requirements: + attack: 10 diff --git a/data/items/tools/bracelet_mould.yaml b/data/items/tools/bracelet_mould.yaml new file mode 100644 index 0000000..78bc099 --- /dev/null +++ b/data/items/tools/bracelet_mould.yaml @@ -0,0 +1,5 @@ +id: bracelet_mould +name: bracelet mould +color: "250" +description: "A mould for casting bracelets." +value: 5 diff --git a/data/items/tools/bronze_axe.yaml b/data/items/tools/bronze_axe.yaml new file mode 100644 index 0000000..84b2762 --- /dev/null +++ b/data/items/tools/bronze_axe.yaml @@ -0,0 +1,17 @@ +id: bronze_axe +name: bronze axe +color: "178" +description: "A sturdy bronze axe, good for woodcutting." +value: 10 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: -2 + slash_attack: 7 + crush_attack: 5 + strength_bonus: 5 +speed: 5 +tool_type: axe +tool_speed: 4 diff --git a/data/items/tools/bronze_pickaxe.yaml b/data/items/tools/bronze_pickaxe.yaml new file mode 100644 index 0000000..b581fc0 --- /dev/null +++ b/data/items/tools/bronze_pickaxe.yaml @@ -0,0 +1,17 @@ +id: bronze_pickaxe +name: bronze pickaxe +color: "178" +description: "A sturdy bronze pickaxe, good for mining." +value: 10 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 4 + slash_attack: -2 + crush_attack: 2 + strength_bonus: 3 +speed: 5 +tool_type: pickaxe +tool_speed: 2 diff --git a/data/items/tools/chisel.yaml b/data/items/tools/chisel.yaml new file mode 100644 index 0000000..a99c828 --- /dev/null +++ b/data/items/tools/chisel.yaml @@ -0,0 +1,6 @@ +id: chisel +name: chisel +color: "250" +description: "A chisel used for cutting gems." +value: 5 +tool_type: chisel diff --git a/data/items/tools/dragon_pickaxe.yaml b/data/items/tools/dragon_pickaxe.yaml new file mode 100644 index 0000000..6f187b8 --- /dev/null +++ b/data/items/tools/dragon_pickaxe.yaml @@ -0,0 +1,19 @@ +id: dragon_pickaxe +name: dragon pickaxe +color: "196" +description: "A powerful dragon pickaxe." +value: 50000 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 34 + slash_attack: -2 + crush_attack: 16 + strength_bonus: 26 +speed: 5 +tool_type: pickaxe +tool_speed: 0.25 +requirements: + attack: 60 diff --git a/data/items/tools/empty_bucket.yaml b/data/items/tools/empty_bucket.yaml new file mode 100644 index 0000000..6debb02 --- /dev/null +++ b/data/items/tools/empty_bucket.yaml @@ -0,0 +1,6 @@ +id: empty_bucket +name: empty bucket +color: "137" +description: "An empty wooden bucket." +value: 1 +stackable: false diff --git a/data/items/tools/empty_jug.yaml b/data/items/tools/empty_jug.yaml new file mode 100644 index 0000000..c6774a5 --- /dev/null +++ b/data/items/tools/empty_jug.yaml @@ -0,0 +1,6 @@ +id: empty_jug +name: empty jug +color: "137" +description: "An empty ceramic jug." +value: 1 +stackable: false diff --git a/data/items/tools/empty_pot.yaml b/data/items/tools/empty_pot.yaml new file mode 100644 index 0000000..a57b441 --- /dev/null +++ b/data/items/tools/empty_pot.yaml @@ -0,0 +1,6 @@ +id: empty_pot +name: empty pot +color: "130" +description: "An empty clay pot." +value: 1 +stackable: false diff --git a/data/items/tools/firesteel.yaml b/data/items/tools/firesteel.yaml new file mode 100644 index 0000000..b3f9302 --- /dev/null +++ b/data/items/tools/firesteel.yaml @@ -0,0 +1,8 @@ +id: firesteel +name: firesteel +color: "250" +description: "A rugged firesteel that never wears out." +value: 20 +stackable: false +tool_type: fire +tool_speed: 4 diff --git a/data/items/tools/fishing_bait.yaml b/data/items/tools/fishing_bait.yaml new file mode 100644 index 0000000..2336a7d --- /dev/null +++ b/data/items/tools/fishing_bait.yaml @@ -0,0 +1,6 @@ +id: fishing_bait +name: fishing bait +color: "222" +description: "A handful of wriggling bait. Used with a fishing rod." +value: 1 +stackable: true diff --git a/data/items/tools/fishing_rod.yaml b/data/items/tools/fishing_rod.yaml new file mode 100644 index 0000000..a48c0a1 --- /dev/null +++ b/data/items/tools/fishing_rod.yaml @@ -0,0 +1,15 @@ +id: fishing_rod +name: fishing rod +color: "107" +description: "A simple fishing rod. Use with fishing bait." +value: 5 +stackable: false +equip_slot: main_hand +weapon_type: melee +stats: + attack_bonus: 0 + strength_bonus: 0 + defense_bonus: 0 +speed: 5 +tool_type: fishing_rod +tool_speed: 0 diff --git a/data/items/tools/fly_fishing_rod.yaml b/data/items/tools/fly_fishing_rod.yaml new file mode 100644 index 0000000..c0f3f78 --- /dev/null +++ b/data/items/tools/fly_fishing_rod.yaml @@ -0,0 +1,15 @@ +id: fly_fishing_rod +name: fly fishing rod +color: "107" +description: "A flexible rod for fly fishing with artificial flies." +value: 20 +stackable: false +equip_slot: main_hand +weapon_type: melee +stats: + attack_bonus: 0 + strength_bonus: 0 + defense_bonus: 0 +speed: 5 +tool_type: fly_rod +tool_speed: 1 diff --git a/data/items/tools/hammer.yaml b/data/items/tools/hammer.yaml new file mode 100644 index 0000000..74302a4 --- /dev/null +++ b/data/items/tools/hammer.yaml @@ -0,0 +1,7 @@ +id: hammer +name: hammer +color: "250" +description: "A sturdy hammer for smithing metal on an anvil." +value: 10 +stackable: false +tool_type: hammer diff --git a/data/items/tools/harpoon.yaml b/data/items/tools/harpoon.yaml new file mode 100644 index 0000000..1412d5c --- /dev/null +++ b/data/items/tools/harpoon.yaml @@ -0,0 +1,15 @@ +id: harpoon +name: harpoon +color: "250" +description: "A barbed harpoon for spearing large fish." +value: 30 +stackable: false +equip_slot: main_hand +weapon_type: melee +stats: + attack_bonus: 0 + strength_bonus: 0 + defense_bonus: 0 +speed: 5 +tool_type: harpoon +tool_speed: 0 diff --git a/data/items/tools/iron_axe.yaml b/data/items/tools/iron_axe.yaml new file mode 100644 index 0000000..3f989ca --- /dev/null +++ b/data/items/tools/iron_axe.yaml @@ -0,0 +1,17 @@ +id: iron_axe +name: iron axe +color: "250" +description: "A sturdy iron axe, good for woodcutting." +value: 25 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: -2 + slash_attack: 10 + crush_attack: 7 + strength_bonus: 8 +speed: 5 +tool_type: axe +tool_speed: 3.5 diff --git a/data/items/tools/iron_pickaxe.yaml b/data/items/tools/iron_pickaxe.yaml new file mode 100644 index 0000000..d120fde --- /dev/null +++ b/data/items/tools/iron_pickaxe.yaml @@ -0,0 +1,17 @@ +id: iron_pickaxe +name: iron pickaxe +color: "250" +description: "A sturdy iron pickaxe, good for mining." +value: 25 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 7 + slash_attack: -2 + crush_attack: 3 + strength_bonus: 5 +speed: 5 +tool_type: pickaxe +tool_speed: 1.5 diff --git a/data/items/tools/knife.yaml b/data/items/tools/knife.yaml new file mode 100644 index 0000000..fddf120 --- /dev/null +++ b/data/items/tools/knife.yaml @@ -0,0 +1,6 @@ +id: knife +name: knife +color: "250" +description: "A small knife used for cutting wood and fletching." +value: 5 +tool_type: knife diff --git a/data/items/tools/lighter.yaml b/data/items/tools/lighter.yaml new file mode 100644 index 0000000..567f42e --- /dev/null +++ b/data/items/tools/lighter.yaml @@ -0,0 +1,11 @@ +id: lighter +name: lighter +color: "81" +description: "A reliable butane lighter." +value: 15 +stackable: false +equip_slot: main_hand +tool_type: fire +tool_speed: 4 +quality: 100 +max_quality: 100 diff --git a/data/items/tools/lobster_pot.yaml b/data/items/tools/lobster_pot.yaml new file mode 100644 index 0000000..79771c1 --- /dev/null +++ b/data/items/tools/lobster_pot.yaml @@ -0,0 +1,15 @@ +id: lobster_pot +name: lobster pot +color: "250" +description: "A wire cage for trapping lobsters." +value: 20 +stackable: false +equip_slot: main_hand +weapon_type: melee +stats: + attack_bonus: 0 + strength_bonus: 0 + defense_bonus: 0 +speed: 5 +tool_type: lobster_pot +tool_speed: 0 diff --git a/data/items/tools/matches.yaml b/data/items/tools/matches.yaml new file mode 100644 index 0000000..d816cbc --- /dev/null +++ b/data/items/tools/matches.yaml @@ -0,0 +1,9 @@ +id: matches +name: matches +color: "196" +description: "A small box of matches for starting fires." +value: 5 +stackable: true +equip_slot: main_hand +tool_type: fire +tool_speed: 4 diff --git a/data/items/tools/mithril_axe.yaml b/data/items/tools/mithril_axe.yaml new file mode 100644 index 0000000..ca18195 --- /dev/null +++ b/data/items/tools/mithril_axe.yaml @@ -0,0 +1,19 @@ +id: mithril_axe +name: mithril axe +color: "75" +description: "A sturdy mithril axe, good for woodcutting." +value: 200 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: -2 + slash_attack: 21 + crush_attack: 16 + strength_bonus: 17 +speed: 5 +tool_type: axe +tool_speed: 2.5 +requirements: + attack: 20 diff --git a/data/items/tools/mithril_pickaxe.yaml b/data/items/tools/mithril_pickaxe.yaml new file mode 100644 index 0000000..5da6937 --- /dev/null +++ b/data/items/tools/mithril_pickaxe.yaml @@ -0,0 +1,19 @@ +id: mithril_pickaxe +name: mithril pickaxe +color: "75" +description: "A sturdy mithril pickaxe, good for mining." +value: 200 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 17 + slash_attack: -2 + crush_attack: 8 + strength_bonus: 12 +speed: 5 +tool_type: pickaxe +tool_speed: 1 +requirements: + attack: 20 diff --git a/data/items/tools/necklace_mould.yaml b/data/items/tools/necklace_mould.yaml new file mode 100644 index 0000000..bc4df45 --- /dev/null +++ b/data/items/tools/necklace_mould.yaml @@ -0,0 +1,5 @@ +id: necklace_mould +name: necklace mould +color: "250" +description: "A mould for casting necklaces." +value: 5 diff --git a/data/items/tools/needle.yaml b/data/items/tools/needle.yaml new file mode 100644 index 0000000..5f53bf3 --- /dev/null +++ b/data/items/tools/needle.yaml @@ -0,0 +1,6 @@ +id: needle +name: needle +color: "250" +description: "A needle for crafting leather goods." +value: 5 +tool_type: needle diff --git a/data/items/tools/plant_pot.yaml b/data/items/tools/plant_pot.yaml new file mode 100644 index 0000000..2f81e08 --- /dev/null +++ b/data/items/tools/plant_pot.yaml @@ -0,0 +1,5 @@ +id: plant_pot +name: plant pot +color: "130" +description: "A clay plant pot for growing plants." +value: 5 diff --git a/data/items/tools/rake.yaml b/data/items/tools/rake.yaml new file mode 100644 index 0000000..5949626 --- /dev/null +++ b/data/items/tools/rake.yaml @@ -0,0 +1,7 @@ +id: rake +name: rake +color: "94" +description: "A sturdy rake for clearing weeds and dead plants from farming patches." +value: 8 +stackable: false +tool_type: rake diff --git a/data/items/tools/ring_mould.yaml b/data/items/tools/ring_mould.yaml new file mode 100644 index 0000000..d7846c8 --- /dev/null +++ b/data/items/tools/ring_mould.yaml @@ -0,0 +1,5 @@ +id: ring_mould +name: ring mould +color: "250" +description: "A mould for casting rings." +value: 5 diff --git a/data/items/tools/rune_axe.yaml b/data/items/tools/rune_axe.yaml new file mode 100644 index 0000000..a694bdf --- /dev/null +++ b/data/items/tools/rune_axe.yaml @@ -0,0 +1,19 @@ +id: rune_axe +name: rune axe +color: "87" +description: "A sturdy rune axe, good for woodcutting." +value: 5000 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: -2 + slash_attack: 38 + crush_attack: 29 + strength_bonus: 32 +speed: 5 +tool_type: axe +tool_speed: 1.5 +requirements: + attack: 40 diff --git a/data/items/tools/rune_pickaxe.yaml b/data/items/tools/rune_pickaxe.yaml new file mode 100644 index 0000000..265231d --- /dev/null +++ b/data/items/tools/rune_pickaxe.yaml @@ -0,0 +1,19 @@ +id: rune_pickaxe +name: rune pickaxe +color: "87" +description: "A sturdy rune pickaxe, good for mining." +value: 5000 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 30 + slash_attack: -2 + crush_attack: 14 + strength_bonus: 22 +speed: 5 +tool_type: pickaxe +tool_speed: 0.5 +requirements: + attack: 40 diff --git a/data/items/tools/saw.yaml b/data/items/tools/saw.yaml new file mode 100644 index 0000000..4a7ad6a --- /dev/null +++ b/data/items/tools/saw.yaml @@ -0,0 +1,7 @@ +id: saw +name: saw +tool_type: saw +color: "152" +description: "A sharp-toothed saw for cutting planks from logs at a workbench." +value: 30 +stackable: false diff --git a/data/items/tools/shears.yaml b/data/items/tools/shears.yaml new file mode 100644 index 0000000..4166be3 --- /dev/null +++ b/data/items/tools/shears.yaml @@ -0,0 +1,6 @@ +id: shears +name: shears +color: "250" +description: "A pair of shears for shearing sheep." +value: 5 +tool_type: shears diff --git a/data/items/tools/small_fishing_net.yaml b/data/items/tools/small_fishing_net.yaml new file mode 100644 index 0000000..9e91f8f --- /dev/null +++ b/data/items/tools/small_fishing_net.yaml @@ -0,0 +1,15 @@ +id: small_fishing_net +name: small fishing net +color: "230" +description: "A small hand-held fishing net." +value: 5 +stackable: false +equip_slot: main_hand +weapon_type: melee +stats: + attack_bonus: 0 + strength_bonus: 0 + defense_bonus: 0 +speed: 5 +tool_type: small_net +tool_speed: 0 diff --git a/data/items/tools/spade.yaml b/data/items/tools/spade.yaml new file mode 100644 index 0000000..7d0b465 --- /dev/null +++ b/data/items/tools/spade.yaml @@ -0,0 +1,7 @@ +id: spade +name: spade +color: "241" +description: "A metal spade used for planting seeds and harvesting crops." +value: 8 +stackable: false +tool_type: spade diff --git a/data/items/tools/steel_axe.yaml b/data/items/tools/steel_axe.yaml new file mode 100644 index 0000000..6f2ac99 --- /dev/null +++ b/data/items/tools/steel_axe.yaml @@ -0,0 +1,19 @@ +id: steel_axe +name: steel axe +color: "253" +description: "A sturdy steel axe, good for woodcutting." +value: 75 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: slash +stats: + stab_attack: -2 + slash_attack: 15 + crush_attack: 11 + strength_bonus: 12 +speed: 5 +tool_type: axe +tool_speed: 3 +requirements: + attack: 5 diff --git a/data/items/tools/steel_pickaxe.yaml b/data/items/tools/steel_pickaxe.yaml new file mode 100644 index 0000000..cc048a1 --- /dev/null +++ b/data/items/tools/steel_pickaxe.yaml @@ -0,0 +1,19 @@ +id: steel_pickaxe +name: steel pickaxe +color: "253" +description: "A sturdy steel pickaxe, good for mining." +value: 75 +stackable: false +equip_slot: main_hand +weapon_type: melee +attack_type: stab +stats: + stab_attack: 10 + slash_attack: -2 + crush_attack: 4 + strength_bonus: 7 +speed: 5 +tool_type: pickaxe +tool_speed: 1.25 +requirements: + attack: 5 diff --git a/data/items/tools/unfired_pie_dish.yaml b/data/items/tools/unfired_pie_dish.yaml new file mode 100644 index 0000000..fddc4d1 --- /dev/null +++ b/data/items/tools/unfired_pie_dish.yaml @@ -0,0 +1,5 @@ +id: unfired_pie_dish +name: unfired pie dish +color: "173" +description: "An unfired clay pie dish. It needs to be fired in a pottery oven." +value: 1 diff --git a/data/items/tools/unfired_plant_pot.yaml b/data/items/tools/unfired_plant_pot.yaml new file mode 100644 index 0000000..c088242 --- /dev/null +++ b/data/items/tools/unfired_plant_pot.yaml @@ -0,0 +1,5 @@ +id: unfired_plant_pot +name: unfired plant pot +color: "173" +description: "An unfired clay plant pot. It needs to be fired in a pottery oven." +value: 1 diff --git a/data/items/tools/unfired_pot.yaml b/data/items/tools/unfired_pot.yaml new file mode 100644 index 0000000..265a19f --- /dev/null +++ b/data/items/tools/unfired_pot.yaml @@ -0,0 +1,5 @@ +id: unfired_pot +name: unfired pot +color: "173" +description: "An unfired clay pot. It needs to be fired in a pottery oven." +value: 1 diff --git a/data/items/tools/watering_can.yaml b/data/items/tools/watering_can.yaml new file mode 100644 index 0000000..4a75de9 --- /dev/null +++ b/data/items/tools/watering_can.yaml @@ -0,0 +1,7 @@ +id: watering_can +name: watering can +color: "39" +description: "A watering can for hydrating farming patches. Watering eliminates disease risk." +value: 12 +stackable: false +tool_type: watering_can diff --git a/data/items/torstol.yaml b/data/items/torstol.yaml deleted file mode 100644 index a8b8fbb..0000000 --- a/data/items/torstol.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: torstol -name: "torstol" -color: "48" -description: "A clean torstol leaf, ready for use in pharmacy." -value: 100 -stackable: true diff --git a/data/items/torstol_potion_unf.yaml b/data/items/torstol_potion_unf.yaml deleted file mode 100644 index f5816d2..0000000 --- a/data/items/torstol_potion_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: torstol_potion_unf -name: "torstol potion (unf)" -color: "48" -description: "An unfinished potion with torstol floating in water." -value: 102 -stackable: false -made_from: - - items: [torstol] - qty: 1 - - items: [vial_of_water] - qty: 1 -ticks: 0 diff --git a/data/items/torstol_seed.yaml b/data/items/torstol_seed.yaml deleted file mode 100644 index 2dfd60c..0000000 --- a/data/items/torstol_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: torstol_seed -name: torstol seed -color: "46" -description: "The rarest of herb seeds. Worth a small fortune." -value: 5000 -stackable: true -farm_patch_type: herb -farm_level: 85 -farm_plant_xp: 142 -farm_harvest_xp: 200 -farm_stages: 4 -farm_product: torstol -farm_min_yield: 3 -farm_max_yield: 8 \ No newline at end of file diff --git a/data/items/trout.yaml b/data/items/trout.yaml deleted file mode 100644 index df6cdcc..0000000 --- a/data/items/trout.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: trout -name: trout -color: "209" -description: "A nicely cooked trout." -value: 8 -stackable: false -heal_value: 7 -eat_message: "You eat the trout. Delicious!" diff --git a/data/items/uncut_diamond.yaml b/data/items/uncut_diamond.yaml deleted file mode 100644 index cf41d70..0000000 --- a/data/items/uncut_diamond.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: uncut_diamond -name: uncut diamond -color: "255" -description: "An uncut diamond. Can be cut with a chisel." -value: 200 -stackable: false diff --git a/data/items/uncut_emerald.yaml b/data/items/uncut_emerald.yaml deleted file mode 100644 index 1ea217a..0000000 --- a/data/items/uncut_emerald.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: uncut_emerald -name: uncut emerald -color: "83" -description: "An uncut emerald. Can be cut with a chisel." -value: 50 -stackable: false diff --git a/data/items/uncut_ruby.yaml b/data/items/uncut_ruby.yaml deleted file mode 100644 index dfa8188..0000000 --- a/data/items/uncut_ruby.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: uncut_ruby -name: uncut ruby -color: "196" -description: "An uncut ruby. Can be cut with a chisel." -value: 100 -stackable: false diff --git a/data/items/uncut_sapphire.yaml b/data/items/uncut_sapphire.yaml deleted file mode 100644 index bf073fa..0000000 --- a/data/items/uncut_sapphire.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: uncut_sapphire -name: uncut sapphire -color: "69" -description: "An uncut sapphire. Can be cut with a chisel." -value: 25 -stackable: false diff --git a/data/items/unfired_pie_dish.yaml b/data/items/unfired_pie_dish.yaml deleted file mode 100644 index fddc4d1..0000000 --- a/data/items/unfired_pie_dish.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: unfired_pie_dish -name: unfired pie dish -color: "173" -description: "An unfired clay pie dish. It needs to be fired in a pottery oven." -value: 1 diff --git a/data/items/unfired_plant_pot.yaml b/data/items/unfired_plant_pot.yaml deleted file mode 100644 index c088242..0000000 --- a/data/items/unfired_plant_pot.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: unfired_plant_pot -name: unfired plant pot -color: "173" -description: "An unfired clay plant pot. It needs to be fired in a pottery oven." -value: 1 diff --git a/data/items/unfired_pot.yaml b/data/items/unfired_pot.yaml deleted file mode 100644 index 265a19f..0000000 --- a/data/items/unfired_pot.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: unfired_pot -name: unfired pot -color: "173" -description: "An unfired clay pot. It needs to be fired in a pottery oven." -value: 1 diff --git a/data/items/vial.yaml b/data/items/vial.yaml deleted file mode 100644 index 2a5260a..0000000 --- a/data/items/vial.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: vial -name: "vial" -color: "253" -description: "An empty glass vial." -value: 1 -stackable: false diff --git a/data/items/vial_of_water.yaml b/data/items/vial_of_water.yaml deleted file mode 100644 index c3e2995..0000000 --- a/data/items/vial_of_water.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: vial_of_water -name: "vial of water" -color: "39" -description: "A small glass vial filled with purified water. The base for all potions." -value: 2 -stackable: false diff --git a/data/items/watering_can.yaml b/data/items/watering_can.yaml deleted file mode 100644 index 4a75de9..0000000 --- a/data/items/watering_can.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: watering_can -name: watering can -color: "39" -description: "A watering can for hydrating farming patches. Watering eliminates disease risk." -value: 12 -stackable: false -tool_type: watering_can diff --git a/data/items/watermelon.yaml b/data/items/watermelon.yaml deleted file mode 100644 index 3374687..0000000 --- a/data/items/watermelon.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: watermelon -name: watermelon -color: "34" -description: "A freshly harvested watermelon." -value: 18 -stackable: true -heal_value: 4 -eat_message: "You eat the watermelon." diff --git a/data/items/watermelon_seed.yaml b/data/items/watermelon_seed.yaml deleted file mode 100644 index 7ea59c6..0000000 --- a/data/items/watermelon_seed.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: watermelon_seed -name: watermelon seed -color: "34" -description: "A seed for growing watermelons." -value: 80 -stackable: true -farm_patch_type: allotment -farm_level: 47 -farm_plant_xp: 49 -farm_harvest_xp: 55 -farm_stages: 4 -farm_product: watermelon -farm_min_yield: 3 -farm_max_yield: 10 \ No newline at end of file diff --git a/data/items/white_berries.yaml b/data/items/white_berries.yaml deleted file mode 100644 index bdaa993..0000000 --- a/data/items/white_berries.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: white_berries -name: "white berries" -color: "255" -description: "Pale berries from a hardy bush. They have defensive biochemical properties." -value: 10 -stackable: false diff --git a/data/items/willow_logs.yaml b/data/items/willow_logs.yaml deleted file mode 100644 index dbd315b..0000000 --- a/data/items/willow_logs.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: willow_logs -name: willow logs -color: "114" -description: "Some flexible willow logs." -value: 8 -stackable: false -fire_level: 30 -fire_xp: 90 -burn_ticks: 32 diff --git a/data/items/willow_longbow.yaml b/data/items/willow_longbow.yaml deleted file mode 100644 index e30528c..0000000 --- a/data/items/willow_longbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: willow_longbow -name: willow longbow -color: "107" -description: "A willow longbow." -value: 320 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 6 -stats: - ranged_attack: 20 -requirements: - ranged: 20 diff --git a/data/items/willow_longbow_u.yaml b/data/items/willow_longbow_u.yaml deleted file mode 100644 index 5e4e9da..0000000 --- a/data/items/willow_longbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: willow_longbow_u -name: willow longbow (u) -color: "107" -description: "An unstrung willow longbow." -value: 160 diff --git a/data/items/willow_shortbow.yaml b/data/items/willow_shortbow.yaml deleted file mode 100644 index f75cfe9..0000000 --- a/data/items/willow_shortbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: willow_shortbow -name: willow shortbow -color: "107" -description: "A willow shortbow." -value: 160 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 4 -stats: - ranged_attack: 20 -requirements: - ranged: 20 diff --git a/data/items/willow_shortbow_u.yaml b/data/items/willow_shortbow_u.yaml deleted file mode 100644 index b467455..0000000 --- a/data/items/willow_shortbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: willow_shortbow_u -name: willow shortbow (u) -color: "107" -description: "An unstrung willow shortbow." -value: 80 diff --git a/data/items/wooden_chair.yaml b/data/items/wooden_chair.yaml deleted file mode 100644 index 16220ef..0000000 --- a/data/items/wooden_chair.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: wooden_chair -name: wooden chair -color: "130" -description: "A comfortable wooden chair with a smooth finish." -value: 35 -stackable: false diff --git a/data/items/wooden_shelf.yaml b/data/items/wooden_shelf.yaml deleted file mode 100644 index 3b0d97d..0000000 --- a/data/items/wooden_shelf.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: wooden_shelf -name: wooden shelf -color: "130" -description: "A simple wooden shelf, useful for storing small items." -value: 40 -stackable: false diff --git a/data/items/wooden_table.yaml b/data/items/wooden_table.yaml deleted file mode 100644 index 171a9bb..0000000 --- a/data/items/wooden_table.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: wooden_table -name: wooden table -color: "130" -description: "A sturdy wooden table, perfect for dining or displaying objects." -value: 50 -stackable: false diff --git a/data/items/wool.yaml b/data/items/wool.yaml deleted file mode 100644 index f557aaf..0000000 --- a/data/items/wool.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: wool -name: wool -color: "255" -description: "A tuft of sheep's wool. Can be spun into a ball of wool." -value: 1 -stackable: false diff --git a/data/items/yew_logs.yaml b/data/items/yew_logs.yaml deleted file mode 100644 index a5a86a2..0000000 --- a/data/items/yew_logs.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: yew_logs -name: yew logs -color: "108" -description: "Some high-quality yew logs." -value: 40 -stackable: false -fire_level: 60 -fire_xp: 202 -burn_ticks: 48 diff --git a/data/items/yew_longbow.yaml b/data/items/yew_longbow.yaml deleted file mode 100644 index 1e7c0f5..0000000 --- a/data/items/yew_longbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: yew_longbow -name: yew longbow -color: "94" -description: "A yew longbow." -value: 2000 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 6 -stats: - ranged_attack: 47 -requirements: - ranged: 40 diff --git a/data/items/yew_longbow_u.yaml b/data/items/yew_longbow_u.yaml deleted file mode 100644 index ac4fdb2..0000000 --- a/data/items/yew_longbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: yew_longbow_u -name: yew longbow (u) -color: "94" -description: "An unstrung yew longbow." -value: 1000 diff --git a/data/items/yew_shortbow.yaml b/data/items/yew_shortbow.yaml deleted file mode 100644 index c302a38..0000000 --- a/data/items/yew_shortbow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: yew_shortbow -name: yew shortbow -color: "94" -description: "A yew shortbow." -value: 1600 -equip_slot: main_hand -weapon_type: ranged -attack_type: ranged -speed: 4 -stats: - ranged_attack: 47 -requirements: - ranged: 40 diff --git a/data/items/yew_shortbow_u.yaml b/data/items/yew_shortbow_u.yaml deleted file mode 100644 index 4c2124b..0000000 --- a/data/items/yew_shortbow_u.yaml +++ /dev/null @@ -1,5 +0,0 @@ -id: yew_shortbow_u -name: yew shortbow (u) -color: "94" -description: "An unstrung yew shortbow." -value: 800 diff --git a/data/mobs/estate_broker.yaml b/data/mobs/estate_broker.yaml index 6698730..a8b3ed7 100644 --- a/data/mobs/estate_broker.yaml +++ b/data/mobs/estate_broker.yaml @@ -20,8 +20,8 @@ talk: set_player_flags: owns_house_local_neighborhood: local_neighborhood condition: - not: - player_flag: owns_house_local_neighborhood + not: true + player_flag: owns_house_local_neighborhood next: purchased text: Sounds great! I'll buy one. - next: goodbye @@ -39,8 +39,8 @@ talk: set_player_flags: owns_house_local_neighborhood: local_neighborhood condition: - not: - player_flag: owns_house_local_neighborhood + not: true + player_flag: owns_house_local_neighborhood next: purchased text: Yes, I'd like to buy a house. - condition: diff --git a/data/objects/anvil.yaml b/data/objects/anvil.yaml index 22725c1..ab5a79f 100644 --- a/data/objects/anvil.yaml +++ b/data/objects/anvil.yaml @@ -3,7 +3,7 @@ name: anvil color: "250" description: "A heavy iron anvil for hammering metal into shape." use_interactions: - - item: silver_bar + - item_id: silver_bar message: "You should use this with a mold at a furnace." - - item: gold_bar + - item_id: gold_bar message: "You should use this with a mold at a furnace." diff --git a/data/recipes/clean/clean_avantoe.yaml b/data/recipes/clean/clean_avantoe.yaml new file mode 100644 index 0000000..61f8f87 --- /dev/null +++ b/data/recipes/clean/clean_avantoe.yaml @@ -0,0 +1,11 @@ +id: clean_avantoe +type: clean +skill: pharmacy +level: 48 +xp: 10 +wait: 2 +consume: + - items: [grimy_avantoe] + quantity: 1 +output: avantoe +message: "You clean the grimy avantoe leaf." diff --git a/data/recipes/clean/clean_cadantine.yaml b/data/recipes/clean/clean_cadantine.yaml new file mode 100644 index 0000000..a013b5d --- /dev/null +++ b/data/recipes/clean/clean_cadantine.yaml @@ -0,0 +1,11 @@ +id: clean_cadantine +type: clean +skill: pharmacy +level: 65 +xp: 13 +wait: 2 +consume: + - items: [grimy_cadantine] + quantity: 1 +output: cadantine +message: "You clean the grimy cadantine leaf." diff --git a/data/recipes/clean/clean_dwarf_weed.yaml b/data/recipes/clean/clean_dwarf_weed.yaml new file mode 100644 index 0000000..4ea9bb7 --- /dev/null +++ b/data/recipes/clean/clean_dwarf_weed.yaml @@ -0,0 +1,11 @@ +id: clean_dwarf_weed +type: clean +skill: pharmacy +level: 70 +xp: 14 +wait: 2 +consume: + - items: [grimy_dwarf_weed] + quantity: 1 +output: dwarf_weed +message: "You clean the grimy dwarf weed leaf." diff --git a/data/recipes/clean/clean_guam.yaml b/data/recipes/clean/clean_guam.yaml new file mode 100644 index 0000000..d8bb492 --- /dev/null +++ b/data/recipes/clean/clean_guam.yaml @@ -0,0 +1,11 @@ +id: clean_guam +type: clean +skill: pharmacy +level: 3 +xp: 3 +wait: 2 +consume: + - items: [grimy_guam] + quantity: 1 +output: guam +message: "You clean the grimy guam leaf." diff --git a/data/recipes/clean/clean_harralander.yaml b/data/recipes/clean/clean_harralander.yaml new file mode 100644 index 0000000..15d9d22 --- /dev/null +++ b/data/recipes/clean/clean_harralander.yaml @@ -0,0 +1,11 @@ +id: clean_harralander +type: clean +skill: pharmacy +level: 20 +xp: 6 +wait: 2 +consume: + - items: [grimy_harralander] + quantity: 1 +output: harralander +message: "You clean the grimy harralander leaf." diff --git a/data/recipes/clean/clean_irit.yaml b/data/recipes/clean/clean_irit.yaml new file mode 100644 index 0000000..f75603b --- /dev/null +++ b/data/recipes/clean/clean_irit.yaml @@ -0,0 +1,11 @@ +id: clean_irit +type: clean +skill: pharmacy +level: 40 +xp: 9 +wait: 2 +consume: + - items: [grimy_irit] + quantity: 1 +output: irit +message: "You clean the grimy irit leaf." diff --git a/data/recipes/clean/clean_kwuarm.yaml b/data/recipes/clean/clean_kwuarm.yaml new file mode 100644 index 0000000..1a11a84 --- /dev/null +++ b/data/recipes/clean/clean_kwuarm.yaml @@ -0,0 +1,11 @@ +id: clean_kwuarm +type: clean +skill: pharmacy +level: 54 +xp: 11 +wait: 2 +consume: + - items: [grimy_kwuarm] + quantity: 1 +output: kwuarm +message: "You clean the grimy kwuarm leaf." diff --git a/data/recipes/clean/clean_lantadyme.yaml b/data/recipes/clean/clean_lantadyme.yaml new file mode 100644 index 0000000..076f20d --- /dev/null +++ b/data/recipes/clean/clean_lantadyme.yaml @@ -0,0 +1,11 @@ +id: clean_lantadyme +type: clean +skill: pharmacy +level: 67 +xp: 13 +wait: 2 +consume: + - items: [grimy_lantadyme] + quantity: 1 +output: lantadyme +message: "You clean the grimy lantadyme leaf." diff --git a/data/recipes/clean/clean_marrentill.yaml b/data/recipes/clean/clean_marrentill.yaml new file mode 100644 index 0000000..f1565dd --- /dev/null +++ b/data/recipes/clean/clean_marrentill.yaml @@ -0,0 +1,11 @@ +id: clean_marrentill +type: clean +skill: pharmacy +level: 5 +xp: 4 +wait: 2 +consume: + - items: [grimy_marrentill] + quantity: 1 +output: marrentill +message: "You clean the grimy marrentill leaf." diff --git a/data/recipes/clean/clean_ranarr.yaml b/data/recipes/clean/clean_ranarr.yaml new file mode 100644 index 0000000..2e639d8 --- /dev/null +++ b/data/recipes/clean/clean_ranarr.yaml @@ -0,0 +1,11 @@ +id: clean_ranarr +type: clean +skill: pharmacy +level: 25 +xp: 8 +wait: 2 +consume: + - items: [grimy_ranarr] + quantity: 1 +output: ranarr +message: "You clean the grimy ranarr leaf." diff --git a/data/recipes/clean/clean_snapdragon.yaml b/data/recipes/clean/clean_snapdragon.yaml new file mode 100644 index 0000000..995ac8f --- /dev/null +++ b/data/recipes/clean/clean_snapdragon.yaml @@ -0,0 +1,11 @@ +id: clean_snapdragon +type: clean +skill: pharmacy +level: 59 +xp: 12 +wait: 2 +consume: + - items: [grimy_snapdragon] + quantity: 1 +output: snapdragon +message: "You clean the grimy snapdragon leaf." diff --git a/data/recipes/clean/clean_tarromin.yaml b/data/recipes/clean/clean_tarromin.yaml new file mode 100644 index 0000000..1ad55e1 --- /dev/null +++ b/data/recipes/clean/clean_tarromin.yaml @@ -0,0 +1,11 @@ +id: clean_tarromin +type: clean +skill: pharmacy +level: 11 +xp: 5 +wait: 2 +consume: + - items: [grimy_tarromin] + quantity: 1 +output: tarromin +message: "You clean the grimy tarromin leaf." diff --git a/data/recipes/clean/clean_toadflax.yaml b/data/recipes/clean/clean_toadflax.yaml new file mode 100644 index 0000000..11aafca --- /dev/null +++ b/data/recipes/clean/clean_toadflax.yaml @@ -0,0 +1,11 @@ +id: clean_toadflax +type: clean +skill: pharmacy +level: 30 +xp: 8 +wait: 2 +consume: + - items: [grimy_toadflax] + quantity: 1 +output: toadflax +message: "You clean the grimy toadflax leaf." diff --git a/data/recipes/clean/clean_torstol.yaml b/data/recipes/clean/clean_torstol.yaml new file mode 100644 index 0000000..c9bac28 --- /dev/null +++ b/data/recipes/clean/clean_torstol.yaml @@ -0,0 +1,11 @@ +id: clean_torstol +type: clean +skill: pharmacy +level: 75 +xp: 15 +wait: 2 +consume: + - items: [grimy_torstol] + quantity: 1 +output: torstol +message: "You clean the grimy torstol leaf." diff --git a/data/recipes/clean_avantoe.yaml b/data/recipes/clean_avantoe.yaml deleted file mode 100644 index 6903718..0000000 --- a/data/recipes/clean_avantoe.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_avantoe -type: clean -skill: pharmacy -level: 48 -xp: 10 -wait: 2 -consume: - - items: [grimy_avantoe] - qty: 1 -output: avantoe -message: "You clean the grimy avantoe leaf." diff --git a/data/recipes/clean_cadantine.yaml b/data/recipes/clean_cadantine.yaml deleted file mode 100644 index 0a84f1f..0000000 --- a/data/recipes/clean_cadantine.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_cadantine -type: clean -skill: pharmacy -level: 65 -xp: 13 -wait: 2 -consume: - - items: [grimy_cadantine] - qty: 1 -output: cadantine -message: "You clean the grimy cadantine leaf." diff --git a/data/recipes/clean_dwarf_weed.yaml b/data/recipes/clean_dwarf_weed.yaml deleted file mode 100644 index 4843036..0000000 --- a/data/recipes/clean_dwarf_weed.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_dwarf_weed -type: clean -skill: pharmacy -level: 70 -xp: 14 -wait: 2 -consume: - - items: [grimy_dwarf_weed] - qty: 1 -output: dwarf_weed -message: "You clean the grimy dwarf weed leaf." diff --git a/data/recipes/clean_guam.yaml b/data/recipes/clean_guam.yaml deleted file mode 100644 index faa1e0f..0000000 --- a/data/recipes/clean_guam.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_guam -type: clean -skill: pharmacy -level: 3 -xp: 3 -wait: 2 -consume: - - items: [grimy_guam] - qty: 1 -output: guam -message: "You clean the grimy guam leaf." diff --git a/data/recipes/clean_harralander.yaml b/data/recipes/clean_harralander.yaml deleted file mode 100644 index 42aca32..0000000 --- a/data/recipes/clean_harralander.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_harralander -type: clean -skill: pharmacy -level: 20 -xp: 6 -wait: 2 -consume: - - items: [grimy_harralander] - qty: 1 -output: harralander -message: "You clean the grimy harralander leaf." diff --git a/data/recipes/clean_irit.yaml b/data/recipes/clean_irit.yaml deleted file mode 100644 index 1524c20..0000000 --- a/data/recipes/clean_irit.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_irit -type: clean -skill: pharmacy -level: 40 -xp: 9 -wait: 2 -consume: - - items: [grimy_irit] - qty: 1 -output: irit -message: "You clean the grimy irit leaf." diff --git a/data/recipes/clean_kwuarm.yaml b/data/recipes/clean_kwuarm.yaml deleted file mode 100644 index 178dec4..0000000 --- a/data/recipes/clean_kwuarm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_kwuarm -type: clean -skill: pharmacy -level: 54 -xp: 11 -wait: 2 -consume: - - items: [grimy_kwuarm] - qty: 1 -output: kwuarm -message: "You clean the grimy kwuarm leaf." diff --git a/data/recipes/clean_lantadyme.yaml b/data/recipes/clean_lantadyme.yaml deleted file mode 100644 index 05c4f98..0000000 --- a/data/recipes/clean_lantadyme.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_lantadyme -type: clean -skill: pharmacy -level: 67 -xp: 13 -wait: 2 -consume: - - items: [grimy_lantadyme] - qty: 1 -output: lantadyme -message: "You clean the grimy lantadyme leaf." diff --git a/data/recipes/clean_marrentill.yaml b/data/recipes/clean_marrentill.yaml deleted file mode 100644 index 55959c5..0000000 --- a/data/recipes/clean_marrentill.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_marrentill -type: clean -skill: pharmacy -level: 5 -xp: 4 -wait: 2 -consume: - - items: [grimy_marrentill] - qty: 1 -output: marrentill -message: "You clean the grimy marrentill leaf." diff --git a/data/recipes/clean_ranarr.yaml b/data/recipes/clean_ranarr.yaml deleted file mode 100644 index 712c88b..0000000 --- a/data/recipes/clean_ranarr.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_ranarr -type: clean -skill: pharmacy -level: 25 -xp: 8 -wait: 2 -consume: - - items: [grimy_ranarr] - qty: 1 -output: ranarr -message: "You clean the grimy ranarr leaf." diff --git a/data/recipes/clean_snapdragon.yaml b/data/recipes/clean_snapdragon.yaml deleted file mode 100644 index d90c775..0000000 --- a/data/recipes/clean_snapdragon.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_snapdragon -type: clean -skill: pharmacy -level: 59 -xp: 12 -wait: 2 -consume: - - items: [grimy_snapdragon] - qty: 1 -output: snapdragon -message: "You clean the grimy snapdragon leaf." diff --git a/data/recipes/clean_tarromin.yaml b/data/recipes/clean_tarromin.yaml deleted file mode 100644 index 1752b7c..0000000 --- a/data/recipes/clean_tarromin.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_tarromin -type: clean -skill: pharmacy -level: 11 -xp: 5 -wait: 2 -consume: - - items: [grimy_tarromin] - qty: 1 -output: tarromin -message: "You clean the grimy tarromin leaf." diff --git a/data/recipes/clean_toadflax.yaml b/data/recipes/clean_toadflax.yaml deleted file mode 100644 index 4124576..0000000 --- a/data/recipes/clean_toadflax.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_toadflax -type: clean -skill: pharmacy -level: 30 -xp: 8 -wait: 2 -consume: - - items: [grimy_toadflax] - qty: 1 -output: toadflax -message: "You clean the grimy toadflax leaf." diff --git a/data/recipes/clean_torstol.yaml b/data/recipes/clean_torstol.yaml deleted file mode 100644 index 7ce0017..0000000 --- a/data/recipes/clean_torstol.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: clean_torstol -type: clean -skill: pharmacy -level: 75 -xp: 15 -wait: 2 -consume: - - items: [grimy_torstol] - qty: 1 -output: torstol -message: "You clean the grimy torstol leaf." diff --git a/data/recipes/construct_mahogany_planks.yaml b/data/recipes/construct_mahogany_planks.yaml deleted file mode 100644 index 07e0f40..0000000 --- a/data/recipes/construct_mahogany_planks.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: construct_mahogany_planks -type: construction -level: 50 -xp: 30 -wait: 20 -station: [workbench] -tool: saw -consume: - - items: [mahogany_logs] - qty: 1 -output: mahogany_planks -message: "You saw the mahogany logs into luxurious mahogany planks." diff --git a/data/recipes/construct_mahogany_table.yaml b/data/recipes/construct_mahogany_table.yaml deleted file mode 100644 index 252736f..0000000 --- a/data/recipes/construct_mahogany_table.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: construct_mahogany_table -type: construction -level: 52 -xp: 120 -wait: 6 -station: [workbench] -consume: - - items: [mahogany_planks] - qty: 3 -output: mahogany_table -message: "You build a luxurious mahogany table." diff --git a/data/recipes/construct_oak_planks.yaml b/data/recipes/construct_oak_planks.yaml deleted file mode 100644 index 5858208..0000000 --- a/data/recipes/construct_oak_planks.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: construct_oak_planks -type: construction -level: 15 -xp: 10 -wait: 20 -station: [workbench] -tool: saw -consume: - - items: [oak_logs] - qty: 1 -output: oak_planks -message: "You saw the oak logs into sturdy oak planks." diff --git a/data/recipes/construct_oak_shelf.yaml b/data/recipes/construct_oak_shelf.yaml deleted file mode 100644 index 8661679..0000000 --- a/data/recipes/construct_oak_shelf.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: construct_oak_shelf -type: construction -level: 18 -xp: 40 -wait: 6 -station: [workbench] -consume: - - items: [oak_planks] - qty: 2 -output: oak_shelf -message: "You assemble the oak planks into a sturdy shelf." diff --git a/data/recipes/construct_oak_table.yaml b/data/recipes/construct_oak_table.yaml deleted file mode 100644 index e8eff24..0000000 --- a/data/recipes/construct_oak_table.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: construct_oak_table -type: construction -level: 20 -xp: 50 -wait: 6 -station: [workbench] -consume: - - items: [oak_planks] - qty: 3 -output: oak_table -message: "You build a fine oak table." diff --git a/data/recipes/construct_planks.yaml b/data/recipes/construct_planks.yaml deleted file mode 100644 index 4a2a363..0000000 --- a/data/recipes/construct_planks.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: construct_planks -type: construction -level: 1 -xp: 5 -wait: 20 -station: [workbench] -tool: saw -consume: - - items: [logs] - qty: 1 -output: planks -message: "You saw the logs into some regular planks." diff --git a/data/recipes/construct_teak_planks.yaml b/data/recipes/construct_teak_planks.yaml deleted file mode 100644 index 022ff7f..0000000 --- a/data/recipes/construct_teak_planks.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: construct_teak_planks -type: construction -level: 35 -xp: 20 -wait: 20 -station: [workbench] -tool: saw -consume: - - items: [teak_logs] - qty: 1 -output: teak_planks -message: "You saw the teak logs into fine teak planks." diff --git a/data/recipes/construct_teak_table.yaml b/data/recipes/construct_teak_table.yaml deleted file mode 100644 index db926b8..0000000 --- a/data/recipes/construct_teak_table.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: construct_teak_table -type: construction -level: 38 -xp: 80 -wait: 6 -station: [workbench] -consume: - - items: [teak_planks] - qty: 3 -output: teak_table -message: "You build an elegant teak table." diff --git a/data/recipes/construct_wooden_chair.yaml b/data/recipes/construct_wooden_chair.yaml deleted file mode 100644 index cad6200..0000000 --- a/data/recipes/construct_wooden_chair.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: construct_wooden_chair -type: construction -level: 8 -xp: 30 -wait: 6 -station: [workbench] -consume: - - items: [planks] - qty: 2 -output: wooden_chair -message: "You craft a comfortable wooden chair." diff --git a/data/recipes/construct_wooden_shelf.yaml b/data/recipes/construct_wooden_shelf.yaml deleted file mode 100644 index f09a199..0000000 --- a/data/recipes/construct_wooden_shelf.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: construct_wooden_shelf -type: construction -level: 4 -xp: 20 -wait: 6 -station: [workbench] -consume: - - items: [planks] - qty: 2 -output: wooden_shelf -message: "You assemble the planks into a wooden shelf." diff --git a/data/recipes/construct_wooden_table.yaml b/data/recipes/construct_wooden_table.yaml deleted file mode 100644 index 8451f31..0000000 --- a/data/recipes/construct_wooden_table.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: construct_wooden_table -type: construction -level: 6 -xp: 25 -wait: 6 -station: [workbench] -consume: - - items: [planks] - qty: 3 -output: wooden_table -message: "You build a sturdy wooden table." diff --git a/data/recipes/construction/construct_mahogany_planks.yaml b/data/recipes/construction/construct_mahogany_planks.yaml new file mode 100644 index 0000000..6634f78 --- /dev/null +++ b/data/recipes/construction/construct_mahogany_planks.yaml @@ -0,0 +1,12 @@ +id: construct_mahogany_planks +type: construction +level: 50 +xp: 30 +wait: 20 +station: [workbench] +tool: saw +consume: + - items: [mahogany_logs] + quantity: 1 +output: mahogany_planks +message: "You saw the mahogany logs into luxurious mahogany planks." diff --git a/data/recipes/construction/construct_mahogany_table.yaml b/data/recipes/construction/construct_mahogany_table.yaml new file mode 100644 index 0000000..89d08e4 --- /dev/null +++ b/data/recipes/construction/construct_mahogany_table.yaml @@ -0,0 +1,11 @@ +id: construct_mahogany_table +type: construction +level: 52 +xp: 120 +wait: 6 +station: [workbench] +consume: + - items: [mahogany_planks] + quantity: 3 +output: mahogany_table +message: "You build a luxurious mahogany table." diff --git a/data/recipes/construction/construct_oak_planks.yaml b/data/recipes/construction/construct_oak_planks.yaml new file mode 100644 index 0000000..77c2fcb --- /dev/null +++ b/data/recipes/construction/construct_oak_planks.yaml @@ -0,0 +1,12 @@ +id: construct_oak_planks +type: construction +level: 15 +xp: 10 +wait: 20 +station: [workbench] +tool: saw +consume: + - items: [oak_logs] + quantity: 1 +output: oak_planks +message: "You saw the oak logs into sturdy oak planks." diff --git a/data/recipes/construction/construct_oak_shelf.yaml b/data/recipes/construction/construct_oak_shelf.yaml new file mode 100644 index 0000000..042e64f --- /dev/null +++ b/data/recipes/construction/construct_oak_shelf.yaml @@ -0,0 +1,11 @@ +id: construct_oak_shelf +type: construction +level: 18 +xp: 40 +wait: 6 +station: [workbench] +consume: + - items: [oak_planks] + quantity: 2 +output: oak_shelf +message: "You assemble the oak planks into a sturdy shelf." diff --git a/data/recipes/construction/construct_oak_table.yaml b/data/recipes/construction/construct_oak_table.yaml new file mode 100644 index 0000000..8eafe15 --- /dev/null +++ b/data/recipes/construction/construct_oak_table.yaml @@ -0,0 +1,11 @@ +id: construct_oak_table +type: construction +level: 20 +xp: 50 +wait: 6 +station: [workbench] +consume: + - items: [oak_planks] + quantity: 3 +output: oak_table +message: "You build a fine oak table." diff --git a/data/recipes/construction/construct_planks.yaml b/data/recipes/construction/construct_planks.yaml new file mode 100644 index 0000000..3ed8058 --- /dev/null +++ b/data/recipes/construction/construct_planks.yaml @@ -0,0 +1,12 @@ +id: construct_planks +type: construction +level: 1 +xp: 5 +wait: 20 +station: [workbench] +tool: saw +consume: + - items: [logs] + quantity: 1 +output: planks +message: "You saw the logs into some regular planks." diff --git a/data/recipes/construction/construct_teak_planks.yaml b/data/recipes/construction/construct_teak_planks.yaml new file mode 100644 index 0000000..aec0888 --- /dev/null +++ b/data/recipes/construction/construct_teak_planks.yaml @@ -0,0 +1,12 @@ +id: construct_teak_planks +type: construction +level: 35 +xp: 20 +wait: 20 +station: [workbench] +tool: saw +consume: + - items: [teak_logs] + quantity: 1 +output: teak_planks +message: "You saw the teak logs into fine teak planks." diff --git a/data/recipes/construction/construct_teak_table.yaml b/data/recipes/construction/construct_teak_table.yaml new file mode 100644 index 0000000..88d4a2a --- /dev/null +++ b/data/recipes/construction/construct_teak_table.yaml @@ -0,0 +1,11 @@ +id: construct_teak_table +type: construction +level: 38 +xp: 80 +wait: 6 +station: [workbench] +consume: + - items: [teak_planks] + quantity: 3 +output: teak_table +message: "You build an elegant teak table." diff --git a/data/recipes/construction/construct_wooden_chair.yaml b/data/recipes/construction/construct_wooden_chair.yaml new file mode 100644 index 0000000..3a9120d --- /dev/null +++ b/data/recipes/construction/construct_wooden_chair.yaml @@ -0,0 +1,11 @@ +id: construct_wooden_chair +type: construction +level: 8 +xp: 30 +wait: 6 +station: [workbench] +consume: + - items: [planks] + quantity: 2 +output: wooden_chair +message: "You craft a comfortable wooden chair." diff --git a/data/recipes/construction/construct_wooden_shelf.yaml b/data/recipes/construction/construct_wooden_shelf.yaml new file mode 100644 index 0000000..c8ea836 --- /dev/null +++ b/data/recipes/construction/construct_wooden_shelf.yaml @@ -0,0 +1,11 @@ +id: construct_wooden_shelf +type: construction +level: 4 +xp: 20 +wait: 6 +station: [workbench] +consume: + - items: [planks] + quantity: 2 +output: wooden_shelf +message: "You assemble the planks into a wooden shelf." diff --git a/data/recipes/construction/construct_wooden_table.yaml b/data/recipes/construction/construct_wooden_table.yaml new file mode 100644 index 0000000..21d6c53 --- /dev/null +++ b/data/recipes/construction/construct_wooden_table.yaml @@ -0,0 +1,11 @@ +id: construct_wooden_table +type: construction +level: 6 +xp: 25 +wait: 6 +station: [workbench] +consume: + - items: [planks] + quantity: 3 +output: wooden_table +message: "You build a sturdy wooden table." diff --git a/data/recipes/cook_anchovies.yaml b/data/recipes/cook_anchovies.yaml deleted file mode 100644 index 07d3f62..0000000 --- a/data/recipes/cook_anchovies.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: cook_anchovies -type: cooking -level: 1 -xp: 30 -wait: 6 -station: [fire, cooking_range] -consume: - - items: [raw_anchovies] - qty: 1 -output: anchovies -fail: burnt_fish -message: "Cooked to perfection. It looks great!" -fail_message: "You accidentally burn the anchovies." diff --git a/data/recipes/cook_bread.yaml b/data/recipes/cook_bread.yaml deleted file mode 100644 index c76cedc..0000000 --- a/data/recipes/cook_bread.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: cook_bread -type: cooking -level: 1 -xp: 40 -wait: 6 -station: [cooking_range] -consume: - - items: [bread_dough] - qty: 1 -output: bread -fail: burnt_meat -message: "You bake the dough into a fresh loaf of bread." -fail_message: "You burn the bread to a crisp." diff --git a/data/recipes/cook_herring.yaml b/data/recipes/cook_herring.yaml deleted file mode 100644 index 05d10eb..0000000 --- a/data/recipes/cook_herring.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: cook_herring -type: cooking -level: 5 -xp: 50 -wait: 6 -station: [fire, cooking_range] -consume: - - items: [raw_herring] - qty: 1 -output: herring -fail: burnt_fish -message: "Cooked to perfection. It looks great!" -fail_message: "You accidentally burn the herring." diff --git a/data/recipes/cook_salmon.yaml b/data/recipes/cook_salmon.yaml deleted file mode 100644 index ab086fb..0000000 --- a/data/recipes/cook_salmon.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: cook_salmon -type: cooking -level: 25 -xp: 90 -wait: 6 -station: [fire, cooking_range] -consume: - - items: [raw_salmon] - qty: 1 -output: salmon -fail: burnt_fish -message: "Cooked to perfection. It looks great!" -fail_message: "You accidentally burn the salmon." diff --git a/data/recipes/cook_sardine.yaml b/data/recipes/cook_sardine.yaml deleted file mode 100644 index f7e8389..0000000 --- a/data/recipes/cook_sardine.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: cook_sardine -type: cooking -level: 1 -xp: 40 -wait: 6 -station: [fire, cooking_range] -consume: - - items: [raw_sardine] - qty: 1 -output: sardine -fail: burnt_fish -message: "Cooked to perfection. It looks great!" -fail_message: "You accidentally burn the sardine." diff --git a/data/recipes/cook_shrimps.yaml b/data/recipes/cook_shrimps.yaml deleted file mode 100644 index 8755b68..0000000 --- a/data/recipes/cook_shrimps.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: cook_shrimps -type: cooking -level: 1 -xp: 30 -wait: 6 -station: [fire, cooking_range] -consume: - - items: [raw_shrimps] - qty: 1 -output: shrimps -fail: burnt_fish -message: "Cooked to perfection. It looks great!" -fail_message: "You accidentally burn the shrimps." diff --git a/data/recipes/cook_trout.yaml b/data/recipes/cook_trout.yaml deleted file mode 100644 index a392e3d..0000000 --- a/data/recipes/cook_trout.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: cook_trout -type: cooking -level: 15 -xp: 70 -wait: 6 -station: [fire, cooking_range] -consume: - - items: [raw_trout] - qty: 1 -output: trout -fail: burnt_fish -message: "Cooked to perfection. It looks great!" -fail_message: "You accidentally burn the trout." diff --git a/data/recipes/cooking/cook_anchovies.yaml b/data/recipes/cooking/cook_anchovies.yaml new file mode 100644 index 0000000..bd4ea41 --- /dev/null +++ b/data/recipes/cooking/cook_anchovies.yaml @@ -0,0 +1,13 @@ +id: cook_anchovies +type: cooking +level: 1 +xp: 30 +wait: 6 +station: [fire, cooking_range] +consume: + - items: [raw_anchovies] + quantity: 1 +output: anchovies +fail: burnt_fish +message: "Cooked to perfection. It looks great!" +fail_message: "You accidentally burn the anchovies." diff --git a/data/recipes/cooking/cook_bread.yaml b/data/recipes/cooking/cook_bread.yaml new file mode 100644 index 0000000..d1c68bf --- /dev/null +++ b/data/recipes/cooking/cook_bread.yaml @@ -0,0 +1,13 @@ +id: cook_bread +type: cooking +level: 1 +xp: 40 +wait: 6 +station: [cooking_range] +consume: + - items: [bread_dough] + quantity: 1 +output: bread +fail: burnt_meat +message: "You bake the dough into a fresh loaf of bread." +fail_message: "You burn the bread to a crisp." diff --git a/data/recipes/cooking/cook_herring.yaml b/data/recipes/cooking/cook_herring.yaml new file mode 100644 index 0000000..3113092 --- /dev/null +++ b/data/recipes/cooking/cook_herring.yaml @@ -0,0 +1,13 @@ +id: cook_herring +type: cooking +level: 5 +xp: 50 +wait: 6 +station: [fire, cooking_range] +consume: + - items: [raw_herring] + quantity: 1 +output: herring +fail: burnt_fish +message: "Cooked to perfection. It looks great!" +fail_message: "You accidentally burn the herring." diff --git a/data/recipes/cooking/cook_salmon.yaml b/data/recipes/cooking/cook_salmon.yaml new file mode 100644 index 0000000..32c0fb0 --- /dev/null +++ b/data/recipes/cooking/cook_salmon.yaml @@ -0,0 +1,13 @@ +id: cook_salmon +type: cooking +level: 25 +xp: 90 +wait: 6 +station: [fire, cooking_range] +consume: + - items: [raw_salmon] + quantity: 1 +output: salmon +fail: burnt_fish +message: "Cooked to perfection. It looks great!" +fail_message: "You accidentally burn the salmon." diff --git a/data/recipes/cooking/cook_sardine.yaml b/data/recipes/cooking/cook_sardine.yaml new file mode 100644 index 0000000..fcda9b5 --- /dev/null +++ b/data/recipes/cooking/cook_sardine.yaml @@ -0,0 +1,13 @@ +id: cook_sardine +type: cooking +level: 1 +xp: 40 +wait: 6 +station: [fire, cooking_range] +consume: + - items: [raw_sardine] + quantity: 1 +output: sardine +fail: burnt_fish +message: "Cooked to perfection. It looks great!" +fail_message: "You accidentally burn the sardine." diff --git a/data/recipes/cooking/cook_shrimps.yaml b/data/recipes/cooking/cook_shrimps.yaml new file mode 100644 index 0000000..feb4506 --- /dev/null +++ b/data/recipes/cooking/cook_shrimps.yaml @@ -0,0 +1,13 @@ +id: cook_shrimps +type: cooking +level: 1 +xp: 30 +wait: 6 +station: [fire, cooking_range] +consume: + - items: [raw_shrimps] + quantity: 1 +output: shrimps +fail: burnt_fish +message: "Cooked to perfection. It looks great!" +fail_message: "You accidentally burn the shrimps." diff --git a/data/recipes/cooking/cook_trout.yaml b/data/recipes/cooking/cook_trout.yaml new file mode 100644 index 0000000..cec6cd4 --- /dev/null +++ b/data/recipes/cooking/cook_trout.yaml @@ -0,0 +1,13 @@ +id: cook_trout +type: cooking +level: 15 +xp: 70 +wait: 6 +station: [fire, cooking_range] +consume: + - items: [raw_trout] + quantity: 1 +output: trout +fail: burnt_fish +message: "Cooked to perfection. It looks great!" +fail_message: "You accidentally burn the trout." diff --git a/data/recipes/craft_ball_of_wool.yaml b/data/recipes/craft_ball_of_wool.yaml deleted file mode 100644 index 2f8f4f9..0000000 --- a/data/recipes/craft_ball_of_wool.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: craft_ball_of_wool -type: crafting -level: 1 -xp: 3 -wait: 3 -station: [spinning_wheel] -consume: - - items: [wool] - qty: 1 -output: ball_of_wool -message: "You spin the wool into a ball." diff --git a/data/recipes/craft_bowstring.yaml b/data/recipes/craft_bowstring.yaml deleted file mode 100644 index 1df6aba..0000000 --- a/data/recipes/craft_bowstring.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: craft_bowstring -type: crafting -level: 1 -xp: 15 -wait: 3 -station: [spinning_wheel] -consume: - - items: [flax] - qty: 1 -output: bowstring -message: "You spin the flax into a bowstring." diff --git a/data/recipes/craft_coif.yaml b/data/recipes/craft_coif.yaml deleted file mode 100644 index 49fc4c3..0000000 --- a/data/recipes/craft_coif.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: craft_coif -type: crafting -level: 38 -xp: 37 -wait: 4 -tool: needle -consume: - - items: [hard_leather] - qty: 1 - - items: [thread] - qty: 1 -output: coif -message: "You craft a coif." diff --git a/data/recipes/craft_cut_diamond.yaml b/data/recipes/craft_cut_diamond.yaml deleted file mode 100644 index b0187a8..0000000 --- a/data/recipes/craft_cut_diamond.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: craft_cut_diamond -type: crafting -level: 43 -xp: 108 -wait: 3 -tool: chisel -consume: - - items: [uncut_diamond] - qty: 1 -output: diamond -message: "You cut the diamond into a beautiful gem." diff --git a/data/recipes/craft_cut_emerald.yaml b/data/recipes/craft_cut_emerald.yaml deleted file mode 100644 index 69fdd19..0000000 --- a/data/recipes/craft_cut_emerald.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: craft_cut_emerald -type: crafting -level: 27 -xp: 68 -wait: 3 -tool: chisel -consume: - - items: [uncut_emerald] - qty: 1 -output: emerald -message: "You cut the emerald into a beautiful gem." diff --git a/data/recipes/craft_cut_ruby.yaml b/data/recipes/craft_cut_ruby.yaml deleted file mode 100644 index 6cc402c..0000000 --- a/data/recipes/craft_cut_ruby.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: craft_cut_ruby -type: crafting -level: 63 -xp: 85 -wait: 3 -tool: chisel -consume: - - items: [uncut_ruby] - qty: 1 -output: ruby -message: "You cut the ruby into a beautiful gem." diff --git a/data/recipes/craft_cut_sapphire.yaml b/data/recipes/craft_cut_sapphire.yaml deleted file mode 100644 index 6f3bb65..0000000 --- a/data/recipes/craft_cut_sapphire.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: craft_cut_sapphire -type: crafting -level: 20 -xp: 50 -wait: 3 -tool: chisel -consume: - - items: [uncut_sapphire] - qty: 1 -output: sapphire -message: "You cut the sapphire into a beautiful gem." diff --git a/data/recipes/craft_diamond_amulet_u.yaml b/data/recipes/craft_diamond_amulet_u.yaml deleted file mode 100644 index 053c409..0000000 --- a/data/recipes/craft_diamond_amulet_u.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_diamond_amulet_u -type: crafting -level: 70 -xp: 100 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [diamond] - qty: 1 - - items: [amulet_mould] - qty: 1 - byproducts: [amulet_mould] -output: diamond_amulet_u -message: "You cast a diamond amulet." diff --git a/data/recipes/craft_diamond_bracelet.yaml b/data/recipes/craft_diamond_bracelet.yaml deleted file mode 100644 index 17ac23e..0000000 --- a/data/recipes/craft_diamond_bracelet.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_diamond_bracelet -type: crafting -level: 58 -xp: 95 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [diamond] - qty: 1 - - items: [bracelet_mould] - qty: 1 - byproducts: [bracelet_mould] -output: diamond_bracelet -message: "You cast a diamond bracelet." diff --git a/data/recipes/craft_diamond_necklace.yaml b/data/recipes/craft_diamond_necklace.yaml deleted file mode 100644 index cebbec1..0000000 --- a/data/recipes/craft_diamond_necklace.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_diamond_necklace -type: crafting -level: 56 -xp: 90 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [diamond] - qty: 1 - - items: [necklace_mould] - qty: 1 - byproducts: [necklace_mould] -output: diamond_necklace -message: "You cast a diamond necklace." diff --git a/data/recipes/craft_diamond_ring.yaml b/data/recipes/craft_diamond_ring.yaml deleted file mode 100644 index aacce0e..0000000 --- a/data/recipes/craft_diamond_ring.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_diamond_ring -type: crafting -level: 43 -xp: 85 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [diamond] - qty: 1 - - items: [ring_mould] - qty: 1 - byproducts: [ring_mould] -output: diamond_ring -message: "You cast a diamond ring." diff --git a/data/recipes/craft_emerald_amulet_u.yaml b/data/recipes/craft_emerald_amulet_u.yaml deleted file mode 100644 index dbf8b8a..0000000 --- a/data/recipes/craft_emerald_amulet_u.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_emerald_amulet_u -type: crafting -level: 31 -xp: 70 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [emerald] - qty: 1 - - items: [amulet_mould] - qty: 1 - byproducts: [amulet_mould] -output: emerald_amulet_u -message: "You cast a emerald amulet." diff --git a/data/recipes/craft_emerald_bracelet.yaml b/data/recipes/craft_emerald_bracelet.yaml deleted file mode 100644 index b3dd83e..0000000 --- a/data/recipes/craft_emerald_bracelet.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_emerald_bracelet -type: crafting -level: 30 -xp: 65 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [emerald] - qty: 1 - - items: [bracelet_mould] - qty: 1 - byproducts: [bracelet_mould] -output: emerald_bracelet -message: "You cast a emerald bracelet." diff --git a/data/recipes/craft_emerald_necklace.yaml b/data/recipes/craft_emerald_necklace.yaml deleted file mode 100644 index cd0a94b..0000000 --- a/data/recipes/craft_emerald_necklace.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_emerald_necklace -type: crafting -level: 29 -xp: 60 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [emerald] - qty: 1 - - items: [necklace_mould] - qty: 1 - byproducts: [necklace_mould] -output: emerald_necklace -message: "You cast a emerald necklace." diff --git a/data/recipes/craft_emerald_ring.yaml b/data/recipes/craft_emerald_ring.yaml deleted file mode 100644 index ebbe473..0000000 --- a/data/recipes/craft_emerald_ring.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_emerald_ring -type: crafting -level: 27 -xp: 55 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [emerald] - qty: 1 - - items: [ring_mould] - qty: 1 - byproducts: [ring_mould] -output: emerald_ring -message: "You cast a emerald ring." diff --git a/data/recipes/craft_gold_amulet_u.yaml b/data/recipes/craft_gold_amulet_u.yaml deleted file mode 100644 index 3701320..0000000 --- a/data/recipes/craft_gold_amulet_u.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: craft_gold_amulet_u -type: crafting -level: 8 -xp: 30 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [amulet_mould] - qty: 1 - byproducts: [amulet_mould] -output: gold_amulet_u -message: "You cast a gold amulet." diff --git a/data/recipes/craft_gold_bracelet.yaml b/data/recipes/craft_gold_bracelet.yaml deleted file mode 100644 index 630b8de..0000000 --- a/data/recipes/craft_gold_bracelet.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: craft_gold_bracelet -type: crafting -level: 7 -xp: 25 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [bracelet_mould] - qty: 1 - byproducts: [bracelet_mould] -output: gold_bracelet -message: "You cast a gold bracelet." diff --git a/data/recipes/craft_gold_necklace.yaml b/data/recipes/craft_gold_necklace.yaml deleted file mode 100644 index 6879338..0000000 --- a/data/recipes/craft_gold_necklace.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: craft_gold_necklace -type: crafting -level: 6 -xp: 20 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [necklace_mould] - qty: 1 - byproducts: [necklace_mould] -output: gold_necklace -message: "You cast a gold necklace." diff --git a/data/recipes/craft_gold_ring.yaml b/data/recipes/craft_gold_ring.yaml deleted file mode 100644 index 4e2c13f..0000000 --- a/data/recipes/craft_gold_ring.yaml +++ /dev/null @@ -1,14 +0,0 @@ -id: craft_gold_ring -type: crafting -level: 5 -xp: 15 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [ring_mould] - qty: 1 - byproducts: [ring_mould] -output: gold_ring -message: "You cast a gold ring." diff --git a/data/recipes/craft_hard_leather_body.yaml b/data/recipes/craft_hard_leather_body.yaml deleted file mode 100644 index 088553e..0000000 --- a/data/recipes/craft_hard_leather_body.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: craft_hard_leather_body -type: crafting -level: 28 -xp: 35 -wait: 4 -tool: needle -consume: - - items: [hard_leather] - qty: 1 - - items: [thread] - qty: 1 -output: hard_leather_body -message: "You craft a hard leather body." diff --git a/data/recipes/craft_hard_leather_shield.yaml b/data/recipes/craft_hard_leather_shield.yaml deleted file mode 100644 index b41e5b4..0000000 --- a/data/recipes/craft_hard_leather_shield.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: craft_hard_leather_shield -type: crafting -level: 41 -xp: 40 -wait: 4 -tool: needle -consume: - - items: [hard_leather] - qty: 1 - - items: [thread] - qty: 1 -output: hard_leather_shield -message: "You craft a hard leather shield." diff --git a/data/recipes/craft_leather_body.yaml b/data/recipes/craft_leather_body.yaml deleted file mode 100644 index b01eefa..0000000 --- a/data/recipes/craft_leather_body.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: craft_leather_body -type: crafting -level: 14 -xp: 25 -wait: 4 -tool: needle -consume: - - items: [leather] - qty: 1 - - items: [thread] - qty: 1 -output: leather_body -message: "You craft a leather body." diff --git a/data/recipes/craft_leather_boots.yaml b/data/recipes/craft_leather_boots.yaml deleted file mode 100644 index df86ae9..0000000 --- a/data/recipes/craft_leather_boots.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: craft_leather_boots -type: crafting -level: 7 -xp: 16 -wait: 4 -tool: needle -consume: - - items: [leather] - qty: 1 - - items: [thread] - qty: 1 -output: leather_boots -message: "You craft a pair of leather boots." diff --git a/data/recipes/craft_leather_chaps.yaml b/data/recipes/craft_leather_chaps.yaml deleted file mode 100644 index bfbb832..0000000 --- a/data/recipes/craft_leather_chaps.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: craft_leather_chaps -type: crafting -level: 18 -xp: 27 -wait: 4 -tool: needle -consume: - - items: [leather] - qty: 1 - - items: [thread] - qty: 1 -output: leather_chaps -message: "You craft a pair of leather chaps." diff --git a/data/recipes/craft_leather_cowl.yaml b/data/recipes/craft_leather_cowl.yaml deleted file mode 100644 index 7f018bf..0000000 --- a/data/recipes/craft_leather_cowl.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: craft_leather_cowl -type: crafting -level: 9 -xp: 19 -wait: 4 -tool: needle -consume: - - items: [leather] - qty: 1 - - items: [thread] - qty: 1 -output: leather_cowl -message: "You craft a leather cowl." diff --git a/data/recipes/craft_leather_gloves.yaml b/data/recipes/craft_leather_gloves.yaml deleted file mode 100644 index 4f6b27c..0000000 --- a/data/recipes/craft_leather_gloves.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: craft_leather_gloves -type: crafting -level: 1 -xp: 14 -wait: 4 -tool: needle -consume: - - items: [leather] - qty: 1 - - items: [thread] - qty: 1 -output: leather_gloves -message: "You craft a pair of leather gloves." diff --git a/data/recipes/craft_leather_vambraces.yaml b/data/recipes/craft_leather_vambraces.yaml deleted file mode 100644 index 44624c9..0000000 --- a/data/recipes/craft_leather_vambraces.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: craft_leather_vambraces -type: crafting -level: 11 -xp: 22 -wait: 4 -tool: needle -consume: - - items: [leather] - qty: 1 - - items: [thread] - qty: 1 -output: leather_vambraces -message: "You craft a pair of leather vambraces." diff --git a/data/recipes/craft_pie_dish.yaml b/data/recipes/craft_pie_dish.yaml deleted file mode 100644 index 0648dd5..0000000 --- a/data/recipes/craft_pie_dish.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_pie_dish -type: crafting -level: 7 -xp: 10 -wait: 4 -station: [pottery_oven] -consume: - - items: [unfired_pie_dish] - qty: 1 -output: pie_dish -message: "You fire the pie dish in the oven successfully." -fail_message: "The pie dish cracks in the oven and is ruined." -success: - base: 0.40 - per_level: 0.02 - cap: 0.95 diff --git a/data/recipes/craft_plant_pot.yaml b/data/recipes/craft_plant_pot.yaml deleted file mode 100644 index efa353c..0000000 --- a/data/recipes/craft_plant_pot.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_plant_pot -type: crafting -level: 19 -xp: 18 -wait: 4 -station: [pottery_oven] -consume: - - items: [unfired_plant_pot] - qty: 1 -output: plant_pot -message: "You fire the plant pot in the oven successfully." -fail_message: "The plant pot cracks in the oven and is ruined." -success: - base: 0.30 - per_level: 0.02 - cap: 0.95 diff --git a/data/recipes/craft_pot.yaml b/data/recipes/craft_pot.yaml deleted file mode 100644 index 4e7a5ce..0000000 --- a/data/recipes/craft_pot.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_pot -type: crafting -level: 1 -xp: 6 -wait: 4 -station: [pottery_oven] -consume: - - items: [unfired_pot] - qty: 1 -output: empty_pot -message: "You fire the pot in the oven successfully." -fail_message: "The pot cracks in the oven and is ruined." -success: - base: 0.50 - per_level: 0.02 - cap: 0.95 diff --git a/data/recipes/craft_ruby_amulet_u.yaml b/data/recipes/craft_ruby_amulet_u.yaml deleted file mode 100644 index 4f1fbea..0000000 --- a/data/recipes/craft_ruby_amulet_u.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_ruby_amulet_u -type: crafting -level: 50 -xp: 85 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [ruby] - qty: 1 - - items: [amulet_mould] - qty: 1 - byproducts: [amulet_mould] -output: ruby_amulet_u -message: "You cast a ruby amulet." diff --git a/data/recipes/craft_ruby_bracelet.yaml b/data/recipes/craft_ruby_bracelet.yaml deleted file mode 100644 index c5e0027..0000000 --- a/data/recipes/craft_ruby_bracelet.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_ruby_bracelet -type: crafting -level: 42 -xp: 80 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [ruby] - qty: 1 - - items: [bracelet_mould] - qty: 1 - byproducts: [bracelet_mould] -output: ruby_bracelet -message: "You cast a ruby bracelet." diff --git a/data/recipes/craft_ruby_necklace.yaml b/data/recipes/craft_ruby_necklace.yaml deleted file mode 100644 index 4504f7b..0000000 --- a/data/recipes/craft_ruby_necklace.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_ruby_necklace -type: crafting -level: 40 -xp: 75 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [ruby] - qty: 1 - - items: [necklace_mould] - qty: 1 - byproducts: [necklace_mould] -output: ruby_necklace -message: "You cast a ruby necklace." diff --git a/data/recipes/craft_ruby_ring.yaml b/data/recipes/craft_ruby_ring.yaml deleted file mode 100644 index e38a490..0000000 --- a/data/recipes/craft_ruby_ring.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_ruby_ring -type: crafting -level: 63 -xp: 70 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [ruby] - qty: 1 - - items: [ring_mould] - qty: 1 - byproducts: [ring_mould] -output: ruby_ring -message: "You cast a ruby ring." diff --git a/data/recipes/craft_sapphire_amulet_u.yaml b/data/recipes/craft_sapphire_amulet_u.yaml deleted file mode 100644 index a15a484..0000000 --- a/data/recipes/craft_sapphire_amulet_u.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_sapphire_amulet_u -type: crafting -level: 24 -xp: 65 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [sapphire] - qty: 1 - - items: [amulet_mould] - qty: 1 - byproducts: [amulet_mould] -output: sapphire_amulet_u -message: "You cast a sapphire amulet." diff --git a/data/recipes/craft_sapphire_bracelet.yaml b/data/recipes/craft_sapphire_bracelet.yaml deleted file mode 100644 index ee5d1a7..0000000 --- a/data/recipes/craft_sapphire_bracelet.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_sapphire_bracelet -type: crafting -level: 23 -xp: 60 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [sapphire] - qty: 1 - - items: [bracelet_mould] - qty: 1 - byproducts: [bracelet_mould] -output: sapphire_bracelet -message: "You cast a sapphire bracelet." diff --git a/data/recipes/craft_sapphire_necklace.yaml b/data/recipes/craft_sapphire_necklace.yaml deleted file mode 100644 index 1dfd112..0000000 --- a/data/recipes/craft_sapphire_necklace.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_sapphire_necklace -type: crafting -level: 22 -xp: 55 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [sapphire] - qty: 1 - - items: [necklace_mould] - qty: 1 - byproducts: [necklace_mould] -output: sapphire_necklace -message: "You cast a sapphire necklace." diff --git a/data/recipes/craft_sapphire_ring.yaml b/data/recipes/craft_sapphire_ring.yaml deleted file mode 100644 index dd793ac..0000000 --- a/data/recipes/craft_sapphire_ring.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: craft_sapphire_ring -type: crafting -level: 20 -xp: 40 -wait: 4 -station: [furnace] -consume: - - items: [gold_bar] - qty: 1 - - items: [sapphire] - qty: 1 - - items: [ring_mould] - qty: 1 - byproducts: [ring_mould] -output: sapphire_ring -message: "You cast a sapphire ring." diff --git a/data/recipes/craft_unfired_pie_dish.yaml b/data/recipes/craft_unfired_pie_dish.yaml deleted file mode 100644 index e55d47e..0000000 --- a/data/recipes/craft_unfired_pie_dish.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: craft_unfired_pie_dish -type: crafting -level: 7 -xp: 15 -wait: 4 -station: [pottery_wheel] -consume: - - items: [soft_clay] - qty: 1 -output: unfired_pie_dish -message: "You shape the clay into a pie dish." diff --git a/data/recipes/craft_unfired_plant_pot.yaml b/data/recipes/craft_unfired_plant_pot.yaml deleted file mode 100644 index 6dbd8ef..0000000 --- a/data/recipes/craft_unfired_plant_pot.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: craft_unfired_plant_pot -type: crafting -level: 19 -xp: 18 -wait: 4 -station: [pottery_wheel] -consume: - - items: [soft_clay] - qty: 1 -output: unfired_plant_pot -message: "You shape the clay into a plant pot." diff --git a/data/recipes/craft_unfired_pot.yaml b/data/recipes/craft_unfired_pot.yaml deleted file mode 100644 index 8d72be0..0000000 --- a/data/recipes/craft_unfired_pot.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: craft_unfired_pot -type: crafting -level: 1 -xp: 6 -wait: 4 -station: [pottery_wheel] -consume: - - items: [soft_clay] - qty: 1 -output: unfired_pot -message: "You shape the clay into a pot." diff --git a/data/recipes/crafting/craft_ball_of_wool.yaml b/data/recipes/crafting/craft_ball_of_wool.yaml new file mode 100644 index 0000000..ef25972 --- /dev/null +++ b/data/recipes/crafting/craft_ball_of_wool.yaml @@ -0,0 +1,11 @@ +id: craft_ball_of_wool +type: crafting +level: 1 +xp: 3 +wait: 3 +station: [spinning_wheel] +consume: + - items: [wool] + quantity: 1 +output: ball_of_wool +message: "You spin the wool into a ball." diff --git a/data/recipes/crafting/craft_bowstring.yaml b/data/recipes/crafting/craft_bowstring.yaml new file mode 100644 index 0000000..caca1a4 --- /dev/null +++ b/data/recipes/crafting/craft_bowstring.yaml @@ -0,0 +1,11 @@ +id: craft_bowstring +type: crafting +level: 1 +xp: 15 +wait: 3 +station: [spinning_wheel] +consume: + - items: [flax] + quantity: 1 +output: bowstring +message: "You spin the flax into a bowstring." diff --git a/data/recipes/crafting/craft_coif.yaml b/data/recipes/crafting/craft_coif.yaml new file mode 100644 index 0000000..4aa914a --- /dev/null +++ b/data/recipes/crafting/craft_coif.yaml @@ -0,0 +1,13 @@ +id: craft_coif +type: crafting +level: 38 +xp: 37 +wait: 4 +tool: needle +consume: + - items: [hard_leather] + quantity: 1 + - items: [thread] + quantity: 1 +output: coif +message: "You craft a coif." diff --git a/data/recipes/crafting/craft_cut_diamond.yaml b/data/recipes/crafting/craft_cut_diamond.yaml new file mode 100644 index 0000000..175a518 --- /dev/null +++ b/data/recipes/crafting/craft_cut_diamond.yaml @@ -0,0 +1,11 @@ +id: craft_cut_diamond +type: crafting +level: 43 +xp: 108 +wait: 3 +tool: chisel +consume: + - items: [uncut_diamond] + quantity: 1 +output: diamond +message: "You cut the diamond into a beautiful gem." diff --git a/data/recipes/crafting/craft_cut_emerald.yaml b/data/recipes/crafting/craft_cut_emerald.yaml new file mode 100644 index 0000000..f725103 --- /dev/null +++ b/data/recipes/crafting/craft_cut_emerald.yaml @@ -0,0 +1,11 @@ +id: craft_cut_emerald +type: crafting +level: 27 +xp: 68 +wait: 3 +tool: chisel +consume: + - items: [uncut_emerald] + quantity: 1 +output: emerald +message: "You cut the emerald into a beautiful gem." diff --git a/data/recipes/crafting/craft_cut_ruby.yaml b/data/recipes/crafting/craft_cut_ruby.yaml new file mode 100644 index 0000000..bfc5e88 --- /dev/null +++ b/data/recipes/crafting/craft_cut_ruby.yaml @@ -0,0 +1,11 @@ +id: craft_cut_ruby +type: crafting +level: 63 +xp: 85 +wait: 3 +tool: chisel +consume: + - items: [uncut_ruby] + quantity: 1 +output: ruby +message: "You cut the ruby into a beautiful gem." diff --git a/data/recipes/crafting/craft_cut_sapphire.yaml b/data/recipes/crafting/craft_cut_sapphire.yaml new file mode 100644 index 0000000..bfd9a00 --- /dev/null +++ b/data/recipes/crafting/craft_cut_sapphire.yaml @@ -0,0 +1,11 @@ +id: craft_cut_sapphire +type: crafting +level: 20 +xp: 50 +wait: 3 +tool: chisel +consume: + - items: [uncut_sapphire] + quantity: 1 +output: sapphire +message: "You cut the sapphire into a beautiful gem." diff --git a/data/recipes/crafting/craft_diamond_amulet_u.yaml b/data/recipes/crafting/craft_diamond_amulet_u.yaml new file mode 100644 index 0000000..533ce2e --- /dev/null +++ b/data/recipes/crafting/craft_diamond_amulet_u.yaml @@ -0,0 +1,16 @@ +id: craft_diamond_amulet_u +type: crafting +level: 70 +xp: 100 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [diamond] + quantity: 1 + - items: [amulet_mould] + quantity: 1 + byproducts: [amulet_mould] +output: diamond_amulet_u +message: "You cast a diamond amulet." diff --git a/data/recipes/crafting/craft_diamond_bracelet.yaml b/data/recipes/crafting/craft_diamond_bracelet.yaml new file mode 100644 index 0000000..f9486d3 --- /dev/null +++ b/data/recipes/crafting/craft_diamond_bracelet.yaml @@ -0,0 +1,16 @@ +id: craft_diamond_bracelet +type: crafting +level: 58 +xp: 95 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [diamond] + quantity: 1 + - items: [bracelet_mould] + quantity: 1 + byproducts: [bracelet_mould] +output: diamond_bracelet +message: "You cast a diamond bracelet." diff --git a/data/recipes/crafting/craft_diamond_necklace.yaml b/data/recipes/crafting/craft_diamond_necklace.yaml new file mode 100644 index 0000000..bdd4425 --- /dev/null +++ b/data/recipes/crafting/craft_diamond_necklace.yaml @@ -0,0 +1,16 @@ +id: craft_diamond_necklace +type: crafting +level: 56 +xp: 90 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [diamond] + quantity: 1 + - items: [necklace_mould] + quantity: 1 + byproducts: [necklace_mould] +output: diamond_necklace +message: "You cast a diamond necklace." diff --git a/data/recipes/crafting/craft_diamond_ring.yaml b/data/recipes/crafting/craft_diamond_ring.yaml new file mode 100644 index 0000000..eaf3a59 --- /dev/null +++ b/data/recipes/crafting/craft_diamond_ring.yaml @@ -0,0 +1,16 @@ +id: craft_diamond_ring +type: crafting +level: 43 +xp: 85 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [diamond] + quantity: 1 + - items: [ring_mould] + quantity: 1 + byproducts: [ring_mould] +output: diamond_ring +message: "You cast a diamond ring." diff --git a/data/recipes/crafting/craft_emerald_amulet_u.yaml b/data/recipes/crafting/craft_emerald_amulet_u.yaml new file mode 100644 index 0000000..82773fb --- /dev/null +++ b/data/recipes/crafting/craft_emerald_amulet_u.yaml @@ -0,0 +1,16 @@ +id: craft_emerald_amulet_u +type: crafting +level: 31 +xp: 70 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [emerald] + quantity: 1 + - items: [amulet_mould] + quantity: 1 + byproducts: [amulet_mould] +output: emerald_amulet_u +message: "You cast a emerald amulet." diff --git a/data/recipes/crafting/craft_emerald_bracelet.yaml b/data/recipes/crafting/craft_emerald_bracelet.yaml new file mode 100644 index 0000000..3c2f7b4 --- /dev/null +++ b/data/recipes/crafting/craft_emerald_bracelet.yaml @@ -0,0 +1,16 @@ +id: craft_emerald_bracelet +type: crafting +level: 30 +xp: 65 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [emerald] + quantity: 1 + - items: [bracelet_mould] + quantity: 1 + byproducts: [bracelet_mould] +output: emerald_bracelet +message: "You cast a emerald bracelet." diff --git a/data/recipes/crafting/craft_emerald_necklace.yaml b/data/recipes/crafting/craft_emerald_necklace.yaml new file mode 100644 index 0000000..7815c16 --- /dev/null +++ b/data/recipes/crafting/craft_emerald_necklace.yaml @@ -0,0 +1,16 @@ +id: craft_emerald_necklace +type: crafting +level: 29 +xp: 60 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [emerald] + quantity: 1 + - items: [necklace_mould] + quantity: 1 + byproducts: [necklace_mould] +output: emerald_necklace +message: "You cast a emerald necklace." diff --git a/data/recipes/crafting/craft_emerald_ring.yaml b/data/recipes/crafting/craft_emerald_ring.yaml new file mode 100644 index 0000000..2590490 --- /dev/null +++ b/data/recipes/crafting/craft_emerald_ring.yaml @@ -0,0 +1,16 @@ +id: craft_emerald_ring +type: crafting +level: 27 +xp: 55 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [emerald] + quantity: 1 + - items: [ring_mould] + quantity: 1 + byproducts: [ring_mould] +output: emerald_ring +message: "You cast a emerald ring." diff --git a/data/recipes/crafting/craft_gold_amulet_u.yaml b/data/recipes/crafting/craft_gold_amulet_u.yaml new file mode 100644 index 0000000..69daa89 --- /dev/null +++ b/data/recipes/crafting/craft_gold_amulet_u.yaml @@ -0,0 +1,14 @@ +id: craft_gold_amulet_u +type: crafting +level: 8 +xp: 30 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [amulet_mould] + quantity: 1 + byproducts: [amulet_mould] +output: gold_amulet_u +message: "You cast a gold amulet." diff --git a/data/recipes/crafting/craft_gold_bracelet.yaml b/data/recipes/crafting/craft_gold_bracelet.yaml new file mode 100644 index 0000000..e3de6d0 --- /dev/null +++ b/data/recipes/crafting/craft_gold_bracelet.yaml @@ -0,0 +1,14 @@ +id: craft_gold_bracelet +type: crafting +level: 7 +xp: 25 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [bracelet_mould] + quantity: 1 + byproducts: [bracelet_mould] +output: gold_bracelet +message: "You cast a gold bracelet." diff --git a/data/recipes/crafting/craft_gold_necklace.yaml b/data/recipes/crafting/craft_gold_necklace.yaml new file mode 100644 index 0000000..ab52bef --- /dev/null +++ b/data/recipes/crafting/craft_gold_necklace.yaml @@ -0,0 +1,14 @@ +id: craft_gold_necklace +type: crafting +level: 6 +xp: 20 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [necklace_mould] + quantity: 1 + byproducts: [necklace_mould] +output: gold_necklace +message: "You cast a gold necklace." diff --git a/data/recipes/crafting/craft_gold_ring.yaml b/data/recipes/crafting/craft_gold_ring.yaml new file mode 100644 index 0000000..943c31d --- /dev/null +++ b/data/recipes/crafting/craft_gold_ring.yaml @@ -0,0 +1,14 @@ +id: craft_gold_ring +type: crafting +level: 5 +xp: 15 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [ring_mould] + quantity: 1 + byproducts: [ring_mould] +output: gold_ring +message: "You cast a gold ring." diff --git a/data/recipes/crafting/craft_hard_leather_body.yaml b/data/recipes/crafting/craft_hard_leather_body.yaml new file mode 100644 index 0000000..d1287df --- /dev/null +++ b/data/recipes/crafting/craft_hard_leather_body.yaml @@ -0,0 +1,13 @@ +id: craft_hard_leather_body +type: crafting +level: 28 +xp: 35 +wait: 4 +tool: needle +consume: + - items: [hard_leather] + quantity: 1 + - items: [thread] + quantity: 1 +output: hard_leather_body +message: "You craft a hard leather body." diff --git a/data/recipes/crafting/craft_hard_leather_shield.yaml b/data/recipes/crafting/craft_hard_leather_shield.yaml new file mode 100644 index 0000000..7dbd66a --- /dev/null +++ b/data/recipes/crafting/craft_hard_leather_shield.yaml @@ -0,0 +1,13 @@ +id: craft_hard_leather_shield +type: crafting +level: 41 +xp: 40 +wait: 4 +tool: needle +consume: + - items: [hard_leather] + quantity: 1 + - items: [thread] + quantity: 1 +output: hard_leather_shield +message: "You craft a hard leather shield." diff --git a/data/recipes/crafting/craft_leather_body.yaml b/data/recipes/crafting/craft_leather_body.yaml new file mode 100644 index 0000000..0f9774e --- /dev/null +++ b/data/recipes/crafting/craft_leather_body.yaml @@ -0,0 +1,13 @@ +id: craft_leather_body +type: crafting +level: 14 +xp: 25 +wait: 4 +tool: needle +consume: + - items: [leather] + quantity: 1 + - items: [thread] + quantity: 1 +output: leather_body +message: "You craft a leather body." diff --git a/data/recipes/crafting/craft_leather_boots.yaml b/data/recipes/crafting/craft_leather_boots.yaml new file mode 100644 index 0000000..b935a08 --- /dev/null +++ b/data/recipes/crafting/craft_leather_boots.yaml @@ -0,0 +1,13 @@ +id: craft_leather_boots +type: crafting +level: 7 +xp: 16 +wait: 4 +tool: needle +consume: + - items: [leather] + quantity: 1 + - items: [thread] + quantity: 1 +output: leather_boots +message: "You craft a pair of leather boots." diff --git a/data/recipes/crafting/craft_leather_chaps.yaml b/data/recipes/crafting/craft_leather_chaps.yaml new file mode 100644 index 0000000..fac2a9d --- /dev/null +++ b/data/recipes/crafting/craft_leather_chaps.yaml @@ -0,0 +1,13 @@ +id: craft_leather_chaps +type: crafting +level: 18 +xp: 27 +wait: 4 +tool: needle +consume: + - items: [leather] + quantity: 1 + - items: [thread] + quantity: 1 +output: leather_chaps +message: "You craft a pair of leather chaps." diff --git a/data/recipes/crafting/craft_leather_cowl.yaml b/data/recipes/crafting/craft_leather_cowl.yaml new file mode 100644 index 0000000..9e5de25 --- /dev/null +++ b/data/recipes/crafting/craft_leather_cowl.yaml @@ -0,0 +1,13 @@ +id: craft_leather_cowl +type: crafting +level: 9 +xp: 19 +wait: 4 +tool: needle +consume: + - items: [leather] + quantity: 1 + - items: [thread] + quantity: 1 +output: leather_cowl +message: "You craft a leather cowl." diff --git a/data/recipes/crafting/craft_leather_gloves.yaml b/data/recipes/crafting/craft_leather_gloves.yaml new file mode 100644 index 0000000..4b4fdfc --- /dev/null +++ b/data/recipes/crafting/craft_leather_gloves.yaml @@ -0,0 +1,13 @@ +id: craft_leather_gloves +type: crafting +level: 1 +xp: 14 +wait: 4 +tool: needle +consume: + - items: [leather] + quantity: 1 + - items: [thread] + quantity: 1 +output: leather_gloves +message: "You craft a pair of leather gloves." diff --git a/data/recipes/crafting/craft_leather_vambraces.yaml b/data/recipes/crafting/craft_leather_vambraces.yaml new file mode 100644 index 0000000..1227271 --- /dev/null +++ b/data/recipes/crafting/craft_leather_vambraces.yaml @@ -0,0 +1,13 @@ +id: craft_leather_vambraces +type: crafting +level: 11 +xp: 22 +wait: 4 +tool: needle +consume: + - items: [leather] + quantity: 1 + - items: [thread] + quantity: 1 +output: leather_vambraces +message: "You craft a pair of leather vambraces." diff --git a/data/recipes/crafting/craft_pie_dish.yaml b/data/recipes/crafting/craft_pie_dish.yaml new file mode 100644 index 0000000..2b31d17 --- /dev/null +++ b/data/recipes/crafting/craft_pie_dish.yaml @@ -0,0 +1,16 @@ +id: craft_pie_dish +type: crafting +level: 7 +xp: 10 +wait: 4 +station: [pottery_oven] +consume: + - items: [unfired_pie_dish] + quantity: 1 +output: pie_dish +message: "You fire the pie dish in the oven successfully." +fail_message: "The pie dish cracks in the oven and is ruined." +success: + base: 0.40 + per_level: 0.02 + cap: 0.95 diff --git a/data/recipes/crafting/craft_plant_pot.yaml b/data/recipes/crafting/craft_plant_pot.yaml new file mode 100644 index 0000000..ddfcefa --- /dev/null +++ b/data/recipes/crafting/craft_plant_pot.yaml @@ -0,0 +1,16 @@ +id: craft_plant_pot +type: crafting +level: 19 +xp: 18 +wait: 4 +station: [pottery_oven] +consume: + - items: [unfired_plant_pot] + quantity: 1 +output: plant_pot +message: "You fire the plant pot in the oven successfully." +fail_message: "The plant pot cracks in the oven and is ruined." +success: + base: 0.30 + per_level: 0.02 + cap: 0.95 diff --git a/data/recipes/crafting/craft_pot.yaml b/data/recipes/crafting/craft_pot.yaml new file mode 100644 index 0000000..1b80eef --- /dev/null +++ b/data/recipes/crafting/craft_pot.yaml @@ -0,0 +1,16 @@ +id: craft_pot +type: crafting +level: 1 +xp: 6 +wait: 4 +station: [pottery_oven] +consume: + - items: [unfired_pot] + quantity: 1 +output: empty_pot +message: "You fire the pot in the oven successfully." +fail_message: "The pot cracks in the oven and is ruined." +success: + base: 0.50 + per_level: 0.02 + cap: 0.95 diff --git a/data/recipes/crafting/craft_ruby_amulet_u.yaml b/data/recipes/crafting/craft_ruby_amulet_u.yaml new file mode 100644 index 0000000..38a864e --- /dev/null +++ b/data/recipes/crafting/craft_ruby_amulet_u.yaml @@ -0,0 +1,16 @@ +id: craft_ruby_amulet_u +type: crafting +level: 50 +xp: 85 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [ruby] + quantity: 1 + - items: [amulet_mould] + quantity: 1 + byproducts: [amulet_mould] +output: ruby_amulet_u +message: "You cast a ruby amulet." diff --git a/data/recipes/crafting/craft_ruby_bracelet.yaml b/data/recipes/crafting/craft_ruby_bracelet.yaml new file mode 100644 index 0000000..bcc963e --- /dev/null +++ b/data/recipes/crafting/craft_ruby_bracelet.yaml @@ -0,0 +1,16 @@ +id: craft_ruby_bracelet +type: crafting +level: 42 +xp: 80 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [ruby] + quantity: 1 + - items: [bracelet_mould] + quantity: 1 + byproducts: [bracelet_mould] +output: ruby_bracelet +message: "You cast a ruby bracelet." diff --git a/data/recipes/crafting/craft_ruby_necklace.yaml b/data/recipes/crafting/craft_ruby_necklace.yaml new file mode 100644 index 0000000..60e47a3 --- /dev/null +++ b/data/recipes/crafting/craft_ruby_necklace.yaml @@ -0,0 +1,16 @@ +id: craft_ruby_necklace +type: crafting +level: 40 +xp: 75 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [ruby] + quantity: 1 + - items: [necklace_mould] + quantity: 1 + byproducts: [necklace_mould] +output: ruby_necklace +message: "You cast a ruby necklace." diff --git a/data/recipes/crafting/craft_ruby_ring.yaml b/data/recipes/crafting/craft_ruby_ring.yaml new file mode 100644 index 0000000..61d2b46 --- /dev/null +++ b/data/recipes/crafting/craft_ruby_ring.yaml @@ -0,0 +1,16 @@ +id: craft_ruby_ring +type: crafting +level: 63 +xp: 70 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [ruby] + quantity: 1 + - items: [ring_mould] + quantity: 1 + byproducts: [ring_mould] +output: ruby_ring +message: "You cast a ruby ring." diff --git a/data/recipes/crafting/craft_sapphire_amulet_u.yaml b/data/recipes/crafting/craft_sapphire_amulet_u.yaml new file mode 100644 index 0000000..07ef6bf --- /dev/null +++ b/data/recipes/crafting/craft_sapphire_amulet_u.yaml @@ -0,0 +1,16 @@ +id: craft_sapphire_amulet_u +type: crafting +level: 24 +xp: 65 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [sapphire] + quantity: 1 + - items: [amulet_mould] + quantity: 1 + byproducts: [amulet_mould] +output: sapphire_amulet_u +message: "You cast a sapphire amulet." diff --git a/data/recipes/crafting/craft_sapphire_bracelet.yaml b/data/recipes/crafting/craft_sapphire_bracelet.yaml new file mode 100644 index 0000000..3bc1067 --- /dev/null +++ b/data/recipes/crafting/craft_sapphire_bracelet.yaml @@ -0,0 +1,16 @@ +id: craft_sapphire_bracelet +type: crafting +level: 23 +xp: 60 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [sapphire] + quantity: 1 + - items: [bracelet_mould] + quantity: 1 + byproducts: [bracelet_mould] +output: sapphire_bracelet +message: "You cast a sapphire bracelet." diff --git a/data/recipes/crafting/craft_sapphire_necklace.yaml b/data/recipes/crafting/craft_sapphire_necklace.yaml new file mode 100644 index 0000000..8006bf7 --- /dev/null +++ b/data/recipes/crafting/craft_sapphire_necklace.yaml @@ -0,0 +1,16 @@ +id: craft_sapphire_necklace +type: crafting +level: 22 +xp: 55 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [sapphire] + quantity: 1 + - items: [necklace_mould] + quantity: 1 + byproducts: [necklace_mould] +output: sapphire_necklace +message: "You cast a sapphire necklace." diff --git a/data/recipes/crafting/craft_sapphire_ring.yaml b/data/recipes/crafting/craft_sapphire_ring.yaml new file mode 100644 index 0000000..cc67b73 --- /dev/null +++ b/data/recipes/crafting/craft_sapphire_ring.yaml @@ -0,0 +1,16 @@ +id: craft_sapphire_ring +type: crafting +level: 20 +xp: 40 +wait: 4 +station: [furnace] +consume: + - items: [gold_bar] + quantity: 1 + - items: [sapphire] + quantity: 1 + - items: [ring_mould] + quantity: 1 + byproducts: [ring_mould] +output: sapphire_ring +message: "You cast a sapphire ring." diff --git a/data/recipes/crafting/craft_unfired_pie_dish.yaml b/data/recipes/crafting/craft_unfired_pie_dish.yaml new file mode 100644 index 0000000..7ba5032 --- /dev/null +++ b/data/recipes/crafting/craft_unfired_pie_dish.yaml @@ -0,0 +1,11 @@ +id: craft_unfired_pie_dish +type: crafting +level: 7 +xp: 15 +wait: 4 +station: [pottery_wheel] +consume: + - items: [soft_clay] + quantity: 1 +output: unfired_pie_dish +message: "You shape the clay into a pie dish." diff --git a/data/recipes/crafting/craft_unfired_plant_pot.yaml b/data/recipes/crafting/craft_unfired_plant_pot.yaml new file mode 100644 index 0000000..db7a38e --- /dev/null +++ b/data/recipes/crafting/craft_unfired_plant_pot.yaml @@ -0,0 +1,11 @@ +id: craft_unfired_plant_pot +type: crafting +level: 19 +xp: 18 +wait: 4 +station: [pottery_wheel] +consume: + - items: [soft_clay] + quantity: 1 +output: unfired_plant_pot +message: "You shape the clay into a plant pot." diff --git a/data/recipes/crafting/craft_unfired_pot.yaml b/data/recipes/crafting/craft_unfired_pot.yaml new file mode 100644 index 0000000..5b2762d --- /dev/null +++ b/data/recipes/crafting/craft_unfired_pot.yaml @@ -0,0 +1,11 @@ +id: craft_unfired_pot +type: crafting +level: 1 +xp: 6 +wait: 4 +station: [pottery_wheel] +consume: + - items: [soft_clay] + quantity: 1 +output: unfired_pot +message: "You shape the clay into a pot." diff --git a/data/recipes/fletch_adamant_arrow.yaml b/data/recipes/fletch_adamant_arrow.yaml deleted file mode 100644 index 0166c99..0000000 --- a/data/recipes/fletch_adamant_arrow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_adamant_arrow -type: fletching -level: 60 -xp: 10 -wait: 2 -consume: - - items: [headless_arrow] - qty: 15 - - items: [adamant_arrowtips] - qty: 15 -output: adamant_arrow -output_qty: 15 -message: "You attach the adamant arrowtips to the headless arrows." diff --git a/data/recipes/fletch_adamant_bolts.yaml b/data/recipes/fletch_adamant_bolts.yaml deleted file mode 100644 index 46aa57f..0000000 --- a/data/recipes/fletch_adamant_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_adamant_bolts -type: fletching -level: 61 -xp: 70 -wait: 0 -consume: - - items: [adamant_bolts_unf] - qty: 10 - - items: [feather] - qty: 10 -output: adamant_bolts -output_qty: 10 -message: "You attach feathers to the adamant bolts." diff --git a/data/recipes/fletch_arrow_shaft.yaml b/data/recipes/fletch_arrow_shaft.yaml deleted file mode 100644 index b2d3c81..0000000 --- a/data/recipes/fletch_arrow_shaft.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_arrow_shaft -type: fletching -tool: knife -level: 1 -xp: 5 -wait: 5 -consume: - - items: [logs] - qty: 1 -output: arrow_shaft -output_qty: 15 -message: "You carefully cut the logs into arrow shafts." diff --git a/data/recipes/fletch_arrow_shaft_magic.yaml b/data/recipes/fletch_arrow_shaft_magic.yaml deleted file mode 100644 index b72c4b8..0000000 --- a/data/recipes/fletch_arrow_shaft_magic.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_arrow_shaft_magic -type: fletching -tool: knife -level: 75 -xp: 30 -wait: 5 -consume: - - items: [magic_logs] - qty: 1 -output: arrow_shaft -output_qty: 40 -message: "You carefully cut the magic logs into arrow shafts." diff --git a/data/recipes/fletch_arrow_shaft_maple.yaml b/data/recipes/fletch_arrow_shaft_maple.yaml deleted file mode 100644 index aa9fea6..0000000 --- a/data/recipes/fletch_arrow_shaft_maple.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_arrow_shaft_maple -type: fletching -tool: knife -level: 45 -xp: 20 -wait: 5 -consume: - - items: [maple_logs] - qty: 1 -output: arrow_shaft -output_qty: 30 -message: "You carefully cut the maple logs into arrow shafts." diff --git a/data/recipes/fletch_arrow_shaft_oak.yaml b/data/recipes/fletch_arrow_shaft_oak.yaml deleted file mode 100644 index 1940e87..0000000 --- a/data/recipes/fletch_arrow_shaft_oak.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_arrow_shaft_oak -type: fletching -tool: knife -level: 15 -xp: 10 -wait: 5 -consume: - - items: [oak_logs] - qty: 1 -output: arrow_shaft -output_qty: 20 -message: "You carefully cut the oak logs into arrow shafts." diff --git a/data/recipes/fletch_arrow_shaft_willow.yaml b/data/recipes/fletch_arrow_shaft_willow.yaml deleted file mode 100644 index 986ffae..0000000 --- a/data/recipes/fletch_arrow_shaft_willow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_arrow_shaft_willow -type: fletching -tool: knife -level: 30 -xp: 15 -wait: 5 -consume: - - items: [willow_logs] - qty: 1 -output: arrow_shaft -output_qty: 25 -message: "You carefully cut the willow logs into arrow shafts." diff --git a/data/recipes/fletch_arrow_shaft_yew.yaml b/data/recipes/fletch_arrow_shaft_yew.yaml deleted file mode 100644 index bc7775e..0000000 --- a/data/recipes/fletch_arrow_shaft_yew.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_arrow_shaft_yew -type: fletching -tool: knife -level: 60 -xp: 25 -wait: 5 -consume: - - items: [yew_logs] - qty: 1 -output: arrow_shaft -output_qty: 35 -message: "You carefully cut the yew logs into arrow shafts." diff --git a/data/recipes/fletch_bronze_arrow.yaml b/data/recipes/fletch_bronze_arrow.yaml deleted file mode 100644 index 4cc7aca..0000000 --- a/data/recipes/fletch_bronze_arrow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_bronze_arrow -type: fletching -level: 1 -xp: 1 -wait: 2 -consume: - - items: [headless_arrow] - qty: 15 - - items: [bronze_arrowtips] - qty: 15 -output: bronze_arrow -output_qty: 15 -message: "You attach the bronze arrowtips to the headless arrows." diff --git a/data/recipes/fletch_bronze_bolts.yaml b/data/recipes/fletch_bronze_bolts.yaml deleted file mode 100644 index f10595a..0000000 --- a/data/recipes/fletch_bronze_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_bronze_bolts -type: fletching -level: 9 -xp: 5 -wait: 0 -consume: - - items: [bronze_bolts_unf] - qty: 10 - - items: [feather] - qty: 10 -output: bronze_bolts -output_qty: 10 -message: "You attach feathers to the bronze bolts." diff --git a/data/recipes/fletch_diamond_bolt_tips.yaml b/data/recipes/fletch_diamond_bolt_tips.yaml deleted file mode 100644 index dc57964..0000000 --- a/data/recipes/fletch_diamond_bolt_tips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_diamond_bolt_tips -type: fletching -tool: chisel -level: 65 -xp: 7 -wait: 5 -consume: - - items: [uncut_diamond] - qty: 1 -output: diamond_bolt_tips -output_qty: 12 -message: "You cut the diamond into bolt tips." diff --git a/data/recipes/fletch_diamond_bolts.yaml b/data/recipes/fletch_diamond_bolts.yaml deleted file mode 100644 index 7b0a460..0000000 --- a/data/recipes/fletch_diamond_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_diamond_bolts -type: fletching -level: 65 -xp: 7 -wait: 2 -consume: - - items: [adamant_bolts] - qty: 10 - - items: [diamond_bolt_tips] - qty: 10 -output: diamond_bolts -output_qty: 10 -message: "You tip the adamant bolts with diamond." diff --git a/data/recipes/fletch_emerald_bolt_tips.yaml b/data/recipes/fletch_emerald_bolt_tips.yaml deleted file mode 100644 index b7d78a5..0000000 --- a/data/recipes/fletch_emerald_bolt_tips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_emerald_bolt_tips -type: fletching -tool: chisel -level: 66 -xp: 5 -wait: 5 -consume: - - items: [uncut_emerald] - qty: 1 -output: emerald_bolt_tips -output_qty: 12 -message: "You cut the emerald into bolt tips." diff --git a/data/recipes/fletch_emerald_bolts.yaml b/data/recipes/fletch_emerald_bolts.yaml deleted file mode 100644 index 353432a..0000000 --- a/data/recipes/fletch_emerald_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_emerald_bolts -type: fletching -level: 66 -xp: 5 -wait: 2 -consume: - - items: [mithril_bolts] - qty: 10 - - items: [emerald_bolt_tips] - qty: 10 -output: emerald_bolts -output_qty: 10 -message: "You tip the mithril bolts with emerald." diff --git a/data/recipes/fletch_headless_arrow.yaml b/data/recipes/fletch_headless_arrow.yaml deleted file mode 100644 index 3016430..0000000 --- a/data/recipes/fletch_headless_arrow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_headless_arrow -type: fletching -level: 1 -xp: 1 -wait: 2 -consume: - - items: [arrow_shaft] - qty: 15 - - items: [feather] - qty: 15 -output: headless_arrow -output_qty: 15 -message: "You attach feathers to the arrow shafts." diff --git a/data/recipes/fletch_iron_arrow.yaml b/data/recipes/fletch_iron_arrow.yaml deleted file mode 100644 index 2727ca1..0000000 --- a/data/recipes/fletch_iron_arrow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_iron_arrow -type: fletching -level: 15 -xp: 2 -wait: 2 -consume: - - items: [headless_arrow] - qty: 15 - - items: [iron_arrowtips] - qty: 15 -output: iron_arrow -output_qty: 15 -message: "You attach the iron arrowtips to the headless arrows." diff --git a/data/recipes/fletch_iron_bolts.yaml b/data/recipes/fletch_iron_bolts.yaml deleted file mode 100644 index 44a623f..0000000 --- a/data/recipes/fletch_iron_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_iron_bolts -type: fletching -level: 39 -xp: 15 -wait: 0 -consume: - - items: [iron_bolts_unf] - qty: 10 - - items: [feather] - qty: 10 -output: iron_bolts -output_qty: 10 -message: "You attach feathers to the iron bolts." diff --git a/data/recipes/fletch_longbow.yaml b/data/recipes/fletch_longbow.yaml deleted file mode 100644 index 392ccfb..0000000 --- a/data/recipes/fletch_longbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_longbow -type: fletching -level: 10 -xp: 10 -wait: 2 -consume: - - items: [longbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: longbow -message: "You string the longbow." diff --git a/data/recipes/fletch_longbow_u.yaml b/data/recipes/fletch_longbow_u.yaml deleted file mode 100644 index e836a9e..0000000 --- a/data/recipes/fletch_longbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_longbow_u -type: fletching -tool: knife -level: 10 -xp: 10 -wait: 3 -consume: - - items: [logs] - qty: 1 -output: longbow_u -message: "You carefully carve the log into a longbow." diff --git a/data/recipes/fletch_magic_longbow.yaml b/data/recipes/fletch_magic_longbow.yaml deleted file mode 100644 index c8cc0d4..0000000 --- a/data/recipes/fletch_magic_longbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_magic_longbow -type: fletching -level: 85 -xp: 91 -wait: 2 -consume: - - items: [magic_longbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: magic_longbow -message: "You string the magic longbow." diff --git a/data/recipes/fletch_magic_longbow_u.yaml b/data/recipes/fletch_magic_longbow_u.yaml deleted file mode 100644 index 19eddc8..0000000 --- a/data/recipes/fletch_magic_longbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_magic_longbow_u -type: fletching -tool: knife -level: 85 -xp: 91 -wait: 3 -consume: - - items: [magic_logs] - qty: 1 -output: magic_longbow_u -message: "You carefully carve the magic log into a longbow." diff --git a/data/recipes/fletch_magic_shortbow.yaml b/data/recipes/fletch_magic_shortbow.yaml deleted file mode 100644 index b9b3bb2..0000000 --- a/data/recipes/fletch_magic_shortbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_magic_shortbow -type: fletching -level: 80 -xp: 83 -wait: 2 -consume: - - items: [magic_shortbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: magic_shortbow -message: "You string the magic shortbow." diff --git a/data/recipes/fletch_magic_shortbow_u.yaml b/data/recipes/fletch_magic_shortbow_u.yaml deleted file mode 100644 index e9f2e38..0000000 --- a/data/recipes/fletch_magic_shortbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_magic_shortbow_u -type: fletching -tool: knife -level: 80 -xp: 83 -wait: 3 -consume: - - items: [magic_logs] - qty: 1 -output: magic_shortbow_u -message: "You carefully carve the magic log into a shortbow." diff --git a/data/recipes/fletch_maple_longbow.yaml b/data/recipes/fletch_maple_longbow.yaml deleted file mode 100644 index 1ecfb74..0000000 --- a/data/recipes/fletch_maple_longbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_maple_longbow -type: fletching -level: 55 -xp: 58 -wait: 2 -consume: - - items: [maple_longbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: maple_longbow -message: "You string the maple longbow." diff --git a/data/recipes/fletch_maple_longbow_u.yaml b/data/recipes/fletch_maple_longbow_u.yaml deleted file mode 100644 index 981c6e0..0000000 --- a/data/recipes/fletch_maple_longbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_maple_longbow_u -type: fletching -tool: knife -level: 55 -xp: 58 -wait: 3 -consume: - - items: [maple_logs] - qty: 1 -output: maple_longbow_u -message: "You carefully carve the maple log into a longbow." diff --git a/data/recipes/fletch_maple_shortbow.yaml b/data/recipes/fletch_maple_shortbow.yaml deleted file mode 100644 index 844a080..0000000 --- a/data/recipes/fletch_maple_shortbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_maple_shortbow -type: fletching -level: 50 -xp: 50 -wait: 2 -consume: - - items: [maple_shortbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: maple_shortbow -message: "You string the maple shortbow." diff --git a/data/recipes/fletch_maple_shortbow_u.yaml b/data/recipes/fletch_maple_shortbow_u.yaml deleted file mode 100644 index 56dc15c..0000000 --- a/data/recipes/fletch_maple_shortbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_maple_shortbow_u -type: fletching -tool: knife -level: 50 -xp: 50 -wait: 3 -consume: - - items: [maple_logs] - qty: 1 -output: maple_shortbow_u -message: "You carefully carve the maple log into a shortbow." diff --git a/data/recipes/fletch_mithril_arrow.yaml b/data/recipes/fletch_mithril_arrow.yaml deleted file mode 100644 index 1d03823..0000000 --- a/data/recipes/fletch_mithril_arrow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_mithril_arrow -type: fletching -level: 45 -xp: 7 -wait: 2 -consume: - - items: [headless_arrow] - qty: 15 - - items: [mithril_arrowtips] - qty: 15 -output: mithril_arrow -output_qty: 15 -message: "You attach the mithril arrowtips to the headless arrows." diff --git a/data/recipes/fletch_mithril_bolts.yaml b/data/recipes/fletch_mithril_bolts.yaml deleted file mode 100644 index 90e85a8..0000000 --- a/data/recipes/fletch_mithril_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_mithril_bolts -type: fletching -level: 54 -xp: 50 -wait: 0 -consume: - - items: [mithril_bolts_unf] - qty: 10 - - items: [feather] - qty: 10 -output: mithril_bolts -output_qty: 10 -message: "You attach feathers to the mithril bolts." diff --git a/data/recipes/fletch_oak_longbow.yaml b/data/recipes/fletch_oak_longbow.yaml deleted file mode 100644 index 39b72d8..0000000 --- a/data/recipes/fletch_oak_longbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_oak_longbow -type: fletching -level: 25 -xp: 25 -wait: 2 -consume: - - items: [oak_longbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: oak_longbow -message: "You string the oak longbow." diff --git a/data/recipes/fletch_oak_longbow_u.yaml b/data/recipes/fletch_oak_longbow_u.yaml deleted file mode 100644 index 733c227..0000000 --- a/data/recipes/fletch_oak_longbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_oak_longbow_u -type: fletching -tool: knife -level: 25 -xp: 25 -wait: 3 -consume: - - items: [oak_logs] - qty: 1 -output: oak_longbow_u -message: "You carefully carve the oak log into a longbow." diff --git a/data/recipes/fletch_oak_shortbow.yaml b/data/recipes/fletch_oak_shortbow.yaml deleted file mode 100644 index ade20ff..0000000 --- a/data/recipes/fletch_oak_shortbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_oak_shortbow -type: fletching -level: 20 -xp: 16 -wait: 2 -consume: - - items: [oak_shortbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: oak_shortbow -message: "You string the oak shortbow." diff --git a/data/recipes/fletch_oak_shortbow_u.yaml b/data/recipes/fletch_oak_shortbow_u.yaml deleted file mode 100644 index d994a77..0000000 --- a/data/recipes/fletch_oak_shortbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_oak_shortbow_u -type: fletching -tool: knife -level: 20 -xp: 16 -wait: 3 -consume: - - items: [oak_logs] - qty: 1 -output: oak_shortbow_u -message: "You carefully carve the oak log into a shortbow." diff --git a/data/recipes/fletch_ruby_bolt_tips.yaml b/data/recipes/fletch_ruby_bolt_tips.yaml deleted file mode 100644 index 293a840..0000000 --- a/data/recipes/fletch_ruby_bolt_tips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_ruby_bolt_tips -type: fletching -tool: chisel -level: 73 -xp: 6 -wait: 5 -consume: - - items: [uncut_ruby] - qty: 1 -output: ruby_bolt_tips -output_qty: 12 -message: "You cut the ruby into bolt tips." diff --git a/data/recipes/fletch_ruby_bolts.yaml b/data/recipes/fletch_ruby_bolts.yaml deleted file mode 100644 index 1fdac70..0000000 --- a/data/recipes/fletch_ruby_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_ruby_bolts -type: fletching -level: 73 -xp: 6 -wait: 2 -consume: - - items: [adamant_bolts] - qty: 10 - - items: [ruby_bolt_tips] - qty: 10 -output: ruby_bolts -output_qty: 10 -message: "You tip the adamant bolts with ruby." diff --git a/data/recipes/fletch_rune_arrow.yaml b/data/recipes/fletch_rune_arrow.yaml deleted file mode 100644 index a208bce..0000000 --- a/data/recipes/fletch_rune_arrow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_rune_arrow -type: fletching -level: 75 -xp: 12 -wait: 2 -consume: - - items: [headless_arrow] - qty: 15 - - items: [rune_arrowtips] - qty: 15 -output: rune_arrow -output_qty: 15 -message: "You attach the rune arrowtips to the headless arrows." diff --git a/data/recipes/fletch_rune_bolts.yaml b/data/recipes/fletch_rune_bolts.yaml deleted file mode 100644 index 6073d7f..0000000 --- a/data/recipes/fletch_rune_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_rune_bolts -type: fletching -level: 69 -xp: 100 -wait: 0 -consume: - - items: [rune_bolts_unf] - qty: 10 - - items: [feather] - qty: 10 -output: rune_bolts -output_qty: 10 -message: "You attach feathers to the rune bolts." diff --git a/data/recipes/fletch_sapphire_bolt_tips.yaml b/data/recipes/fletch_sapphire_bolt_tips.yaml deleted file mode 100644 index 353d1de..0000000 --- a/data/recipes/fletch_sapphire_bolt_tips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_sapphire_bolt_tips -type: fletching -tool: chisel -level: 63 -xp: 4 -wait: 5 -consume: - - items: [uncut_sapphire] - qty: 1 -output: sapphire_bolt_tips -output_qty: 12 -message: "You cut the sapphire into bolt tips." diff --git a/data/recipes/fletch_sapphire_bolts.yaml b/data/recipes/fletch_sapphire_bolts.yaml deleted file mode 100644 index 503809a..0000000 --- a/data/recipes/fletch_sapphire_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_sapphire_bolts -type: fletching -level: 63 -xp: 4 -wait: 2 -consume: - - items: [mithril_bolts] - qty: 10 - - items: [sapphire_bolt_tips] - qty: 10 -output: sapphire_bolts -output_qty: 10 -message: "You tip the mithril bolts with sapphire." diff --git a/data/recipes/fletch_shortbow.yaml b/data/recipes/fletch_shortbow.yaml deleted file mode 100644 index 0911aa2..0000000 --- a/data/recipes/fletch_shortbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_shortbow -type: fletching -level: 5 -xp: 5 -wait: 2 -consume: - - items: [shortbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: shortbow -message: "You string the shortbow." diff --git a/data/recipes/fletch_shortbow_u.yaml b/data/recipes/fletch_shortbow_u.yaml deleted file mode 100644 index bda2a93..0000000 --- a/data/recipes/fletch_shortbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_shortbow_u -type: fletching -tool: knife -level: 5 -xp: 5 -wait: 3 -consume: - - items: [logs] - qty: 1 -output: shortbow_u -message: "You carefully carve the log into a shortbow." diff --git a/data/recipes/fletch_steel_arrow.yaml b/data/recipes/fletch_steel_arrow.yaml deleted file mode 100644 index fc28d21..0000000 --- a/data/recipes/fletch_steel_arrow.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_steel_arrow -type: fletching -level: 30 -xp: 5 -wait: 2 -consume: - - items: [headless_arrow] - qty: 15 - - items: [steel_arrowtips] - qty: 15 -output: steel_arrow -output_qty: 15 -message: "You attach the steel arrowtips to the headless arrows." diff --git a/data/recipes/fletch_steel_bolts.yaml b/data/recipes/fletch_steel_bolts.yaml deleted file mode 100644 index 156b6e0..0000000 --- a/data/recipes/fletch_steel_bolts.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: fletch_steel_bolts -type: fletching -level: 46 -xp: 35 -wait: 0 -consume: - - items: [steel_bolts_unf] - qty: 10 - - items: [feather] - qty: 10 -output: steel_bolts -output_qty: 10 -message: "You attach feathers to the steel bolts." diff --git a/data/recipes/fletch_willow_longbow.yaml b/data/recipes/fletch_willow_longbow.yaml deleted file mode 100644 index 6f4a9c0..0000000 --- a/data/recipes/fletch_willow_longbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_willow_longbow -type: fletching -level: 40 -xp: 41 -wait: 2 -consume: - - items: [willow_longbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: willow_longbow -message: "You string the willow longbow." diff --git a/data/recipes/fletch_willow_longbow_u.yaml b/data/recipes/fletch_willow_longbow_u.yaml deleted file mode 100644 index 5afbe89..0000000 --- a/data/recipes/fletch_willow_longbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_willow_longbow_u -type: fletching -tool: knife -level: 40 -xp: 41 -wait: 3 -consume: - - items: [willow_logs] - qty: 1 -output: willow_longbow_u -message: "You carefully carve the willow log into a longbow." diff --git a/data/recipes/fletch_willow_shortbow.yaml b/data/recipes/fletch_willow_shortbow.yaml deleted file mode 100644 index e6d044f..0000000 --- a/data/recipes/fletch_willow_shortbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_willow_shortbow -type: fletching -level: 35 -xp: 33 -wait: 2 -consume: - - items: [willow_shortbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: willow_shortbow -message: "You string the willow shortbow." diff --git a/data/recipes/fletch_willow_shortbow_u.yaml b/data/recipes/fletch_willow_shortbow_u.yaml deleted file mode 100644 index b0fb490..0000000 --- a/data/recipes/fletch_willow_shortbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_willow_shortbow_u -type: fletching -tool: knife -level: 35 -xp: 33 -wait: 3 -consume: - - items: [willow_logs] - qty: 1 -output: willow_shortbow_u -message: "You carefully carve the willow log into a shortbow." diff --git a/data/recipes/fletch_yew_longbow.yaml b/data/recipes/fletch_yew_longbow.yaml deleted file mode 100644 index 34b6a79..0000000 --- a/data/recipes/fletch_yew_longbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_yew_longbow -type: fletching -level: 65 -xp: 75 -wait: 2 -consume: - - items: [yew_longbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: yew_longbow -message: "You string the yew longbow." diff --git a/data/recipes/fletch_yew_longbow_u.yaml b/data/recipes/fletch_yew_longbow_u.yaml deleted file mode 100644 index c5abe34..0000000 --- a/data/recipes/fletch_yew_longbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_yew_longbow_u -type: fletching -tool: knife -level: 65 -xp: 75 -wait: 3 -consume: - - items: [yew_logs] - qty: 1 -output: yew_longbow_u -message: "You carefully carve the yew log into a longbow." diff --git a/data/recipes/fletch_yew_shortbow.yaml b/data/recipes/fletch_yew_shortbow.yaml deleted file mode 100644 index 2dac064..0000000 --- a/data/recipes/fletch_yew_shortbow.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: fletch_yew_shortbow -type: fletching -level: 60 -xp: 67 -wait: 2 -consume: - - items: [yew_shortbow_u] - qty: 1 - - items: [bowstring] - qty: 1 -output: yew_shortbow -message: "You string the yew shortbow." diff --git a/data/recipes/fletch_yew_shortbow_u.yaml b/data/recipes/fletch_yew_shortbow_u.yaml deleted file mode 100644 index 4b61a38..0000000 --- a/data/recipes/fletch_yew_shortbow_u.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: fletch_yew_shortbow_u -type: fletching -tool: knife -level: 60 -xp: 67 -wait: 3 -consume: - - items: [yew_logs] - qty: 1 -output: yew_shortbow_u -message: "You carefully carve the yew log into a shortbow." diff --git a/data/recipes/fletching/fletch_adamant_arrow.yaml b/data/recipes/fletching/fletch_adamant_arrow.yaml new file mode 100644 index 0000000..57f899b --- /dev/null +++ b/data/recipes/fletching/fletch_adamant_arrow.yaml @@ -0,0 +1,13 @@ +id: fletch_adamant_arrow +type: fletching +level: 60 +xp: 10 +wait: 2 +consume: + - items: [headless_arrow] + quantity: 15 + - items: [adamant_arrowtips] + quantity: 15 +output: adamant_arrow +output_qty: 15 +message: "You attach the adamant arrowtips to the headless arrows." diff --git a/data/recipes/fletching/fletch_adamant_bolts.yaml b/data/recipes/fletching/fletch_adamant_bolts.yaml new file mode 100644 index 0000000..d96c811 --- /dev/null +++ b/data/recipes/fletching/fletch_adamant_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_adamant_bolts +type: fletching +level: 61 +xp: 70 +wait: 0 +consume: + - items: [adamant_bolts_unf] + quantity: 10 + - items: [feather] + quantity: 10 +output: adamant_bolts +output_qty: 10 +message: "You attach feathers to the adamant bolts." diff --git a/data/recipes/fletching/fletch_arrow_shaft.yaml b/data/recipes/fletching/fletch_arrow_shaft.yaml new file mode 100644 index 0000000..ebf3861 --- /dev/null +++ b/data/recipes/fletching/fletch_arrow_shaft.yaml @@ -0,0 +1,12 @@ +id: fletch_arrow_shaft +type: fletching +tool: knife +level: 1 +xp: 5 +wait: 5 +consume: + - items: [logs] + quantity: 1 +output: arrow_shaft +output_qty: 15 +message: "You carefully cut the logs into arrow shafts." diff --git a/data/recipes/fletching/fletch_arrow_shaft_magic.yaml b/data/recipes/fletching/fletch_arrow_shaft_magic.yaml new file mode 100644 index 0000000..0621859 --- /dev/null +++ b/data/recipes/fletching/fletch_arrow_shaft_magic.yaml @@ -0,0 +1,12 @@ +id: fletch_arrow_shaft_magic +type: fletching +tool: knife +level: 75 +xp: 30 +wait: 5 +consume: + - items: [magic_logs] + quantity: 1 +output: arrow_shaft +output_qty: 40 +message: "You carefully cut the magic logs into arrow shafts." diff --git a/data/recipes/fletching/fletch_arrow_shaft_maple.yaml b/data/recipes/fletching/fletch_arrow_shaft_maple.yaml new file mode 100644 index 0000000..b6671da --- /dev/null +++ b/data/recipes/fletching/fletch_arrow_shaft_maple.yaml @@ -0,0 +1,12 @@ +id: fletch_arrow_shaft_maple +type: fletching +tool: knife +level: 45 +xp: 20 +wait: 5 +consume: + - items: [maple_logs] + quantity: 1 +output: arrow_shaft +output_qty: 30 +message: "You carefully cut the maple logs into arrow shafts." diff --git a/data/recipes/fletching/fletch_arrow_shaft_oak.yaml b/data/recipes/fletching/fletch_arrow_shaft_oak.yaml new file mode 100644 index 0000000..cf38335 --- /dev/null +++ b/data/recipes/fletching/fletch_arrow_shaft_oak.yaml @@ -0,0 +1,12 @@ +id: fletch_arrow_shaft_oak +type: fletching +tool: knife +level: 15 +xp: 10 +wait: 5 +consume: + - items: [oak_logs] + quantity: 1 +output: arrow_shaft +output_qty: 20 +message: "You carefully cut the oak logs into arrow shafts." diff --git a/data/recipes/fletching/fletch_arrow_shaft_willow.yaml b/data/recipes/fletching/fletch_arrow_shaft_willow.yaml new file mode 100644 index 0000000..0c39a13 --- /dev/null +++ b/data/recipes/fletching/fletch_arrow_shaft_willow.yaml @@ -0,0 +1,12 @@ +id: fletch_arrow_shaft_willow +type: fletching +tool: knife +level: 30 +xp: 15 +wait: 5 +consume: + - items: [willow_logs] + quantity: 1 +output: arrow_shaft +output_qty: 25 +message: "You carefully cut the willow logs into arrow shafts." diff --git a/data/recipes/fletching/fletch_arrow_shaft_yew.yaml b/data/recipes/fletching/fletch_arrow_shaft_yew.yaml new file mode 100644 index 0000000..785325e --- /dev/null +++ b/data/recipes/fletching/fletch_arrow_shaft_yew.yaml @@ -0,0 +1,12 @@ +id: fletch_arrow_shaft_yew +type: fletching +tool: knife +level: 60 +xp: 25 +wait: 5 +consume: + - items: [yew_logs] + quantity: 1 +output: arrow_shaft +output_qty: 35 +message: "You carefully cut the yew logs into arrow shafts." diff --git a/data/recipes/fletching/fletch_bronze_arrow.yaml b/data/recipes/fletching/fletch_bronze_arrow.yaml new file mode 100644 index 0000000..4b9e924 --- /dev/null +++ b/data/recipes/fletching/fletch_bronze_arrow.yaml @@ -0,0 +1,13 @@ +id: fletch_bronze_arrow +type: fletching +level: 1 +xp: 1 +wait: 2 +consume: + - items: [headless_arrow] + quantity: 15 + - items: [bronze_arrowtips] + quantity: 15 +output: bronze_arrow +output_qty: 15 +message: "You attach the bronze arrowtips to the headless arrows." diff --git a/data/recipes/fletching/fletch_bronze_bolts.yaml b/data/recipes/fletching/fletch_bronze_bolts.yaml new file mode 100644 index 0000000..cdcf6db --- /dev/null +++ b/data/recipes/fletching/fletch_bronze_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_bronze_bolts +type: fletching +level: 9 +xp: 5 +wait: 0 +consume: + - items: [bronze_bolts_unf] + quantity: 10 + - items: [feather] + quantity: 10 +output: bronze_bolts +output_qty: 10 +message: "You attach feathers to the bronze bolts." diff --git a/data/recipes/fletching/fletch_diamond_bolt_tips.yaml b/data/recipes/fletching/fletch_diamond_bolt_tips.yaml new file mode 100644 index 0000000..0ccabe2 --- /dev/null +++ b/data/recipes/fletching/fletch_diamond_bolt_tips.yaml @@ -0,0 +1,12 @@ +id: fletch_diamond_bolt_tips +type: fletching +tool: chisel +level: 65 +xp: 7 +wait: 5 +consume: + - items: [uncut_diamond] + quantity: 1 +output: diamond_bolt_tips +output_qty: 12 +message: "You cut the diamond into bolt tips." diff --git a/data/recipes/fletching/fletch_diamond_bolts.yaml b/data/recipes/fletching/fletch_diamond_bolts.yaml new file mode 100644 index 0000000..8c98fc2 --- /dev/null +++ b/data/recipes/fletching/fletch_diamond_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_diamond_bolts +type: fletching +level: 65 +xp: 7 +wait: 2 +consume: + - items: [adamant_bolts] + quantity: 10 + - items: [diamond_bolt_tips] + quantity: 10 +output: diamond_bolts +output_qty: 10 +message: "You tip the adamant bolts with diamond." diff --git a/data/recipes/fletching/fletch_emerald_bolt_tips.yaml b/data/recipes/fletching/fletch_emerald_bolt_tips.yaml new file mode 100644 index 0000000..d48cf73 --- /dev/null +++ b/data/recipes/fletching/fletch_emerald_bolt_tips.yaml @@ -0,0 +1,12 @@ +id: fletch_emerald_bolt_tips +type: fletching +tool: chisel +level: 66 +xp: 5 +wait: 5 +consume: + - items: [uncut_emerald] + quantity: 1 +output: emerald_bolt_tips +output_qty: 12 +message: "You cut the emerald into bolt tips." diff --git a/data/recipes/fletching/fletch_emerald_bolts.yaml b/data/recipes/fletching/fletch_emerald_bolts.yaml new file mode 100644 index 0000000..8e7e446 --- /dev/null +++ b/data/recipes/fletching/fletch_emerald_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_emerald_bolts +type: fletching +level: 66 +xp: 5 +wait: 2 +consume: + - items: [mithril_bolts] + quantity: 10 + - items: [emerald_bolt_tips] + quantity: 10 +output: emerald_bolts +output_qty: 10 +message: "You tip the mithril bolts with emerald." diff --git a/data/recipes/fletching/fletch_headless_arrow.yaml b/data/recipes/fletching/fletch_headless_arrow.yaml new file mode 100644 index 0000000..84d88f5 --- /dev/null +++ b/data/recipes/fletching/fletch_headless_arrow.yaml @@ -0,0 +1,13 @@ +id: fletch_headless_arrow +type: fletching +level: 1 +xp: 1 +wait: 2 +consume: + - items: [arrow_shaft] + quantity: 15 + - items: [feather] + quantity: 15 +output: headless_arrow +output_qty: 15 +message: "You attach feathers to the arrow shafts." diff --git a/data/recipes/fletching/fletch_iron_arrow.yaml b/data/recipes/fletching/fletch_iron_arrow.yaml new file mode 100644 index 0000000..fbb1c2c --- /dev/null +++ b/data/recipes/fletching/fletch_iron_arrow.yaml @@ -0,0 +1,13 @@ +id: fletch_iron_arrow +type: fletching +level: 15 +xp: 2 +wait: 2 +consume: + - items: [headless_arrow] + quantity: 15 + - items: [iron_arrowtips] + quantity: 15 +output: iron_arrow +output_qty: 15 +message: "You attach the iron arrowtips to the headless arrows." diff --git a/data/recipes/fletching/fletch_iron_bolts.yaml b/data/recipes/fletching/fletch_iron_bolts.yaml new file mode 100644 index 0000000..bb90403 --- /dev/null +++ b/data/recipes/fletching/fletch_iron_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_iron_bolts +type: fletching +level: 39 +xp: 15 +wait: 0 +consume: + - items: [iron_bolts_unf] + quantity: 10 + - items: [feather] + quantity: 10 +output: iron_bolts +output_qty: 10 +message: "You attach feathers to the iron bolts." diff --git a/data/recipes/fletching/fletch_longbow.yaml b/data/recipes/fletching/fletch_longbow.yaml new file mode 100644 index 0000000..fa46921 --- /dev/null +++ b/data/recipes/fletching/fletch_longbow.yaml @@ -0,0 +1,12 @@ +id: fletch_longbow +type: fletching +level: 10 +xp: 10 +wait: 2 +consume: + - items: [longbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: longbow +message: "You string the longbow." diff --git a/data/recipes/fletching/fletch_longbow_u.yaml b/data/recipes/fletching/fletch_longbow_u.yaml new file mode 100644 index 0000000..a893b49 --- /dev/null +++ b/data/recipes/fletching/fletch_longbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_longbow_u +type: fletching +tool: knife +level: 10 +xp: 10 +wait: 3 +consume: + - items: [logs] + quantity: 1 +output: longbow_u +message: "You carefully carve the log into a longbow." diff --git a/data/recipes/fletching/fletch_magic_longbow.yaml b/data/recipes/fletching/fletch_magic_longbow.yaml new file mode 100644 index 0000000..8e16b9c --- /dev/null +++ b/data/recipes/fletching/fletch_magic_longbow.yaml @@ -0,0 +1,12 @@ +id: fletch_magic_longbow +type: fletching +level: 85 +xp: 91 +wait: 2 +consume: + - items: [magic_longbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: magic_longbow +message: "You string the magic longbow." diff --git a/data/recipes/fletching/fletch_magic_longbow_u.yaml b/data/recipes/fletching/fletch_magic_longbow_u.yaml new file mode 100644 index 0000000..ce2e247 --- /dev/null +++ b/data/recipes/fletching/fletch_magic_longbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_magic_longbow_u +type: fletching +tool: knife +level: 85 +xp: 91 +wait: 3 +consume: + - items: [magic_logs] + quantity: 1 +output: magic_longbow_u +message: "You carefully carve the magic log into a longbow." diff --git a/data/recipes/fletching/fletch_magic_shortbow.yaml b/data/recipes/fletching/fletch_magic_shortbow.yaml new file mode 100644 index 0000000..58abce9 --- /dev/null +++ b/data/recipes/fletching/fletch_magic_shortbow.yaml @@ -0,0 +1,12 @@ +id: fletch_magic_shortbow +type: fletching +level: 80 +xp: 83 +wait: 2 +consume: + - items: [magic_shortbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: magic_shortbow +message: "You string the magic shortbow." diff --git a/data/recipes/fletching/fletch_magic_shortbow_u.yaml b/data/recipes/fletching/fletch_magic_shortbow_u.yaml new file mode 100644 index 0000000..3fbf6cd --- /dev/null +++ b/data/recipes/fletching/fletch_magic_shortbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_magic_shortbow_u +type: fletching +tool: knife +level: 80 +xp: 83 +wait: 3 +consume: + - items: [magic_logs] + quantity: 1 +output: magic_shortbow_u +message: "You carefully carve the magic log into a shortbow." diff --git a/data/recipes/fletching/fletch_maple_longbow.yaml b/data/recipes/fletching/fletch_maple_longbow.yaml new file mode 100644 index 0000000..123d531 --- /dev/null +++ b/data/recipes/fletching/fletch_maple_longbow.yaml @@ -0,0 +1,12 @@ +id: fletch_maple_longbow +type: fletching +level: 55 +xp: 58 +wait: 2 +consume: + - items: [maple_longbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: maple_longbow +message: "You string the maple longbow." diff --git a/data/recipes/fletching/fletch_maple_longbow_u.yaml b/data/recipes/fletching/fletch_maple_longbow_u.yaml new file mode 100644 index 0000000..4c61993 --- /dev/null +++ b/data/recipes/fletching/fletch_maple_longbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_maple_longbow_u +type: fletching +tool: knife +level: 55 +xp: 58 +wait: 3 +consume: + - items: [maple_logs] + quantity: 1 +output: maple_longbow_u +message: "You carefully carve the maple log into a longbow." diff --git a/data/recipes/fletching/fletch_maple_shortbow.yaml b/data/recipes/fletching/fletch_maple_shortbow.yaml new file mode 100644 index 0000000..aebe50a --- /dev/null +++ b/data/recipes/fletching/fletch_maple_shortbow.yaml @@ -0,0 +1,12 @@ +id: fletch_maple_shortbow +type: fletching +level: 50 +xp: 50 +wait: 2 +consume: + - items: [maple_shortbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: maple_shortbow +message: "You string the maple shortbow." diff --git a/data/recipes/fletching/fletch_maple_shortbow_u.yaml b/data/recipes/fletching/fletch_maple_shortbow_u.yaml new file mode 100644 index 0000000..36270dd --- /dev/null +++ b/data/recipes/fletching/fletch_maple_shortbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_maple_shortbow_u +type: fletching +tool: knife +level: 50 +xp: 50 +wait: 3 +consume: + - items: [maple_logs] + quantity: 1 +output: maple_shortbow_u +message: "You carefully carve the maple log into a shortbow." diff --git a/data/recipes/fletching/fletch_mithril_arrow.yaml b/data/recipes/fletching/fletch_mithril_arrow.yaml new file mode 100644 index 0000000..87a46e2 --- /dev/null +++ b/data/recipes/fletching/fletch_mithril_arrow.yaml @@ -0,0 +1,13 @@ +id: fletch_mithril_arrow +type: fletching +level: 45 +xp: 7 +wait: 2 +consume: + - items: [headless_arrow] + quantity: 15 + - items: [mithril_arrowtips] + quantity: 15 +output: mithril_arrow +output_qty: 15 +message: "You attach the mithril arrowtips to the headless arrows." diff --git a/data/recipes/fletching/fletch_mithril_bolts.yaml b/data/recipes/fletching/fletch_mithril_bolts.yaml new file mode 100644 index 0000000..a2afcb8 --- /dev/null +++ b/data/recipes/fletching/fletch_mithril_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_mithril_bolts +type: fletching +level: 54 +xp: 50 +wait: 0 +consume: + - items: [mithril_bolts_unf] + quantity: 10 + - items: [feather] + quantity: 10 +output: mithril_bolts +output_qty: 10 +message: "You attach feathers to the mithril bolts." diff --git a/data/recipes/fletching/fletch_oak_longbow.yaml b/data/recipes/fletching/fletch_oak_longbow.yaml new file mode 100644 index 0000000..f1c96ba --- /dev/null +++ b/data/recipes/fletching/fletch_oak_longbow.yaml @@ -0,0 +1,12 @@ +id: fletch_oak_longbow +type: fletching +level: 25 +xp: 25 +wait: 2 +consume: + - items: [oak_longbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: oak_longbow +message: "You string the oak longbow." diff --git a/data/recipes/fletching/fletch_oak_longbow_u.yaml b/data/recipes/fletching/fletch_oak_longbow_u.yaml new file mode 100644 index 0000000..8f0b234 --- /dev/null +++ b/data/recipes/fletching/fletch_oak_longbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_oak_longbow_u +type: fletching +tool: knife +level: 25 +xp: 25 +wait: 3 +consume: + - items: [oak_logs] + quantity: 1 +output: oak_longbow_u +message: "You carefully carve the oak log into a longbow." diff --git a/data/recipes/fletching/fletch_oak_shortbow.yaml b/data/recipes/fletching/fletch_oak_shortbow.yaml new file mode 100644 index 0000000..198657f --- /dev/null +++ b/data/recipes/fletching/fletch_oak_shortbow.yaml @@ -0,0 +1,12 @@ +id: fletch_oak_shortbow +type: fletching +level: 20 +xp: 16 +wait: 2 +consume: + - items: [oak_shortbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: oak_shortbow +message: "You string the oak shortbow." diff --git a/data/recipes/fletching/fletch_oak_shortbow_u.yaml b/data/recipes/fletching/fletch_oak_shortbow_u.yaml new file mode 100644 index 0000000..4f96a09 --- /dev/null +++ b/data/recipes/fletching/fletch_oak_shortbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_oak_shortbow_u +type: fletching +tool: knife +level: 20 +xp: 16 +wait: 3 +consume: + - items: [oak_logs] + quantity: 1 +output: oak_shortbow_u +message: "You carefully carve the oak log into a shortbow." diff --git a/data/recipes/fletching/fletch_ruby_bolt_tips.yaml b/data/recipes/fletching/fletch_ruby_bolt_tips.yaml new file mode 100644 index 0000000..bc9f695 --- /dev/null +++ b/data/recipes/fletching/fletch_ruby_bolt_tips.yaml @@ -0,0 +1,12 @@ +id: fletch_ruby_bolt_tips +type: fletching +tool: chisel +level: 73 +xp: 6 +wait: 5 +consume: + - items: [uncut_ruby] + quantity: 1 +output: ruby_bolt_tips +output_qty: 12 +message: "You cut the ruby into bolt tips." diff --git a/data/recipes/fletching/fletch_ruby_bolts.yaml b/data/recipes/fletching/fletch_ruby_bolts.yaml new file mode 100644 index 0000000..ac1d150 --- /dev/null +++ b/data/recipes/fletching/fletch_ruby_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_ruby_bolts +type: fletching +level: 73 +xp: 6 +wait: 2 +consume: + - items: [adamant_bolts] + quantity: 10 + - items: [ruby_bolt_tips] + quantity: 10 +output: ruby_bolts +output_qty: 10 +message: "You tip the adamant bolts with ruby." diff --git a/data/recipes/fletching/fletch_rune_arrow.yaml b/data/recipes/fletching/fletch_rune_arrow.yaml new file mode 100644 index 0000000..aa2795e --- /dev/null +++ b/data/recipes/fletching/fletch_rune_arrow.yaml @@ -0,0 +1,13 @@ +id: fletch_rune_arrow +type: fletching +level: 75 +xp: 12 +wait: 2 +consume: + - items: [headless_arrow] + quantity: 15 + - items: [rune_arrowtips] + quantity: 15 +output: rune_arrow +output_qty: 15 +message: "You attach the rune arrowtips to the headless arrows." diff --git a/data/recipes/fletching/fletch_rune_bolts.yaml b/data/recipes/fletching/fletch_rune_bolts.yaml new file mode 100644 index 0000000..20bb7b9 --- /dev/null +++ b/data/recipes/fletching/fletch_rune_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_rune_bolts +type: fletching +level: 69 +xp: 100 +wait: 0 +consume: + - items: [rune_bolts_unf] + quantity: 10 + - items: [feather] + quantity: 10 +output: rune_bolts +output_qty: 10 +message: "You attach feathers to the rune bolts." diff --git a/data/recipes/fletching/fletch_sapphire_bolt_tips.yaml b/data/recipes/fletching/fletch_sapphire_bolt_tips.yaml new file mode 100644 index 0000000..dca6fef --- /dev/null +++ b/data/recipes/fletching/fletch_sapphire_bolt_tips.yaml @@ -0,0 +1,12 @@ +id: fletch_sapphire_bolt_tips +type: fletching +tool: chisel +level: 63 +xp: 4 +wait: 5 +consume: + - items: [uncut_sapphire] + quantity: 1 +output: sapphire_bolt_tips +output_qty: 12 +message: "You cut the sapphire into bolt tips." diff --git a/data/recipes/fletching/fletch_sapphire_bolts.yaml b/data/recipes/fletching/fletch_sapphire_bolts.yaml new file mode 100644 index 0000000..712578f --- /dev/null +++ b/data/recipes/fletching/fletch_sapphire_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_sapphire_bolts +type: fletching +level: 63 +xp: 4 +wait: 2 +consume: + - items: [mithril_bolts] + quantity: 10 + - items: [sapphire_bolt_tips] + quantity: 10 +output: sapphire_bolts +output_qty: 10 +message: "You tip the mithril bolts with sapphire." diff --git a/data/recipes/fletching/fletch_shortbow.yaml b/data/recipes/fletching/fletch_shortbow.yaml new file mode 100644 index 0000000..e96317d --- /dev/null +++ b/data/recipes/fletching/fletch_shortbow.yaml @@ -0,0 +1,12 @@ +id: fletch_shortbow +type: fletching +level: 5 +xp: 5 +wait: 2 +consume: + - items: [shortbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: shortbow +message: "You string the shortbow." diff --git a/data/recipes/fletching/fletch_shortbow_u.yaml b/data/recipes/fletching/fletch_shortbow_u.yaml new file mode 100644 index 0000000..3ab4931 --- /dev/null +++ b/data/recipes/fletching/fletch_shortbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_shortbow_u +type: fletching +tool: knife +level: 5 +xp: 5 +wait: 3 +consume: + - items: [logs] + quantity: 1 +output: shortbow_u +message: "You carefully carve the log into a shortbow." diff --git a/data/recipes/fletching/fletch_steel_arrow.yaml b/data/recipes/fletching/fletch_steel_arrow.yaml new file mode 100644 index 0000000..9bd229a --- /dev/null +++ b/data/recipes/fletching/fletch_steel_arrow.yaml @@ -0,0 +1,13 @@ +id: fletch_steel_arrow +type: fletching +level: 30 +xp: 5 +wait: 2 +consume: + - items: [headless_arrow] + quantity: 15 + - items: [steel_arrowtips] + quantity: 15 +output: steel_arrow +output_qty: 15 +message: "You attach the steel arrowtips to the headless arrows." diff --git a/data/recipes/fletching/fletch_steel_bolts.yaml b/data/recipes/fletching/fletch_steel_bolts.yaml new file mode 100644 index 0000000..9bfdafe --- /dev/null +++ b/data/recipes/fletching/fletch_steel_bolts.yaml @@ -0,0 +1,13 @@ +id: fletch_steel_bolts +type: fletching +level: 46 +xp: 35 +wait: 0 +consume: + - items: [steel_bolts_unf] + quantity: 10 + - items: [feather] + quantity: 10 +output: steel_bolts +output_qty: 10 +message: "You attach feathers to the steel bolts." diff --git a/data/recipes/fletching/fletch_willow_longbow.yaml b/data/recipes/fletching/fletch_willow_longbow.yaml new file mode 100644 index 0000000..28071ac --- /dev/null +++ b/data/recipes/fletching/fletch_willow_longbow.yaml @@ -0,0 +1,12 @@ +id: fletch_willow_longbow +type: fletching +level: 40 +xp: 41 +wait: 2 +consume: + - items: [willow_longbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: willow_longbow +message: "You string the willow longbow." diff --git a/data/recipes/fletching/fletch_willow_longbow_u.yaml b/data/recipes/fletching/fletch_willow_longbow_u.yaml new file mode 100644 index 0000000..ef808c0 --- /dev/null +++ b/data/recipes/fletching/fletch_willow_longbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_willow_longbow_u +type: fletching +tool: knife +level: 40 +xp: 41 +wait: 3 +consume: + - items: [willow_logs] + quantity: 1 +output: willow_longbow_u +message: "You carefully carve the willow log into a longbow." diff --git a/data/recipes/fletching/fletch_willow_shortbow.yaml b/data/recipes/fletching/fletch_willow_shortbow.yaml new file mode 100644 index 0000000..a2b2c2b --- /dev/null +++ b/data/recipes/fletching/fletch_willow_shortbow.yaml @@ -0,0 +1,12 @@ +id: fletch_willow_shortbow +type: fletching +level: 35 +xp: 33 +wait: 2 +consume: + - items: [willow_shortbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: willow_shortbow +message: "You string the willow shortbow." diff --git a/data/recipes/fletching/fletch_willow_shortbow_u.yaml b/data/recipes/fletching/fletch_willow_shortbow_u.yaml new file mode 100644 index 0000000..95609b3 --- /dev/null +++ b/data/recipes/fletching/fletch_willow_shortbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_willow_shortbow_u +type: fletching +tool: knife +level: 35 +xp: 33 +wait: 3 +consume: + - items: [willow_logs] + quantity: 1 +output: willow_shortbow_u +message: "You carefully carve the willow log into a shortbow." diff --git a/data/recipes/fletching/fletch_yew_longbow.yaml b/data/recipes/fletching/fletch_yew_longbow.yaml new file mode 100644 index 0000000..208c623 --- /dev/null +++ b/data/recipes/fletching/fletch_yew_longbow.yaml @@ -0,0 +1,12 @@ +id: fletch_yew_longbow +type: fletching +level: 65 +xp: 75 +wait: 2 +consume: + - items: [yew_longbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: yew_longbow +message: "You string the yew longbow." diff --git a/data/recipes/fletching/fletch_yew_longbow_u.yaml b/data/recipes/fletching/fletch_yew_longbow_u.yaml new file mode 100644 index 0000000..bdce4f8 --- /dev/null +++ b/data/recipes/fletching/fletch_yew_longbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_yew_longbow_u +type: fletching +tool: knife +level: 65 +xp: 75 +wait: 3 +consume: + - items: [yew_logs] + quantity: 1 +output: yew_longbow_u +message: "You carefully carve the yew log into a longbow." diff --git a/data/recipes/fletching/fletch_yew_shortbow.yaml b/data/recipes/fletching/fletch_yew_shortbow.yaml new file mode 100644 index 0000000..fbe5f62 --- /dev/null +++ b/data/recipes/fletching/fletch_yew_shortbow.yaml @@ -0,0 +1,12 @@ +id: fletch_yew_shortbow +type: fletching +level: 60 +xp: 67 +wait: 2 +consume: + - items: [yew_shortbow_u] + quantity: 1 + - items: [bowstring] + quantity: 1 +output: yew_shortbow +message: "You string the yew shortbow." diff --git a/data/recipes/fletching/fletch_yew_shortbow_u.yaml b/data/recipes/fletching/fletch_yew_shortbow_u.yaml new file mode 100644 index 0000000..774e3a5 --- /dev/null +++ b/data/recipes/fletching/fletch_yew_shortbow_u.yaml @@ -0,0 +1,11 @@ +id: fletch_yew_shortbow_u +type: fletching +tool: knife +level: 60 +xp: 67 +wait: 3 +consume: + - items: [yew_logs] + quantity: 1 +output: yew_shortbow_u +message: "You carefully carve the yew log into a shortbow." diff --git a/data/recipes/mix_amp_potion.yaml b/data/recipes/mix_amp_potion.yaml deleted file mode 100644 index 1a50af9..0000000 --- a/data/recipes/mix_amp_potion.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_amp_potion -type: pharmacy -skill: pharmacy -level: 12 -xp: 50 -wait: 4 -consume: - - items: [tarromin_potion_unf] - qty: 1 - - items: [limpwurt_root] - qty: 1 -output: amp_potion -message: "You mix an amp potion." diff --git a/data/recipes/mix_bio_serum.yaml b/data/recipes/mix_bio_serum.yaml deleted file mode 100644 index 7f1931a..0000000 --- a/data/recipes/mix_bio_serum.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_bio_serum -type: pharmacy -skill: pharmacy -level: 5 -xp: 38 -wait: 4 -consume: - - items: [marrentill_potion_unf] - qty: 1 - - items: [antitoxin_powder] - qty: 1 -output: bio_serum -message: "You mix a bio serum." diff --git a/data/recipes/mix_full_restore.yaml b/data/recipes/mix_full_restore.yaml deleted file mode 100644 index 76312cf..0000000 --- a/data/recipes/mix_full_restore.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_full_restore -type: pharmacy -skill: pharmacy -level: 63 -xp: 143 -wait: 4 -consume: - - items: [snapdragon_potion_unf] - qty: 1 - - items: [arachnid_enzyme] - qty: 1 -output: full_restore -message: "You mix a full restore." diff --git a/data/recipes/mix_nano_restore.yaml b/data/recipes/mix_nano_restore.yaml deleted file mode 100644 index 36bb251..0000000 --- a/data/recipes/mix_nano_restore.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_nano_restore -type: pharmacy -skill: pharmacy -level: 22 -xp: 63 -wait: 4 -consume: - - items: [harralander_potion_unf] - qty: 1 - - items: [arachnid_enzyme] - qty: 1 -output: nano_restore -message: "You mix a nano restore." diff --git a/data/recipes/mix_restoration_compound.yaml b/data/recipes/mix_restoration_compound.yaml deleted file mode 100644 index 6639784..0000000 --- a/data/recipes/mix_restoration_compound.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_restoration_compound -type: pharmacy -skill: pharmacy -level: 81 -xp: 180 -wait: 4 -consume: - - items: [toadflax_potion_unf] - qty: 1 - - items: [crushed_nest] - qty: 1 -output: restoration_compound -message: "You mix a restoration compound." diff --git a/data/recipes/mix_science_serum.yaml b/data/recipes/mix_science_serum.yaml deleted file mode 100644 index 5f60945..0000000 --- a/data/recipes/mix_science_serum.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_science_serum -type: pharmacy -skill: pharmacy -level: 76 -xp: 173 -wait: 4 -consume: - - items: [lantadyme_potion_unf] - qty: 1 - - items: [potato_cactus] - qty: 1 -output: science_serum -message: "You mix a science serum." diff --git a/data/recipes/mix_shield_potion.yaml b/data/recipes/mix_shield_potion.yaml deleted file mode 100644 index 875e870..0000000 --- a/data/recipes/mix_shield_potion.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_shield_potion -type: pharmacy -skill: pharmacy -level: 30 -xp: 75 -wait: 4 -consume: - - items: [ranarr_potion_unf] - qty: 1 - - items: [white_berries] - qty: 1 -output: shield_potion -message: "You mix a shield potion." diff --git a/data/recipes/mix_stim_cell.yaml b/data/recipes/mix_stim_cell.yaml deleted file mode 100644 index 8915f39..0000000 --- a/data/recipes/mix_stim_cell.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_stim_cell -type: pharmacy -skill: pharmacy -level: 26 -xp: 68 -wait: 4 -consume: - - items: [harralander_potion_unf] - qty: 1 - - items: [chocolate_dust] - qty: 1 -output: stim_cell -message: "You mix a stim cell." diff --git a/data/recipes/mix_stim_potion.yaml b/data/recipes/mix_stim_potion.yaml deleted file mode 100644 index 67db442..0000000 --- a/data/recipes/mix_stim_potion.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_stim_potion -type: pharmacy -skill: pharmacy -level: 3 -xp: 25 -wait: 4 -consume: - - items: [guam_potion_unf] - qty: 1 - - items: [eye_of_newt] - qty: 1 -output: stim_potion -message: "You mix a stim potion." diff --git a/data/recipes/mix_super_amp.yaml b/data/recipes/mix_super_amp.yaml deleted file mode 100644 index ea30e35..0000000 --- a/data/recipes/mix_super_amp.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_super_amp -type: pharmacy -skill: pharmacy -level: 55 -xp: 125 -wait: 4 -consume: - - items: [kwuarm_potion_unf] - qty: 1 - - items: [limpwurt_root] - qty: 1 -output: super_amp -message: "You mix a super amp." diff --git a/data/recipes/mix_super_bio_serum.yaml b/data/recipes/mix_super_bio_serum.yaml deleted file mode 100644 index 808dd31..0000000 --- a/data/recipes/mix_super_bio_serum.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_super_bio_serum -type: pharmacy -skill: pharmacy -level: 48 -xp: 106 -wait: 4 -consume: - - items: [irit_potion_unf] - qty: 1 - - items: [antitoxin_powder] - qty: 1 -output: super_bio_serum -message: "You mix a super bio serum." diff --git a/data/recipes/mix_super_shield.yaml b/data/recipes/mix_super_shield.yaml deleted file mode 100644 index 07d849b..0000000 --- a/data/recipes/mix_super_shield.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_super_shield -type: pharmacy -skill: pharmacy -level: 66 -xp: 150 -wait: 4 -consume: - - items: [cadantine_potion_unf] - qty: 1 - - items: [white_berries] - qty: 1 -output: super_shield -message: "You mix a super shield." diff --git a/data/recipes/mix_super_stim.yaml b/data/recipes/mix_super_stim.yaml deleted file mode 100644 index 2382960..0000000 --- a/data/recipes/mix_super_stim.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_super_stim -type: pharmacy -skill: pharmacy -level: 45 -xp: 100 -wait: 4 -consume: - - items: [irit_potion_unf] - qty: 1 - - items: [eye_of_newt] - qty: 1 -output: super_stim -message: "You mix a super stim." diff --git a/data/recipes/mix_super_stim_cell.yaml b/data/recipes/mix_super_stim_cell.yaml deleted file mode 100644 index 5ed6bd3..0000000 --- a/data/recipes/mix_super_stim_cell.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_super_stim_cell -type: pharmacy -skill: pharmacy -level: 52 -xp: 118 -wait: 4 -consume: - - items: [avantoe_potion_unf] - qty: 1 - - items: [blight_spore] - qty: 1 -output: super_stim_cell -message: "You mix a super stim cell." diff --git a/data/recipes/mix_targeting_serum.yaml b/data/recipes/mix_targeting_serum.yaml deleted file mode 100644 index 54bd338..0000000 --- a/data/recipes/mix_targeting_serum.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_targeting_serum -type: pharmacy -skill: pharmacy -level: 72 -xp: 163 -wait: 4 -consume: - - items: [dwarf_weed_potion_unf] - qty: 1 - - items: [catalyst_wine] - qty: 1 -output: targeting_serum -message: "You mix a targeting serum." diff --git a/data/recipes/mix_tech_serum.yaml b/data/recipes/mix_tech_serum.yaml deleted file mode 100644 index ea41efd..0000000 --- a/data/recipes/mix_tech_serum.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: mix_tech_serum -type: pharmacy -skill: pharmacy -level: 38 -xp: 88 -wait: 4 -consume: - - items: [ranarr_potion_unf] - qty: 1 - - items: [snape_grass] - qty: 1 -output: tech_serum -message: "You mix a tech serum." diff --git a/data/recipes/mixing/mix_amp_potion.yaml b/data/recipes/mixing/mix_amp_potion.yaml new file mode 100644 index 0000000..6145296 --- /dev/null +++ b/data/recipes/mixing/mix_amp_potion.yaml @@ -0,0 +1,13 @@ +id: mix_amp_potion +type: pharmacy +skill: pharmacy +level: 12 +xp: 50 +wait: 4 +consume: + - items: [tarromin_potion_unf] + quantity: 1 + - items: [limpwurt_root] + quantity: 1 +output: amp_potion +message: "You mix an amp potion." diff --git a/data/recipes/mixing/mix_bio_serum.yaml b/data/recipes/mixing/mix_bio_serum.yaml new file mode 100644 index 0000000..6f5a3ea --- /dev/null +++ b/data/recipes/mixing/mix_bio_serum.yaml @@ -0,0 +1,13 @@ +id: mix_bio_serum +type: pharmacy +skill: pharmacy +level: 5 +xp: 38 +wait: 4 +consume: + - items: [marrentill_potion_unf] + quantity: 1 + - items: [antitoxin_powder] + quantity: 1 +output: bio_serum +message: "You mix a bio serum." diff --git a/data/recipes/mixing/mix_full_restore.yaml b/data/recipes/mixing/mix_full_restore.yaml new file mode 100644 index 0000000..b9e320e --- /dev/null +++ b/data/recipes/mixing/mix_full_restore.yaml @@ -0,0 +1,13 @@ +id: mix_full_restore +type: pharmacy +skill: pharmacy +level: 63 +xp: 143 +wait: 4 +consume: + - items: [snapdragon_potion_unf] + quantity: 1 + - items: [arachnid_enzyme] + quantity: 1 +output: full_restore +message: "You mix a full restore." diff --git a/data/recipes/mixing/mix_nano_restore.yaml b/data/recipes/mixing/mix_nano_restore.yaml new file mode 100644 index 0000000..4a5ebb0 --- /dev/null +++ b/data/recipes/mixing/mix_nano_restore.yaml @@ -0,0 +1,13 @@ +id: mix_nano_restore +type: pharmacy +skill: pharmacy +level: 22 +xp: 63 +wait: 4 +consume: + - items: [harralander_potion_unf] + quantity: 1 + - items: [arachnid_enzyme] + quantity: 1 +output: nano_restore +message: "You mix a nano restore." diff --git a/data/recipes/mixing/mix_restoration_compound.yaml b/data/recipes/mixing/mix_restoration_compound.yaml new file mode 100644 index 0000000..c945cac --- /dev/null +++ b/data/recipes/mixing/mix_restoration_compound.yaml @@ -0,0 +1,13 @@ +id: mix_restoration_compound +type: pharmacy +skill: pharmacy +level: 81 +xp: 180 +wait: 4 +consume: + - items: [toadflax_potion_unf] + quantity: 1 + - items: [crushed_nest] + quantity: 1 +output: restoration_compound +message: "You mix a restoration compound." diff --git a/data/recipes/mixing/mix_science_serum.yaml b/data/recipes/mixing/mix_science_serum.yaml new file mode 100644 index 0000000..b65f2d2 --- /dev/null +++ b/data/recipes/mixing/mix_science_serum.yaml @@ -0,0 +1,13 @@ +id: mix_science_serum +type: pharmacy +skill: pharmacy +level: 76 +xp: 173 +wait: 4 +consume: + - items: [lantadyme_potion_unf] + quantity: 1 + - items: [potato_cactus] + quantity: 1 +output: science_serum +message: "You mix a science serum." diff --git a/data/recipes/mixing/mix_shield_potion.yaml b/data/recipes/mixing/mix_shield_potion.yaml new file mode 100644 index 0000000..fc44abf --- /dev/null +++ b/data/recipes/mixing/mix_shield_potion.yaml @@ -0,0 +1,13 @@ +id: mix_shield_potion +type: pharmacy +skill: pharmacy +level: 30 +xp: 75 +wait: 4 +consume: + - items: [ranarr_potion_unf] + quantity: 1 + - items: [white_berries] + quantity: 1 +output: shield_potion +message: "You mix a shield potion." diff --git a/data/recipes/mixing/mix_stim_cell.yaml b/data/recipes/mixing/mix_stim_cell.yaml new file mode 100644 index 0000000..ccca53a --- /dev/null +++ b/data/recipes/mixing/mix_stim_cell.yaml @@ -0,0 +1,13 @@ +id: mix_stim_cell +type: pharmacy +skill: pharmacy +level: 26 +xp: 68 +wait: 4 +consume: + - items: [harralander_potion_unf] + quantity: 1 + - items: [chocolate_dust] + quantity: 1 +output: stim_cell +message: "You mix a stim cell." diff --git a/data/recipes/mixing/mix_stim_potion.yaml b/data/recipes/mixing/mix_stim_potion.yaml new file mode 100644 index 0000000..437b985 --- /dev/null +++ b/data/recipes/mixing/mix_stim_potion.yaml @@ -0,0 +1,13 @@ +id: mix_stim_potion +type: pharmacy +skill: pharmacy +level: 3 +xp: 25 +wait: 4 +consume: + - items: [guam_potion_unf] + quantity: 1 + - items: [eye_of_newt] + quantity: 1 +output: stim_potion +message: "You mix a stim potion." diff --git a/data/recipes/mixing/mix_super_amp.yaml b/data/recipes/mixing/mix_super_amp.yaml new file mode 100644 index 0000000..5e05019 --- /dev/null +++ b/data/recipes/mixing/mix_super_amp.yaml @@ -0,0 +1,13 @@ +id: mix_super_amp +type: pharmacy +skill: pharmacy +level: 55 +xp: 125 +wait: 4 +consume: + - items: [kwuarm_potion_unf] + quantity: 1 + - items: [limpwurt_root] + quantity: 1 +output: super_amp +message: "You mix a super amp." diff --git a/data/recipes/mixing/mix_super_bio_serum.yaml b/data/recipes/mixing/mix_super_bio_serum.yaml new file mode 100644 index 0000000..96e6632 --- /dev/null +++ b/data/recipes/mixing/mix_super_bio_serum.yaml @@ -0,0 +1,13 @@ +id: mix_super_bio_serum +type: pharmacy +skill: pharmacy +level: 48 +xp: 106 +wait: 4 +consume: + - items: [irit_potion_unf] + quantity: 1 + - items: [antitoxin_powder] + quantity: 1 +output: super_bio_serum +message: "You mix a super bio serum." diff --git a/data/recipes/mixing/mix_super_shield.yaml b/data/recipes/mixing/mix_super_shield.yaml new file mode 100644 index 0000000..61b3686 --- /dev/null +++ b/data/recipes/mixing/mix_super_shield.yaml @@ -0,0 +1,13 @@ +id: mix_super_shield +type: pharmacy +skill: pharmacy +level: 66 +xp: 150 +wait: 4 +consume: + - items: [cadantine_potion_unf] + quantity: 1 + - items: [white_berries] + quantity: 1 +output: super_shield +message: "You mix a super shield." diff --git a/data/recipes/mixing/mix_super_stim.yaml b/data/recipes/mixing/mix_super_stim.yaml new file mode 100644 index 0000000..bac9f8f --- /dev/null +++ b/data/recipes/mixing/mix_super_stim.yaml @@ -0,0 +1,13 @@ +id: mix_super_stim +type: pharmacy +skill: pharmacy +level: 45 +xp: 100 +wait: 4 +consume: + - items: [irit_potion_unf] + quantity: 1 + - items: [eye_of_newt] + quantity: 1 +output: super_stim +message: "You mix a super stim." diff --git a/data/recipes/mixing/mix_super_stim_cell.yaml b/data/recipes/mixing/mix_super_stim_cell.yaml new file mode 100644 index 0000000..26640ea --- /dev/null +++ b/data/recipes/mixing/mix_super_stim_cell.yaml @@ -0,0 +1,13 @@ +id: mix_super_stim_cell +type: pharmacy +skill: pharmacy +level: 52 +xp: 118 +wait: 4 +consume: + - items: [avantoe_potion_unf] + quantity: 1 + - items: [blight_spore] + quantity: 1 +output: super_stim_cell +message: "You mix a super stim cell." diff --git a/data/recipes/mixing/mix_targeting_serum.yaml b/data/recipes/mixing/mix_targeting_serum.yaml new file mode 100644 index 0000000..06f8421 --- /dev/null +++ b/data/recipes/mixing/mix_targeting_serum.yaml @@ -0,0 +1,13 @@ +id: mix_targeting_serum +type: pharmacy +skill: pharmacy +level: 72 +xp: 163 +wait: 4 +consume: + - items: [dwarf_weed_potion_unf] + quantity: 1 + - items: [catalyst_wine] + quantity: 1 +output: targeting_serum +message: "You mix a targeting serum." diff --git a/data/recipes/mixing/mix_tech_serum.yaml b/data/recipes/mixing/mix_tech_serum.yaml new file mode 100644 index 0000000..a57d2f9 --- /dev/null +++ b/data/recipes/mixing/mix_tech_serum.yaml @@ -0,0 +1,13 @@ +id: mix_tech_serum +type: pharmacy +skill: pharmacy +level: 38 +xp: 88 +wait: 4 +consume: + - items: [ranarr_potion_unf] + quantity: 1 + - items: [snape_grass] + quantity: 1 +output: tech_serum +message: "You mix a tech serum." diff --git a/data/recipes/smelt_adamantite.yaml b/data/recipes/smelt_adamantite.yaml deleted file mode 100644 index c5a34f7..0000000 --- a/data/recipes/smelt_adamantite.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: smelt_adamantite -type: smelting -skill: smithing -level: 65 -xp: 37 -wait: 4 -station: [furnace] -consume: - - items: [adamantite_ore] - qty: 1 - - items: [coal] - qty: 6 -output: adamantite_bar -message: "You remove a white hot adamantite bar!" -fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelt_bronze.yaml b/data/recipes/smelt_bronze.yaml deleted file mode 100644 index bb46da5..0000000 --- a/data/recipes/smelt_bronze.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: smelt_bronze -type: smelting -skill: smithing -level: 1 -xp: 6 -wait: 4 -station: [furnace] -consume: - - items: [copper_ore] - qty: 1 - - items: [tin_ore] - qty: 1 -output: bronze_bar -message: "You remove a white hot bronze bar!" -fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelt_gold.yaml b/data/recipes/smelt_gold.yaml deleted file mode 100644 index 6f30147..0000000 --- a/data/recipes/smelt_gold.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: smelt_gold -type: smelting -skill: smithing -level: 45 -xp: 22 -wait: 4 -station: [furnace] -consume: - - items: [gold_ore] - qty: 1 -output: gold_bar -message: "You remove a white hot gold bar!" -fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelt_iron.yaml b/data/recipes/smelt_iron.yaml deleted file mode 100644 index 2631b28..0000000 --- a/data/recipes/smelt_iron.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: smelt_iron -type: smelting -skill: smithing -level: 20 -xp: 12 -wait: 4 -station: [furnace] -consume: - - items: [iron_ore] - qty: 1 -output: iron_bar -message: "You remove a white hot iron bar!" -fail_message: "The iron is too impure to make a workable bar." -success: - base: 0.5 - per_level: 0 - cap: 0.5 diff --git a/data/recipes/smelt_mithril.yaml b/data/recipes/smelt_mithril.yaml deleted file mode 100644 index 0e2856a..0000000 --- a/data/recipes/smelt_mithril.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: smelt_mithril -type: smelting -skill: smithing -level: 50 -xp: 30 -wait: 4 -station: [furnace] -consume: - - items: [mithril_ore] - qty: 1 - - items: [coal] - qty: 4 -output: mithril_bar -message: "You remove a white hot mithril bar!" -fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelt_runite.yaml b/data/recipes/smelt_runite.yaml deleted file mode 100644 index 1c2935e..0000000 --- a/data/recipes/smelt_runite.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: smelt_runite -type: smelting -skill: smithing -level: 80 -xp: 50 -wait: 4 -station: [furnace] -consume: - - items: [runite_ore] - qty: 1 - - items: [coal] - qty: 8 -output: runite_bar -message: "You remove a white hot runite bar!" -fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelt_silver.yaml b/data/recipes/smelt_silver.yaml deleted file mode 100644 index 1630452..0000000 --- a/data/recipes/smelt_silver.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: smelt_silver -type: smelting -skill: smithing -level: 25 -xp: 14 -wait: 4 -station: [furnace] -consume: - - items: [silver_ore] - qty: 1 -output: silver_bar -message: "You remove a white hot silver bar!" -fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelt_steel.yaml b/data/recipes/smelt_steel.yaml deleted file mode 100644 index e3df4b6..0000000 --- a/data/recipes/smelt_steel.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: smelt_steel -type: smelting -skill: smithing -level: 40 -xp: 17 -wait: 4 -station: [furnace] -consume: - - items: [iron_ore] - qty: 1 - - items: [coal] - qty: 2 -output: steel_bar -message: "You remove a white hot steel bar!" -fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelting/smelt_adamantite.yaml b/data/recipes/smelting/smelt_adamantite.yaml new file mode 100644 index 0000000..5ff675b --- /dev/null +++ b/data/recipes/smelting/smelt_adamantite.yaml @@ -0,0 +1,15 @@ +id: smelt_adamantite +type: smelting +skill: smithing +level: 65 +xp: 37 +wait: 4 +station: [furnace] +consume: + - items: [adamantite_ore] + quantity: 1 + - items: [coal] + quantity: 6 +output: adamantite_bar +message: "You remove a white hot adamantite bar!" +fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelting/smelt_bronze.yaml b/data/recipes/smelting/smelt_bronze.yaml new file mode 100644 index 0000000..bdb33af --- /dev/null +++ b/data/recipes/smelting/smelt_bronze.yaml @@ -0,0 +1,15 @@ +id: smelt_bronze +type: smelting +skill: smithing +level: 1 +xp: 6 +wait: 4 +station: [furnace] +consume: + - items: [copper_ore] + quantity: 1 + - items: [tin_ore] + quantity: 1 +output: bronze_bar +message: "You remove a white hot bronze bar!" +fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelting/smelt_gold.yaml b/data/recipes/smelting/smelt_gold.yaml new file mode 100644 index 0000000..91229e8 --- /dev/null +++ b/data/recipes/smelting/smelt_gold.yaml @@ -0,0 +1,13 @@ +id: smelt_gold +type: smelting +skill: smithing +level: 45 +xp: 22 +wait: 4 +station: [furnace] +consume: + - items: [gold_ore] + quantity: 1 +output: gold_bar +message: "You remove a white hot gold bar!" +fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelting/smelt_iron.yaml b/data/recipes/smelting/smelt_iron.yaml new file mode 100644 index 0000000..ce0ca11 --- /dev/null +++ b/data/recipes/smelting/smelt_iron.yaml @@ -0,0 +1,17 @@ +id: smelt_iron +type: smelting +skill: smithing +level: 20 +xp: 12 +wait: 4 +station: [furnace] +consume: + - items: [iron_ore] + quantity: 1 +output: iron_bar +message: "You remove a white hot iron bar!" +fail_message: "The iron is too impure to make a workable bar." +success: + base: 0.5 + per_level: 0 + cap: 0.5 diff --git a/data/recipes/smelting/smelt_mithril.yaml b/data/recipes/smelting/smelt_mithril.yaml new file mode 100644 index 0000000..6285c1b --- /dev/null +++ b/data/recipes/smelting/smelt_mithril.yaml @@ -0,0 +1,15 @@ +id: smelt_mithril +type: smelting +skill: smithing +level: 50 +xp: 30 +wait: 4 +station: [furnace] +consume: + - items: [mithril_ore] + quantity: 1 + - items: [coal] + quantity: 4 +output: mithril_bar +message: "You remove a white hot mithril bar!" +fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelting/smelt_runite.yaml b/data/recipes/smelting/smelt_runite.yaml new file mode 100644 index 0000000..b683221 --- /dev/null +++ b/data/recipes/smelting/smelt_runite.yaml @@ -0,0 +1,15 @@ +id: smelt_runite +type: smelting +skill: smithing +level: 80 +xp: 50 +wait: 4 +station: [furnace] +consume: + - items: [runite_ore] + quantity: 1 + - items: [coal] + quantity: 8 +output: runite_bar +message: "You remove a white hot runite bar!" +fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelting/smelt_silver.yaml b/data/recipes/smelting/smelt_silver.yaml new file mode 100644 index 0000000..f381bd0 --- /dev/null +++ b/data/recipes/smelting/smelt_silver.yaml @@ -0,0 +1,13 @@ +id: smelt_silver +type: smelting +skill: smithing +level: 25 +xp: 14 +wait: 4 +station: [furnace] +consume: + - items: [silver_ore] + quantity: 1 +output: silver_bar +message: "You remove a white hot silver bar!" +fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smelting/smelt_steel.yaml b/data/recipes/smelting/smelt_steel.yaml new file mode 100644 index 0000000..ec1c2df --- /dev/null +++ b/data/recipes/smelting/smelt_steel.yaml @@ -0,0 +1,15 @@ +id: smelt_steel +type: smelting +skill: smithing +level: 40 +xp: 17 +wait: 4 +station: [furnace] +consume: + - items: [iron_ore] + quantity: 1 + - items: [coal] + quantity: 2 +output: steel_bar +message: "You remove a white hot steel bar!" +fail_message: "You fail to smelt a usable bar." diff --git a/data/recipes/smith_adamant_arrowtips.yaml b/data/recipes/smith_adamant_arrowtips.yaml deleted file mode 100644 index 6ad49d7..0000000 --- a/data/recipes/smith_adamant_arrowtips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_adamant_arrowtips -type: smithing -level: 75 -xp: 62 -wait: 4 -station: [anvil] -consume: - - items: [adamantite_bar] - qty: 1 -output: adamant_arrowtips -output_qty: 15 -message: "You hammer out some adamant arrowtips." diff --git a/data/recipes/smith_adamant_bolts_unf.yaml b/data/recipes/smith_adamant_bolts_unf.yaml deleted file mode 100644 index 9e71a5c..0000000 --- a/data/recipes/smith_adamant_bolts_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_adamant_bolts_unf -type: smithing -level: 76 -xp: 62 -wait: 4 -station: [anvil] -consume: - - items: [adamantite_bar] - qty: 1 -output: adamant_bolts_unf -output_qty: 10 -message: "You hammer out some adamant bolts." diff --git a/data/recipes/smith_adamant_dagger.yaml b/data/recipes/smith_adamant_dagger.yaml deleted file mode 100644 index 8d5f6d2..0000000 --- a/data/recipes/smith_adamant_dagger.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_adamant_dagger -type: smithing -level: 70 -xp: 62 -wait: 4 -station: [anvil] -consume: - - items: [adamantite_bar] - qty: 1 -output: adamant_dagger -message: "You hammer out an adamant dagger." diff --git a/data/recipes/smith_adamant_full_helm.yaml b/data/recipes/smith_adamant_full_helm.yaml deleted file mode 100644 index 61a79b0..0000000 --- a/data/recipes/smith_adamant_full_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_adamant_full_helm -type: smithing -level: 77 -xp: 125 -wait: 4 -station: [anvil] -consume: - - items: [adamantite_bar] - qty: 2 -output: adamant_full_helm -message: "You hammer out an adamant full helm." diff --git a/data/recipes/smith_adamant_med_helm.yaml b/data/recipes/smith_adamant_med_helm.yaml deleted file mode 100644 index 275adaf..0000000 --- a/data/recipes/smith_adamant_med_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_adamant_med_helm -type: smithing -level: 73 -xp: 62 -wait: 4 -station: [anvil] -consume: - - items: [adamantite_bar] - qty: 1 -output: adamant_med_helm -message: "You hammer out an adamant med helm." diff --git a/data/recipes/smith_adamant_nails.yaml b/data/recipes/smith_adamant_nails.yaml deleted file mode 100644 index 195cbb1..0000000 --- a/data/recipes/smith_adamant_nails.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_adamant_nails -type: smithing -level: 74 -xp: 62 -wait: 4 -station: [anvil] -consume: - - items: [adamantite_bar] - qty: 1 -output: adamant_nails -output_qty: 15 -message: "You hammer out some adamant nails." diff --git a/data/recipes/smith_adamant_platebody.yaml b/data/recipes/smith_adamant_platebody.yaml deleted file mode 100644 index abd5284..0000000 --- a/data/recipes/smith_adamant_platebody.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_adamant_platebody -type: smithing -level: 88 -xp: 312 -wait: 4 -station: [anvil] -consume: - - items: [adamantite_bar] - qty: 5 -output: adamant_platebody -message: "You hammer out an adamant platebody." diff --git a/data/recipes/smith_adamant_sword.yaml b/data/recipes/smith_adamant_sword.yaml deleted file mode 100644 index c973310..0000000 --- a/data/recipes/smith_adamant_sword.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_adamant_sword -type: smithing -level: 74 -xp: 62 -wait: 4 -station: [anvil] -consume: - - items: [adamantite_bar] - qty: 1 -output: adamant_sword -message: "You hammer out an adamant sword." diff --git a/data/recipes/smith_bronze_arrowtips.yaml b/data/recipes/smith_bronze_arrowtips.yaml deleted file mode 100644 index 4b74869..0000000 --- a/data/recipes/smith_bronze_arrowtips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_bronze_arrowtips -type: smithing -level: 5 -xp: 12 -wait: 4 -station: [anvil] -consume: - - items: [bronze_bar] - qty: 1 -output: bronze_arrowtips -output_qty: 15 -message: "You hammer out some bronze arrowtips." diff --git a/data/recipes/smith_bronze_bolts_unf.yaml b/data/recipes/smith_bronze_bolts_unf.yaml deleted file mode 100644 index 349be84..0000000 --- a/data/recipes/smith_bronze_bolts_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_bronze_bolts_unf -type: smithing -level: 6 -xp: 12 -wait: 4 -station: [anvil] -consume: - - items: [bronze_bar] - qty: 1 -output: bronze_bolts_unf -output_qty: 10 -message: "You hammer out some bronze bolts." diff --git a/data/recipes/smith_bronze_dagger.yaml b/data/recipes/smith_bronze_dagger.yaml deleted file mode 100644 index fc458c8..0000000 --- a/data/recipes/smith_bronze_dagger.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_bronze_dagger -type: smithing -level: 1 -xp: 12 -wait: 4 -station: [anvil] -consume: - - items: [bronze_bar] - qty: 1 -output: bronze_dagger -message: "You hammer out a bronze dagger." diff --git a/data/recipes/smith_bronze_full_helm.yaml b/data/recipes/smith_bronze_full_helm.yaml deleted file mode 100644 index cd689fd..0000000 --- a/data/recipes/smith_bronze_full_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_bronze_full_helm -type: smithing -level: 7 -xp: 25 -wait: 4 -station: [anvil] -consume: - - items: [bronze_bar] - qty: 2 -output: bronze_full_helm -message: "You hammer out a bronze full helm." diff --git a/data/recipes/smith_bronze_med_helm.yaml b/data/recipes/smith_bronze_med_helm.yaml deleted file mode 100644 index 60e1353..0000000 --- a/data/recipes/smith_bronze_med_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_bronze_med_helm -type: smithing -level: 3 -xp: 12 -wait: 4 -station: [anvil] -consume: - - items: [bronze_bar] - qty: 1 -output: bronze_med_helm -message: "You hammer out a bronze med helm." diff --git a/data/recipes/smith_bronze_nails.yaml b/data/recipes/smith_bronze_nails.yaml deleted file mode 100644 index fa3286b..0000000 --- a/data/recipes/smith_bronze_nails.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_bronze_nails -type: smithing -level: 4 -xp: 12 -wait: 4 -station: [anvil] -consume: - - items: [bronze_bar] - qty: 1 -output: bronze_nails -output_qty: 15 -message: "You hammer out some bronze nails." diff --git a/data/recipes/smith_bronze_platebody.yaml b/data/recipes/smith_bronze_platebody.yaml deleted file mode 100644 index 5e49649..0000000 --- a/data/recipes/smith_bronze_platebody.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_bronze_platebody -type: smithing -level: 18 -xp: 62 -wait: 4 -station: [anvil] -consume: - - items: [bronze_bar] - qty: 5 -output: bronze_platebody -message: "You hammer out a bronze platebody." diff --git a/data/recipes/smith_bronze_sword.yaml b/data/recipes/smith_bronze_sword.yaml deleted file mode 100644 index 23d3237..0000000 --- a/data/recipes/smith_bronze_sword.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_bronze_sword -type: smithing -level: 4 -xp: 12 -wait: 4 -station: [anvil] -consume: - - items: [bronze_bar] - qty: 1 -output: bronze_sword -message: "You hammer out a bronze sword." diff --git a/data/recipes/smith_iron_arrowtips.yaml b/data/recipes/smith_iron_arrowtips.yaml deleted file mode 100644 index 9b773ee..0000000 --- a/data/recipes/smith_iron_arrowtips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_iron_arrowtips -type: smithing -level: 25 -xp: 25 -wait: 4 -station: [anvil] -consume: - - items: [iron_bar] - qty: 1 -output: iron_arrowtips -output_qty: 15 -message: "You hammer out some iron arrowtips." diff --git a/data/recipes/smith_iron_bolts_unf.yaml b/data/recipes/smith_iron_bolts_unf.yaml deleted file mode 100644 index 564daab..0000000 --- a/data/recipes/smith_iron_bolts_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_iron_bolts_unf -type: smithing -level: 26 -xp: 25 -wait: 4 -station: [anvil] -consume: - - items: [iron_bar] - qty: 1 -output: iron_bolts_unf -output_qty: 10 -message: "You hammer out some iron bolts." diff --git a/data/recipes/smith_iron_dagger.yaml b/data/recipes/smith_iron_dagger.yaml deleted file mode 100644 index d885717..0000000 --- a/data/recipes/smith_iron_dagger.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_iron_dagger -type: smithing -level: 20 -xp: 25 -wait: 4 -station: [anvil] -consume: - - items: [iron_bar] - qty: 1 -output: iron_dagger -message: "You hammer out an iron dagger." diff --git a/data/recipes/smith_iron_full_helm.yaml b/data/recipes/smith_iron_full_helm.yaml deleted file mode 100644 index afcd56a..0000000 --- a/data/recipes/smith_iron_full_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_iron_full_helm -type: smithing -level: 27 -xp: 50 -wait: 4 -station: [anvil] -consume: - - items: [iron_bar] - qty: 2 -output: iron_full_helm -message: "You hammer out an iron full helm." diff --git a/data/recipes/smith_iron_med_helm.yaml b/data/recipes/smith_iron_med_helm.yaml deleted file mode 100644 index 5aabb9e..0000000 --- a/data/recipes/smith_iron_med_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_iron_med_helm -type: smithing -level: 22 -xp: 25 -wait: 4 -station: [anvil] -consume: - - items: [iron_bar] - qty: 1 -output: iron_med_helm -message: "You hammer out an iron med helm." diff --git a/data/recipes/smith_iron_nails.yaml b/data/recipes/smith_iron_nails.yaml deleted file mode 100644 index 2e6e59f..0000000 --- a/data/recipes/smith_iron_nails.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_iron_nails -type: smithing -level: 24 -xp: 25 -wait: 4 -station: [anvil] -consume: - - items: [iron_bar] - qty: 1 -output: iron_nails -output_qty: 15 -message: "You hammer out some iron nails." diff --git a/data/recipes/smith_iron_platebody.yaml b/data/recipes/smith_iron_platebody.yaml deleted file mode 100644 index c1fd795..0000000 --- a/data/recipes/smith_iron_platebody.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_iron_platebody -type: smithing -level: 33 -xp: 125 -wait: 4 -station: [anvil] -consume: - - items: [iron_bar] - qty: 5 -output: iron_platebody -message: "You hammer out an iron platebody." diff --git a/data/recipes/smith_iron_sword.yaml b/data/recipes/smith_iron_sword.yaml deleted file mode 100644 index ab87fdc..0000000 --- a/data/recipes/smith_iron_sword.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_iron_sword -type: smithing -level: 24 -xp: 25 -wait: 4 -station: [anvil] -consume: - - items: [iron_bar] - qty: 1 -output: iron_sword -message: "You hammer out an iron sword." diff --git a/data/recipes/smith_mithril_arrowtips.yaml b/data/recipes/smith_mithril_arrowtips.yaml deleted file mode 100644 index a61e5f1..0000000 --- a/data/recipes/smith_mithril_arrowtips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_mithril_arrowtips -type: smithing -level: 55 -xp: 50 -wait: 4 -station: [anvil] -consume: - - items: [mithril_bar] - qty: 1 -output: mithril_arrowtips -output_qty: 15 -message: "You hammer out some mithril arrowtips." diff --git a/data/recipes/smith_mithril_bolts_unf.yaml b/data/recipes/smith_mithril_bolts_unf.yaml deleted file mode 100644 index eb6da91..0000000 --- a/data/recipes/smith_mithril_bolts_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_mithril_bolts_unf -type: smithing -level: 56 -xp: 50 -wait: 4 -station: [anvil] -consume: - - items: [mithril_bar] - qty: 1 -output: mithril_bolts_unf -output_qty: 10 -message: "You hammer out some mithril bolts." diff --git a/data/recipes/smith_mithril_dagger.yaml b/data/recipes/smith_mithril_dagger.yaml deleted file mode 100644 index f8aea86..0000000 --- a/data/recipes/smith_mithril_dagger.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_mithril_dagger -type: smithing -level: 50 -xp: 50 -wait: 4 -station: [anvil] -consume: - - items: [mithril_bar] - qty: 1 -output: mithril_dagger -message: "You hammer out a mithril dagger." diff --git a/data/recipes/smith_mithril_full_helm.yaml b/data/recipes/smith_mithril_full_helm.yaml deleted file mode 100644 index 64b78c4..0000000 --- a/data/recipes/smith_mithril_full_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_mithril_full_helm -type: smithing -level: 57 -xp: 100 -wait: 4 -station: [anvil] -consume: - - items: [mithril_bar] - qty: 2 -output: mithril_full_helm -message: "You hammer out a mithril full helm." diff --git a/data/recipes/smith_mithril_med_helm.yaml b/data/recipes/smith_mithril_med_helm.yaml deleted file mode 100644 index d8cc14e..0000000 --- a/data/recipes/smith_mithril_med_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_mithril_med_helm -type: smithing -level: 53 -xp: 50 -wait: 4 -station: [anvil] -consume: - - items: [mithril_bar] - qty: 1 -output: mithril_med_helm -message: "You hammer out a mithril med helm." diff --git a/data/recipes/smith_mithril_nails.yaml b/data/recipes/smith_mithril_nails.yaml deleted file mode 100644 index 5f33c62..0000000 --- a/data/recipes/smith_mithril_nails.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_mithril_nails -type: smithing -level: 54 -xp: 50 -wait: 4 -station: [anvil] -consume: - - items: [mithril_bar] - qty: 1 -output: mithril_nails -output_qty: 15 -message: "You hammer out some mithril nails." diff --git a/data/recipes/smith_mithril_platebody.yaml b/data/recipes/smith_mithril_platebody.yaml deleted file mode 100644 index 43efb1d..0000000 --- a/data/recipes/smith_mithril_platebody.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_mithril_platebody -type: smithing -level: 68 -xp: 250 -wait: 4 -station: [anvil] -consume: - - items: [mithril_bar] - qty: 5 -output: mithril_platebody -message: "You hammer out a mithril platebody." diff --git a/data/recipes/smith_mithril_sword.yaml b/data/recipes/smith_mithril_sword.yaml deleted file mode 100644 index 98cf6dc..0000000 --- a/data/recipes/smith_mithril_sword.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_mithril_sword -type: smithing -level: 54 -xp: 50 -wait: 4 -station: [anvil] -consume: - - items: [mithril_bar] - qty: 1 -output: mithril_sword -message: "You hammer out a mithril sword." diff --git a/data/recipes/smith_rune_arrowtips.yaml b/data/recipes/smith_rune_arrowtips.yaml deleted file mode 100644 index 4d2731e..0000000 --- a/data/recipes/smith_rune_arrowtips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_rune_arrowtips -type: smithing -level: 90 -xp: 75 -wait: 4 -station: [anvil] -consume: - - items: [runite_bar] - qty: 1 -output: rune_arrowtips -output_qty: 15 -message: "You hammer out some rune arrowtips." diff --git a/data/recipes/smith_rune_bolts_unf.yaml b/data/recipes/smith_rune_bolts_unf.yaml deleted file mode 100644 index 088871b..0000000 --- a/data/recipes/smith_rune_bolts_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_rune_bolts_unf -type: smithing -level: 91 -xp: 75 -wait: 4 -station: [anvil] -consume: - - items: [runite_bar] - qty: 1 -output: rune_bolts_unf -output_qty: 10 -message: "You hammer out some rune bolts." diff --git a/data/recipes/smith_rune_dagger.yaml b/data/recipes/smith_rune_dagger.yaml deleted file mode 100644 index 3b76cae..0000000 --- a/data/recipes/smith_rune_dagger.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_rune_dagger -type: smithing -level: 85 -xp: 75 -wait: 4 -station: [anvil] -consume: - - items: [runite_bar] - qty: 1 -output: rune_dagger -message: "You hammer out a rune dagger." diff --git a/data/recipes/smith_rune_full_helm.yaml b/data/recipes/smith_rune_full_helm.yaml deleted file mode 100644 index 1714afa..0000000 --- a/data/recipes/smith_rune_full_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_rune_full_helm -type: smithing -level: 92 -xp: 150 -wait: 4 -station: [anvil] -consume: - - items: [runite_bar] - qty: 2 -output: rune_full_helm -message: "You hammer out a rune full helm." diff --git a/data/recipes/smith_rune_med_helm.yaml b/data/recipes/smith_rune_med_helm.yaml deleted file mode 100644 index 0c58be5..0000000 --- a/data/recipes/smith_rune_med_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_rune_med_helm -type: smithing -level: 88 -xp: 75 -wait: 4 -station: [anvil] -consume: - - items: [runite_bar] - qty: 1 -output: rune_med_helm -message: "You hammer out a rune med helm." diff --git a/data/recipes/smith_rune_nails.yaml b/data/recipes/smith_rune_nails.yaml deleted file mode 100644 index ad99d41..0000000 --- a/data/recipes/smith_rune_nails.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_rune_nails -type: smithing -level: 89 -xp: 75 -wait: 4 -station: [anvil] -consume: - - items: [runite_bar] - qty: 1 -output: rune_nails -output_qty: 15 -message: "You hammer out some rune nails." diff --git a/data/recipes/smith_rune_platebody.yaml b/data/recipes/smith_rune_platebody.yaml deleted file mode 100644 index 7f27292..0000000 --- a/data/recipes/smith_rune_platebody.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_rune_platebody -type: smithing -level: 99 -xp: 375 -wait: 4 -station: [anvil] -consume: - - items: [runite_bar] - qty: 5 -output: rune_platebody -message: "You hammer out a rune platebody." diff --git a/data/recipes/smith_rune_sword.yaml b/data/recipes/smith_rune_sword.yaml deleted file mode 100644 index c329102..0000000 --- a/data/recipes/smith_rune_sword.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_rune_sword -type: smithing -level: 89 -xp: 75 -wait: 4 -station: [anvil] -consume: - - items: [runite_bar] - qty: 1 -output: rune_sword -message: "You hammer out a rune sword." diff --git a/data/recipes/smith_steel_arrowtips.yaml b/data/recipes/smith_steel_arrowtips.yaml deleted file mode 100644 index 0f97327..0000000 --- a/data/recipes/smith_steel_arrowtips.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_steel_arrowtips -type: smithing -level: 35 -xp: 37 -wait: 4 -station: [anvil] -consume: - - items: [steel_bar] - qty: 1 -output: steel_arrowtips -output_qty: 15 -message: "You hammer out some steel arrowtips." diff --git a/data/recipes/smith_steel_bolts_unf.yaml b/data/recipes/smith_steel_bolts_unf.yaml deleted file mode 100644 index 550dd5e..0000000 --- a/data/recipes/smith_steel_bolts_unf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_steel_bolts_unf -type: smithing -level: 36 -xp: 37 -wait: 4 -station: [anvil] -consume: - - items: [steel_bar] - qty: 1 -output: steel_bolts_unf -output_qty: 10 -message: "You hammer out some steel bolts." diff --git a/data/recipes/smith_steel_dagger.yaml b/data/recipes/smith_steel_dagger.yaml deleted file mode 100644 index e569065..0000000 --- a/data/recipes/smith_steel_dagger.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_steel_dagger -type: smithing -level: 30 -xp: 37 -wait: 4 -station: [anvil] -consume: - - items: [steel_bar] - qty: 1 -output: steel_dagger -message: "You hammer out a steel dagger." diff --git a/data/recipes/smith_steel_full_helm.yaml b/data/recipes/smith_steel_full_helm.yaml deleted file mode 100644 index a23b110..0000000 --- a/data/recipes/smith_steel_full_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_steel_full_helm -type: smithing -level: 37 -xp: 75 -wait: 4 -station: [anvil] -consume: - - items: [steel_bar] - qty: 2 -output: steel_full_helm -message: "You hammer out a steel full helm." diff --git a/data/recipes/smith_steel_med_helm.yaml b/data/recipes/smith_steel_med_helm.yaml deleted file mode 100644 index 264b487..0000000 --- a/data/recipes/smith_steel_med_helm.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_steel_med_helm -type: smithing -level: 33 -xp: 37 -wait: 4 -station: [anvil] -consume: - - items: [steel_bar] - qty: 1 -output: steel_med_helm -message: "You hammer out a steel med helm." diff --git a/data/recipes/smith_steel_nails.yaml b/data/recipes/smith_steel_nails.yaml deleted file mode 100644 index 63a5881..0000000 --- a/data/recipes/smith_steel_nails.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: smith_steel_nails -type: smithing -level: 34 -xp: 37 -wait: 4 -station: [anvil] -consume: - - items: [steel_bar] - qty: 1 -output: steel_nails -output_qty: 15 -message: "You hammer out some steel nails." diff --git a/data/recipes/smith_steel_platebody.yaml b/data/recipes/smith_steel_platebody.yaml deleted file mode 100644 index 5d001b0..0000000 --- a/data/recipes/smith_steel_platebody.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_steel_platebody -type: smithing -level: 48 -xp: 187 -wait: 4 -station: [anvil] -consume: - - items: [steel_bar] - qty: 5 -output: steel_platebody -message: "You hammer out a steel platebody." diff --git a/data/recipes/smith_steel_sword.yaml b/data/recipes/smith_steel_sword.yaml deleted file mode 100644 index b8c18bd..0000000 --- a/data/recipes/smith_steel_sword.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: smith_steel_sword -type: smithing -level: 34 -xp: 37 -wait: 4 -station: [anvil] -consume: - - items: [steel_bar] - qty: 1 -output: steel_sword -message: "You hammer out a steel sword." diff --git a/data/recipes/smithing/smith_adamant_arrowtips.yaml b/data/recipes/smithing/smith_adamant_arrowtips.yaml new file mode 100644 index 0000000..466cfa2 --- /dev/null +++ b/data/recipes/smithing/smith_adamant_arrowtips.yaml @@ -0,0 +1,12 @@ +id: smith_adamant_arrowtips +type: smithing +level: 75 +xp: 62 +wait: 4 +station: [anvil] +consume: + - items: [adamantite_bar] + quantity: 1 +output: adamant_arrowtips +output_qty: 15 +message: "You hammer out some adamant arrowtips." diff --git a/data/recipes/smithing/smith_adamant_bolts_unf.yaml b/data/recipes/smithing/smith_adamant_bolts_unf.yaml new file mode 100644 index 0000000..2fe1730 --- /dev/null +++ b/data/recipes/smithing/smith_adamant_bolts_unf.yaml @@ -0,0 +1,12 @@ +id: smith_adamant_bolts_unf +type: smithing +level: 76 +xp: 62 +wait: 4 +station: [anvil] +consume: + - items: [adamantite_bar] + quantity: 1 +output: adamant_bolts_unf +output_qty: 10 +message: "You hammer out some adamant bolts." diff --git a/data/recipes/smithing/smith_adamant_dagger.yaml b/data/recipes/smithing/smith_adamant_dagger.yaml new file mode 100644 index 0000000..fb68dbf --- /dev/null +++ b/data/recipes/smithing/smith_adamant_dagger.yaml @@ -0,0 +1,11 @@ +id: smith_adamant_dagger +type: smithing +level: 70 +xp: 62 +wait: 4 +station: [anvil] +consume: + - items: [adamantite_bar] + quantity: 1 +output: adamant_dagger +message: "You hammer out an adamant dagger." diff --git a/data/recipes/smithing/smith_adamant_full_helm.yaml b/data/recipes/smithing/smith_adamant_full_helm.yaml new file mode 100644 index 0000000..2d849e5 --- /dev/null +++ b/data/recipes/smithing/smith_adamant_full_helm.yaml @@ -0,0 +1,11 @@ +id: smith_adamant_full_helm +type: smithing +level: 77 +xp: 125 +wait: 4 +station: [anvil] +consume: + - items: [adamantite_bar] + quantity: 2 +output: adamant_full_helm +message: "You hammer out an adamant full helm." diff --git a/data/recipes/smithing/smith_adamant_med_helm.yaml b/data/recipes/smithing/smith_adamant_med_helm.yaml new file mode 100644 index 0000000..505691c --- /dev/null +++ b/data/recipes/smithing/smith_adamant_med_helm.yaml @@ -0,0 +1,11 @@ +id: smith_adamant_med_helm +type: smithing +level: 73 +xp: 62 +wait: 4 +station: [anvil] +consume: + - items: [adamantite_bar] + quantity: 1 +output: adamant_med_helm +message: "You hammer out an adamant med helm." diff --git a/data/recipes/smithing/smith_adamant_nails.yaml b/data/recipes/smithing/smith_adamant_nails.yaml new file mode 100644 index 0000000..2273b67 --- /dev/null +++ b/data/recipes/smithing/smith_adamant_nails.yaml @@ -0,0 +1,12 @@ +id: smith_adamant_nails +type: smithing +level: 74 +xp: 62 +wait: 4 +station: [anvil] +consume: + - items: [adamantite_bar] + quantity: 1 +output: adamant_nails +output_qty: 15 +message: "You hammer out some adamant nails." diff --git a/data/recipes/smithing/smith_adamant_platebody.yaml b/data/recipes/smithing/smith_adamant_platebody.yaml new file mode 100644 index 0000000..33dc400 --- /dev/null +++ b/data/recipes/smithing/smith_adamant_platebody.yaml @@ -0,0 +1,11 @@ +id: smith_adamant_platebody +type: smithing +level: 88 +xp: 312 +wait: 4 +station: [anvil] +consume: + - items: [adamantite_bar] + quantity: 5 +output: adamant_platebody +message: "You hammer out an adamant platebody." diff --git a/data/recipes/smithing/smith_adamant_sword.yaml b/data/recipes/smithing/smith_adamant_sword.yaml new file mode 100644 index 0000000..e853ea6 --- /dev/null +++ b/data/recipes/smithing/smith_adamant_sword.yaml @@ -0,0 +1,11 @@ +id: smith_adamant_sword +type: smithing +level: 74 +xp: 62 +wait: 4 +station: [anvil] +consume: + - items: [adamantite_bar] + quantity: 1 +output: adamant_sword +message: "You hammer out an adamant sword." diff --git a/data/recipes/smithing/smith_bronze_arrowtips.yaml b/data/recipes/smithing/smith_bronze_arrowtips.yaml new file mode 100644 index 0000000..77d724f --- /dev/null +++ b/data/recipes/smithing/smith_bronze_arrowtips.yaml @@ -0,0 +1,12 @@ +id: smith_bronze_arrowtips +type: smithing +level: 5 +xp: 12 +wait: 4 +station: [anvil] +consume: + - items: [bronze_bar] + quantity: 1 +output: bronze_arrowtips +output_qty: 15 +message: "You hammer out some bronze arrowtips." diff --git a/data/recipes/smithing/smith_bronze_bolts_unf.yaml b/data/recipes/smithing/smith_bronze_bolts_unf.yaml new file mode 100644 index 0000000..340d14f --- /dev/null +++ b/data/recipes/smithing/smith_bronze_bolts_unf.yaml @@ -0,0 +1,12 @@ +id: smith_bronze_bolts_unf +type: smithing +level: 6 +xp: 12 +wait: 4 +station: [anvil] +consume: + - items: [bronze_bar] + quantity: 1 +output: bronze_bolts_unf +output_qty: 10 +message: "You hammer out some bronze bolts." diff --git a/data/recipes/smithing/smith_bronze_dagger.yaml b/data/recipes/smithing/smith_bronze_dagger.yaml new file mode 100644 index 0000000..4842927 --- /dev/null +++ b/data/recipes/smithing/smith_bronze_dagger.yaml @@ -0,0 +1,11 @@ +id: smith_bronze_dagger +type: smithing +level: 1 +xp: 12 +wait: 4 +station: [anvil] +consume: + - items: [bronze_bar] + quantity: 1 +output: bronze_dagger +message: "You hammer out a bronze dagger." diff --git a/data/recipes/smithing/smith_bronze_full_helm.yaml b/data/recipes/smithing/smith_bronze_full_helm.yaml new file mode 100644 index 0000000..6ef58ed --- /dev/null +++ b/data/recipes/smithing/smith_bronze_full_helm.yaml @@ -0,0 +1,11 @@ +id: smith_bronze_full_helm +type: smithing +level: 7 +xp: 25 +wait: 4 +station: [anvil] +consume: + - items: [bronze_bar] + quantity: 2 +output: bronze_full_helm +message: "You hammer out a bronze full helm." diff --git a/data/recipes/smithing/smith_bronze_med_helm.yaml b/data/recipes/smithing/smith_bronze_med_helm.yaml new file mode 100644 index 0000000..6abbc60 --- /dev/null +++ b/data/recipes/smithing/smith_bronze_med_helm.yaml @@ -0,0 +1,11 @@ +id: smith_bronze_med_helm +type: smithing +level: 3 +xp: 12 +wait: 4 +station: [anvil] +consume: + - items: [bronze_bar] + quantity: 1 +output: bronze_med_helm +message: "You hammer out a bronze med helm." diff --git a/data/recipes/smithing/smith_bronze_nails.yaml b/data/recipes/smithing/smith_bronze_nails.yaml new file mode 100644 index 0000000..c75a957 --- /dev/null +++ b/data/recipes/smithing/smith_bronze_nails.yaml @@ -0,0 +1,12 @@ +id: smith_bronze_nails +type: smithing +level: 4 +xp: 12 +wait: 4 +station: [anvil] +consume: + - items: [bronze_bar] + quantity: 1 +output: bronze_nails +output_qty: 15 +message: "You hammer out some bronze nails." diff --git a/data/recipes/smithing/smith_bronze_platebody.yaml b/data/recipes/smithing/smith_bronze_platebody.yaml new file mode 100644 index 0000000..c9d7d39 --- /dev/null +++ b/data/recipes/smithing/smith_bronze_platebody.yaml @@ -0,0 +1,11 @@ +id: smith_bronze_platebody +type: smithing +level: 18 +xp: 62 +wait: 4 +station: [anvil] +consume: + - items: [bronze_bar] + quantity: 5 +output: bronze_platebody +message: "You hammer out a bronze platebody." diff --git a/data/recipes/smithing/smith_bronze_sword.yaml b/data/recipes/smithing/smith_bronze_sword.yaml new file mode 100644 index 0000000..322ca9f --- /dev/null +++ b/data/recipes/smithing/smith_bronze_sword.yaml @@ -0,0 +1,11 @@ +id: smith_bronze_sword +type: smithing +level: 4 +xp: 12 +wait: 4 +station: [anvil] +consume: + - items: [bronze_bar] + quantity: 1 +output: bronze_sword +message: "You hammer out a bronze sword." diff --git a/data/recipes/smithing/smith_iron_arrowtips.yaml b/data/recipes/smithing/smith_iron_arrowtips.yaml new file mode 100644 index 0000000..d11286e --- /dev/null +++ b/data/recipes/smithing/smith_iron_arrowtips.yaml @@ -0,0 +1,12 @@ +id: smith_iron_arrowtips +type: smithing +level: 25 +xp: 25 +wait: 4 +station: [anvil] +consume: + - items: [iron_bar] + quantity: 1 +output: iron_arrowtips +output_qty: 15 +message: "You hammer out some iron arrowtips." diff --git a/data/recipes/smithing/smith_iron_bolts_unf.yaml b/data/recipes/smithing/smith_iron_bolts_unf.yaml new file mode 100644 index 0000000..9529cab --- /dev/null +++ b/data/recipes/smithing/smith_iron_bolts_unf.yaml @@ -0,0 +1,12 @@ +id: smith_iron_bolts_unf +type: smithing +level: 26 +xp: 25 +wait: 4 +station: [anvil] +consume: + - items: [iron_bar] + quantity: 1 +output: iron_bolts_unf +output_qty: 10 +message: "You hammer out some iron bolts." diff --git a/data/recipes/smithing/smith_iron_dagger.yaml b/data/recipes/smithing/smith_iron_dagger.yaml new file mode 100644 index 0000000..3694ca5 --- /dev/null +++ b/data/recipes/smithing/smith_iron_dagger.yaml @@ -0,0 +1,11 @@ +id: smith_iron_dagger +type: smithing +level: 20 +xp: 25 +wait: 4 +station: [anvil] +consume: + - items: [iron_bar] + quantity: 1 +output: iron_dagger +message: "You hammer out an iron dagger." diff --git a/data/recipes/smithing/smith_iron_full_helm.yaml b/data/recipes/smithing/smith_iron_full_helm.yaml new file mode 100644 index 0000000..cfa27f5 --- /dev/null +++ b/data/recipes/smithing/smith_iron_full_helm.yaml @@ -0,0 +1,11 @@ +id: smith_iron_full_helm +type: smithing +level: 27 +xp: 50 +wait: 4 +station: [anvil] +consume: + - items: [iron_bar] + quantity: 2 +output: iron_full_helm +message: "You hammer out an iron full helm." diff --git a/data/recipes/smithing/smith_iron_med_helm.yaml b/data/recipes/smithing/smith_iron_med_helm.yaml new file mode 100644 index 0000000..54b6654 --- /dev/null +++ b/data/recipes/smithing/smith_iron_med_helm.yaml @@ -0,0 +1,11 @@ +id: smith_iron_med_helm +type: smithing +level: 22 +xp: 25 +wait: 4 +station: [anvil] +consume: + - items: [iron_bar] + quantity: 1 +output: iron_med_helm +message: "You hammer out an iron med helm." diff --git a/data/recipes/smithing/smith_iron_nails.yaml b/data/recipes/smithing/smith_iron_nails.yaml new file mode 100644 index 0000000..cb6ad89 --- /dev/null +++ b/data/recipes/smithing/smith_iron_nails.yaml @@ -0,0 +1,12 @@ +id: smith_iron_nails +type: smithing +level: 24 +xp: 25 +wait: 4 +station: [anvil] +consume: + - items: [iron_bar] + quantity: 1 +output: iron_nails +output_qty: 15 +message: "You hammer out some iron nails." diff --git a/data/recipes/smithing/smith_iron_platebody.yaml b/data/recipes/smithing/smith_iron_platebody.yaml new file mode 100644 index 0000000..dd8a7d6 --- /dev/null +++ b/data/recipes/smithing/smith_iron_platebody.yaml @@ -0,0 +1,11 @@ +id: smith_iron_platebody +type: smithing +level: 33 +xp: 125 +wait: 4 +station: [anvil] +consume: + - items: [iron_bar] + quantity: 5 +output: iron_platebody +message: "You hammer out an iron platebody." diff --git a/data/recipes/smithing/smith_iron_sword.yaml b/data/recipes/smithing/smith_iron_sword.yaml new file mode 100644 index 0000000..c2d4bc5 --- /dev/null +++ b/data/recipes/smithing/smith_iron_sword.yaml @@ -0,0 +1,11 @@ +id: smith_iron_sword +type: smithing +level: 24 +xp: 25 +wait: 4 +station: [anvil] +consume: + - items: [iron_bar] + quantity: 1 +output: iron_sword +message: "You hammer out an iron sword." diff --git a/data/recipes/smithing/smith_mithril_arrowtips.yaml b/data/recipes/smithing/smith_mithril_arrowtips.yaml new file mode 100644 index 0000000..2d27604 --- /dev/null +++ b/data/recipes/smithing/smith_mithril_arrowtips.yaml @@ -0,0 +1,12 @@ +id: smith_mithril_arrowtips +type: smithing +level: 55 +xp: 50 +wait: 4 +station: [anvil] +consume: + - items: [mithril_bar] + quantity: 1 +output: mithril_arrowtips +output_qty: 15 +message: "You hammer out some mithril arrowtips." diff --git a/data/recipes/smithing/smith_mithril_bolts_unf.yaml b/data/recipes/smithing/smith_mithril_bolts_unf.yaml new file mode 100644 index 0000000..03afe7f --- /dev/null +++ b/data/recipes/smithing/smith_mithril_bolts_unf.yaml @@ -0,0 +1,12 @@ +id: smith_mithril_bolts_unf +type: smithing +level: 56 +xp: 50 +wait: 4 +station: [anvil] +consume: + - items: [mithril_bar] + quantity: 1 +output: mithril_bolts_unf +output_qty: 10 +message: "You hammer out some mithril bolts." diff --git a/data/recipes/smithing/smith_mithril_dagger.yaml b/data/recipes/smithing/smith_mithril_dagger.yaml new file mode 100644 index 0000000..a437969 --- /dev/null +++ b/data/recipes/smithing/smith_mithril_dagger.yaml @@ -0,0 +1,11 @@ +id: smith_mithril_dagger +type: smithing +level: 50 +xp: 50 +wait: 4 +station: [anvil] +consume: + - items: [mithril_bar] + quantity: 1 +output: mithril_dagger +message: "You hammer out a mithril dagger." diff --git a/data/recipes/smithing/smith_mithril_full_helm.yaml b/data/recipes/smithing/smith_mithril_full_helm.yaml new file mode 100644 index 0000000..f9d6b74 --- /dev/null +++ b/data/recipes/smithing/smith_mithril_full_helm.yaml @@ -0,0 +1,11 @@ +id: smith_mithril_full_helm +type: smithing +level: 57 +xp: 100 +wait: 4 +station: [anvil] +consume: + - items: [mithril_bar] + quantity: 2 +output: mithril_full_helm +message: "You hammer out a mithril full helm." diff --git a/data/recipes/smithing/smith_mithril_med_helm.yaml b/data/recipes/smithing/smith_mithril_med_helm.yaml new file mode 100644 index 0000000..c4ebc30 --- /dev/null +++ b/data/recipes/smithing/smith_mithril_med_helm.yaml @@ -0,0 +1,11 @@ +id: smith_mithril_med_helm +type: smithing +level: 53 +xp: 50 +wait: 4 +station: [anvil] +consume: + - items: [mithril_bar] + quantity: 1 +output: mithril_med_helm +message: "You hammer out a mithril med helm." diff --git a/data/recipes/smithing/smith_mithril_nails.yaml b/data/recipes/smithing/smith_mithril_nails.yaml new file mode 100644 index 0000000..6c9f225 --- /dev/null +++ b/data/recipes/smithing/smith_mithril_nails.yaml @@ -0,0 +1,12 @@ +id: smith_mithril_nails +type: smithing +level: 54 +xp: 50 +wait: 4 +station: [anvil] +consume: + - items: [mithril_bar] + quantity: 1 +output: mithril_nails +output_qty: 15 +message: "You hammer out some mithril nails." diff --git a/data/recipes/smithing/smith_mithril_platebody.yaml b/data/recipes/smithing/smith_mithril_platebody.yaml new file mode 100644 index 0000000..751a7ea --- /dev/null +++ b/data/recipes/smithing/smith_mithril_platebody.yaml @@ -0,0 +1,11 @@ +id: smith_mithril_platebody +type: smithing +level: 68 +xp: 250 +wait: 4 +station: [anvil] +consume: + - items: [mithril_bar] + quantity: 5 +output: mithril_platebody +message: "You hammer out a mithril platebody." diff --git a/data/recipes/smithing/smith_mithril_sword.yaml b/data/recipes/smithing/smith_mithril_sword.yaml new file mode 100644 index 0000000..fdf96ff --- /dev/null +++ b/data/recipes/smithing/smith_mithril_sword.yaml @@ -0,0 +1,11 @@ +id: smith_mithril_sword +type: smithing +level: 54 +xp: 50 +wait: 4 +station: [anvil] +consume: + - items: [mithril_bar] + quantity: 1 +output: mithril_sword +message: "You hammer out a mithril sword." diff --git a/data/recipes/smithing/smith_rune_arrowtips.yaml b/data/recipes/smithing/smith_rune_arrowtips.yaml new file mode 100644 index 0000000..93554a9 --- /dev/null +++ b/data/recipes/smithing/smith_rune_arrowtips.yaml @@ -0,0 +1,12 @@ +id: smith_rune_arrowtips +type: smithing +level: 90 +xp: 75 +wait: 4 +station: [anvil] +consume: + - items: [runite_bar] + quantity: 1 +output: rune_arrowtips +output_qty: 15 +message: "You hammer out some rune arrowtips." diff --git a/data/recipes/smithing/smith_rune_bolts_unf.yaml b/data/recipes/smithing/smith_rune_bolts_unf.yaml new file mode 100644 index 0000000..93047ce --- /dev/null +++ b/data/recipes/smithing/smith_rune_bolts_unf.yaml @@ -0,0 +1,12 @@ +id: smith_rune_bolts_unf +type: smithing +level: 91 +xp: 75 +wait: 4 +station: [anvil] +consume: + - items: [runite_bar] + quantity: 1 +output: rune_bolts_unf +output_qty: 10 +message: "You hammer out some rune bolts." diff --git a/data/recipes/smithing/smith_rune_dagger.yaml b/data/recipes/smithing/smith_rune_dagger.yaml new file mode 100644 index 0000000..a87b356 --- /dev/null +++ b/data/recipes/smithing/smith_rune_dagger.yaml @@ -0,0 +1,11 @@ +id: smith_rune_dagger +type: smithing +level: 85 +xp: 75 +wait: 4 +station: [anvil] +consume: + - items: [runite_bar] + quantity: 1 +output: rune_dagger +message: "You hammer out a rune dagger." diff --git a/data/recipes/smithing/smith_rune_full_helm.yaml b/data/recipes/smithing/smith_rune_full_helm.yaml new file mode 100644 index 0000000..79ae3b0 --- /dev/null +++ b/data/recipes/smithing/smith_rune_full_helm.yaml @@ -0,0 +1,11 @@ +id: smith_rune_full_helm +type: smithing +level: 92 +xp: 150 +wait: 4 +station: [anvil] +consume: + - items: [runite_bar] + quantity: 2 +output: rune_full_helm +message: "You hammer out a rune full helm." diff --git a/data/recipes/smithing/smith_rune_med_helm.yaml b/data/recipes/smithing/smith_rune_med_helm.yaml new file mode 100644 index 0000000..74e639a --- /dev/null +++ b/data/recipes/smithing/smith_rune_med_helm.yaml @@ -0,0 +1,11 @@ +id: smith_rune_med_helm +type: smithing +level: 88 +xp: 75 +wait: 4 +station: [anvil] +consume: + - items: [runite_bar] + quantity: 1 +output: rune_med_helm +message: "You hammer out a rune med helm." diff --git a/data/recipes/smithing/smith_rune_nails.yaml b/data/recipes/smithing/smith_rune_nails.yaml new file mode 100644 index 0000000..2681a57 --- /dev/null +++ b/data/recipes/smithing/smith_rune_nails.yaml @@ -0,0 +1,12 @@ +id: smith_rune_nails +type: smithing +level: 89 +xp: 75 +wait: 4 +station: [anvil] +consume: + - items: [runite_bar] + quantity: 1 +output: rune_nails +output_qty: 15 +message: "You hammer out some rune nails." diff --git a/data/recipes/smithing/smith_rune_platebody.yaml b/data/recipes/smithing/smith_rune_platebody.yaml new file mode 100644 index 0000000..4a36082 --- /dev/null +++ b/data/recipes/smithing/smith_rune_platebody.yaml @@ -0,0 +1,11 @@ +id: smith_rune_platebody +type: smithing +level: 99 +xp: 375 +wait: 4 +station: [anvil] +consume: + - items: [runite_bar] + quantity: 5 +output: rune_platebody +message: "You hammer out a rune platebody." diff --git a/data/recipes/smithing/smith_rune_sword.yaml b/data/recipes/smithing/smith_rune_sword.yaml new file mode 100644 index 0000000..20f94f6 --- /dev/null +++ b/data/recipes/smithing/smith_rune_sword.yaml @@ -0,0 +1,11 @@ +id: smith_rune_sword +type: smithing +level: 89 +xp: 75 +wait: 4 +station: [anvil] +consume: + - items: [runite_bar] + quantity: 1 +output: rune_sword +message: "You hammer out a rune sword." diff --git a/data/recipes/smithing/smith_steel_arrowtips.yaml b/data/recipes/smithing/smith_steel_arrowtips.yaml new file mode 100644 index 0000000..1ec292f --- /dev/null +++ b/data/recipes/smithing/smith_steel_arrowtips.yaml @@ -0,0 +1,12 @@ +id: smith_steel_arrowtips +type: smithing +level: 35 +xp: 37 +wait: 4 +station: [anvil] +consume: + - items: [steel_bar] + quantity: 1 +output: steel_arrowtips +output_qty: 15 +message: "You hammer out some steel arrowtips." diff --git a/data/recipes/smithing/smith_steel_bolts_unf.yaml b/data/recipes/smithing/smith_steel_bolts_unf.yaml new file mode 100644 index 0000000..cc071ef --- /dev/null +++ b/data/recipes/smithing/smith_steel_bolts_unf.yaml @@ -0,0 +1,12 @@ +id: smith_steel_bolts_unf +type: smithing +level: 36 +xp: 37 +wait: 4 +station: [anvil] +consume: + - items: [steel_bar] + quantity: 1 +output: steel_bolts_unf +output_qty: 10 +message: "You hammer out some steel bolts." diff --git a/data/recipes/smithing/smith_steel_dagger.yaml b/data/recipes/smithing/smith_steel_dagger.yaml new file mode 100644 index 0000000..6e2f1c4 --- /dev/null +++ b/data/recipes/smithing/smith_steel_dagger.yaml @@ -0,0 +1,11 @@ +id: smith_steel_dagger +type: smithing +level: 30 +xp: 37 +wait: 4 +station: [anvil] +consume: + - items: [steel_bar] + quantity: 1 +output: steel_dagger +message: "You hammer out a steel dagger." diff --git a/data/recipes/smithing/smith_steel_full_helm.yaml b/data/recipes/smithing/smith_steel_full_helm.yaml new file mode 100644 index 0000000..c95d0d0 --- /dev/null +++ b/data/recipes/smithing/smith_steel_full_helm.yaml @@ -0,0 +1,11 @@ +id: smith_steel_full_helm +type: smithing +level: 37 +xp: 75 +wait: 4 +station: [anvil] +consume: + - items: [steel_bar] + quantity: 2 +output: steel_full_helm +message: "You hammer out a steel full helm." diff --git a/data/recipes/smithing/smith_steel_med_helm.yaml b/data/recipes/smithing/smith_steel_med_helm.yaml new file mode 100644 index 0000000..3415ec8 --- /dev/null +++ b/data/recipes/smithing/smith_steel_med_helm.yaml @@ -0,0 +1,11 @@ +id: smith_steel_med_helm +type: smithing +level: 33 +xp: 37 +wait: 4 +station: [anvil] +consume: + - items: [steel_bar] + quantity: 1 +output: steel_med_helm +message: "You hammer out a steel med helm." diff --git a/data/recipes/smithing/smith_steel_nails.yaml b/data/recipes/smithing/smith_steel_nails.yaml new file mode 100644 index 0000000..2da69c8 --- /dev/null +++ b/data/recipes/smithing/smith_steel_nails.yaml @@ -0,0 +1,12 @@ +id: smith_steel_nails +type: smithing +level: 34 +xp: 37 +wait: 4 +station: [anvil] +consume: + - items: [steel_bar] + quantity: 1 +output: steel_nails +output_qty: 15 +message: "You hammer out some steel nails." diff --git a/data/recipes/smithing/smith_steel_platebody.yaml b/data/recipes/smithing/smith_steel_platebody.yaml new file mode 100644 index 0000000..da11d11 --- /dev/null +++ b/data/recipes/smithing/smith_steel_platebody.yaml @@ -0,0 +1,11 @@ +id: smith_steel_platebody +type: smithing +level: 48 +xp: 187 +wait: 4 +station: [anvil] +consume: + - items: [steel_bar] + quantity: 5 +output: steel_platebody +message: "You hammer out a steel platebody." diff --git a/data/recipes/smithing/smith_steel_sword.yaml b/data/recipes/smithing/smith_steel_sword.yaml new file mode 100644 index 0000000..63270bc --- /dev/null +++ b/data/recipes/smithing/smith_steel_sword.yaml @@ -0,0 +1,11 @@ +id: smith_steel_sword +type: smithing +level: 34 +xp: 37 +wait: 4 +station: [anvil] +consume: + - items: [steel_bar] + quantity: 1 +output: steel_sword +message: "You hammer out a steel sword." diff --git a/data/rooms/1.yaml b/data/rooms/1.yaml deleted file mode 100644 index c4ec261..0000000 --- a/data/rooms/1.yaml +++ /dev/null @@ -1,38 +0,0 @@ -id: 1 -name: "Town Square" -description: "The central square of Lumbridge. A fountain gurgles peacefully in the center. Paths lead west toward the gathering grounds and east toward the production district." -map_symbol: "S" -exits: - east: 2 - west: 22 - up: 100 - down: 31 -objects: - - id: lumby_fountain - - id: charging_station - - id: bank_booth -mobs: - - "newbie_trainer" - - "general_store_clerk" -spawns: - - item_id: cape_of_agility - quantity: 1 - respawn_ticks: 60 - - item_id: graceful_hat - quantity: 1 - respawn_ticks: 60 - - item_id: graceful_torso - quantity: 1 - respawn_ticks: 60 - - item_id: graceful_legs - quantity: 1 - respawn_ticks: 60 - - item_id: graceful_gloves - quantity: 1 - respawn_ticks: 60 - - item_id: graceful_boots - quantity: 1 - respawn_ticks: 60 - - item_id: graceful_cape - quantity: 1 - respawn_ticks: 60 diff --git a/data/rooms/10.yaml b/data/rooms/10.yaml deleted file mode 100644 index edeac4d..0000000 --- a/data/rooms/10.yaml +++ /dev/null @@ -1,10 +0,0 @@ -id: 10 -name: "Farming Plot" -description: "A small patch of tilled soil behind a weathered fence. This area is not yet accessible." -exits: - west: 9 - east: 11 -mobs: - - id: skeleton - - id: skeleton - - id: mutant_rat diff --git a/data/rooms/11.yaml b/data/rooms/11.yaml deleted file mode 100644 index a7b3247..0000000 --- a/data/rooms/11.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: 11 -name: "Kitchen" -description: "A warm kitchen with a stone hearth and wooden counters. A large iron cooking range dominates one wall, and shelves are stocked with ingredients." -exits: - east: 12 - west: 10 -objects: - - id: cooking_range -mobs: - - id: zombie -spawns: - - item_id: bucket_of_water - quantity: 1 - respawn_ticks: 200 - - item_id: pot_of_flour - quantity: 1 - respawn_ticks: 200 diff --git a/data/rooms/12.yaml b/data/rooms/12.yaml deleted file mode 100644 index 80380b8..0000000 --- a/data/rooms/12.yaml +++ /dev/null @@ -1,28 +0,0 @@ -id: 12 -name: "Forge" -description: "A blazing forge and anvil dominate this smoky workshop. The heat from the furnace is intense." -exits: - east: 13 - west: 11 -mobs: - - "weapons_smith" -objects: - - id: furnace - - id: anvil - - id: bank_booth -spawns: - - item_id: copper_ore - quantity: 3 - respawn_ticks: 30 - - item_id: tin_ore - quantity: 3 - respawn_ticks: 30 - - item_id: iron_ore - quantity: 3 - respawn_ticks: 30 - - item_id: coal - quantity: 5 - respawn_ticks: 30 - - item_id: hammer - quantity: 1 - respawn_ticks: 30 diff --git a/data/rooms/13.yaml b/data/rooms/13.yaml deleted file mode 100644 index 939e751..0000000 --- a/data/rooms/13.yaml +++ /dev/null @@ -1,46 +0,0 @@ -id: 13 -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." -exits: - east: 14 - west: 12 -objects: - - id: spinning_wheel - - id: pottery_wheel - - id: pottery_oven - - id: sheep - - id: clay_rock - - id: clay_rock -mobs: - - id: tanner - - id: cow - - id: cow - - id: cow -spawns: - - item_id: flax - quantity: 5 - respawn_ticks: 60 - - item_id: thread - quantity: 10 - respawn_ticks: 60 - - item_id: shears - quantity: 1 - respawn_ticks: 60 - - item_id: needle - quantity: 1 - respawn_ticks: 60 - - item_id: chisel - quantity: 1 - respawn_ticks: 60 - - item_id: ring_mould - quantity: 1 - respawn_ticks: 60 - - item_id: necklace_mould - quantity: 1 - respawn_ticks: 60 - - item_id: amulet_mould - quantity: 1 - respawn_ticks: 60 - - item_id: bracelet_mould - quantity: 1 - respawn_ticks: 60 diff --git a/data/rooms/14.yaml b/data/rooms/14.yaml deleted file mode 100644 index 63db344..0000000 --- a/data/rooms/14.yaml +++ /dev/null @@ -1,18 +0,0 @@ -id: 14 -name: "Fletching Bench" -description: "A workbench covered in wood shavings, feathers, and arrowheads. Racks of unfinished bows line the walls, and a pile of bowstrings sits in the corner." -exits: - east: 15 - west: 13 -mobs: - - id: moss_giant -spawns: - - item_id: bowstring - quantity: 5 - respawn_ticks: 50 - - item_id: knife - quantity: 1 - respawn_ticks: 50 - - item_id: chisel - quantity: 1 - respawn_ticks: 50 diff --git a/data/rooms/15.yaml b/data/rooms/15.yaml deleted file mode 100644 index a67624d..0000000 --- a/data/rooms/15.yaml +++ /dev/null @@ -1,10 +0,0 @@ -id: 15 -name: "Pharmacy Lab" -description: "Shelves lined with glass vials, dried herbs, and bubbling cauldrons. This area is not yet accessible." -exits: - east: 16 - west: 14 - south: 150 -mobs: - - id: lesser_drone - - id: lesser_drone diff --git a/data/rooms/150.yaml b/data/rooms/150.yaml deleted file mode 100644 index 462a30c..0000000 --- a/data/rooms/150.yaml +++ /dev/null @@ -1,32 +0,0 @@ -id: 150 -name: "Hydroponics Bay" -description: "A large enclosed area with climate-controlled growing stations. {34}Lush green patches{/} of soil are laid out in neat rows under artificial UV lamps. A {94}tool shed{/} stands near the entrance. Exits lead to specialized growing areas." -map_symbol: "H" -exits: - north: 15 - east: 151 - south: 152 -objects: - - id: tool_shed -spawns: - - item_id: rake - quantity: 1 - respawn_ticks: 120 - - item_id: spade - quantity: 1 - respawn_ticks: 120 - - item_id: watering_can - quantity: 1 - respawn_ticks: 120 - - item_id: plant_cure - quantity: 3 - respawn_ticks: 200 - - item_id: guam_seed - quantity: 5 - respawn_ticks: 300 - - item_id: potato_seed - quantity: 10 - respawn_ticks: 300 - - item_id: onion_seed - quantity: 10 - respawn_ticks: 300 diff --git a/data/rooms/151.yaml b/data/rooms/151.yaml deleted file mode 100644 index 1bb25bf..0000000 --- a/data/rooms/151.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: 151 -name: "Herb Garden" -description: "A dedicated section of the hydroponics bay for growing herbs. {28}Herb patches{/} are arranged in two rows under specialized grow lights. The air here smells faintly of fresh vegetation." -map_symbol: "G" -exits: - west: 150 -objects: - - id: herb_patch - - id: herb_patch - - id: herb_patch - - id: herb_patch diff --git a/data/rooms/152.yaml b/data/rooms/152.yaml deleted file mode 100644 index 5d2f62d..0000000 --- a/data/rooms/152.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: 152 -name: "Allotment Field" -description: "A section with larger soil beds for growing vegetables. {94}Allotment patches{/} stretch across the floor under warm overhead lamps. A single {213}flower patch{/} sits in the corner." -map_symbol: "A" -exits: - north: 150 -objects: - - id: allotment_patch - - id: allotment_patch - - id: allotment_patch - - id: flower_patch diff --git a/data/rooms/16.yaml b/data/rooms/16.yaml deleted file mode 100644 index 3776f4f..0000000 --- a/data/rooms/16.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: 16 -name: "Construction Site" -description: "A half-built structure surrounded by planks, nails, and blueprints. A workbench stands ready for crafting. Signs point north toward the Local Neighborhood and east toward the lumberyard." -exits: - east: 171 - west: 15 - north: 170 -objects: - - id: workbench -mobs: - - id: greater_drone - - id: estate_broker diff --git a/data/rooms/160.yaml b/data/rooms/160.yaml deleted file mode 100644 index dea9d00..0000000 --- a/data/rooms/160.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: 160 -name: "Market Square" -description: "A noisy open-air market wedged between crumbling hab-blocks. Vendors hawk salvaged tech and reconstituted food from makeshift stalls. A {220 bold}Guard{/} watches over the area with a stern expression." -map_symbol: "M" -exits: - north: 1 - east: 161 -objects: - - id: market_stall -mobs: - - id: man - wander_interval: 15 - - id: man - wander_interval: 18 - - id: man - wander_interval: 20 - - id: guard \ No newline at end of file diff --git a/data/rooms/161.yaml b/data/rooms/161.yaml deleted file mode 100644 index c887347..0000000 --- a/data/rooms/161.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: 161 -name: "Farm Outpost" -description: "A cluster of hydroponic grow-pods on the asteroid's surface, shielded by a flickering atmospheric dome. Rows of bio-luminescent crops stretch into the distance." -map_symbol: "F" -exits: - west: 160 -mobs: - - id: farmer - wander_rooms: [161] - - id: farmer - wander_rooms: [161] - - id: bioengineer - wander_rooms: [161] \ No newline at end of file diff --git a/data/rooms/162.yaml b/data/rooms/162.yaml deleted file mode 100644 index a8333d8..0000000 --- a/data/rooms/162.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: 162 -name: "Detention Cell" -description: "A small, grimy holding cell. The walls are scratched with tally marks from previous occupants. A heavy door bars the only exit." -map_symbol: "J" -exits: - north: 1 \ No newline at end of file diff --git a/data/rooms/17.yaml b/data/rooms/17.yaml deleted file mode 100644 index 512ec9e..0000000 --- a/data/rooms/17.yaml +++ /dev/null @@ -1,10 +0,0 @@ -id: 17 -name: "Bonfire" -description: "A ring of stones surrounds a bed of ash. A few unlit logs wait nearby. A narrow passage leads north toward what sounds like echoing footsteps and clanging metal." -exits: - east: 18 - west: 16 - north: 200 -mobs: - - id: scrap_bot - - id: scrap_bot diff --git a/data/rooms/170.yaml b/data/rooms/170.yaml deleted file mode 100644 index 35d539f..0000000 --- a/data/rooms/170.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 170 -name: "Local Neighborhood" -description: "A quiet cul-de-sac of modest homes, each with a small garden plot. An estate directory terminal glows in the center, listing residents and property information." -exits: - south: 16 -objects: - - id: estate_directory diff --git a/data/rooms/171.yaml b/data/rooms/171.yaml deleted file mode 100644 index 552ccd4..0000000 --- a/data/rooms/171.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 171 -name: "Lumberyard" -description: "Stacks of fresh-cut timber fill the air with the scent of pine. A massive industrial sawmill hums in the background, operated by a burly worker." -exits: - west: 16 -mobs: - - id: sawmill_operator diff --git a/data/rooms/18.yaml b/data/rooms/18.yaml deleted file mode 100644 index 9dfc446..0000000 --- a/data/rooms/18.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: 18 -name: "Thieves' Den" -description: "A shadowy hideout with lockpicks, dark cloaks, and wanted posters on the walls. This area is not yet accessible." -exits: - east: 19 - west: 17 diff --git a/data/rooms/19.yaml b/data/rooms/19.yaml deleted file mode 100644 index 35800a0..0000000 --- a/data/rooms/19.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: 19 -name: "Agility Course" -description: "A training ground with balance beams, monkey bars, and climbing nets. This area is not yet accessible." -exits: - east: 20 - west: 18 diff --git a/data/rooms/2.yaml b/data/rooms/2.yaml deleted file mode 100644 index 39fcb9a..0000000 --- a/data/rooms/2.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: 2 -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." -map_symbol: "F" -exits: - east: 4 - north: 3 - west: 1 -objects: - - id: bait_fishing_spot -spawns: - - item_id: fishing_rod - quantity: 1 - respawn_ticks: 30 - - item_id: fishing_bait - quantity: 20 - respawn_ticks: 60 diff --git a/data/rooms/20.yaml b/data/rooms/20.yaml deleted file mode 100644 index 379322b..0000000 --- a/data/rooms/20.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: 20 -name: "Assassin's Bureau" -description: "A discreet office with job postings pinned to a corkboard. This area is not yet accessible." -exits: - east: 21 - west: 19 diff --git a/data/rooms/200.yaml b/data/rooms/200.yaml deleted file mode 100644 index 469e214..0000000 --- a/data/rooms/200.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 200 -name: "Agility Training Grounds" -description: "A cavernous space beneath the asteroid's surface, repurposed as a training facility. Scaffolding, pipes, and platforms fill the chamber. Signs point to three courses of increasing difficulty: {33}Ventilation Shaft{/} (beginner), {214}Rooftop{/} (intermediate), and {196}Reactor{/} (advanced)." -exits: - south: 17 - north: 201 - east: 210 - west: 220 diff --git a/data/rooms/201.yaml b/data/rooms/201.yaml deleted file mode 100644 index 2beb2ec..0000000 --- a/data/rooms/201.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 201 -name: "Ventilation Shaft - Corroded Wall" -description: "A towering wall of corroded ventilation panels rises before you. Rust-eaten handholds and buckled seams offer a treacherous path upward. The air smells of old metal and recycled atmosphere." -on_enter: - - message: "Type 'scramble' to climb the wall." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/202.yaml b/data/rooms/202.yaml deleted file mode 100644 index b9c0292..0000000 --- a/data/rooms/202.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 202 -name: "Ventilation Shaft - Coolant Pipe Walkway" -description: "A narrow coolant pipe stretches across a dark chasm. Condensation drips from its surface, making it slick. Far below, you can hear the distant hum of machinery." -on_enter: - - message: "Type 'balance' to cross the pipe." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/203.yaml b/data/rooms/203.yaml deleted file mode 100644 index 4f5d883..0000000 --- a/data/rooms/203.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 203 -name: "Ventilation Shaft - Shaft Gap" -description: "The ventilation shaft floor is missing here -- a jagged gap drops into darkness. The far side is just barely within jumping distance. Exposed wiring sparks intermittently below." -on_enter: - - message: "Type 'jump' to leap across the gap." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/204.yaml b/data/rooms/204.yaml deleted file mode 100644 index 2d82040..0000000 --- a/data/rooms/204.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 204 -name: "Ventilation Shaft - Narrow Vent" -description: "The passage narrows dramatically here, becoming a tight rectangular vent barely wide enough to fit through. Scratches on the metal walls suggest others have squeezed through before you." -on_enter: - - message: "Type 'crawl' to squeeze through the vent." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/205.yaml b/data/rooms/205.yaml deleted file mode 100644 index d814f7d..0000000 --- a/data/rooms/205.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 205 -name: "Ventilation Shaft - Emergency Chute" -description: "A smooth metal chute angles steeply downward, polished by countless slides. An old emergency evacuation sign hangs crookedly on the wall. This is the final obstacle -- the chute leads back to the training grounds." -on_enter: - - message: "Type 'slide' to descend the chute." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/21.yaml b/data/rooms/21.yaml deleted file mode 100644 index 987f5ea..0000000 --- a/data/rooms/21.yaml +++ /dev/null @@ -1,13 +0,0 @@ -id: 21 -name: "Combat Arena" -description: "A sandy training ground with practice dummies and sparring rings. Several men wander here looking for a fight." -map_symbol: "C" -exits: - west: 20 -mobs: - - id: man - wander_interval: 10 - - id: man - wander_interval: 12 - - id: man - wander_interval: 15 diff --git a/data/rooms/210.yaml b/data/rooms/210.yaml deleted file mode 100644 index 2b86500..0000000 --- a/data/rooms/210.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 210 -name: "Rooftop Course - Hab Block Wall" -description: "The exterior wall of Hab Block 7 rises three stories above the street. Rough permacrete and maintenance handholds provide a challenging climb. The city spreads out below, neon signs flickering in the perpetual twilight." -on_enter: - - message: "Type 'climb' to scale the wall." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/211.yaml b/data/rooms/211.yaml deleted file mode 100644 index 8b1f069..0000000 --- a/data/rooms/211.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 211 -name: "Rooftop Course - Building Gap" -description: "You stand on the edge of Hab Block 7's roof. Across a three-meter gap, the roof of Hab Block 8 awaits. The street below is a dizzying drop. A few old bootprints mark the takeoff point." -on_enter: - - message: "Type 'jump' to leap to the next building." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/212.yaml b/data/rooms/212.yaml deleted file mode 100644 index 0393a7e..0000000 --- a/data/rooms/212.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 212 -name: "Rooftop Course - Cable Array" -description: "A tangle of power cables and data lines stretches between two antenna towers. One thick cable hangs low enough to grab. The gap below drops to a dark alleyway between hab blocks." -on_enter: - - message: "Type 'swing' to cross on the cable." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/213.yaml b/data/rooms/213.yaml deleted file mode 100644 index be3b736..0000000 --- a/data/rooms/213.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 213 -name: "Rooftop Course - Narrow Beam" -description: "A structural I-beam extends across the gap between two buildings, no wider than your foot. It sways slightly in the recycled air currents. Someone has scratched tally marks into the near end." -on_enter: - - message: "Type 'balance' to cross the beam." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/214.yaml b/data/rooms/214.yaml deleted file mode 100644 index 9f9e081..0000000 --- a/data/rooms/214.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 214 -name: "Rooftop Course - Maintenance Railing" -description: "A high maintenance railing blocks the path forward, topped with sensor equipment and warning labels. It's too high to step over but the right technique could clear it. Beyond the railing, the course continues." -on_enter: - - message: "Type 'vault' to clear the railing." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/215.yaml b/data/rooms/215.yaml deleted file mode 100644 index 7ea39f9..0000000 --- a/data/rooms/215.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 215 -name: "Rooftop Course - Rooftop Edge" -description: "The final jump. The gap here is wider than any before -- a full four meters of empty air between you and the landing platform. Far below, the streets of the asteroid colony pulse with dim light. This is the last obstacle." -on_enter: - - message: "Type 'leap' to make the final jump." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/22.yaml b/data/rooms/22.yaml deleted file mode 100644 index 478995b..0000000 --- a/data/rooms/22.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 22 -name: "West of Town Square" -description: "" -map_symbol: "W" -exits: - east: 1 - west: 23 diff --git a/data/rooms/220.yaml b/data/rooms/220.yaml deleted file mode 100644 index d6826a3..0000000 --- a/data/rooms/220.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 220 -name: "Reactor Course - Scaffolding" -description: "Massive metal scaffolding surrounds the outer reactor housing. The structure vibrates with the reactor's pulse. Heat radiates from every surface, and warning klaxons sound periodically in the distance." -on_enter: - - message: "Type 'climb' to ascend the scaffolding." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/221.yaml b/data/rooms/221.yaml deleted file mode 100644 index 936ee65..0000000 --- a/data/rooms/221.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 221 -name: "Reactor Course - Coolant Chain" -description: "A heavy chain hangs from an overhead crane, suspended above the reactor cooling pit. The pit glows with an eerie blue-green light. The chain is your only way across -- the gantry ahead is the landing zone." -on_enter: - - message: "Type 'swing' to cross on the chain." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/222.yaml b/data/rooms/222.yaml deleted file mode 100644 index 119db01..0000000 --- a/data/rooms/222.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 222 -name: "Reactor Course - Steam Pipe" -description: "An enormous steam pipe, two meters in diameter, stretches across the reactor chamber. Steam vents periodically blast from pressure valves along its length. The pipe's surface is warm but not scalding -- yet." -on_enter: - - message: "Type 'balance' to traverse the pipe." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/223.yaml b/data/rooms/223.yaml deleted file mode 100644 index 0e557f6..0000000 --- a/data/rooms/223.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 223 -name: "Reactor Course - Platform Gap" -description: "A section of the reactor maintenance platform has collapsed into the void below. Emergency barriers block the edges, but someone has moved them aside here. The gap is intimidating but clearable." -on_enter: - - message: "Type 'jump' to clear the gap." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/224.yaml b/data/rooms/224.yaml deleted file mode 100644 index 4e70f7a..0000000 --- a/data/rooms/224.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 224 -name: "Reactor Course - Service Conduit" -description: "A narrow service conduit leads through the reactor shielding. Radiation warning symbols are painted on every surface. Damaged wiring hangs from the ceiling, sparking occasionally. It's the only way forward." -on_enter: - - message: "Type 'crawl' to enter the conduit." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/225.yaml b/data/rooms/225.yaml deleted file mode 100644 index 3413792..0000000 --- a/data/rooms/225.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 225 -name: "Reactor Course - Radiation Barrier" -description: "A containment barrier hums with energy, its surface shimmering with a faint purple glow. It pulses on and off in a regular cycle. Beyond it, the final stretch of the course is visible." -on_enter: - - message: "Type 'vault' to clear the barrier." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/226.yaml b/data/rooms/226.yaml deleted file mode 100644 index 6faa2c1..0000000 --- a/data/rooms/226.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 226 -name: "Reactor Course - Reactor Chasm" -description: "The final obstacle. A massive chasm separates you from the exit platform, the reactor's coolant pool churning far below in shades of luminous green. A narrow runway of grating leads to the edge. This is the longest leap on the course." -on_enter: - - message: "Type 'leap' to make the final jump." -exits: - down: - room: 200 - blocked_message: "" diff --git a/data/rooms/23.yaml b/data/rooms/23.yaml deleted file mode 100644 index f7301f6..0000000 --- a/data/rooms/23.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 23 -name: "West of West of Town Square" -description: "Here is a description of where we are!" -map_symbol: "D" -exits: - east: 22 - south: 24 diff --git a/data/rooms/24.yaml b/data/rooms/24.yaml deleted file mode 100644 index 60bf0d8..0000000 --- a/data/rooms/24.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 24 -name: "South of West of West of Town Square" -description: "Here is a description of where we are!" -map_symbol: "N" -exits: - north: 23 - east: 25 diff --git a/data/rooms/25.yaml b/data/rooms/25.yaml deleted file mode 100644 index a3dd843..0000000 --- a/data/rooms/25.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 25 -name: "East of South of West of West of Town Square" -description: "Here is a description of where we are!" -map_symbol: "N" -exits: - west: 24 - east: 26 diff --git a/data/rooms/26.yaml b/data/rooms/26.yaml deleted file mode 100644 index a2899e7..0000000 --- a/data/rooms/26.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 26 -name: "East of South of West of West of Town Square" -description: "Here is a description of where we are!" -map_symbol: "Q" -exits: - west: 25 - south: 27 diff --git a/data/rooms/27.yaml b/data/rooms/27.yaml deleted file mode 100644 index d435424..0000000 --- a/data/rooms/27.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 27 -name: "East of South of West of West of Town Square" -description: "Here is a description of where we are!" -map_symbol: "J" -exits: - west: 28 - north: 26 diff --git a/data/rooms/28.yaml b/data/rooms/28.yaml deleted file mode 100644 index 03913d5..0000000 --- a/data/rooms/28.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: 28 -name: "East of South of West of West of Town Square" -description: "Here is a description of where we are!" -map_symbol: "r" -exits: - east: 27 diff --git a/data/rooms/3.yaml b/data/rooms/3.yaml deleted file mode 100644 index 8e4d1ed..0000000 --- a/data/rooms/3.yaml +++ /dev/null @@ -1,15 +0,0 @@ -id: 3 -name: "Fly Fishing Pool" -description: "A calm pool where insects hover over the water. Perfect for fly fishing." -map_symbol: "X" -exits: - south: 2 -objects: - - id: fly_fishing_spot -spawns: - - item_id: fly_fishing_rod - quantity: 1 - respawn_ticks: 30 - - item_id: feather - quantity: 15 - respawn_ticks: 60 diff --git a/data/rooms/30.yaml b/data/rooms/30.yaml deleted file mode 100644 index 8c167eb..0000000 --- a/data/rooms/30.yaml +++ /dev/null @@ -1,6 +0,0 @@ -id: 30 -name: "Above Town Square" -description: "The central square of Lumbridge. A fountain gurgles peacefully in the center. Paths lead west toward the gathering grounds and east toward the production district." -map_symbol: "A" -exits: - down: 1 diff --git a/data/rooms/31.yaml b/data/rooms/31.yaml deleted file mode 100644 index 3d010df..0000000 --- a/data/rooms/31.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 31 -name: "Below Town Square" -description: "The central square of Lumbridge. A fountain gurgles peacefully in the center. Paths lead west toward the gathering grounds and east toward the production district." -map_symbol: "b" -exits: - up: 1 - down: 50 diff --git a/data/rooms/4.yaml b/data/rooms/4.yaml deleted file mode 100644 index 6a60783..0000000 --- a/data/rooms/4.yaml +++ /dev/null @@ -1,29 +0,0 @@ -id: 4 -name: "Woodcutting Glade" -description: "A sunny glade at the edge of the forest. A sturdy tree stands here, perfect for practicing woodcutting." -map_symbol: "W" -exits: - east: 6 - north: 5 - west: 2 -objects: - - id: tree - - id: tree - - id: tree - - id: tree -mobs: - - id: rat - - id: rat -spawns: - - item_id: bronze_axe - quantity: 1 - respawn_ticks: 60 - - item_id: matches - quantity: 100 - respawn_ticks: 120 - - item_id: firesteel - quantity: 1 - respawn_ticks: 120 - - item_id: lighter - quantity: 1 - respawn_ticks: 120 diff --git a/data/rooms/5.yaml b/data/rooms/5.yaml deleted file mode 100644 index 195c098..0000000 --- a/data/rooms/5.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: 5 -name: "Oak Grove" -description: "A stand of young oak trees. The wood here is tougher but more valuable." -map_symbol: "O" -exits: - south: 4 -objects: - - id: oak_tree -spawns: - - item_id: iron_axe - quantity: 1 - respawn_ticks: 60 diff --git a/data/rooms/50.yaml b/data/rooms/50.yaml deleted file mode 100644 index 0c9ebf2..0000000 --- a/data/rooms/50.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 50 -name: "The Assassin's Den" -description: "A dimly lit basement accessible through a trapdoor. Tactical maps and bounty posters line the walls. The air smells of gun oil and burnt ozone. {141}The Client{/} sits behind a reinforced desk." -exits: - up: 31 -mobs: - - "client" diff --git a/data/rooms/51.yaml b/data/rooms/51.yaml deleted file mode 100644 index 74a97ef..0000000 --- a/data/rooms/51.yaml +++ /dev/null @@ -1,10 +0,0 @@ -id: 51 -name: "Sewer Tunnels" -description: "Dark, damp tunnels beneath the settlement. The floor is slick with moisture and something {82}slimy{/}. The smell is indescribable." -exits: - north: 50 - south: 52 -mobs: - - "slug" - - "slug" - - "slug" diff --git a/data/rooms/52.yaml b/data/rooms/52.yaml deleted file mode 100644 index 2f90abd..0000000 --- a/data/rooms/52.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 52 -name: "Abandoned Sector" -description: "A decommissioned sector of the asteroid's infrastructure. Broken monitors flicker and exposed wiring {214}sparks{/} dangerously." -exits: - north: 51 - south: 53 -mobs: - - "drone" - - "drone" diff --git a/data/rooms/53.yaml b/data/rooms/53.yaml deleted file mode 100644 index 126719b..0000000 --- a/data/rooms/53.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 53 -name: "Deep Tunnels" -description: "The tunnels descend deeper into the asteroid's core. Strange chitinous scraping echoes from the darkness. The walls are scarred with {130}claw marks{/}." -exits: - north: 52 - south: 54 -mobs: - - "crawler" - - "crawler" diff --git a/data/rooms/54.yaml b/data/rooms/54.yaml deleted file mode 100644 index e86e5b7..0000000 --- a/data/rooms/54.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 54 -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." -exits: - north: 53 - down: 55 -mobs: - - "phantom" - - "phantom" diff --git a/data/rooms/55.yaml b/data/rooms/55.yaml deleted file mode 100644 index 8000170..0000000 --- a/data/rooms/55.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: 55 -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." -exits: - up: 54 - north: 56 - east: 57 - south: 58 - west: 60 - down: 62 -mobs: - - id: security_turret diff --git a/data/rooms/56.yaml b/data/rooms/56.yaml deleted file mode 100644 index 375696d..0000000 --- a/data/rooms/56.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 56 -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." -exits: - south: 55 -mobs: - - id: ghoul - - id: ghoul - - id: corrupted_scientist diff --git a/data/rooms/57.yaml b/data/rooms/57.yaml deleted file mode 100644 index 714197d..0000000 --- a/data/rooms/57.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 57 -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." -exits: - west: 55 -mobs: - - id: war_drone - - id: war_drone diff --git a/data/rooms/58.yaml b/data/rooms/58.yaml deleted file mode 100644 index f4d1829..0000000 --- a/data/rooms/58.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 58 -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." -exits: - north: 55 - south: 59 -mobs: - - id: enforcer_bot diff --git a/data/rooms/59.yaml b/data/rooms/59.yaml deleted file mode 100644 index a1cc594..0000000 --- a/data/rooms/59.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 59 -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." -exits: - north: 58 -mobs: - - id: plasma_wraith - - id: plasma_wraith - - id: feral_cyborg diff --git a/data/rooms/6.yaml b/data/rooms/6.yaml deleted file mode 100644 index 66d8d85..0000000 --- a/data/rooms/6.yaml +++ /dev/null @@ -1,16 +0,0 @@ -id: 6 -name: "Mining Pit" -description: "A small mining pit. The rocky walls glint with veins of copper ore." -map_symbol: "M" -exits: - east: 8 - north: 7 - west: 4 -objects: - - id: copper_rock - - id: copper_rock - - id: copper_rock -spawns: - - item_id: bronze_pickaxe - quantity: 1 - respawn_ticks: 30 diff --git a/data/rooms/60.yaml b/data/rooms/60.yaml deleted file mode 100644 index e9b7114..0000000 --- a/data/rooms/60.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 60 -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." -exits: - east: 55 - west: 61 -mobs: - - id: heavy_mech diff --git a/data/rooms/61.yaml b/data/rooms/61.yaml deleted file mode 100644 index a85c7ba..0000000 --- a/data/rooms/61.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 61 -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." -exits: - east: 60 -mobs: - - id: elite_synth diff --git a/data/rooms/62.yaml b/data/rooms/62.yaml deleted file mode 100644 index 9ed1fad..0000000 --- a/data/rooms/62.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 62 -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." -exits: - up: 55 - down: 63 -mobs: - - id: veteran_merc diff --git a/data/rooms/63.yaml b/data/rooms/63.yaml deleted file mode 100644 index b6bf53e..0000000 --- a/data/rooms/63.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 63 -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." -exits: - up: 62 - down: 64 -mobs: - - id: molten_elemental diff --git a/data/rooms/64.yaml b/data/rooms/64.yaml deleted file mode 100644 index b412992..0000000 --- a/data/rooms/64.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 64 -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." -exits: - up: 63 - down: 65 -mobs: - - id: iron_sentinel diff --git a/data/rooms/65.yaml b/data/rooms/65.yaml deleted file mode 100644 index 47aed6b..0000000 --- a/data/rooms/65.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 65 -name: "Titan's Rest" -description: "A colossal vault built to house something immense. The ceiling vanishes into darkness above, and the walls are etched with maintenance schematics for a machine of staggering proportions. At the center, a titan sentinel awakens." -exits: - up: 64 - down: 66 -mobs: - - id: titan_sentinel diff --git a/data/rooms/66.yaml b/data/rooms/66.yaml deleted file mode 100644 index 755d5e2..0000000 --- a/data/rooms/66.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 66 -name: "Psionic Nexus" -description: "Reality grows thin here. The walls are covered in strange geometric patterns that hurt to look at directly. A low hum vibrates through your skull, and the air seems to bend around a central point of unseen pressure." -exits: - up: 65 - down: 67 -mobs: - - id: psionic_entity diff --git a/data/rooms/67.yaml b/data/rooms/67.yaml deleted file mode 100644 index 6b8d663..0000000 --- a/data/rooms/67.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 67 -name: "Ancient Chamber" -description: "A perfectly spherical room carved from an unknown black metal. Glowing runes spiral across every surface in patterns that predate the asteroid itself. At the center, an ancient construct stirs from its eons-long vigil." -exits: - up: 66 - down: 68 -mobs: - - id: ancient_construct diff --git a/data/rooms/68.yaml b/data/rooms/68.yaml deleted file mode 100644 index f631981..0000000 --- a/data/rooms/68.yaml +++ /dev/null @@ -1,7 +0,0 @@ -id: 68 -name: "The Void" -description: "The bottom of the world. Light itself seems to hesitate before entering this place. The floor is unnaturally smooth black glass, and the only sound is the beating of your own heart. Something waits in the darkness — something that was here before the asteroid, before the colony, before anything." -exits: - up: 67 -mobs: - - id: void_reaper diff --git a/data/rooms/7.yaml b/data/rooms/7.yaml deleted file mode 100644 index 37dfed9..0000000 --- a/data/rooms/7.yaml +++ /dev/null @@ -1,9 +0,0 @@ -id: 7 -name: "Deep Mine" -description: "A deeper mine shaft. Higher quality ores can be found here. This area is not yet accessible." -exits: - south: 6 -mobs: - - id: goblin - - id: goblin - - id: bandit diff --git a/data/rooms/8.yaml b/data/rooms/8.yaml deleted file mode 100644 index b82c1bb..0000000 --- a/data/rooms/8.yaml +++ /dev/null @@ -1,11 +0,0 @@ -id: 8 -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." -exits: - east: 9 - west: 6 -objects: - - id: terminal_basic - - id: terminal_advanced - - id: terminal_secure - - id: netrunner diff --git a/data/rooms/9.yaml b/data/rooms/9.yaml deleted file mode 100644 index fe15233..0000000 --- a/data/rooms/9.yaml +++ /dev/null @@ -1,17 +0,0 @@ -id: 9 -name: "Scavenging Post" -description: "A cluttered yard full of {243}scrap metal{/} and discarded technology. Piles of salvageable debris are scattered across the ground. The air smells of ozone and rust." -exits: - east: 10 - west: 8 - north: 150 - south: 151 - northeast: 152 - southeast: 153 - northwest: 154 - southwest: 155 -objects: - - id: scrap_pile - - id: scrap_pile - - id: scrap_pile - - id: solar_altar diff --git a/data/rooms/agility/200.yaml b/data/rooms/agility/200.yaml new file mode 100644 index 0000000..469e214 --- /dev/null +++ b/data/rooms/agility/200.yaml @@ -0,0 +1,8 @@ +id: 200 +name: "Agility Training Grounds" +description: "A cavernous space beneath the asteroid's surface, repurposed as a training facility. Scaffolding, pipes, and platforms fill the chamber. Signs point to three courses of increasing difficulty: {33}Ventilation Shaft{/} (beginner), {214}Rooftop{/} (intermediate), and {196}Reactor{/} (advanced)." +exits: + south: 17 + north: 201 + east: 210 + west: 220 diff --git a/data/rooms/agility/201.yaml b/data/rooms/agility/201.yaml new file mode 100644 index 0000000..2beb2ec --- /dev/null +++ b/data/rooms/agility/201.yaml @@ -0,0 +1,9 @@ +id: 201 +name: "Ventilation Shaft - Corroded Wall" +description: "A towering wall of corroded ventilation panels rises before you. Rust-eaten handholds and buckled seams offer a treacherous path upward. The air smells of old metal and recycled atmosphere." +on_enter: + - message: "Type 'scramble' to climb the wall." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/202.yaml b/data/rooms/agility/202.yaml new file mode 100644 index 0000000..b9c0292 --- /dev/null +++ b/data/rooms/agility/202.yaml @@ -0,0 +1,9 @@ +id: 202 +name: "Ventilation Shaft - Coolant Pipe Walkway" +description: "A narrow coolant pipe stretches across a dark chasm. Condensation drips from its surface, making it slick. Far below, you can hear the distant hum of machinery." +on_enter: + - message: "Type 'balance' to cross the pipe." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/203.yaml b/data/rooms/agility/203.yaml new file mode 100644 index 0000000..4f5d883 --- /dev/null +++ b/data/rooms/agility/203.yaml @@ -0,0 +1,9 @@ +id: 203 +name: "Ventilation Shaft - Shaft Gap" +description: "The ventilation shaft floor is missing here -- a jagged gap drops into darkness. The far side is just barely within jumping distance. Exposed wiring sparks intermittently below." +on_enter: + - message: "Type 'jump' to leap across the gap." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/204.yaml b/data/rooms/agility/204.yaml new file mode 100644 index 0000000..2d82040 --- /dev/null +++ b/data/rooms/agility/204.yaml @@ -0,0 +1,9 @@ +id: 204 +name: "Ventilation Shaft - Narrow Vent" +description: "The passage narrows dramatically here, becoming a tight rectangular vent barely wide enough to fit through. Scratches on the metal walls suggest others have squeezed through before you." +on_enter: + - message: "Type 'crawl' to squeeze through the vent." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/205.yaml b/data/rooms/agility/205.yaml new file mode 100644 index 0000000..d814f7d --- /dev/null +++ b/data/rooms/agility/205.yaml @@ -0,0 +1,9 @@ +id: 205 +name: "Ventilation Shaft - Emergency Chute" +description: "A smooth metal chute angles steeply downward, polished by countless slides. An old emergency evacuation sign hangs crookedly on the wall. This is the final obstacle -- the chute leads back to the training grounds." +on_enter: + - message: "Type 'slide' to descend the chute." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/210.yaml b/data/rooms/agility/210.yaml new file mode 100644 index 0000000..2b86500 --- /dev/null +++ b/data/rooms/agility/210.yaml @@ -0,0 +1,9 @@ +id: 210 +name: "Rooftop Course - Hab Block Wall" +description: "The exterior wall of Hab Block 7 rises three stories above the street. Rough permacrete and maintenance handholds provide a challenging climb. The city spreads out below, neon signs flickering in the perpetual twilight." +on_enter: + - message: "Type 'climb' to scale the wall." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/211.yaml b/data/rooms/agility/211.yaml new file mode 100644 index 0000000..8b1f069 --- /dev/null +++ b/data/rooms/agility/211.yaml @@ -0,0 +1,9 @@ +id: 211 +name: "Rooftop Course - Building Gap" +description: "You stand on the edge of Hab Block 7's roof. Across a three-meter gap, the roof of Hab Block 8 awaits. The street below is a dizzying drop. A few old bootprints mark the takeoff point." +on_enter: + - message: "Type 'jump' to leap to the next building." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/212.yaml b/data/rooms/agility/212.yaml new file mode 100644 index 0000000..0393a7e --- /dev/null +++ b/data/rooms/agility/212.yaml @@ -0,0 +1,9 @@ +id: 212 +name: "Rooftop Course - Cable Array" +description: "A tangle of power cables and data lines stretches between two antenna towers. One thick cable hangs low enough to grab. The gap below drops to a dark alleyway between hab blocks." +on_enter: + - message: "Type 'swing' to cross on the cable." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/213.yaml b/data/rooms/agility/213.yaml new file mode 100644 index 0000000..be3b736 --- /dev/null +++ b/data/rooms/agility/213.yaml @@ -0,0 +1,9 @@ +id: 213 +name: "Rooftop Course - Narrow Beam" +description: "A structural I-beam extends across the gap between two buildings, no wider than your foot. It sways slightly in the recycled air currents. Someone has scratched tally marks into the near end." +on_enter: + - message: "Type 'balance' to cross the beam." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/214.yaml b/data/rooms/agility/214.yaml new file mode 100644 index 0000000..9f9e081 --- /dev/null +++ b/data/rooms/agility/214.yaml @@ -0,0 +1,9 @@ +id: 214 +name: "Rooftop Course - Maintenance Railing" +description: "A high maintenance railing blocks the path forward, topped with sensor equipment and warning labels. It's too high to step over but the right technique could clear it. Beyond the railing, the course continues." +on_enter: + - message: "Type 'vault' to clear the railing." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/215.yaml b/data/rooms/agility/215.yaml new file mode 100644 index 0000000..7ea39f9 --- /dev/null +++ b/data/rooms/agility/215.yaml @@ -0,0 +1,9 @@ +id: 215 +name: "Rooftop Course - Rooftop Edge" +description: "The final jump. The gap here is wider than any before -- a full four meters of empty air between you and the landing platform. Far below, the streets of the asteroid colony pulse with dim light. This is the last obstacle." +on_enter: + - message: "Type 'leap' to make the final jump." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/220.yaml b/data/rooms/agility/220.yaml new file mode 100644 index 0000000..d6826a3 --- /dev/null +++ b/data/rooms/agility/220.yaml @@ -0,0 +1,9 @@ +id: 220 +name: "Reactor Course - Scaffolding" +description: "Massive metal scaffolding surrounds the outer reactor housing. The structure vibrates with the reactor's pulse. Heat radiates from every surface, and warning klaxons sound periodically in the distance." +on_enter: + - message: "Type 'climb' to ascend the scaffolding." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/221.yaml b/data/rooms/agility/221.yaml new file mode 100644 index 0000000..936ee65 --- /dev/null +++ b/data/rooms/agility/221.yaml @@ -0,0 +1,9 @@ +id: 221 +name: "Reactor Course - Coolant Chain" +description: "A heavy chain hangs from an overhead crane, suspended above the reactor cooling pit. The pit glows with an eerie blue-green light. The chain is your only way across -- the gantry ahead is the landing zone." +on_enter: + - message: "Type 'swing' to cross on the chain." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/222.yaml b/data/rooms/agility/222.yaml new file mode 100644 index 0000000..119db01 --- /dev/null +++ b/data/rooms/agility/222.yaml @@ -0,0 +1,9 @@ +id: 222 +name: "Reactor Course - Steam Pipe" +description: "An enormous steam pipe, two meters in diameter, stretches across the reactor chamber. Steam vents periodically blast from pressure valves along its length. The pipe's surface is warm but not scalding -- yet." +on_enter: + - message: "Type 'balance' to traverse the pipe." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/223.yaml b/data/rooms/agility/223.yaml new file mode 100644 index 0000000..0e557f6 --- /dev/null +++ b/data/rooms/agility/223.yaml @@ -0,0 +1,9 @@ +id: 223 +name: "Reactor Course - Platform Gap" +description: "A section of the reactor maintenance platform has collapsed into the void below. Emergency barriers block the edges, but someone has moved them aside here. The gap is intimidating but clearable." +on_enter: + - message: "Type 'jump' to clear the gap." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/224.yaml b/data/rooms/agility/224.yaml new file mode 100644 index 0000000..4e70f7a --- /dev/null +++ b/data/rooms/agility/224.yaml @@ -0,0 +1,9 @@ +id: 224 +name: "Reactor Course - Service Conduit" +description: "A narrow service conduit leads through the reactor shielding. Radiation warning symbols are painted on every surface. Damaged wiring hangs from the ceiling, sparking occasionally. It's the only way forward." +on_enter: + - message: "Type 'crawl' to enter the conduit." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/225.yaml b/data/rooms/agility/225.yaml new file mode 100644 index 0000000..3413792 --- /dev/null +++ b/data/rooms/agility/225.yaml @@ -0,0 +1,9 @@ +id: 225 +name: "Reactor Course - Radiation Barrier" +description: "A containment barrier hums with energy, its surface shimmering with a faint purple glow. It pulses on and off in a regular cycle. Beyond it, the final stretch of the course is visible." +on_enter: + - message: "Type 'vault' to clear the barrier." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/agility/226.yaml b/data/rooms/agility/226.yaml new file mode 100644 index 0000000..6faa2c1 --- /dev/null +++ b/data/rooms/agility/226.yaml @@ -0,0 +1,9 @@ +id: 226 +name: "Reactor Course - Reactor Chasm" +description: "The final obstacle. A massive chasm separates you from the exit platform, the reactor's coolant pool churning far below in shades of luminous green. A narrow runway of grating leads to the edge. This is the longest leap on the course." +on_enter: + - message: "Type 'leap' to make the final jump." +exits: + down: + room: 200 + blocked_message: "" diff --git a/data/rooms/player_housing/200.yaml b/data/rooms/player_housing/200.yaml deleted file mode 100644 index 1781818..0000000 --- a/data/rooms/player_housing/200.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 200 -name: "Player House: Entrance Hall" -description: "A cozy entrance hall with polished floors and warm lighting. A welcome mat greets visitors at the door." -exits: - south: 170 - north: 201 -objects: - - id: charging_station diff --git a/data/rooms/player_housing/201.yaml b/data/rooms/player_housing/201.yaml deleted file mode 100644 index dbc1fd9..0000000 --- a/data/rooms/player_housing/201.yaml +++ /dev/null @@ -1,8 +0,0 @@ -id: 201 -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." -exits: - south: 200 -objects: - - id: workbench - - id: bank_booth diff --git a/data/rooms/player_housing/300.yaml b/data/rooms/player_housing/300.yaml new file mode 100644 index 0000000..06f1a07 --- /dev/null +++ b/data/rooms/player_housing/300.yaml @@ -0,0 +1,8 @@ +id: 300 +name: "Player House: Entrance Hall" +description: "A cozy entrance hall with polished floors and warm lighting. A welcome mat greets visitors at the door." +exits: + south: 170 + north: 301 +objects: + - id: charging_station diff --git a/data/rooms/player_housing/301.yaml b/data/rooms/player_housing/301.yaml new file mode 100644 index 0000000..c2f3e65 --- /dev/null +++ b/data/rooms/player_housing/301.yaml @@ -0,0 +1,8 @@ +id: 301 +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." +exits: + south: 300 +objects: + - id: workbench + - id: bank_booth diff --git a/data/rooms/town/1.yaml b/data/rooms/town/1.yaml new file mode 100644 index 0000000..ec97af2 --- /dev/null +++ b/data/rooms/town/1.yaml @@ -0,0 +1,38 @@ +id: 1 +name: "Town Square" +description: "The central square of Lumbridge. A fountain gurgles peacefully in the center. Paths lead west toward the gathering grounds and east toward the production district." +map_symbol: "S" +exits: + east: 2 + west: 22 + up: 30 + down: 31 +objects: + - id: lumby_fountain + - id: charging_station + - id: bank_booth +mobs: + - "newbie_trainer" + - "general_store_clerk" +item_spawns: + - id: cape_of_agility + quantity: 1 + respawn_ticks: 60 + - id: graceful_hat + quantity: 1 + respawn_ticks: 60 + - id: graceful_torso + quantity: 1 + respawn_ticks: 60 + - id: graceful_legs + quantity: 1 + respawn_ticks: 60 + - id: graceful_gloves + quantity: 1 + respawn_ticks: 60 + - id: graceful_boots + quantity: 1 + respawn_ticks: 60 + - id: graceful_cape + quantity: 1 + respawn_ticks: 60 diff --git a/data/rooms/town/10.yaml b/data/rooms/town/10.yaml new file mode 100644 index 0000000..edeac4d --- /dev/null +++ b/data/rooms/town/10.yaml @@ -0,0 +1,10 @@ +id: 10 +name: "Farming Plot" +description: "A small patch of tilled soil behind a weathered fence. This area is not yet accessible." +exits: + west: 9 + east: 11 +mobs: + - id: skeleton + - id: skeleton + - id: mutant_rat diff --git a/data/rooms/town/11.yaml b/data/rooms/town/11.yaml new file mode 100644 index 0000000..9bc45a7 --- /dev/null +++ b/data/rooms/town/11.yaml @@ -0,0 +1,17 @@ +id: 11 +name: "Kitchen" +description: "A warm kitchen with a stone hearth and wooden counters. A large iron cooking range dominates one wall, and shelves are stocked with ingredients." +exits: + east: 12 + west: 10 +objects: + - id: cooking_range +mobs: + - id: zombie +item_spawns: + - id: bucket_of_water + quantity: 1 + respawn_ticks: 200 + - id: pot_of_flour + quantity: 1 + respawn_ticks: 200 diff --git a/data/rooms/town/12.yaml b/data/rooms/town/12.yaml new file mode 100644 index 0000000..e44ae3a --- /dev/null +++ b/data/rooms/town/12.yaml @@ -0,0 +1,28 @@ +id: 12 +name: "Forge" +description: "A blazing forge and anvil dominate this smoky workshop. The heat from the furnace is intense." +exits: + east: 13 + west: 11 +mobs: + - "weapons_smith" +objects: + - 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 diff --git a/data/rooms/town/13.yaml b/data/rooms/town/13.yaml new file mode 100644 index 0000000..dc07dc1 --- /dev/null +++ b/data/rooms/town/13.yaml @@ -0,0 +1,46 @@ +id: 13 +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." +exits: + east: 14 + west: 12 +objects: + - id: spinning_wheel + - id: pottery_wheel + - id: pottery_oven + - id: sheep + - id: clay_rock + - id: clay_rock +mobs: + - id: tanner + - id: cow + - id: cow + - id: cow +item_spawns: + - id: flax + quantity: 5 + respawn_ticks: 60 + - id: thread + quantity: 10 + respawn_ticks: 60 + - id: shears + quantity: 1 + respawn_ticks: 60 + - id: needle + quantity: 1 + respawn_ticks: 60 + - id: chisel + quantity: 1 + respawn_ticks: 60 + - id: ring_mould + quantity: 1 + respawn_ticks: 60 + - id: necklace_mould + quantity: 1 + respawn_ticks: 60 + - id: amulet_mould + quantity: 1 + respawn_ticks: 60 + - id: bracelet_mould + quantity: 1 + respawn_ticks: 60 diff --git a/data/rooms/town/14.yaml b/data/rooms/town/14.yaml new file mode 100644 index 0000000..ad515de --- /dev/null +++ b/data/rooms/town/14.yaml @@ -0,0 +1,18 @@ +id: 14 +name: "Fletching Bench" +description: "A workbench covered in wood shavings, feathers, and arrowheads. Racks of unfinished bows line the walls, and a pile of bowstrings sits in the corner." +exits: + east: 15 + west: 13 +mobs: + - id: moss_giant +item_spawns: + - id: bowstring + quantity: 5 + respawn_ticks: 50 + - id: knife + quantity: 1 + respawn_ticks: 50 + - id: chisel + quantity: 1 + respawn_ticks: 50 diff --git a/data/rooms/town/15.yaml b/data/rooms/town/15.yaml new file mode 100644 index 0000000..a67624d --- /dev/null +++ b/data/rooms/town/15.yaml @@ -0,0 +1,10 @@ +id: 15 +name: "Pharmacy Lab" +description: "Shelves lined with glass vials, dried herbs, and bubbling cauldrons. This area is not yet accessible." +exits: + east: 16 + west: 14 + south: 150 +mobs: + - id: lesser_drone + - id: lesser_drone diff --git a/data/rooms/town/16.yaml b/data/rooms/town/16.yaml new file mode 100644 index 0000000..3776f4f --- /dev/null +++ b/data/rooms/town/16.yaml @@ -0,0 +1,12 @@ +id: 16 +name: "Construction Site" +description: "A half-built structure surrounded by planks, nails, and blueprints. A workbench stands ready for crafting. Signs point north toward the Local Neighborhood and east toward the lumberyard." +exits: + east: 171 + west: 15 + north: 170 +objects: + - id: workbench +mobs: + - id: greater_drone + - id: estate_broker diff --git a/data/rooms/town/17.yaml b/data/rooms/town/17.yaml new file mode 100644 index 0000000..512ec9e --- /dev/null +++ b/data/rooms/town/17.yaml @@ -0,0 +1,10 @@ +id: 17 +name: "Bonfire" +description: "A ring of stones surrounds a bed of ash. A few unlit logs wait nearby. A narrow passage leads north toward what sounds like echoing footsteps and clanging metal." +exits: + east: 18 + west: 16 + north: 200 +mobs: + - id: scrap_bot + - id: scrap_bot diff --git a/data/rooms/town/18.yaml b/data/rooms/town/18.yaml new file mode 100644 index 0000000..9dfc446 --- /dev/null +++ b/data/rooms/town/18.yaml @@ -0,0 +1,6 @@ +id: 18 +name: "Thieves' Den" +description: "A shadowy hideout with lockpicks, dark cloaks, and wanted posters on the walls. This area is not yet accessible." +exits: + east: 19 + west: 17 diff --git a/data/rooms/town/19.yaml b/data/rooms/town/19.yaml new file mode 100644 index 0000000..35800a0 --- /dev/null +++ b/data/rooms/town/19.yaml @@ -0,0 +1,6 @@ +id: 19 +name: "Agility Course" +description: "A training ground with balance beams, monkey bars, and climbing nets. This area is not yet accessible." +exits: + east: 20 + west: 18 diff --git a/data/rooms/town/2.yaml b/data/rooms/town/2.yaml new file mode 100644 index 0000000..686dc65 --- /dev/null +++ b/data/rooms/town/2.yaml @@ -0,0 +1,17 @@ +id: 2 +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." +map_symbol: "F" +exits: + east: 4 + north: 3 + west: 1 +objects: + - id: bait_fishing_spot +item_spawns: + - id: fishing_rod + quantity: 1 + respawn_ticks: 30 + - id: fishing_bait + quantity: 20 + respawn_ticks: 60 diff --git a/data/rooms/town/20.yaml b/data/rooms/town/20.yaml new file mode 100644 index 0000000..379322b --- /dev/null +++ b/data/rooms/town/20.yaml @@ -0,0 +1,6 @@ +id: 20 +name: "Assassin's Bureau" +description: "A discreet office with job postings pinned to a corkboard. This area is not yet accessible." +exits: + east: 21 + west: 19 diff --git a/data/rooms/town/21.yaml b/data/rooms/town/21.yaml new file mode 100644 index 0000000..987f5ea --- /dev/null +++ b/data/rooms/town/21.yaml @@ -0,0 +1,13 @@ +id: 21 +name: "Combat Arena" +description: "A sandy training ground with practice dummies and sparring rings. Several men wander here looking for a fight." +map_symbol: "C" +exits: + west: 20 +mobs: + - id: man + wander_interval: 10 + - id: man + wander_interval: 12 + - id: man + wander_interval: 15 diff --git a/data/rooms/town/22.yaml b/data/rooms/town/22.yaml new file mode 100644 index 0000000..478995b --- /dev/null +++ b/data/rooms/town/22.yaml @@ -0,0 +1,7 @@ +id: 22 +name: "West of Town Square" +description: "" +map_symbol: "W" +exits: + east: 1 + west: 23 diff --git a/data/rooms/town/23.yaml b/data/rooms/town/23.yaml new file mode 100644 index 0000000..f7301f6 --- /dev/null +++ b/data/rooms/town/23.yaml @@ -0,0 +1,7 @@ +id: 23 +name: "West of West of Town Square" +description: "Here is a description of where we are!" +map_symbol: "D" +exits: + east: 22 + south: 24 diff --git a/data/rooms/town/24.yaml b/data/rooms/town/24.yaml new file mode 100644 index 0000000..60bf0d8 --- /dev/null +++ b/data/rooms/town/24.yaml @@ -0,0 +1,7 @@ +id: 24 +name: "South of West of West of Town Square" +description: "Here is a description of where we are!" +map_symbol: "N" +exits: + north: 23 + east: 25 diff --git a/data/rooms/town/25.yaml b/data/rooms/town/25.yaml new file mode 100644 index 0000000..a3dd843 --- /dev/null +++ b/data/rooms/town/25.yaml @@ -0,0 +1,7 @@ +id: 25 +name: "East of South of West of West of Town Square" +description: "Here is a description of where we are!" +map_symbol: "N" +exits: + west: 24 + east: 26 diff --git a/data/rooms/town/26.yaml b/data/rooms/town/26.yaml new file mode 100644 index 0000000..a2899e7 --- /dev/null +++ b/data/rooms/town/26.yaml @@ -0,0 +1,7 @@ +id: 26 +name: "East of South of West of West of Town Square" +description: "Here is a description of where we are!" +map_symbol: "Q" +exits: + west: 25 + south: 27 diff --git a/data/rooms/town/27.yaml b/data/rooms/town/27.yaml new file mode 100644 index 0000000..d435424 --- /dev/null +++ b/data/rooms/town/27.yaml @@ -0,0 +1,7 @@ +id: 27 +name: "East of South of West of West of Town Square" +description: "Here is a description of where we are!" +map_symbol: "J" +exits: + west: 28 + north: 26 diff --git a/data/rooms/town/28.yaml b/data/rooms/town/28.yaml new file mode 100644 index 0000000..03913d5 --- /dev/null +++ b/data/rooms/town/28.yaml @@ -0,0 +1,6 @@ +id: 28 +name: "East of South of West of West of Town Square" +description: "Here is a description of where we are!" +map_symbol: "r" +exits: + east: 27 diff --git a/data/rooms/town/3.yaml b/data/rooms/town/3.yaml new file mode 100644 index 0000000..16ce1c8 --- /dev/null +++ b/data/rooms/town/3.yaml @@ -0,0 +1,15 @@ +id: 3 +name: "Fly Fishing Pool" +description: "A calm pool where insects hover over the water. Perfect for fly fishing." +map_symbol: "X" +exits: + south: 2 +objects: + - id: fly_fishing_spot +item_spawns: + - id: fly_fishing_rod + quantity: 1 + respawn_ticks: 30 + - id: feather + quantity: 15 + respawn_ticks: 60 diff --git a/data/rooms/town/30.yaml b/data/rooms/town/30.yaml new file mode 100644 index 0000000..8c167eb --- /dev/null +++ b/data/rooms/town/30.yaml @@ -0,0 +1,6 @@ +id: 30 +name: "Above Town Square" +description: "The central square of Lumbridge. A fountain gurgles peacefully in the center. Paths lead west toward the gathering grounds and east toward the production district." +map_symbol: "A" +exits: + down: 1 diff --git a/data/rooms/town/31.yaml b/data/rooms/town/31.yaml new file mode 100644 index 0000000..3d010df --- /dev/null +++ b/data/rooms/town/31.yaml @@ -0,0 +1,7 @@ +id: 31 +name: "Below Town Square" +description: "The central square of Lumbridge. A fountain gurgles peacefully in the center. Paths lead west toward the gathering grounds and east toward the production district." +map_symbol: "b" +exits: + up: 1 + down: 50 diff --git a/data/rooms/town/4.yaml b/data/rooms/town/4.yaml new file mode 100644 index 0000000..2c9f27f --- /dev/null +++ b/data/rooms/town/4.yaml @@ -0,0 +1,29 @@ +id: 4 +name: "Woodcutting Glade" +description: "A sunny glade at the edge of the forest. A sturdy tree stands here, perfect for practicing woodcutting." +map_symbol: "W" +exits: + east: 6 + north: 5 + west: 2 +objects: + - id: tree + - id: tree + - id: tree + - id: tree +mobs: + - id: rat + - id: rat +item_spawns: + - id: bronze_axe + quantity: 1 + respawn_ticks: 60 + - id: matches + quantity: 100 + respawn_ticks: 120 + - id: firesteel + quantity: 1 + respawn_ticks: 120 + - id: lighter + quantity: 1 + respawn_ticks: 120 diff --git a/data/rooms/town/5.yaml b/data/rooms/town/5.yaml new file mode 100644 index 0000000..bd760b1 --- /dev/null +++ b/data/rooms/town/5.yaml @@ -0,0 +1,12 @@ +id: 5 +name: "Oak Grove" +description: "A stand of young oak trees. The wood here is tougher but more valuable." +map_symbol: "O" +exits: + south: 4 +objects: + - id: oak_tree +item_spawns: + - id: iron_axe + quantity: 1 + respawn_ticks: 60 diff --git a/data/rooms/town/6.yaml b/data/rooms/town/6.yaml new file mode 100644 index 0000000..0fb9c59 --- /dev/null +++ b/data/rooms/town/6.yaml @@ -0,0 +1,16 @@ +id: 6 +name: "Mining Pit" +description: "A small mining pit. The rocky walls glint with veins of copper ore." +map_symbol: "M" +exits: + east: 8 + north: 7 + west: 4 +objects: + - id: copper_rock + - id: copper_rock + - id: copper_rock +item_spawns: + - id: bronze_pickaxe + quantity: 1 + respawn_ticks: 30 diff --git a/data/rooms/town/7.yaml b/data/rooms/town/7.yaml new file mode 100644 index 0000000..37dfed9 --- /dev/null +++ b/data/rooms/town/7.yaml @@ -0,0 +1,9 @@ +id: 7 +name: "Deep Mine" +description: "A deeper mine shaft. Higher quality ores can be found here. This area is not yet accessible." +exits: + south: 6 +mobs: + - id: goblin + - id: goblin + - id: bandit diff --git a/data/rooms/town/8.yaml b/data/rooms/town/8.yaml new file mode 100644 index 0000000..b82c1bb --- /dev/null +++ b/data/rooms/town/8.yaml @@ -0,0 +1,11 @@ +id: 8 +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." +exits: + east: 9 + west: 6 +objects: + - id: terminal_basic + - id: terminal_advanced + - id: terminal_secure + - id: netrunner diff --git a/data/rooms/town/9.yaml b/data/rooms/town/9.yaml new file mode 100644 index 0000000..9a19943 --- /dev/null +++ b/data/rooms/town/9.yaml @@ -0,0 +1,14 @@ +id: 9 +name: "Scavenging Post" +description: "A cluttered yard full of {243}scrap metal{/} and discarded technology. Piles of salvageable debris are scattered across the ground. The air smells of ozone and rust." +exits: + east: 10 + west: 8 + north: 150 + south: 151 + northeast: 152 +objects: + - id: scrap_pile + - id: scrap_pile + - id: scrap_pile + - id: solar_altar diff --git a/data/rooms/underground/50.yaml b/data/rooms/underground/50.yaml new file mode 100644 index 0000000..0c9ebf2 --- /dev/null +++ b/data/rooms/underground/50.yaml @@ -0,0 +1,7 @@ +id: 50 +name: "The Assassin's Den" +description: "A dimly lit basement accessible through a trapdoor. Tactical maps and bounty posters line the walls. The air smells of gun oil and burnt ozone. {141}The Client{/} sits behind a reinforced desk." +exits: + up: 31 +mobs: + - "client" diff --git a/data/rooms/underground/51.yaml b/data/rooms/underground/51.yaml new file mode 100644 index 0000000..74a97ef --- /dev/null +++ b/data/rooms/underground/51.yaml @@ -0,0 +1,10 @@ +id: 51 +name: "Sewer Tunnels" +description: "Dark, damp tunnels beneath the settlement. The floor is slick with moisture and something {82}slimy{/}. The smell is indescribable." +exits: + north: 50 + south: 52 +mobs: + - "slug" + - "slug" + - "slug" diff --git a/data/rooms/underground/52.yaml b/data/rooms/underground/52.yaml new file mode 100644 index 0000000..2f90abd --- /dev/null +++ b/data/rooms/underground/52.yaml @@ -0,0 +1,9 @@ +id: 52 +name: "Abandoned Sector" +description: "A decommissioned sector of the asteroid's infrastructure. Broken monitors flicker and exposed wiring {214}sparks{/} dangerously." +exits: + north: 51 + south: 53 +mobs: + - "drone" + - "drone" diff --git a/data/rooms/underground/53.yaml b/data/rooms/underground/53.yaml new file mode 100644 index 0000000..126719b --- /dev/null +++ b/data/rooms/underground/53.yaml @@ -0,0 +1,9 @@ +id: 53 +name: "Deep Tunnels" +description: "The tunnels descend deeper into the asteroid's core. Strange chitinous scraping echoes from the darkness. The walls are scarred with {130}claw marks{/}." +exits: + north: 52 + south: 54 +mobs: + - "crawler" + - "crawler" diff --git a/data/rooms/underground/54.yaml b/data/rooms/underground/54.yaml new file mode 100644 index 0000000..e86e5b7 --- /dev/null +++ b/data/rooms/underground/54.yaml @@ -0,0 +1,9 @@ +id: 54 +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." +exits: + north: 53 + down: 55 +mobs: + - "phantom" + - "phantom" diff --git a/data/rooms/underground/55.yaml b/data/rooms/underground/55.yaml new file mode 100644 index 0000000..8000170 --- /dev/null +++ b/data/rooms/underground/55.yaml @@ -0,0 +1,12 @@ +id: 55 +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." +exits: + up: 54 + north: 56 + east: 57 + south: 58 + west: 60 + down: 62 +mobs: + - id: security_turret diff --git a/data/rooms/underground/56.yaml b/data/rooms/underground/56.yaml new file mode 100644 index 0000000..375696d --- /dev/null +++ b/data/rooms/underground/56.yaml @@ -0,0 +1,9 @@ +id: 56 +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." +exits: + south: 55 +mobs: + - id: ghoul + - id: ghoul + - id: corrupted_scientist diff --git a/data/rooms/underground/57.yaml b/data/rooms/underground/57.yaml new file mode 100644 index 0000000..714197d --- /dev/null +++ b/data/rooms/underground/57.yaml @@ -0,0 +1,8 @@ +id: 57 +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." +exits: + west: 55 +mobs: + - id: war_drone + - id: war_drone diff --git a/data/rooms/underground/58.yaml b/data/rooms/underground/58.yaml new file mode 100644 index 0000000..f4d1829 --- /dev/null +++ b/data/rooms/underground/58.yaml @@ -0,0 +1,8 @@ +id: 58 +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." +exits: + north: 55 + south: 59 +mobs: + - id: enforcer_bot diff --git a/data/rooms/underground/59.yaml b/data/rooms/underground/59.yaml new file mode 100644 index 0000000..a1cc594 --- /dev/null +++ b/data/rooms/underground/59.yaml @@ -0,0 +1,9 @@ +id: 59 +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." +exits: + north: 58 +mobs: + - id: plasma_wraith + - id: plasma_wraith + - id: feral_cyborg diff --git a/data/rooms/underground/60.yaml b/data/rooms/underground/60.yaml new file mode 100644 index 0000000..e9b7114 --- /dev/null +++ b/data/rooms/underground/60.yaml @@ -0,0 +1,8 @@ +id: 60 +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." +exits: + east: 55 + west: 61 +mobs: + - id: heavy_mech diff --git a/data/rooms/underground/61.yaml b/data/rooms/underground/61.yaml new file mode 100644 index 0000000..a85c7ba --- /dev/null +++ b/data/rooms/underground/61.yaml @@ -0,0 +1,7 @@ +id: 61 +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." +exits: + east: 60 +mobs: + - id: elite_synth diff --git a/data/rooms/underground/62.yaml b/data/rooms/underground/62.yaml new file mode 100644 index 0000000..9ed1fad --- /dev/null +++ b/data/rooms/underground/62.yaml @@ -0,0 +1,8 @@ +id: 62 +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." +exits: + up: 55 + down: 63 +mobs: + - id: veteran_merc diff --git a/data/rooms/underground/63.yaml b/data/rooms/underground/63.yaml new file mode 100644 index 0000000..b6bf53e --- /dev/null +++ b/data/rooms/underground/63.yaml @@ -0,0 +1,8 @@ +id: 63 +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." +exits: + up: 62 + down: 64 +mobs: + - id: molten_elemental diff --git a/data/rooms/underground/64.yaml b/data/rooms/underground/64.yaml new file mode 100644 index 0000000..b412992 --- /dev/null +++ b/data/rooms/underground/64.yaml @@ -0,0 +1,8 @@ +id: 64 +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." +exits: + up: 63 + down: 65 +mobs: + - id: iron_sentinel diff --git a/data/rooms/underground/65.yaml b/data/rooms/underground/65.yaml new file mode 100644 index 0000000..47aed6b --- /dev/null +++ b/data/rooms/underground/65.yaml @@ -0,0 +1,8 @@ +id: 65 +name: "Titan's Rest" +description: "A colossal vault built to house something immense. The ceiling vanishes into darkness above, and the walls are etched with maintenance schematics for a machine of staggering proportions. At the center, a titan sentinel awakens." +exits: + up: 64 + down: 66 +mobs: + - id: titan_sentinel diff --git a/data/rooms/underground/66.yaml b/data/rooms/underground/66.yaml new file mode 100644 index 0000000..755d5e2 --- /dev/null +++ b/data/rooms/underground/66.yaml @@ -0,0 +1,8 @@ +id: 66 +name: "Psionic Nexus" +description: "Reality grows thin here. The walls are covered in strange geometric patterns that hurt to look at directly. A low hum vibrates through your skull, and the air seems to bend around a central point of unseen pressure." +exits: + up: 65 + down: 67 +mobs: + - id: psionic_entity diff --git a/data/rooms/underground/67.yaml b/data/rooms/underground/67.yaml new file mode 100644 index 0000000..6b8d663 --- /dev/null +++ b/data/rooms/underground/67.yaml @@ -0,0 +1,8 @@ +id: 67 +name: "Ancient Chamber" +description: "A perfectly spherical room carved from an unknown black metal. Glowing runes spiral across every surface in patterns that predate the asteroid itself. At the center, an ancient construct stirs from its eons-long vigil." +exits: + up: 66 + down: 68 +mobs: + - id: ancient_construct diff --git a/data/rooms/underground/68.yaml b/data/rooms/underground/68.yaml new file mode 100644 index 0000000..f631981 --- /dev/null +++ b/data/rooms/underground/68.yaml @@ -0,0 +1,7 @@ +id: 68 +name: "The Void" +description: "The bottom of the world. Light itself seems to hesitate before entering this place. The floor is unnaturally smooth black glass, and the only sound is the beating of your own heart. Something waits in the darkness — something that was here before the asteroid, before the colony, before anything." +exits: + up: 67 +mobs: + - id: void_reaper diff --git a/data/rooms/wilderness/150.yaml b/data/rooms/wilderness/150.yaml new file mode 100644 index 0000000..36b86ea --- /dev/null +++ b/data/rooms/wilderness/150.yaml @@ -0,0 +1,32 @@ +id: 150 +name: "Hydroponics Bay" +description: "A large enclosed area with climate-controlled growing stations. {34}Lush green patches{/} of soil are laid out in neat rows under artificial UV lamps. A {94}tool shed{/} stands near the entrance. Exits lead to specialized growing areas." +map_symbol: "H" +exits: + north: 15 + east: 151 + south: 152 +objects: + - id: tool_shed +item_spawns: + - id: rake + quantity: 1 + respawn_ticks: 120 + - id: spade + quantity: 1 + respawn_ticks: 120 + - id: watering_can + quantity: 1 + respawn_ticks: 120 + - id: plant_cure + quantity: 3 + respawn_ticks: 200 + - id: guam_seed + quantity: 5 + respawn_ticks: 300 + - id: potato_seed + quantity: 10 + respawn_ticks: 300 + - id: onion_seed + quantity: 10 + respawn_ticks: 300 diff --git a/data/rooms/wilderness/151.yaml b/data/rooms/wilderness/151.yaml new file mode 100644 index 0000000..1bb25bf --- /dev/null +++ b/data/rooms/wilderness/151.yaml @@ -0,0 +1,11 @@ +id: 151 +name: "Herb Garden" +description: "A dedicated section of the hydroponics bay for growing herbs. {28}Herb patches{/} are arranged in two rows under specialized grow lights. The air here smells faintly of fresh vegetation." +map_symbol: "G" +exits: + west: 150 +objects: + - id: herb_patch + - id: herb_patch + - id: herb_patch + - id: herb_patch diff --git a/data/rooms/wilderness/152.yaml b/data/rooms/wilderness/152.yaml new file mode 100644 index 0000000..5d2f62d --- /dev/null +++ b/data/rooms/wilderness/152.yaml @@ -0,0 +1,11 @@ +id: 152 +name: "Allotment Field" +description: "A section with larger soil beds for growing vegetables. {94}Allotment patches{/} stretch across the floor under warm overhead lamps. A single {213}flower patch{/} sits in the corner." +map_symbol: "A" +exits: + north: 150 +objects: + - id: allotment_patch + - id: allotment_patch + - id: allotment_patch + - id: flower_patch diff --git a/data/rooms/wilderness/160.yaml b/data/rooms/wilderness/160.yaml new file mode 100644 index 0000000..dea9d00 --- /dev/null +++ b/data/rooms/wilderness/160.yaml @@ -0,0 +1,17 @@ +id: 160 +name: "Market Square" +description: "A noisy open-air market wedged between crumbling hab-blocks. Vendors hawk salvaged tech and reconstituted food from makeshift stalls. A {220 bold}Guard{/} watches over the area with a stern expression." +map_symbol: "M" +exits: + north: 1 + east: 161 +objects: + - id: market_stall +mobs: + - id: man + wander_interval: 15 + - id: man + wander_interval: 18 + - id: man + wander_interval: 20 + - id: guard \ No newline at end of file diff --git a/data/rooms/wilderness/161.yaml b/data/rooms/wilderness/161.yaml new file mode 100644 index 0000000..c887347 --- /dev/null +++ b/data/rooms/wilderness/161.yaml @@ -0,0 +1,13 @@ +id: 161 +name: "Farm Outpost" +description: "A cluster of hydroponic grow-pods on the asteroid's surface, shielded by a flickering atmospheric dome. Rows of bio-luminescent crops stretch into the distance." +map_symbol: "F" +exits: + west: 160 +mobs: + - id: farmer + wander_rooms: [161] + - id: farmer + wander_rooms: [161] + - id: bioengineer + wander_rooms: [161] \ No newline at end of file diff --git a/data/rooms/wilderness/162.yaml b/data/rooms/wilderness/162.yaml new file mode 100644 index 0000000..a8333d8 --- /dev/null +++ b/data/rooms/wilderness/162.yaml @@ -0,0 +1,6 @@ +id: 162 +name: "Detention Cell" +description: "A small, grimy holding cell. The walls are scratched with tally marks from previous occupants. A heavy door bars the only exit." +map_symbol: "J" +exits: + north: 1 \ No newline at end of file diff --git a/data/rooms/wilderness/170.yaml b/data/rooms/wilderness/170.yaml new file mode 100644 index 0000000..35d539f --- /dev/null +++ b/data/rooms/wilderness/170.yaml @@ -0,0 +1,7 @@ +id: 170 +name: "Local Neighborhood" +description: "A quiet cul-de-sac of modest homes, each with a small garden plot. An estate directory terminal glows in the center, listing residents and property information." +exits: + south: 16 +objects: + - id: estate_directory diff --git a/data/rooms/wilderness/171.yaml b/data/rooms/wilderness/171.yaml new file mode 100644 index 0000000..552ccd4 --- /dev/null +++ b/data/rooms/wilderness/171.yaml @@ -0,0 +1,7 @@ +id: 171 +name: "Lumberyard" +description: "Stacks of fresh-cut timber fill the air with the scent of pine. A massive industrial sawmill hums in the background, operated by a burly worker." +exits: + west: 16 +mobs: + - id: sawmill_operator diff --git a/internal/action/recipe.go b/internal/action/recipe.go index c1f30fb..5a69195 100644 --- a/internal/action/recipe.go +++ b/internal/action/recipe.go @@ -1,7 +1,6 @@ package action import ( - "os" "path/filepath" "gopkg.in/yaml.v3" @@ -9,7 +8,7 @@ import ( type ConsumeEntry struct { Items []string `yaml:"items"` - Qty int `yaml:"qty"` + Quantity int `yaml:"quantity"` Byproducts []string `yaml:"byproducts"` } @@ -80,25 +79,15 @@ func (s *RecipeStore) LoadByType(recipeType string) ([]RecipeDef, error) { func (s *RecipeStore) loadAllRaw() ([]RecipeDef, error) { dir := filepath.Join(s.dataDir, "recipes") - entries, err := os.ReadDir(dir) - if err != nil { - return nil, err - } var recipes []RecipeDef - for _, e := range entries { - if e.IsDir() || filepath.Ext(e.Name()) != ".yaml" { - continue - } - data, err := os.ReadFile(filepath.Join(dir, e.Name())) - if err != nil { - continue - } + WalkYAMLDir(dir, func(path, id string, data []byte) error { var r RecipeDef if err := yaml.Unmarshal(data, &r); err != nil { - continue + return nil } recipes = append(recipes, r) - } + return nil + }) return recipes, nil } @@ -190,23 +179,23 @@ func (r *RecipeDef) ConsumeAll(hasItem func(string) bool, removeItem func(string found := false for _, id := range e.Items { if hasItem(id) { - removeItem(id, e.Qty) - found = true - break - } - } - if !found { - return false + removeItem(id, e.Quantity) + found = true + break } } - return true + if !found { + return false + } +} +return true } func (r *RecipeDef) HasAllItemsQty(countItem func(string) int) bool { for _, e := range r.Consume { found := false for _, id := range e.Items { - qty := e.Qty + qty := e.Quantity if qty <= 0 { qty = 1 } diff --git a/internal/action/store.go b/internal/action/store.go index a8db9df..6cb2e39 100644 --- a/internal/action/store.go +++ b/internal/action/store.go @@ -5,10 +5,79 @@ import ( "math/rand" "os" "path/filepath" + "strings" + "sync" "gopkg.in/yaml.v3" ) +func BuildPathIndex(dir string) map[string]string { + index := make(map[string]string) + filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { + if err != nil || d.IsDir() || !strings.HasSuffix(d.Name(), ".yaml") { + return nil + } + id := strings.TrimSuffix(d.Name(), ".yaml") + index[id] = path + return nil + }) + return index +} + +func BuildRoomIndex(dir string) map[int]string { + index := make(map[int]string) + filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { + if err != nil || d.IsDir() || !strings.HasSuffix(d.Name(), ".yaml") { + return nil + } + id := strings.TrimSuffix(d.Name(), ".yaml") + var n int + if _, scanErr := fmt.Sscanf(id, "%d", &n); scanErr == nil { + index[n] = path + } + return nil + }) + return index +} + +func WalkYAMLDir(dir string, fn func(path, id string, data []byte) error) error { + return filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { + if err != nil || d.IsDir() || !strings.HasSuffix(d.Name(), ".yaml") { + return nil + } + data, readErr := os.ReadFile(path) + if readErr != nil { + return nil + } + id := strings.TrimSuffix(d.Name(), ".yaml") + return fn(path, id, data) + }) +} + +type Duplicate struct { + ID string + Paths []string +} + +func CheckDuplicateIDs(dir string) []Duplicate { + seen := make(map[string][]string) + filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { + if err != nil || d.IsDir() || !strings.HasSuffix(d.Name(), ".yaml") { + return nil + } + id := strings.TrimSuffix(d.Name(), ".yaml") + seen[id] = append(seen[id], path) + return nil + }) + var dups []Duplicate + for id, paths := range seen { + if len(paths) > 1 { + dups = append(dups, Duplicate{ID: id, Paths: paths}) + } + } + return dups +} + func SuccessChance(cfg SuccessFormula, level int, requiredLevel int) float64 { chance := cfg.Base + float64(level-requiredLevel)*cfg.PerLevel if chance > cfg.Cap { @@ -20,8 +89,26 @@ func SuccessChance(cfg SuccessFormula, level int, requiredLevel int) float64 { return chance } +var ( + dropIndex map[string]string + dropIndexMu sync.Mutex +) + +func loadDropIndex(dataDir string) map[string]string { + dropIndexMu.Lock() + defer dropIndexMu.Unlock() + if dropIndex == nil { + dropIndex = BuildPathIndex(filepath.Join(dataDir, "drops")) + } + return dropIndex +} + func LoadDropTable(dataDir, id string) (*DropTableDef, error) { - path := filepath.Join(dataDir, "drops", id+".yaml") + index := loadDropIndex(dataDir) + path, ok := index[id] + if !ok { + path = filepath.Join(dataDir, "drops", id+".yaml") + } data, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("read drop table %s: %w", id, err) diff --git a/internal/config/config.go b/internal/config/config.go index 122c311..124d45d 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -60,7 +60,13 @@ func DefaultColors() ColorsConfig { } type GameConfig struct { - TickLength int `yaml:"tick_length"` + TickLength int `yaml:"tick_length"` + StartupValidation StartupValidationConfig `yaml:"startup_validation"` +} + +type StartupValidationConfig struct { + CheckSources []int `yaml:"check_sources"` + IgnoreUnreachable []int `yaml:"ignore_unreachable"` } type TelnetConfig struct { @@ -91,6 +97,10 @@ func Default() *Config { return &Config{ Game: GameConfig{ TickLength: 600, + StartupValidation: StartupValidationConfig{ + CheckSources: []int{1}, + IgnoreUnreachable: []int{}, + }, }, Colors: DefaultColors(), Telnet: TelnetConfig{ diff --git a/internal/game/action_burn.go b/internal/game/action_burn.go index 4d8b65e..c31d7d5 100644 --- a/internal/game/action_burn.go +++ b/internal/game/action_burn.go @@ -3,6 +3,7 @@ package game import ( "fmt" "math/rand" + "strings" "thehouseoficarus/internal/action" "thehouseoficarus/internal/engine" @@ -11,6 +12,18 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeBurn(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + g.doBurn(sess, p, strings.Join(args, " ")) +} + +func (g *Game) executeStoke(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + g.doStoke(sess, p, strings.Join(args, " ")) +} + func (g *Game) doBurn(sess *net.Session, p *player.Player, input string) { if p.Action != nil { g.cancelAction(p) diff --git a/internal/game/action_steal.go b/internal/game/action_steal.go index ee5456c..3510ce7 100644 --- a/internal/game/action_steal.go +++ b/internal/game/action_steal.go @@ -16,6 +16,16 @@ import ( "thehouseoficarus/internal/world" ) +func (g *Game) executeSteal(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + if len(args) == 0 { + g.doSteal(sess, "") + } else { + g.doSteal(sess, strings.Join(args, " ")) + } +} + var stallGuardTalk = &action.TalkConfig{ Nodes: map[string]action.TalkNode{ "start": { diff --git a/internal/game/aggro.go b/internal/game/aggro.go deleted file mode 100644 index 2a9fff4..0000000 --- a/internal/game/aggro.go +++ /dev/null @@ -1,53 +0,0 @@ -package game - -import ( - "fmt" - - "thehouseoficarus/internal/combat" - "thehouseoficarus/internal/engine" - "thehouseoficarus/internal/net" -) - -func (g *Game) checkAggro(sess *net.Session) { - p := sess.Player - - if combat.GetCombat(p.Name) != nil { - return - } - - playerLevel := p.CombatLevel() - mobs := g.MobStore.MobsInRoom(p.RoomID) - - for _, mob := range mobs { - if !mob.Aggressive || mob.HP <= 0 || mob.Protected { - continue - } - if combat.IsMobInCombat(mob.InstanceID) { - continue - } - mobLevel := mobCombatLevel(mob) - if playerLevel > mobLevel*2 { - continue - } - aggMob := mob - g.Ticks.Subscribe(engine.ToTicks(1), func() bool { - if combat.GetCombat(p.Name) != nil { - return false - } - if aggMob.HP <= 0 || aggMob.RoomID != p.RoomID { - return false - } - if combat.IsMobInCombat(aggMob.InstanceID) { - return false - } - attacker := aggMob.Name - if !aggMob.Unique { - attacker = "The " + aggMob.Name - } - sess.WriteLine(fmt.Sprintf("\n%s attacks you!", g.colorize(sess, "mob_name", attacker))) - g.startCombat(sess, p, aggMob) - return false - }) - break - } -} diff --git a/internal/game/assassin.go b/internal/game/assassin.go deleted file mode 100644 index 1927399..0000000 --- a/internal/game/assassin.go +++ /dev/null @@ -1,174 +0,0 @@ -package game - -import ( - "fmt" - "math/rand" - - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/player" - "thehouseoficarus/internal/world" -) - -type assassinTaskEntry struct { - MobID string - MinLevel int - MaxLevel int - MinCount int - MaxCount int - Weight int -} - -var assassinTaskTable = []assassinTaskEntry{ - {"man", 1, 15, 10, 25, 8}, - {"cow", 1, 15, 10, 25, 8}, - {"slug", 1, 99, 15, 45, 15}, - {"drone", 15, 99, 20, 50, 12}, - {"crawler", 30, 99, 15, 40, 10}, - {"phantom", 45, 99, 10, 30, 8}, -} - -func (g *Game) assignAssassinTask(sess *net.Session, p *player.Player) { - level := p.Level(player.Assassin) - var eligible []assassinTaskEntry - totalWeight := 0 - for _, entry := range assassinTaskTable { - if level >= entry.MinLevel && level <= entry.MaxLevel { - eligible = append(eligible, entry) - totalWeight += entry.Weight - } - } - if len(eligible) == 0 { - sess.WriteLine("The Client shakes their head. \"Nothing available for your level.\"") - return - } - roll := rand.Intn(totalWeight) - var chosen assassinTaskEntry - for _, entry := range eligible { - roll -= entry.Weight - if roll < 0 { - chosen = entry - break - } - } - count := chosen.MinCount + rand.Intn(chosen.MaxCount-chosen.MinCount+1) - setPlayerFlag(p, "assassin_task_mob", chosen.MobID) - setPlayerFlag(p, "assassin_task_total", count) - setPlayerFlag(p, "assassin_task_remaining", count) - g.AccountStore.SaveCharacter(p) - - def, err := g.MobStore.LoadDef(chosen.MobID) - name := chosen.MobID - if err == nil { - name = def.Name - } - sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf("\"Your target: %d %ss. Get to work.\"", count, name))) -} - -func (g *Game) onAssassinKill(sess *net.Session, p *player.Player, mob *world.MobInstance) { - taskMob := getPlayerFlagString(p, "assassin_task_mob") - if taskMob == "" || taskMob != mob.DefID { - return - } - remaining := getPlayerFlagInt(p, "assassin_task_remaining") - if remaining <= 0 { - return - } - xp := mob.MaxHP * 2 - g.awardSkillXP(sess, p, player.Assassin, xp) - if p.OptionBool("xp_drops") { - sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf(" (+%dxp asm)", xp))) - } - remaining-- - setPlayerFlag(p, "assassin_task_remaining", remaining) - if remaining <= 0 { - completed := getPlayerFlagInt(p, "assassin_tasks_completed") + 1 - streak := getPlayerFlagInt(p, "assassin_streak") + 1 - setPlayerFlag(p, "assassin_tasks_completed", completed) - setPlayerFlag(p, "assassin_streak", streak) - delete(p.Flags, "assassin_task_mob") - setPlayerFlag(p, "assassin_task_remaining", 0) - setPlayerFlag(p, "assassin_task_total", 0) - rep := 1 - bonus := streakBonus(streak) - rep += bonus - currentRep := getPlayerFlagInt(p, "assassin_reputation") - setPlayerFlag(p, "assassin_reputation", currentRep+rep) - sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf("\n*** Assassin task complete! ***"))) - if bonus > 0 { - sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf(" Streak bonus! %d tasks in a row. +%d bonus reputation.", streak, bonus))) - } - sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf(" Reputation earned: %d (total: %d)", rep, currentRep+rep))) - } else { - total := getPlayerFlagInt(p, "assassin_task_total") - def, _ := g.MobStore.LoadDef(taskMob) - name := taskMob - if def != nil { - name = def.Name - } - sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf(" Assassin task: %d of %d %ss remaining.", remaining, total, name))) - } - g.AccountStore.SaveCharacter(p) -} - -func (g *Game) skipAssassinTask(sess *net.Session, p *player.Player) { - rep := getPlayerFlagInt(p, "assassin_reputation") - if rep < 30 { - sess.WriteLine("You don't have enough Reputation to skip. (Need 30, have " + fmt.Sprint(rep) + ")") - return - } - setPlayerFlag(p, "assassin_reputation", rep-30) - delete(p.Flags, "assassin_task_mob") - setPlayerFlag(p, "assassin_task_remaining", 0) - setPlayerFlag(p, "assassin_task_total", 0) - setPlayerFlag(p, "assassin_streak", 0) - g.AccountStore.SaveCharacter(p) -} - -func (g *Game) extendAssassinTask(sess *net.Session, p *player.Player) { - rep := getPlayerFlagInt(p, "assassin_reputation") - if rep < 30 { - sess.WriteLine("You don't have enough Reputation to extend. (Need 30, have " + fmt.Sprint(rep) + ")") - return - } - taskMob := getPlayerFlagString(p, "assassin_task_mob") - if taskMob == "" { - sess.WriteLine("You don't have an active task to extend.") - return - } - setPlayerFlag(p, "assassin_reputation", rep-30) - total := getPlayerFlagInt(p, "assassin_task_total") - remaining := getPlayerFlagInt(p, "assassin_task_remaining") - extension := total / 2 - if extension < 5 { - extension = 5 - } - setPlayerFlag(p, "assassin_task_total", total+extension) - setPlayerFlag(p, "assassin_task_remaining", remaining+extension) - g.AccountStore.SaveCharacter(p) - - def, _ := g.MobStore.LoadDef(taskMob) - name := taskMob - if def != nil { - name = def.Name - } - sess.WriteLine(fmt.Sprintf("Task extended by %d. Kill %d more %ss (%d total).", extension, remaining+extension, name, total+extension)) -} - -func streakBonus(streak int) int { - if streak%1000 == 0 { - return 50 - } - if streak%250 == 0 { - return 35 - } - if streak%100 == 0 { - return 25 - } - if streak%50 == 0 { - return 15 - } - if streak%10 == 0 { - return 5 - } - return 0 -} diff --git a/internal/game/buff.go b/internal/game/buff.go deleted file mode 100644 index 9449731..0000000 --- a/internal/game/buff.go +++ /dev/null @@ -1,55 +0,0 @@ -package game - -import ( - "strings" - - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/player" -) - -func (g *Game) BuffTick() { - if g.Hub == nil { - return - } - for _, sess := range g.Hub.AllSessions() { - if sess.Player == nil { - continue - } - p := sess.Player - remaining := make([]player.PotionBuff, 0, len(p.ActiveBuffs)) - dirty := false - for _, buff := range p.ActiveBuffs { - buff.TicksLeft-- - if buff.TicksLeft > 0 { - remaining = append(remaining, buff) - } else { - dirty = true - } - } - if dirty { - p.ActiveBuffs = remaining - sess.WriteLine(g.colorize(sess, "broadcast", "\nYour potion buff has worn off.")) - } - } -} - -func (g *Game) buffLevelBonus(p *player.Player, stat string) int { - if g.Hub == nil { - return 0 - } - totalPercent := 0 - for _, buff := range p.ActiveBuffs { - if strings.EqualFold(buff.Stat, stat) { - totalPercent += buff.BonusPercent - } - } - if totalPercent == 0 { - return 0 - } - baseLevel := p.Level(player.SkillName(strings.ToLower(stat))) - return baseLevel * totalPercent / 100 -} - -func (g *Game) totalBuffedLevel(sess *net.Session, p *player.Player, stat string) int { - return p.Level(player.SkillName(strings.ToLower(stat))) + g.buffLevelBonus(p, stat) -} diff --git a/internal/game/cmd_alias.go b/internal/game/cmd_alias.go index e7e4e12..890b904 100644 --- a/internal/game/cmd_alias.go +++ b/internal/game/cmd_alias.go @@ -8,6 +8,14 @@ import ( "thehouseoficarus/internal/net" ) +func (g *Game) executeAlias(sess *net.Session, args []string, rawInput string) { + g.doAlias(sess, args) +} + +func (g *Game) executeUnalias(sess *net.Session, args []string, rawInput string) { + g.doUnalias(sess, args) +} + func (g *Game) doAlias(sess *net.Session, args []string) { if sess.Account == nil { sess.WriteLine("No account loaded.") diff --git a/internal/game/cmd_attack.go b/internal/game/cmd_attack.go index b0ce214..222e3c3 100644 --- a/internal/game/cmd_attack.go +++ b/internal/game/cmd_attack.go @@ -608,6 +608,20 @@ func (g *Game) stopCombat(playerName string) { } } +func (g *Game) executeAttack(sess *net.Session, args []string, rawInput string) { + if len(args) == 0 { + p := sess.Player + target := g.resolveDefaultMob(p.RoomID) + if target == "" { + sess.WriteLine("Attack what?") + return + } + g.doAttack(sess, target) + } else { + g.doAttack(sess, strings.Join(args, " ")) + } +} + func (g *Game) respawnMob(instanceID string) { inst := g.MobStore.GetInstance(instanceID) if inst == nil { diff --git a/internal/game/cmd_autotrigger.go b/internal/game/cmd_autotrigger.go index 3c41735..e2ecd1a 100644 --- a/internal/game/cmd_autotrigger.go +++ b/internal/game/cmd_autotrigger.go @@ -52,3 +52,7 @@ func (g *Game) doAutotrigger(sess *net.Session, input string) { p.AutotriggerMod = mod.ID sess.WriteLine(fmt.Sprintf("Autotrigger set to: %s", mod.Name)) } + +func (g *Game) executeAutotrigger(sess *net.Session, args []string, rawInput string) { + g.doAutotrigger(sess, strings.Join(args, " ")) +} diff --git a/internal/game/cmd_bank.go b/internal/game/cmd_bank.go index 0785b81..d91e115 100644 --- a/internal/game/cmd_bank.go +++ b/internal/game/cmd_bank.go @@ -10,6 +10,10 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeBank(sess *net.Session, args []string, rawInput string) { + g.doBank(sess) +} + func (g *Game) handleBankInput(sess *net.Session, input string) { if sess.Player == nil { sess.State = net.StateGame diff --git a/internal/game/cmd_clean.go b/internal/game/cmd_clean.go index 1f00d75..47896bb 100644 --- a/internal/game/cmd_clean.go +++ b/internal/game/cmd_clean.go @@ -11,6 +11,10 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeClean(sess *net.Session, args []string, rawInput string) { + g.doClean(sess, strings.Join(args, " ")) +} + func (g *Game) doClean(sess *net.Session, input string) { p := sess.Player diff --git a/internal/game/cmd_color.go b/internal/game/cmd_color.go index 3fb7716..257c965 100644 --- a/internal/game/cmd_color.go +++ b/internal/game/cmd_color.go @@ -128,6 +128,10 @@ func (g *Game) colorSource(sess *net.Session, category string) string { return "builtin" } +func (g *Game) executeColor(sess *net.Session, args []string, rawInput string) { + g.doColor(sess, strings.Join(args, " ")) +} + var colorCategoryOrder = []string{ "room_name", "room_number", diff --git a/internal/game/cmd_colortable.go b/internal/game/cmd_colortable.go index 5aa36d9..86299dc 100644 --- a/internal/game/cmd_colortable.go +++ b/internal/game/cmd_colortable.go @@ -37,6 +37,10 @@ func (g *Game) doColortable(sess *net.Session) { writeANSITable(sess, mode) } +func (g *Game) executeColortable(sess *net.Session, args []string, rawInput string) { + g.doColortable(sess) +} + func writeSectionHeader(sess *net.Session, title string, unicode bool) { if unicode { sess.WriteLine(fmt.Sprintf("── %s ──", title)) diff --git a/internal/game/cmd_consume.go b/internal/game/cmd_consume.go new file mode 100644 index 0000000..0a7d335 --- /dev/null +++ b/internal/game/cmd_consume.go @@ -0,0 +1,293 @@ +package game + +import ( + "fmt" + "strings" + "time" + + "thehouseoficarus/internal/engine" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/object" + "thehouseoficarus/internal/player" +) + +func (g *Game) executeEat(sess *net.Session, args []string, rawInput string) { + g.doEat(sess, strings.Join(args, " ")) +} + +func (g *Game) executeDrink(sess *net.Session, args []string, rawInput string) { + g.doDrink(sess, args) +} + +func (g *Game) doEat(sess *net.Session, input string) { + p := sess.Player + + if input == "" { + sess.WriteLine("Eat what?") + return + } + + qty, itemName := parseQty(input) + _ = qty + + matches := g.findInventoryMatches(itemName, p) + if len(matches) == 0 { + sess.WriteLine(fmt.Sprintf("You don't have any '%s'.", itemName)) + return + } + + unique := uniqueItemNames(matches) + if len(unique) > 1 { + g.showWhichOne(sess, matches) + return + } + + itemID := matches[0].ID + def, _ := g.ItemStore.Load(itemID) + + if def == nil || def.EatMessage == "" { + sess.WriteLine("You can't eat that.") + return + } + + if p.ConsumeCooldown > 0 { + sess.WriteLine("You're still digesting your last meal.") + return + } + + g.cancelRest(p.Name) + + if p.Action == nil && len(p.WalkSequence) == 0 { + g.doEatNow(sess, p, itemID, def) + return + } + + g.cancelAction(p) + + g.consumeQueue[p.Name] = &QueuedCommand{ + Session: sess, + Command: "eat", + Args: itemID, + Timestamp: time.Now(), + } + + if !p.OptionBool("queue_silently") { + sess.WriteLine(fmt.Sprintf("\nYou prepare to eat %s.", g.itemColorize(sess, def, def.Name))) + } +} + +func (g *Game) doEatNow(sess *net.Session, p *player.Player, itemID string, def *object.ItemDef) { + if def == nil { + var err error + def, err = g.ItemStore.Load(itemID) + if err != nil || def.EatMessage == "" { + return + } + } + + p.RemoveItem(itemID, 1) + + p.HP += def.HealValue + maxHP := p.MaxHP() + if p.HP > maxHP { + p.HP = maxHP + } + if p.HP < 0 { + p.HP = 0 + } + + if def.HealValue != 0 { + p.StartRegen() + } + + p.ConsumeCooldown = 3 + g.AccountStore.SaveCharacter(p) + + p.ActionState = &ActionState{Type: ActionEating, TargetName: def.Name} + + sess.WriteLine(g.colorize(sess, "eat_food", def.EatMessage)) + + if p.HP <= 0 { + g.endCombat(sess, p, nil) + } +} + +func (g *Game) processConsumeQueue(p *player.Player, sess *net.Session) bool { + qc, ok := g.consumeQueue[p.Name] + if !ok { + return false + } + delete(g.consumeQueue, p.Name) + + itemID := qc.Args + def, err := g.ItemStore.Load(itemID) + + if qc.Command == "drink" { + if err != nil || (def.PotionEffect == "" && def.HealValue <= 0) { + return false + } + if p.ConsumeCooldown > 0 { + return false + } + if !p.HasItem(itemID) { + sess.WriteLine("You no longer have that to drink.") + return false + } + g.applyPotion(sess, p, itemID, def) + return true + } + + if err != nil || def.EatMessage == "" { + return false + } + + if p.ConsumeCooldown > 0 { + return false + } + + if !p.HasItem(itemID) { + sess.WriteLine("You no longer have that to eat.") + return false + } + + g.doEatNow(sess, p, itemID, def) + return true +} + +func (g *Game) doDrink(sess *net.Session, args []string) { + p := sess.Player + + if len(args) == 0 { + sess.WriteLine("Drink what?") + return + } + + input := strings.Join(args, " ") + matches := g.findInventoryMatches(input, p) + if len(matches) == 0 { + sess.WriteLine(fmt.Sprintf("You don't have any '%s'.", input)) + return + } + + unique := uniqueItemNames(matches) + if len(unique) > 1 { + g.showWhichOne(sess, matches) + return + } + + itemID := matches[0].ID + def, _ := g.ItemStore.Load(itemID) + + if def == nil { + sess.WriteLine("Something went wrong.") + return + } + + if def.PotionEffect == "" && def.HealValue <= 0 { + sess.WriteLine(fmt.Sprintf("You can't drink the %s.", g.itemColorize(sess, def, def.Name))) + return + } + + if p.ConsumeCooldown > 0 { + sess.WriteLine("You're still recovering from your last drink.") + return + } + + g.cancelRest(p.Name) + + if p.Action == nil && len(p.WalkSequence) == 0 { + g.applyPotion(sess, p, itemID, def) + return + } + + g.cancelAction(p) + + g.consumeQueue[p.Name] = &QueuedCommand{ + Session: sess, + Command: "drink", + Args: itemID, + Timestamp: time.Now(), + } + + if !p.OptionBool("queue_silently") { + sess.WriteLine(fmt.Sprintf("\nYou prepare to drink the %s.", g.itemColorize(sess, def, def.Name))) + } +} + +func (g *Game) applyPotion(sess *net.Session, p *player.Player, itemID string, def *object.ItemDef) { + if def == nil { + var err error + def, err = g.ItemStore.Load(itemID) + if err != nil || (def.PotionEffect == "" && def.HealValue <= 0) { + return + } + } + + p.RemoveItem(itemID, 1) + + effect := strings.ToLower(def.PotionEffect) + + switch effect { + case "battery": + batteryRestore := def.PotionBonus + p.Battery += float64(batteryRestore) + if p.Battery > 100 { + p.Battery = 100 + } + sess.WriteLine(fmt.Sprintf("\nYou drink the %s. Your battery is restored by %d%%.", + g.itemColorize(sess, def, def.Name), batteryRestore)) + + case "heal", "": + healAmount := def.PotionBonus + if healAmount <= 0 { + healAmount = def.HealValue + } + if healAmount <= 0 { + healAmount = 50 + } + before := p.HP + maxHP := p.Level(player.Hitpoints) + if p.HP+healAmount > maxHP { + p.HP = maxHP + } else { + p.HP += healAmount + } + actualHeal := p.HP - before + sess.WriteLine(fmt.Sprintf("\nYou drink the %s. You restore %d hitpoints.", + g.itemColorize(sess, def, def.Name), actualHeal)) + + case "all_combat": + duration := engine.ToTicks(def.PotionDuration) + buffs := []string{"attack", "strength", "defense"} + for _, stat := range buffs { + p.ActiveBuffs = append(p.ActiveBuffs, player.PotionBuff{ + Stat: stat, + BonusPercent: def.PotionBonus, + TicksLeft: duration, + }) + } + sess.WriteLine(fmt.Sprintf("\nYou drink the %s. Your combat stats are boosted by %d%% for %d ticks.", + g.itemColorize(sess, def, def.Name), def.PotionBonus, duration)) + + default: + duration := engine.ToTicks(def.PotionDuration) + p.ActiveBuffs = append(p.ActiveBuffs, player.PotionBuff{ + Stat: effect, + BonusPercent: def.PotionBonus, + TicksLeft: duration, + }) + sess.WriteLine(fmt.Sprintf("\nYou drink the %s. Your %s is boosted by %d%% for %d ticks.", + g.itemColorize(sess, def, def.Name), effect, def.PotionBonus, duration)) + } + + p.ConsumeCooldown = 3 + p.ActionState = &ActionState{Type: ActionEating} + + if g.Hub != nil { + for _, other := range g.Hub.PlayersInRoom(p.RoomID) { + if other != sess && other.Player != nil { + other.WriteLine(g.colorize(other, "broadcast", fmt.Sprintf("\n%s drinks a %s.", p.Name, def.Name))) + } + } + } +} diff --git a/internal/game/cmd_cook.go b/internal/game/cmd_cook.go index 5b78745..288afb0 100644 --- a/internal/game/cmd_cook.go +++ b/internal/game/cmd_cook.go @@ -2,12 +2,17 @@ package game import ( "fmt" + "strings" "thehouseoficarus/internal/action" "thehouseoficarus/internal/net" "thehouseoficarus/internal/player" ) +func (g *Game) executeCook(sess *net.Session, args []string, rawInput string) { + g.doCook(sess, strings.Join(args, " ")) +} + func (g *Game) doCook(sess *net.Session, input string) { p := sess.Player g.cancelAction(p) diff --git a/internal/game/cmd_craft.go b/internal/game/cmd_craft.go index 7f8808b..447d980 100644 --- a/internal/game/cmd_craft.go +++ b/internal/game/cmd_craft.go @@ -8,6 +8,14 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeCraft(sess *net.Session, args []string, rawInput string) { + g.doCraft(sess, strings.Join(args, " ")) +} + +func (g *Game) executeConstruct(sess *net.Session, args []string, rawInput string) { + g.doConstruct(sess, strings.Join(args, " ")) +} + func (g *Game) doCraft(sess *net.Session, input string) { g.doGenericStationSkill(sess, input, "crafting", player.Crafting, "last_craft", "Crafting", "craft", "Craft") } diff --git a/internal/game/cmd_description.go b/internal/game/cmd_description.go index ced5dcc..5d0c5c1 100644 --- a/internal/game/cmd_description.go +++ b/internal/game/cmd_description.go @@ -6,6 +6,10 @@ import ( "thehouseoficarus/internal/net" ) +func (g *Game) executeDescription(sess *net.Session, args []string, rawInput string) { + g.doDescription(sess) +} + func (g *Game) doDescription(sess *net.Session) { p := sess.Player sess.WriteLine("") diff --git a/internal/game/cmd_drink.go b/internal/game/cmd_drink.go deleted file mode 100644 index 44ef991..0000000 --- a/internal/game/cmd_drink.go +++ /dev/null @@ -1,150 +0,0 @@ -package game - -import ( - "fmt" - "strings" - "time" - - "thehouseoficarus/internal/engine" - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/object" - "thehouseoficarus/internal/player" -) - -func (g *Game) doDrink(sess *net.Session, args []string) { - p := sess.Player - - if len(args) == 0 { - sess.WriteLine("Drink what?") - return - } - - input := strings.Join(args, " ") - matches := g.findInventoryMatches(input, p) - if len(matches) == 0 { - sess.WriteLine(fmt.Sprintf("You don't have any '%s'.", input)) - return - } - - unique := uniqueItemNames(matches) - if len(unique) > 1 { - g.showWhichOne(sess, matches) - return - } - - itemID := matches[0].ID - def, _ := g.ItemStore.Load(itemID) - - if def == nil { - sess.WriteLine("Something went wrong.") - return - } - - if def.PotionEffect == "" && def.HealValue <= 0 { - sess.WriteLine(fmt.Sprintf("You can't drink the %s.", g.itemColorize(sess, def, def.Name))) - return - } - - if p.ConsumeCooldown > 0 { - sess.WriteLine("You're still recovering from your last drink.") - return - } - - g.cancelRest(p.Name) - - if p.Action == nil && len(p.WalkSequence) == 0 { - g.applyPotion(sess, p, itemID, def) - return - } - - g.cancelAction(p) - - g.consumeQueue[p.Name] = &QueuedCommand{ - Session: sess, - Command: "drink", - Args: itemID, - Timestamp: time.Now(), - } - - if !p.OptionBool("queue_silently") { - sess.WriteLine(fmt.Sprintf("\nYou prepare to drink the %s.", g.itemColorize(sess, def, def.Name))) - } -} - -func (g *Game) applyPotion(sess *net.Session, p *player.Player, itemID string, def *object.ItemDef) { - if def == nil { - var err error - def, err = g.ItemStore.Load(itemID) - if err != nil || (def.PotionEffect == "" && def.HealValue <= 0) { - return - } - } - - p.RemoveItem(itemID, 1) - - effect := strings.ToLower(def.PotionEffect) - - switch effect { - case "battery": - batteryRestore := def.PotionBonus - p.Battery += float64(batteryRestore) - if p.Battery > 100 { - p.Battery = 100 - } - sess.WriteLine(fmt.Sprintf("\nYou drink the %s. Your battery is restored by %d%%.", - g.itemColorize(sess, def, def.Name), batteryRestore)) - - case "heal", "": - healAmount := def.PotionBonus - if healAmount <= 0 { - healAmount = def.HealValue - } - if healAmount <= 0 { - healAmount = 50 - } - before := p.HP - maxHP := p.Level(player.Hitpoints) - if p.HP+healAmount > maxHP { - p.HP = maxHP - } else { - p.HP += healAmount - } - actualHeal := p.HP - before - sess.WriteLine(fmt.Sprintf("\nYou drink the %s. You restore %d hitpoints.", - g.itemColorize(sess, def, def.Name), actualHeal)) - - case "all_combat": - duration := engine.ToTicks(def.PotionDuration) - buffs := []string{"attack", "strength", "defense"} - for _, stat := range buffs { - p.ActiveBuffs = append(p.ActiveBuffs, player.PotionBuff{ - Stat: stat, - BonusPercent: def.PotionBonus, - TicksLeft: duration, - }) - } - sess.WriteLine(fmt.Sprintf("\nYou drink the %s. Your combat stats are boosted by %d%% for %d ticks.", - g.itemColorize(sess, def, def.Name), def.PotionBonus, duration)) - - default: - duration := engine.ToTicks(def.PotionDuration) - p.ActiveBuffs = append(p.ActiveBuffs, player.PotionBuff{ - Stat: effect, - BonusPercent: def.PotionBonus, - TicksLeft: duration, - }) - sess.WriteLine(fmt.Sprintf("\nYou drink the %s. Your %s is boosted by %d%% for %d ticks.", - g.itemColorize(sess, def, def.Name), effect, def.PotionBonus, duration)) - } - - p.ConsumeCooldown = 3 - p.ActionState = &ActionState{Type: ActionEating} - - if g.Hub != nil { - for _, other := range g.Hub.PlayersInRoom(p.RoomID) { - if other != sess && other.Player != nil { - other.WriteLine(g.colorize(other, "broadcast", fmt.Sprintf("\n%s drinks a %s.", p.Name, def.Name))) - } - } - } -} diff --git a/internal/game/cmd_drop.go b/internal/game/cmd_drop.go index d3141e3..551b014 100644 --- a/internal/game/cmd_drop.go +++ b/internal/game/cmd_drop.go @@ -180,6 +180,20 @@ func (g *Game) doDrop(sess *net.Session, input string) { } } +func (g *Game) executeDrop(sess *net.Session, args []string, rawInput string) { + if len(args) == 0 { + sess.WriteLine("Drop what?") + } else if args[0] == "all" { + if len(args) == 1 { + g.doDropAll(sess) + } else { + g.doDropAllNamed(sess, strings.Join(args[1:], " ")) + } + } else { + g.doDrop(sess, strings.Join(args, " ")) + } +} + func (g *Game) handleDropAllConfirm(sess *net.Session, input string) { p := sess.Player if p == nil { diff --git a/internal/game/cmd_eat.go b/internal/game/cmd_eat.go deleted file mode 100644 index f94ade3..0000000 --- a/internal/game/cmd_eat.go +++ /dev/null @@ -1,145 +0,0 @@ -package game - -import ( - "fmt" - "time" - - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/object" - "thehouseoficarus/internal/player" -) - -func (g *Game) doEat(sess *net.Session, input string) { - p := sess.Player - - if input == "" { - sess.WriteLine("Eat what?") - return - } - - qty, itemName := parseQty(input) - _ = qty - - matches := g.findInventoryMatches(itemName, p) - if len(matches) == 0 { - sess.WriteLine(fmt.Sprintf("You don't have any '%s'.", itemName)) - return - } - - unique := uniqueItemNames(matches) - if len(unique) > 1 { - g.showWhichOne(sess, matches) - return - } - - itemID := matches[0].ID - def, _ := g.ItemStore.Load(itemID) - - if def == nil || def.EatMessage == "" { - sess.WriteLine("You can't eat that.") - return - } - - if p.ConsumeCooldown > 0 { - sess.WriteLine("You're still digesting your last meal.") - return - } - - g.cancelRest(p.Name) - - if p.Action == nil && len(p.WalkSequence) == 0 { - g.doEatNow(sess, p, itemID, def) - return - } - - g.cancelAction(p) - - g.consumeQueue[p.Name] = &QueuedCommand{ - Session: sess, - Command: "eat", - Args: itemID, - Timestamp: time.Now(), - } - - if !p.OptionBool("queue_silently") { - sess.WriteLine(fmt.Sprintf("\nYou prepare to eat %s.", g.itemColorize(sess, def, def.Name))) - } -} - -func (g *Game) doEatNow(sess *net.Session, p *player.Player, itemID string, def *object.ItemDef) { - if def == nil { - var err error - def, err = g.ItemStore.Load(itemID) - if err != nil || def.EatMessage == "" { - return - } - } - - p.RemoveItem(itemID, 1) - - p.HP += def.HealValue - maxHP := p.MaxHP() - if p.HP > maxHP { - p.HP = maxHP - } - if p.HP < 0 { - p.HP = 0 - } - - if def.HealValue != 0 { - p.StartRegen() - } - - p.ConsumeCooldown = 3 - g.AccountStore.SaveCharacter(p) - - p.ActionState = &ActionState{Type: ActionEating, TargetName: def.Name} - - sess.WriteLine(g.colorize(sess, "eat_food", def.EatMessage)) - - if p.HP <= 0 { - g.endCombat(sess, p, nil) - } -} - -func (g *Game) processConsumeQueue(p *player.Player, sess *net.Session) bool { - qc, ok := g.consumeQueue[p.Name] - if !ok { - return false - } - delete(g.consumeQueue, p.Name) - - itemID := qc.Args - def, err := g.ItemStore.Load(itemID) - - if qc.Command == "drink" { - if err != nil || (def.PotionEffect == "" && def.HealValue <= 0) { - return false - } - if p.ConsumeCooldown > 0 { - return false - } - if !p.HasItem(itemID) { - sess.WriteLine("You no longer have that to drink.") - return false - } - g.applyPotion(sess, p, itemID, def) - return true - } - - if err != nil || def.EatMessage == "" { - return false - } - - if p.ConsumeCooldown > 0 { - return false - } - - if !p.HasItem(itemID) { - sess.WriteLine("You no longer have that to eat.") - return false - } - - g.doEatNow(sess, p, itemID, def) - return true -} diff --git a/internal/game/cmd_estate_directory.go b/internal/game/cmd_estate_directory.go index c79135f..dbc79f6 100644 --- a/internal/game/cmd_estate_directory.go +++ b/internal/game/cmd_estate_directory.go @@ -186,7 +186,7 @@ func (g *Game) getOwnedHouseRoom(p *player.Player, flagKey string) int { } houseMap := map[string]int{ - "local_neighborhood": 200, + "local_neighborhood": 300, } return houseMap[v] } diff --git a/internal/game/cmd_farm.go b/internal/game/cmd_farm.go index 5ef36d9..791cb6d 100644 --- a/internal/game/cmd_farm.go +++ b/internal/game/cmd_farm.go @@ -9,6 +9,64 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executePlant(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + if len(args) == 0 { + sess.WriteLine("Plant what?") + } else { + g.doPlant(sess, strings.Join(args, " ")) + } +} + +func (g *Game) executeHarvest(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + if len(args) == 0 { + g.doHarvest(sess, "") + } else { + g.doHarvest(sess, strings.Join(args, " ")) + } +} + +func (g *Game) executeRake(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + if len(args) == 0 { + g.doRake(sess, "") + } else { + g.doRake(sess, strings.Join(args, " ")) + } +} + +func (g *Game) executeWater(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + if len(args) == 0 { + g.doWater(sess, "") + } else { + g.doWater(sess, strings.Join(args, " ")) + } +} + +func (g *Game) executeCure(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + if len(args) == 0 { + g.doCure(sess, "") + } else { + g.doCure(sess, strings.Join(args, " ")) + } +} + +func (g *Game) executeInspect(sess *net.Session, args []string, rawInput string) { + if len(args) == 0 { + g.doInspect(sess, "") + } else { + g.doInspect(sess, strings.Join(args, " ")) + } +} + func (g *Game) doPlant(sess *net.Session, input string) { p := sess.Player diff --git a/internal/game/cmd_fletch.go b/internal/game/cmd_fletch.go index 1f6a075..e218dca 100644 --- a/internal/game/cmd_fletch.go +++ b/internal/game/cmd_fletch.go @@ -9,6 +9,10 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeFletch(sess *net.Session, args []string, rawInput string) { + g.doFletch(sess, strings.Join(args, " ")) +} + var fletchLogItems = map[string]bool{ "logs": true, "oak_logs": true, "willow_logs": true, "maple_logs": true, "yew_logs": true, "magic_logs": true, diff --git a/internal/game/cmd_get.go b/internal/game/cmd_get.go index bae721b..f3485fe 100644 --- a/internal/game/cmd_get.go +++ b/internal/game/cmd_get.go @@ -2,6 +2,7 @@ package game import ( "fmt" + "strings" "thehouseoficarus/internal/net" "thehouseoficarus/internal/player" @@ -419,3 +420,17 @@ func (g *Game) findInventoryMatches(input string, p *player.Player) []itemMatch } }) } + +func (g *Game) executeGet(sess *net.Session, args []string, rawInput string) { + if len(args) == 0 { + sess.WriteLine("Get what?") + } else if args[0] == "all" { + if len(args) == 1 { + g.doGetAll(sess) + } else { + g.doGetAllNamed(sess, strings.Join(args[1:], " ")) + } + } else { + g.doGet(sess, strings.Join(args, " ")) + } +} diff --git a/internal/game/cmd_handlers.go b/internal/game/cmd_handlers.go deleted file mode 100644 index b8db359..0000000 --- a/internal/game/cmd_handlers.go +++ /dev/null @@ -1,370 +0,0 @@ -package game - -import ( - "fmt" - "strings" - - "thehouseoficarus/internal/net" -) - -func (g *Game) executeGet(sess *net.Session, args []string, rawInput string) { - if len(args) == 0 { - sess.WriteLine("Get what?") - } else if args[0] == "all" { - if len(args) == 1 { - g.doGetAll(sess) - } else { - g.doGetAllNamed(sess, strings.Join(args[1:], " ")) - } - } else { - g.doGet(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeDrop(sess *net.Session, args []string, rawInput string) { - if len(args) == 0 { - sess.WriteLine("Drop what?") - } else if args[0] == "all" { - if len(args) == 1 { - g.doDropAll(sess) - } else { - g.doDropAllNamed(sess, strings.Join(args[1:], " ")) - } - } else { - g.doDrop(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeAttack(sess *net.Session, args []string, rawInput string) { - if len(args) == 0 { - p := sess.Player - target := g.resolveDefaultMob(p.RoomID) - if target == "" { - sess.WriteLine("Attack what?") - return - } - g.doAttack(sess, target) - } else { - g.doAttack(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeStyle(sess *net.Session, args []string, rawInput string) { - if len(args) == 0 { - g.doStyle(sess, "") - } else { - g.doStyle(sess, args[0]) - } -} - -func (g *Game) executeLook(sess *net.Session, args []string, rawInput string) { - if len(args) == 0 { - g.doLook(sess) - } else { - g.doLookTarget(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeMove(sess *net.Session, args []string, rawInput string) { - g.doMove(sess, strings.TrimSpace(rawInput), 1.0) -} - -func (g *Game) executeSay(sess *net.Session, args []string, rawInput string) { - if len(args) == 0 { - sess.WriteLine("Say what?") - } else { - msgStart := strings.Index(strings.ToLower(rawInput), "say ") + 4 - if msgStart >= 4 && msgStart < len(rawInput) { - g.doSay(sess, rawInput[msgStart:]) - } else { - g.doSay(sess, strings.Join(args, " ")) - } - } -} - -func (g *Game) executeScore(sess *net.Session, args []string, rawInput string) { - g.doScore(sess) -} - -func (g *Game) executeTask(sess *net.Session, args []string, rawInput string) { - g.doTask(sess) -} - -func (g *Game) executeStats(sess *net.Session, args []string, rawInput string) { - g.doStats(sess) -} - -func (g *Game) executeTech(sess *net.Session, args []string, rawInput string) { - g.doTech(sess, strings.Join(args, " ")) -} - -func (g *Game) executeInventory(sess *net.Session, args []string, rawInput string) { - g.doInventory(sess) -} - -func (g *Game) executeQuit(sess *net.Session, args []string, rawInput string) { - g.doQuit(sess) -} - -func (g *Game) executeDescription(sess *net.Session, args []string, rawInput string) { - g.doDescription(sess) -} - -func (g *Game) executeOption(sess *net.Session, args []string, rawInput string) { - g.doOption(sess, strings.Join(args, " ")) -} - -func (g *Game) executeColor(sess *net.Session, args []string, rawInput string) { - g.doColor(sess, strings.Join(args, " ")) -} - -func (g *Game) executeColortable(sess *net.Session, args []string, rawInput string) { - g.doColortable(sess) -} - -func (g *Game) executePrompt(sess *net.Session, args []string, rawInput string) { - if len(args) == 0 { - g.doPrompt(sess, "") - } else { - msgStart := strings.Index(strings.ToLower(rawInput), "prompt ") + 7 - if msgStart >= 7 && msgStart < len(rawInput) { - g.doPrompt(sess, rawInput[msgStart:]) - } else { - g.doPrompt(sess, strings.Join(args, " ")) - } - } -} - -func (g *Game) executeExits(sess *net.Session, args []string, rawInput string) { - g.doExits(sess) -} - -func (g *Game) executeMap(sess *net.Session, args []string, rawInput string) { - g.doMap(sess) -} - -func (g *Game) executeQueued(sess *net.Session, args []string, rawInput string) { - g.doQueued(sess) -} - -func (g *Game) executeHelp(sess *net.Session, args []string, rawInput string) { - if len(args) == 0 { - g.doHelp(sess, "") - } else { - g.doHelp(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeGather(sess *net.Session, args []string, rawInput string) { - verb := strings.TrimSpace(rawInput) - p := sess.Player - g.cancelAction(p) - if len(args) == 0 { - target := g.resolveDefaultTarget(p.RoomID, verb) - if target == "" { - sess.WriteLine(fmt.Sprintf("%s what?", verb)) - return - } - g.startAction(sess, verb, target) - } else { - g.startAction(sess, verb, strings.Join(args, " ")) - } -} - -func (g *Game) executeUse(sess *net.Session, args []string, rawInput string) { - if g.tryFinishingBlow(sess, strings.Join(args, " ")) { - return - } - g.doUse(sess, strings.Join(args, " ")) -} - -func (g *Game) executeCook(sess *net.Session, args []string, rawInput string) { - g.doCook(sess, strings.Join(args, " ")) -} - -func (g *Game) executeSmelt(sess *net.Session, args []string, rawInput string) { - g.doSmelt(sess, strings.Join(args, " ")) -} - -func (g *Game) executeSmith(sess *net.Session, args []string, rawInput string) { - g.doSmith(sess, strings.Join(args, " ")) -} - -func (g *Game) executeCraft(sess *net.Session, args []string, rawInput string) { - g.doCraft(sess, strings.Join(args, " ")) -} - -func (g *Game) executeEat(sess *net.Session, args []string, rawInput string) { - g.doEat(sess, strings.Join(args, " ")) -} - -func (g *Game) executeDrink(sess *net.Session, args []string, rawInput string) { - g.doDrink(sess, args) -} - -func (g *Game) executeFletch(sess *net.Session, args []string, rawInput string) { - g.doFletch(sess, strings.Join(args, " ")) -} - -func (g *Game) executeClean(sess *net.Session, args []string, rawInput string) { - g.doClean(sess, strings.Join(args, " ")) -} - -func (g *Game) executeMix(sess *net.Session, args []string, rawInput string) { - g.doMix(sess, strings.Join(args, " ")) -} - -func (g *Game) executeIdentify(sess *net.Session, args []string, rawInput string) { - g.doIdentify(sess, strings.Join(args, " ")) -} - -func (g *Game) executeAutotrigger(sess *net.Session, args []string, rawInput string) { - g.doAutotrigger(sess, strings.Join(args, " ")) -} - -func (g *Game) executeMods(sess *net.Session, args []string, rawInput string) { - showAll := len(args) > 0 && args[0] == "all" - g.doMods(sess, showAll) -} - -func (g *Game) executeSneak(sess *net.Session, args []string, rawInput string) { - g.doSneak(sess) -} - -func (g *Game) executeTrigger(sess *net.Session, args []string, rawInput string) { - g.doTrigger(sess, strings.Join(args, " ")) -} - -func (g *Game) executeTalk(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - if len(args) == 0 { - sess.WriteLine("Talk to whom?") - } else { - g.startAction(sess, "talk", strings.Join(args, " ")) - } -} - -func (g *Game) executeBurn(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - g.doBurn(sess, p, strings.Join(args, " ")) -} - -func (g *Game) executeStoke(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - g.doStoke(sess, p, strings.Join(args, " ")) -} - -func (g *Game) executeAlias(sess *net.Session, args []string, rawInput string) { - g.doAlias(sess, args) -} - -func (g *Game) executeUnalias(sess *net.Session, args []string, rawInput string) { - g.doUnalias(sess, args) -} - -func (g *Game) executeSearch(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - if len(args) == 0 { - sess.WriteLine("Search what?") - } else { - g.doSearch(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeSteal(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - if len(args) == 0 { - g.doSteal(sess, "") - } else { - g.doSteal(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executePlant(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - if len(args) == 0 { - sess.WriteLine("Plant what?") - } else { - g.doPlant(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeHarvest(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - if len(args) == 0 { - g.doHarvest(sess, "") - } else { - g.doHarvest(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeRake(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - if len(args) == 0 { - g.doRake(sess, "") - } else { - g.doRake(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeWater(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - if len(args) == 0 { - g.doWater(sess, "") - } else { - g.doWater(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeCure(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - if len(args) == 0 { - g.doCure(sess, "") - } else { - g.doCure(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeInspect(sess *net.Session, args []string, rawInput string) { - if len(args) == 0 { - g.doInspect(sess, "") - } else { - g.doInspect(sess, strings.Join(args, " ")) - } -} - -func (g *Game) executeWalk(sess *net.Session, args []string, rawInput string) { - g.doWalk(sess, args) -} - -func (g *Game) executeBank(sess *net.Session, args []string, rawInput string) { - g.doBank(sess) -} - -func (g *Game) executeConstruct(sess *net.Session, args []string, rawInput string) { - g.doConstruct(sess, strings.Join(args, " ")) -} - -func (g *Game) executeJack(sess *net.Session, args []string, rawInput string) { - p := sess.Player - g.cancelAction(p) - g.doJack(sess, strings.Join(args, " ")) -} - -func (g *Game) executeWear(sess *net.Session, args []string, rawInput string) { - g.doWear(sess, strings.Join(args, " ")) -} - -func (g *Game) executeRemove(sess *net.Session, args []string, rawInput string) { - g.doRemove(sess, strings.Join(args, " ")) -} diff --git a/internal/game/cmd_id.go b/internal/game/cmd_id.go index f7158e9..cb886dc 100644 --- a/internal/game/cmd_id.go +++ b/internal/game/cmd_id.go @@ -2,6 +2,7 @@ package game import ( "fmt" + "strings" "thehouseoficarus/internal/action" "thehouseoficarus/internal/net" @@ -81,6 +82,10 @@ func junkMultiplier(junkID string, level int) int { return mult } +func (g *Game) executeIdentify(sess *net.Session, args []string, rawInput string) { + g.doIdentify(sess, strings.Join(args, " ")) +} + func (g *Game) doIdentify(sess *net.Session, input string) { p := sess.Player g.cancelAction(p) diff --git a/internal/game/cmd_inventory.go b/internal/game/cmd_inventory.go index ae7b328..5024642 100644 --- a/internal/game/cmd_inventory.go +++ b/internal/game/cmd_inventory.go @@ -6,6 +6,10 @@ import ( "thehouseoficarus/internal/net" ) +func (g *Game) executeInventory(sess *net.Session, args []string, rawInput string) { + g.doInventory(sess) +} + func (g *Game) doInventory(sess *net.Session) { p := sess.Player sess.WriteLine("") diff --git a/internal/game/cmd_jack.go b/internal/game/cmd_jack.go index 8cb5062..16f8b2a 100644 --- a/internal/game/cmd_jack.go +++ b/internal/game/cmd_jack.go @@ -10,6 +10,12 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeJack(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + g.doJack(sess, strings.Join(args, " ")) +} + func (g *Game) doJack(sess *net.Session, target string) { p := sess.Player diff --git a/internal/game/cmd_look.go b/internal/game/cmd_look.go index 5fa2cf4..6913333 100644 --- a/internal/game/cmd_look.go +++ b/internal/game/cmd_look.go @@ -768,6 +768,18 @@ func (g *Game) writeLookSideBySide(sess *net.Session, p *player.Player, descLine } } +func (g *Game) executeLook(sess *net.Session, args []string, rawInput string) { + if len(args) == 0 { + g.doLook(sess) + } else { + g.doLookTarget(sess, strings.Join(args, " ")) + } +} + +func (g *Game) executeExits(sess *net.Session, args []string, rawInput string) { + g.doExits(sess) +} + func (g *Game) showItemStats(sess *net.Session, def *object.ItemDef) { s := def.Stats hasAttack := s.StabAttack != 0 || s.SlashAttack != 0 || s.CrushAttack != 0 || diff --git a/internal/game/cmd_map.go b/internal/game/cmd_map.go index 7cad008..be35a66 100644 --- a/internal/game/cmd_map.go +++ b/internal/game/cmd_map.go @@ -4,6 +4,10 @@ import ( "thehouseoficarus/internal/net" ) +func (g *Game) executeMap(sess *net.Session, args []string, rawInput string) { + g.doMap(sess) +} + func (g *Game) doMap(sess *net.Session) { p := sess.Player mapWidth := p.OptionInt("mapwidth") diff --git a/internal/game/cmd_mix.go b/internal/game/cmd_mix.go index 8fc600b..7bf1f7b 100644 --- a/internal/game/cmd_mix.go +++ b/internal/game/cmd_mix.go @@ -1,11 +1,17 @@ package game import ( + "strings" + "thehouseoficarus/internal/action" "thehouseoficarus/internal/net" "thehouseoficarus/internal/player" ) +func (g *Game) executeMix(sess *net.Session, args []string, rawInput string) { + g.doMix(sess, strings.Join(args, " ")) +} + func (g *Game) doMix(sess *net.Session, input string) { p := sess.Player g.cancelAction(p) diff --git a/internal/game/cmd_mods.go b/internal/game/cmd_mods.go index 65d7ad7..438e11a 100644 --- a/internal/game/cmd_mods.go +++ b/internal/game/cmd_mods.go @@ -9,6 +9,11 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeMods(sess *net.Session, args []string, rawInput string) { + showAll := len(args) > 0 && args[0] == "all" + g.doMods(sess, showAll) +} + func (g *Game) doMods(sess *net.Session, showAll bool) { p := sess.Player sciLevel := p.Level(player.Science) diff --git a/internal/game/cmd_move.go b/internal/game/cmd_move.go index 5d6ea66..e93b14b 100644 --- a/internal/game/cmd_move.go +++ b/internal/game/cmd_move.go @@ -2,6 +2,7 @@ package game import ( "fmt" + "strings" "thehouseoficarus/internal/combat" "thehouseoficarus/internal/engine" @@ -165,6 +166,10 @@ func (g *Game) seedRoomMobs(roomID int) { g.MobStore.SeedMobs(roomID, room.Mobs) } +func (g *Game) executeMove(sess *net.Session, args []string, rawInput string) { + g.doMove(sess, strings.TrimSpace(rawInput), 1.0) +} + func (g *Game) seedRoomObjects(roomID int) { room, err := g.World.LoadRoom(roomID) if err != nil { diff --git a/internal/game/cmd_option.go b/internal/game/cmd_option.go index fdf5371..19256ba 100644 --- a/internal/game/cmd_option.go +++ b/internal/game/cmd_option.go @@ -85,6 +85,10 @@ func (g *Game) doOption(sess *net.Session, input string) { sess.WriteLine(fmt.Sprintf("\n%s set to %s.", def.Name, formatOptionValue(p, def))) } +func (g *Game) executeOption(sess *net.Session, args []string, rawInput string) { + g.doOption(sess, strings.Join(args, " ")) +} + func formatOptionValue(p *player.Player, def *player.OptionDef) string { switch def.Type { case player.OptBool: diff --git a/internal/game/cmd_prompt.go b/internal/game/cmd_prompt.go index 8850ea1..d91556a 100644 --- a/internal/game/cmd_prompt.go +++ b/internal/game/cmd_prompt.go @@ -2,10 +2,24 @@ package game import ( "fmt" + "strings" "thehouseoficarus/internal/net" ) +func (g *Game) executePrompt(sess *net.Session, args []string, rawInput string) { + if len(args) == 0 { + g.doPrompt(sess, "") + } else { + msgStart := strings.Index(strings.ToLower(rawInput), "prompt ") + 7 + if msgStart >= 7 && msgStart < len(rawInput) { + g.doPrompt(sess, rawInput[msgStart:]) + } else { + g.doPrompt(sess, strings.Join(args, " ")) + } + } +} + func (g *Game) doPrompt(sess *net.Session, input string) { p := sess.Player diff --git a/internal/game/cmd_queued.go b/internal/game/cmd_queued.go index fdb1643..58ac74b 100644 --- a/internal/game/cmd_queued.go +++ b/internal/game/cmd_queued.go @@ -7,6 +7,10 @@ import ( "thehouseoficarus/internal/net" ) +func (g *Game) executeQueued(sess *net.Session, args []string, rawInput string) { + g.doQueued(sess) +} + func (g *Game) doQueued(sess *net.Session) { p := sess.Player diff --git a/internal/game/cmd_quit.go b/internal/game/cmd_quit.go index d52c9ae..46403f4 100644 --- a/internal/game/cmd_quit.go +++ b/internal/game/cmd_quit.go @@ -8,6 +8,10 @@ import ( "thehouseoficarus/internal/net" ) +func (g *Game) executeQuit(sess *net.Session, args []string, rawInput string) { + g.doQuit(sess) +} + func (g *Game) doQuit(sess *net.Session) { p := sess.Player diff --git a/internal/game/cmd_registry.go b/internal/game/cmd_registry.go index e5bf30e..0439cc2 100644 --- a/internal/game/cmd_registry.go +++ b/internal/game/cmd_registry.go @@ -168,3 +168,29 @@ func (g *Game) executeCommand(sess *net.Session, cmd string, args []string, rawI sess.WriteLine("Unknown command.") } + +func (g *Game) executeGather(sess *net.Session, args []string, rawInput string) { + verb := strings.TrimSpace(rawInput) + p := sess.Player + g.cancelAction(p) + if len(args) == 0 { + target := g.resolveDefaultTarget(p.RoomID, verb) + if target == "" { + sess.WriteLine(fmt.Sprintf("%s what?", verb)) + return + } + g.startAction(sess, verb, target) + } else { + g.startAction(sess, verb, strings.Join(args, " ")) + } +} + +func (g *Game) executeTalk(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + if len(args) == 0 { + sess.WriteLine("Talk to whom?") + } else { + g.startAction(sess, "talk", strings.Join(args, " ")) + } +} diff --git a/internal/game/cmd_remove.go b/internal/game/cmd_remove.go index e168fd9..c046537 100644 --- a/internal/game/cmd_remove.go +++ b/internal/game/cmd_remove.go @@ -9,6 +9,10 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeRemove(sess *net.Session, args []string, rawInput string) { + g.doRemove(sess, strings.Join(args, " ")) +} + func (g *Game) doRemove(sess *net.Session, input string) { p := sess.Player diff --git a/internal/game/cmd_say.go b/internal/game/cmd_say.go index 3d619a0..f21ed88 100644 --- a/internal/game/cmd_say.go +++ b/internal/game/cmd_say.go @@ -2,10 +2,24 @@ package game import ( "fmt" + "strings" "thehouseoficarus/internal/net" ) +func (g *Game) executeSay(sess *net.Session, args []string, rawInput string) { + if len(args) == 0 { + sess.WriteLine("Say what?") + } else { + msgStart := strings.Index(strings.ToLower(rawInput), "say ") + 4 + if msgStart >= 4 && msgStart < len(rawInput) { + g.doSay(sess, rawInput[msgStart:]) + } else { + g.doSay(sess, strings.Join(args, " ")) + } + } +} + func (g *Game) doSay(sess *net.Session, msg string) { p := sess.Player roomID := p.RoomID diff --git a/internal/game/cmd_score.go b/internal/game/cmd_score.go index 0b0caf2..b49fd7f 100644 --- a/internal/game/cmd_score.go +++ b/internal/game/cmd_score.go @@ -9,6 +9,10 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeScore(sess *net.Session, args []string, rawInput string) { + g.doScore(sess) +} + func (g *Game) doScore(sess *net.Session) { p := sess.Player mode := g.colorMode(sess) diff --git a/internal/game/cmd_search.go b/internal/game/cmd_search.go index cc22d49..4122e0a 100644 --- a/internal/game/cmd_search.go +++ b/internal/game/cmd_search.go @@ -7,6 +7,16 @@ import ( "thehouseoficarus/internal/net" ) +func (g *Game) executeSearch(sess *net.Session, args []string, rawInput string) { + p := sess.Player + g.cancelAction(p) + if len(args) == 0 { + sess.WriteLine("Search what?") + } else { + g.doSearch(sess, strings.Join(args, " ")) + } +} + func (g *Game) doSearch(sess *net.Session, input string) { p := sess.Player g.cancelAction(p) diff --git a/internal/game/cmd_smelt.go b/internal/game/cmd_smelt.go index 53ff426..a72cf53 100644 --- a/internal/game/cmd_smelt.go +++ b/internal/game/cmd_smelt.go @@ -2,12 +2,17 @@ package game import ( "fmt" + "strings" "thehouseoficarus/internal/action" "thehouseoficarus/internal/net" "thehouseoficarus/internal/player" ) +func (g *Game) executeSmelt(sess *net.Session, args []string, rawInput string) { + g.doSmelt(sess, strings.Join(args, " ")) +} + func (g *Game) doSmelt(sess *net.Session, input string) { p := sess.Player g.cancelAction(p) diff --git a/internal/game/cmd_smith.go b/internal/game/cmd_smith.go index 067d251..a2eaad7 100644 --- a/internal/game/cmd_smith.go +++ b/internal/game/cmd_smith.go @@ -10,6 +10,10 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeSmith(sess *net.Session, args []string, rawInput string) { + g.doSmith(sess, strings.Join(args, " ")) +} + func (g *Game) doSmith(sess *net.Session, input string) { p := sess.Player g.cancelAction(p) diff --git a/internal/game/cmd_sneak.go b/internal/game/cmd_sneak.go index b37862d..325a36b 100644 --- a/internal/game/cmd_sneak.go +++ b/internal/game/cmd_sneak.go @@ -6,6 +6,10 @@ import ( "thehouseoficarus/internal/net" ) +func (g *Game) executeSneak(sess *net.Session, args []string, rawInput string) { + g.doSneak(sess) +} + func (g *Game) doSneak(sess *net.Session) { p := sess.Player p.Sneaking = !p.Sneaking diff --git a/internal/game/cmd_stats.go b/internal/game/cmd_stats.go index 51bacf1..906abf2 100644 --- a/internal/game/cmd_stats.go +++ b/internal/game/cmd_stats.go @@ -9,6 +9,10 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeStats(sess *net.Session, args []string, rawInput string) { + g.doStats(sess) +} + func (g *Game) doStats(sess *net.Session) { p := sess.Player totals := g.playerEquipBonuses(p) diff --git a/internal/game/cmd_style.go b/internal/game/cmd_style.go index 269fa3f..94dd234 100644 --- a/internal/game/cmd_style.go +++ b/internal/game/cmd_style.go @@ -43,3 +43,11 @@ func (g *Game) doStyle(sess *net.Session, input string) { } sess.WriteLine(fmt.Sprintf("\nUnknown style: %s. Choices: accurate, aggressive, defensive, balanced", input)) } + +func (g *Game) executeStyle(sess *net.Session, args []string, rawInput string) { + if len(args) == 0 { + g.doStyle(sess, "") + } else { + g.doStyle(sess, args[0]) + } +} diff --git a/internal/game/cmd_task.go b/internal/game/cmd_task.go index 5b67421..e54db15 100644 --- a/internal/game/cmd_task.go +++ b/internal/game/cmd_task.go @@ -6,6 +6,10 @@ import ( "thehouseoficarus/internal/net" ) +func (g *Game) executeTask(sess *net.Session, args []string, rawInput string) { + g.doTask(sess) +} + func (g *Game) doTask(sess *net.Session) { p := sess.Player diff --git a/internal/game/cmd_tech.go b/internal/game/cmd_tech.go index 89d5c2a..cb4c309 100644 --- a/internal/game/cmd_tech.go +++ b/internal/game/cmd_tech.go @@ -194,3 +194,7 @@ func (g *Game) doTechQuick(sess *net.Session, p *player.Player, input string) { g.AccountStore.SaveCharacter(p) sess.WriteLine(fmt.Sprintf("\nQuick tech set to %s.", matches[0].Name)) } + +func (g *Game) executeTech(sess *net.Session, args []string, rawInput string) { + g.doTech(sess, strings.Join(args, " ")) +} diff --git a/internal/game/cmd_trigger.go b/internal/game/cmd_trigger.go index 89ed397..7d637ca 100644 --- a/internal/game/cmd_trigger.go +++ b/internal/game/cmd_trigger.go @@ -7,9 +7,12 @@ import ( "thehouseoficarus/internal/combat" "thehouseoficarus/internal/net" "thehouseoficarus/internal/player" - "thehouseoficarus/internal/world" ) +func (g *Game) executeTrigger(sess *net.Session, args []string, rawInput string) { + g.doTrigger(sess, strings.Join(args, " ")) +} + func (g *Game) doTrigger(sess *net.Session, input string) { p := sess.Player input = strings.TrimSpace(input) @@ -106,635 +109,3 @@ func (g *Game) triggerCombatMod(sess *net.Session, p *player.Player, mod *ModDef p.AutotriggerMod = mod.ID g.startCombat(sess, p, mob) } - -func (g *Game) triggerTransport(sess *net.Session, p *player.Player, mod *ModDef) { - if combat.GetCombat(p.Name) != nil { - sess.WriteLine("You can't teleport during combat!") - return - } - - if p.Action != nil { - g.cancelAction(p) - } - - g.consumeJunkCost(p, mod) - - sciXP := mod.BaseXP - g.awardSkillXP(sess, p, player.Science, sciXP) - if p.OptionBool("xp_drops") { - sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) - } - g.AccountStore.SaveCharacter(p) - - if g.Hub != nil { - for _, other := range g.Hub.PlayersInRoom(p.RoomID) { - if other != sess { - other.WriteLine(fmt.Sprintf("\n%s teleports away.", p.Name)) - } - } - } - - sess.WriteLine(fmt.Sprintf("\nYou activate %s...", mod.Name)) - - p.RoomID = mod.Destination - if g.Hub != nil { - g.Hub.LeaveRoom(sess) - g.Hub.EnterRoom(sess, p.RoomID) - } - - room, _ := g.World.LoadRoom(p.RoomID) - destName := fmt.Sprintf("room %d", p.RoomID) - if room != nil { - destName = room.Name - } - sess.WriteLine(fmt.Sprintf("You materialize at %s.", destName)) - g.AccountStore.SaveCharacter(p) - g.doLook(sess) -} - -func (g *Game) triggerProcessing(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { - if combat.GetCombat(p.Name) != nil { - sess.WriteLine("You can't do that during combat!") - return - } - - if targetArg == "" { - sess.WriteLine(fmt.Sprintf("Usage: trigger %s ", strings.ReplaceAll(mod.ID, "_", " "))) - return - } - - slot, inv := g.findInventoryItem(p, targetArg) - if slot < 0 { - sess.WriteLine("You don't have that item.") - return - } - - itemDef, err := g.ItemStore.Load(inv.ItemID) - if err != nil || itemDef.Value <= 0 { - sess.WriteLine("That item has no value.") - return - } - - if p.Action != nil { - g.cancelAction(p) - } - - g.consumeJunkCost(p, mod) - - creditValue := itemDef.Value - if mod.ID == "low_process" { - creditValue = itemDef.Value / 2 - if creditValue < 1 { - creditValue = 1 - } - } - - if inv.Quantity > 1 { - inv.Quantity-- - } else { - p.SetInvSlot(slot, nil) - } - - p.Credits += creditValue - - sciXP := mod.BaseXP - g.awardSkillXP(sess, p, player.Science, sciXP) - g.AccountStore.SaveCharacter(p) - - sess.WriteLine(fmt.Sprintf("You process the %s. You receive %s credits.", - itemDef.Name, g.colorize(sess, "credits_pickup", fmt.Sprint(creditValue)))) - - if p.OptionBool("xp_drops") { - sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) - } -} - -func (g *Game) triggerUtility(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { - switch mod.ID { - case "low_process", "high_process": - g.triggerProcessing(sess, p, mod, targetArg) - case "bones_to_nutrients": - g.triggerBonesToNutrients(sess, p, mod) - case "em_grab": - g.triggerEmGrab(sess, p, mod, targetArg) - case "superheat": - g.triggerSuperheat(sess, p, mod, targetArg) - case "plank_make": - g.triggerPlankMake(sess, p, mod, targetArg) - } -} - -func (g *Game) triggerBonesToNutrients(sess *net.Session, p *player.Player, mod *ModDef) { - if combat.GetCombat(p.Name) != nil { - sess.WriteLine("You can't do that during combat!") - return - } - - boneCount := p.CountItem("bones") - if boneCount == 0 { - sess.WriteLine("You don't have any bones.") - return - } - - if p.Action != nil { - g.cancelAction(p) - } - - g.consumeJunkCost(p, mod) - - for i := 0; i < 28; i++ { - slot := p.InvSlot(i) - if slot != nil && slot.ItemID == "bones" { - slot.ItemID = "nutrient_bar" - } - } - - sciXP := mod.BaseXP * boneCount - g.awardSkillXP(sess, p, player.Science, sciXP) - g.AccountStore.SaveCharacter(p) - - sess.WriteLine(fmt.Sprintf("You convert %d bones into nutrient bars.", boneCount)) - if p.OptionBool("xp_drops") { - sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) - } -} - -func (g *Game) triggerEmGrab(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { - if targetArg == "" { - sess.WriteLine("Grab what? Usage: trigger em grab ") - return - } - - if p.FirstFreeSlot() < 0 { - sess.WriteLine("Your inventory is full.") - return - } - - groundItems := g.World.GroundItems(p.RoomID) - var matchedID string - for itemID := range groundItems { - def, _ := g.ItemStore.Load(itemID) - if def != nil && def.MatchesName(targetArg) { - matchedID = itemID - break - } - if strings.HasPrefix(itemID, strings.ToLower(targetArg)) { - matchedID = itemID - break - } - } - - if matchedID == "" { - sess.WriteLine("You don't see that here.") - return - } - - if p.Action != nil { - g.cancelAction(p) - } - - g.consumeJunkCost(p, mod) - - qty := groundItems[matchedID] - g.World.RemoveGroundItem(p.RoomID, matchedID, qty) - - def, _ := g.ItemStore.Load(matchedID) - name := matchedID - if def != nil { - name = def.Name - } - - freeSlot := p.FirstFreeSlot() - p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: matchedID, Quantity: qty}) - - sciXP := mod.BaseXP - g.awardSkillXP(sess, p, player.Science, sciXP) - g.AccountStore.SaveCharacter(p) - - sess.WriteLine(fmt.Sprintf("You magnetically pull the %s toward you.", name)) - if p.OptionBool("xp_drops") { - sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) - } -} - -func (g *Game) triggerSuperheat(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { - if combat.GetCombat(p.Name) != nil { - sess.WriteLine("You can't do that during combat!") - return - } - - if targetArg == "" { - sess.WriteLine("Superheat what? Usage: trigger superheat ") - return - } - - slot, inv := g.findInventoryItem(p, targetArg) - if slot < 0 { - sess.WriteLine("You don't have that item.") - return - } - - recipe := g.RecipeStore.FindByInput("smelt", inv.ItemID) - if recipe == nil { - sess.WriteLine("You can't superheat that.") - return - } - - if recipe.Level > 0 && p.Level(player.SkillName(recipe.Skill)) < recipe.Level { - sess.WriteLine(fmt.Sprintf("You need level %d %s to smelt that.", recipe.Level, recipe.Skill)) - return - } - - for _, e := range recipe.Consume { - for _, itemID := range e.Items { - qty := e.Qty - if qty <= 0 { - qty = 1 - } - if p.CountItem(itemID) < qty { - def, _ := g.ItemStore.Load(itemID) - name := itemID - if def != nil { - name = def.Name - } - sess.WriteLine(fmt.Sprintf("You need %d %s.", qty, name)) - return - } - } - } - - if p.Action != nil { - g.cancelAction(p) - } - - g.consumeJunkCost(p, mod) - - for _, e := range recipe.Consume { - for _, itemID := range e.Items { - qty := e.Qty - if qty <= 0 { - qty = 1 - } - p.RemoveItem(itemID, qty) - } - } - - outputQty := recipe.OutputQty - if outputQty <= 0 { - outputQty = 1 - } - placed := false - for i := 0; i < 28; i++ { - slot := p.InvSlot(i) - if slot != nil && slot.ItemID == recipe.Output { - slot.Quantity += outputQty - placed = true - break - } - } - if !placed { - freeSlot := p.FirstFreeSlot() - p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: recipe.Output, Quantity: outputQty}) - } - - sciXP := mod.BaseXP - g.awardSkillXP(sess, p, player.Science, sciXP) - if recipe.XP > 0 { - g.awardSkillXP(sess, p, player.SkillName(recipe.Skill), recipe.XP) - } - g.AccountStore.SaveCharacter(p) - - outputDef, _ := g.ItemStore.Load(recipe.Output) - outputName := recipe.Output - if outputDef != nil { - outputName = outputDef.Name - } - inputDef, _ := g.ItemStore.Load(inv.ItemID) - inputName := inv.ItemID - if inputDef != nil { - inputName = inputDef.Name - } - - sess.WriteLine(fmt.Sprintf("You superheat the %s and produce a %s.", inputName, outputName)) - if p.OptionBool("xp_drops") { - parts := []string{fmt.Sprintf("+%dxp sci", sciXP)} - if recipe.XP > 0 { - parts = append(parts, fmt.Sprintf("+%dxp %s", recipe.XP, player.SkillAbbr[player.SkillName(recipe.Skill)])) - } - sess.WriteLine(g.colorize(sess, "xp", "("+strings.Join(parts, ", ")+")")) - } -} - -func (g *Game) triggerPlankMake(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { - if combat.GetCombat(p.Name) != nil { - sess.WriteLine("You can't do that during combat!") - return - } - - logTypes := map[string]struct { - plankID string - name string - cost int - }{ - "logs": {"planks", "planks", 3}, - "oak_logs": {"oak_planks", "oak planks", 7}, - "teak_logs": {"teak_planks", "teak planks", 14}, - "mahogany_logs": {"mahogany_planks", "mahogany planks", 28}, - } - - if targetArg != "" { - slot, inv := g.findInventoryItem(p, targetArg) - if slot < 0 { - sess.WriteLine("You don't have that item.") - return - } - info, ok := logTypes[inv.ItemID] - if !ok { - sess.WriteLine("You can't turn that into planks.") - return - } - - if p.Credits < info.cost { - sess.WriteLine(fmt.Sprintf("You need %d credits for Plank Make (70%% of sawmill cost).", info.cost)) - return - } - - if p.Action != nil { - g.cancelAction(p) - } - - g.consumeJunkCost(p, mod) - - p.RemoveItem(inv.ItemID, 1) - p.Credits -= info.cost - - freeSlot := p.FirstFreeSlot() - if freeSlot == -1 { - sess.WriteLine("Your inventory is full.") - return - } - p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: info.plankID, Quantity: 1}) - - sciXP := mod.BaseXP - g.awardSkillXP(sess, p, player.Science, sciXP) - g.awardSkillXP(sess, p, player.Construction, 10) - g.AccountStore.SaveCharacter(p) - - sess.WriteLine(fmt.Sprintf("You convert the log into %s.", info.name)) - if p.OptionBool("xp_drops") { - parts := []string{fmt.Sprintf("+%dxp sci", sciXP), "+10xp con"} - sess.WriteLine(g.colorize(sess, "xp", "("+strings.Join(parts, ", ")+")")) - } - return - } - - for logID, info := range logTypes { - qty := p.CountItem(logID) - if qty == 0 { - continue - } - - totalCost := info.cost * qty - if p.Credits < totalCost { - continue - } - - if p.Action != nil { - g.cancelAction(p) - } - - g.consumeJunkCost(p, mod) - - p.RemoveItem(logID, qty) - p.Credits -= totalCost - - processed := 0 - for i := 0; i < qty; i++ { - freeSlot := p.FirstFreeSlot() - if freeSlot == -1 { - g.World.AddGroundItem(p.RoomID, info.plankID, qty-i) - break - } - p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: info.plankID, Quantity: 1}) - processed++ - } - - sciXP := mod.BaseXP * qty - g.awardSkillXP(sess, p, player.Science, sciXP) - conXP := 10 * qty - g.awardSkillXP(sess, p, player.Construction, conXP) - g.AccountStore.SaveCharacter(p) - - sess.WriteLine(fmt.Sprintf("You convert %d logs into %s for %d credits.", processed, info.name, totalCost)) - if processed < qty { - sess.WriteLine(fmt.Sprintf("Your inventory is full. The remaining %d planks fall to the ground.", qty-processed)) - } - if p.OptionBool("xp_drops") { - parts := []string{fmt.Sprintf("+%dxp sci", sciXP), fmt.Sprintf("+%dxp con", conXP)} - sess.WriteLine(g.colorize(sess, "xp", "("+strings.Join(parts, ", ")+")")) - } - return - } - - sess.WriteLine("You don't have any logs to convert.") -} - -func (g *Game) triggerEnchant(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { - if chipInfo, ok := chipMap[mod.ID]; ok { - g.triggerChipBolts(sess, p, mod, chipInfo) - return - } - - enchants, ok := enchantMap[mod.ID] - if !ok { - sess.WriteLine("That enchantment has no known recipes.") - return - } - - if targetArg == "" { - sess.WriteLine(fmt.Sprintf("Enchant what? Use: trigger %s ", strings.ReplaceAll(mod.ID, "_", " "))) - return - } - - slot, inv := g.findInventoryItem(p, targetArg) - if slot < 0 { - sess.WriteLine("You don't have that item.") - return - } - - outputID, ok := enchants[inv.ItemID] - if !ok { - sess.WriteLine("You can't enchant that with this mod.") - return - } - - if p.Action != nil { - g.cancelAction(p) - } - - g.consumeJunkCost(p, mod) - - inv.ItemID = outputID - - sciXP := mod.BaseXP - g.awardSkillXP(sess, p, player.Science, sciXP) - g.AccountStore.SaveCharacter(p) - - outputDef, _ := g.ItemStore.Load(outputID) - outputName := outputID - if outputDef != nil { - outputName = outputDef.Name - } - inputDef, _ := g.ItemStore.Load(inv.ItemID) - inputName := inv.ItemID - if inputDef != nil { - inputName = inputDef.Name - } - - sess.WriteLine(fmt.Sprintf("You enchant the %s and it becomes a %s!", inputName, outputName)) - if p.OptionBool("xp_drops") { - sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) - } -} - -func (g *Game) triggerChipBolts(sess *net.Session, p *player.Player, mod *ModDef, chip chipEntry) { - count := p.CountItem(chip.Input) - if count < chip.Qty { - inputDef, _ := g.ItemStore.Load(chip.Input) - name := chip.Input - if inputDef != nil { - name = inputDef.Name - } - sess.WriteLine(fmt.Sprintf("You need at least %d %s.", chip.Qty, name)) - return - } - - if p.Action != nil { - g.cancelAction(p) - } - - g.consumeJunkCost(p, mod) - - p.RemoveItem(chip.Input, chip.Qty) - placed := false - for i := 0; i < 28; i++ { - slot := p.InvSlot(i) - if slot != nil && slot.ItemID == chip.Output { - slot.Quantity += chip.Qty - placed = true - break - } - } - if !placed { - freeSlot := p.FirstFreeSlot() - p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: chip.Output, Quantity: chip.Qty}) - } - - sciXP := mod.BaseXP - g.awardSkillXP(sess, p, player.Science, sciXP) - g.AccountStore.SaveCharacter(p) - - inputDef, _ := g.ItemStore.Load(chip.Input) - name := chip.Input - if inputDef != nil { - name = inputDef.Name - } - - sess.WriteLine(fmt.Sprintf("You chip %d %s with arcane circuitry.", chip.Qty, name)) - if p.OptionBool("xp_drops") { - sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) - } -} - -func (g *Game) scienceAttack(sess *net.Session, p *player.Player, mob *world.MobInstance, mod *ModDef) bool { - if p.Level(player.Science) < mod.Level { - sess.WriteLine(fmt.Sprintf("You need level %d science to trigger %s.", mod.Level, mod.Name)) - return false - } - if !g.hasJunkCost(p, mod) { - return false - } - - if g.processConsumeQueue(p, sess) { - p.ActionState = &ActionState{Type: ActionEating, TargetName: "food"} - return true - } - - g.consumeJunkCost(p, mod) - - equipSciBonus := g.totalEquipScienceAttack(p) - attRoll := (p.Level(player.Science) + g.buffLevelBonus(p, "science") + 8) * (equipSciBonus + 64) - - mobSciDef := mob.ScienceDefense - defRoll := (mob.Defense + 9) * (mobSciDef + 64) - - if mob.Weakness == mod.Element { - attRoll = attRoll * 13 / 10 - } - - if combat.HitCheck(attRoll, defRoll) { - dmg := combat.RollDamage(mod.MaxHit) - if dmg < 0 { - dmg = 0 - } - mob.HP -= dmg - if mob.HP < 0 { - mob.HP = 0 - } - if mob.HP < mob.MaxHP && mob.HP > 0 { - mob.StartRegen() - } - - sciXP := mod.BaseXP - hpXP := mod.BaseXP / 3 - if hpXP < 1 { - hpXP = 1 - } - var gains []xpGain - - g.awardSkillXP(sess, p, player.Science, sciXP) - gains = append(gains, xpGain{string(player.Science), sciXP}) - - g.awardSkillXP(sess, p, player.Hitpoints, hpXP) - gains = append(gains, xpGain{string(player.Hitpoints), hpXP}) - - g.AccountStore.SaveCharacter(p) - - mobName := mobDisplayName(mob, true) - prefix := fmt.Sprintf(" %s hits %s for %s damage.", - g.colorize(sess, "science_mod", mod.Name), - g.colorize(sess, "mob_name", mobName), - g.colorize(sess, "damage", fmt.Sprint(dmg))) - hpPart := fmt.Sprintf("[%s/%dhp]", g.colorize(sess, "enemy_hp", fmt.Sprint(mob.HP)), mob.MaxHP) - line := prefix + " " + hpPart - if p.OptionBool("xp_drops") && len(gains) > 0 { - var parts []string - for _, gain := range gains { - parts = append(parts, fmt.Sprintf("+%dxp %s", gain.XP, player.SkillAbbr[player.SkillName(gain.Skill)])) - } - line += g.colorize(sess, "xp", " ("+strings.Join(parts, ", ")+")") - } - sess.WriteLine(line) - } else { - sess.WriteLine(g.colorize(sess, "miss", fmt.Sprintf(" %s fails to connect.", mod.Name))) - } - return true -} - -func (g *Game) findInventoryItem(p *player.Player, input string) (int, *player.InventorySlot) { - lower := strings.ToLower(strings.TrimSpace(input)) - for i := 0; i < 28; i++ { - slot := p.InvSlot(i) - if slot == nil { - continue - } - def, err := g.ItemStore.Load(slot.ItemID) - if err != nil { - continue - } - if def.MatchesName(lower) { - return i, slot - } - } - return -1, nil -} diff --git a/internal/game/cmd_trigger_combat.go b/internal/game/cmd_trigger_combat.go new file mode 100644 index 0000000..545a117 --- /dev/null +++ b/internal/game/cmd_trigger_combat.go @@ -0,0 +1,104 @@ +package game + +import ( + "fmt" + "strings" + + "thehouseoficarus/internal/combat" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" + "thehouseoficarus/internal/world" +) + +func (g *Game) scienceAttack(sess *net.Session, p *player.Player, mob *world.MobInstance, mod *ModDef) bool { + if p.Level(player.Science) < mod.Level { + sess.WriteLine(fmt.Sprintf("You need level %d science to trigger %s.", mod.Level, mod.Name)) + return false + } + if !g.hasJunkCost(p, mod) { + return false + } + + if g.processConsumeQueue(p, sess) { + p.ActionState = &ActionState{Type: ActionEating, TargetName: "food"} + return true + } + + g.consumeJunkCost(p, mod) + + equipSciBonus := g.totalEquipScienceAttack(p) + attRoll := (p.Level(player.Science) + g.buffLevelBonus(p, "science") + 8) * (equipSciBonus + 64) + + mobSciDef := mob.ScienceDefense + defRoll := (mob.Defense + 9) * (mobSciDef + 64) + + if mob.Weakness == mod.Element { + attRoll = attRoll * 13 / 10 + } + + if combat.HitCheck(attRoll, defRoll) { + dmg := combat.RollDamage(mod.MaxHit) + if dmg < 0 { + dmg = 0 + } + mob.HP -= dmg + if mob.HP < 0 { + mob.HP = 0 + } + if mob.HP < mob.MaxHP && mob.HP > 0 { + mob.StartRegen() + } + + sciXP := mod.BaseXP + hpXP := mod.BaseXP / 3 + if hpXP < 1 { + hpXP = 1 + } + var gains []xpGain + + g.awardSkillXP(sess, p, player.Science, sciXP) + gains = append(gains, xpGain{string(player.Science), sciXP}) + + g.awardSkillXP(sess, p, player.Hitpoints, hpXP) + gains = append(gains, xpGain{string(player.Hitpoints), hpXP}) + + g.AccountStore.SaveCharacter(p) + + mobName := mobDisplayName(mob, true) + prefix := fmt.Sprintf(" %s hits %s for %s damage.", + g.colorize(sess, "science_mod", mod.Name), + g.colorize(sess, "mob_name", mobName), + g.colorize(sess, "damage", fmt.Sprint(dmg))) + hpPart := fmt.Sprintf("[%s/%dhp]", g.colorize(sess, "enemy_hp", fmt.Sprint(mob.HP)), mob.MaxHP) + line := prefix + " " + hpPart + if p.OptionBool("xp_drops") && len(gains) > 0 { + var parts []string + for _, gain := range gains { + parts = append(parts, fmt.Sprintf("+%dxp %s", gain.XP, player.SkillAbbr[player.SkillName(gain.Skill)])) + } + line += g.colorize(sess, "xp", " ("+strings.Join(parts, ", ")+")") + } + sess.WriteLine(line) + } else { + sess.WriteLine(g.colorize(sess, "miss", fmt.Sprintf(" %s fails to connect.", mod.Name))) + } + return true +} + +func (g *Game) findInventoryItem(p *player.Player, input string) (int, *player.InventorySlot) { + lower := strings.ToLower(strings.TrimSpace(input)) + for i := 0; i < 28; i++ { + slot := p.InvSlot(i) + if slot == nil { + continue + } + def, err := g.ItemStore.Load(slot.ItemID) + if err != nil { + continue + } + if def.MatchesName(lower) { + return i, slot + } + } + return -1, nil +} diff --git a/internal/game/cmd_trigger_enchant.go b/internal/game/cmd_trigger_enchant.go new file mode 100644 index 0000000..535616b --- /dev/null +++ b/internal/game/cmd_trigger_enchant.go @@ -0,0 +1,116 @@ +package game + +import ( + "fmt" + "strings" + + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) triggerEnchant(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { + if chipInfo, ok := chipMap[mod.ID]; ok { + g.triggerChipBolts(sess, p, mod, chipInfo) + return + } + + enchants, ok := enchantMap[mod.ID] + if !ok { + sess.WriteLine("That enchantment has no known recipes.") + return + } + + if targetArg == "" { + sess.WriteLine(fmt.Sprintf("Enchant what? Use: trigger %s ", strings.ReplaceAll(mod.ID, "_", " "))) + return + } + + slot, inv := g.findInventoryItem(p, targetArg) + if slot < 0 { + sess.WriteLine("You don't have that item.") + return + } + + outputID, ok := enchants[inv.ItemID] + if !ok { + sess.WriteLine("You can't enchant that with this mod.") + return + } + + if p.Action != nil { + g.cancelAction(p) + } + + g.consumeJunkCost(p, mod) + + inv.ItemID = outputID + + sciXP := mod.BaseXP + g.awardSkillXP(sess, p, player.Science, sciXP) + g.AccountStore.SaveCharacter(p) + + outputDef, _ := g.ItemStore.Load(outputID) + outputName := outputID + if outputDef != nil { + outputName = outputDef.Name + } + inputDef, _ := g.ItemStore.Load(inv.ItemID) + inputName := inv.ItemID + if inputDef != nil { + inputName = inputDef.Name + } + + sess.WriteLine(fmt.Sprintf("You enchant the %s and it becomes a %s!", inputName, outputName)) + if p.OptionBool("xp_drops") { + sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) + } +} + +func (g *Game) triggerChipBolts(sess *net.Session, p *player.Player, mod *ModDef, chip chipEntry) { + count := p.CountItem(chip.Input) + if count < chip.Qty { + inputDef, _ := g.ItemStore.Load(chip.Input) + name := chip.Input + if inputDef != nil { + name = inputDef.Name + } + sess.WriteLine(fmt.Sprintf("You need at least %d %s.", chip.Qty, name)) + return + } + + if p.Action != nil { + g.cancelAction(p) + } + + g.consumeJunkCost(p, mod) + + p.RemoveItem(chip.Input, chip.Qty) + placed := false + for i := 0; i < 28; i++ { + slot := p.InvSlot(i) + if slot != nil && slot.ItemID == chip.Output { + slot.Quantity += chip.Qty + placed = true + break + } + } + if !placed { + freeSlot := p.FirstFreeSlot() + p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: chip.Output, Quantity: chip.Qty}) + } + + sciXP := mod.BaseXP + g.awardSkillXP(sess, p, player.Science, sciXP) + g.AccountStore.SaveCharacter(p) + + inputDef, _ := g.ItemStore.Load(chip.Input) + name := chip.Input + if inputDef != nil { + name = inputDef.Name + } + + sess.WriteLine(fmt.Sprintf("You chip %d %s with arcane circuitry.", chip.Qty, name)) + if p.OptionBool("xp_drops") { + sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) + } +} diff --git a/internal/game/cmd_trigger_transport.go b/internal/game/cmd_trigger_transport.go new file mode 100644 index 0000000..2ca8db2 --- /dev/null +++ b/internal/game/cmd_trigger_transport.go @@ -0,0 +1,54 @@ +package game + +import ( + "fmt" + + "thehouseoficarus/internal/combat" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) triggerTransport(sess *net.Session, p *player.Player, mod *ModDef) { + if combat.GetCombat(p.Name) != nil { + sess.WriteLine("You can't teleport during combat!") + return + } + + if p.Action != nil { + g.cancelAction(p) + } + + g.consumeJunkCost(p, mod) + + sciXP := mod.BaseXP + g.awardSkillXP(sess, p, player.Science, sciXP) + if p.OptionBool("xp_drops") { + sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) + } + g.AccountStore.SaveCharacter(p) + + if g.Hub != nil { + for _, other := range g.Hub.PlayersInRoom(p.RoomID) { + if other != sess { + other.WriteLine(fmt.Sprintf("\n%s teleports away.", p.Name)) + } + } + } + + sess.WriteLine(fmt.Sprintf("\nYou activate %s...", mod.Name)) + + p.RoomID = mod.Destination + if g.Hub != nil { + g.Hub.LeaveRoom(sess) + g.Hub.EnterRoom(sess, p.RoomID) + } + + room, _ := g.World.LoadRoom(p.RoomID) + destName := fmt.Sprintf("room %d", p.RoomID) + if room != nil { + destName = room.Name + } + sess.WriteLine(fmt.Sprintf("You materialize at %s.", destName)) + g.AccountStore.SaveCharacter(p) + g.doLook(sess) +} diff --git a/internal/game/cmd_trigger_utility.go b/internal/game/cmd_trigger_utility.go new file mode 100644 index 0000000..efb23e7 --- /dev/null +++ b/internal/game/cmd_trigger_utility.go @@ -0,0 +1,397 @@ +package game + +import ( + "fmt" + "strings" + + "thehouseoficarus/internal/combat" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) triggerUtility(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { + switch mod.ID { + case "low_process", "high_process": + g.triggerProcessing(sess, p, mod, targetArg) + case "bones_to_nutrients": + g.triggerBonesToNutrients(sess, p, mod) + case "em_grab": + g.triggerEmGrab(sess, p, mod, targetArg) + case "superheat": + g.triggerSuperheat(sess, p, mod, targetArg) + case "plank_make": + g.triggerPlankMake(sess, p, mod, targetArg) + } +} + +func (g *Game) triggerProcessing(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { + if combat.GetCombat(p.Name) != nil { + sess.WriteLine("You can't do that during combat!") + return + } + + if targetArg == "" { + sess.WriteLine(fmt.Sprintf("Usage: trigger %s ", strings.ReplaceAll(mod.ID, "_", " "))) + return + } + + slot, inv := g.findInventoryItem(p, targetArg) + if slot < 0 { + sess.WriteLine("You don't have that item.") + return + } + + itemDef, err := g.ItemStore.Load(inv.ItemID) + if err != nil || itemDef.Value <= 0 { + sess.WriteLine("That item has no value.") + return + } + + if p.Action != nil { + g.cancelAction(p) + } + + g.consumeJunkCost(p, mod) + + creditValue := itemDef.Value + if mod.ID == "low_process" { + creditValue = itemDef.Value / 2 + if creditValue < 1 { + creditValue = 1 + } + } + + if inv.Quantity > 1 { + inv.Quantity-- + } else { + p.SetInvSlot(slot, nil) + } + + p.Credits += creditValue + + sciXP := mod.BaseXP + g.awardSkillXP(sess, p, player.Science, sciXP) + g.AccountStore.SaveCharacter(p) + + sess.WriteLine(fmt.Sprintf("You process the %s. You receive %s credits.", + itemDef.Name, g.colorize(sess, "credits_pickup", fmt.Sprint(creditValue)))) + + if p.OptionBool("xp_drops") { + sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) + } +} + +func (g *Game) triggerBonesToNutrients(sess *net.Session, p *player.Player, mod *ModDef) { + if combat.GetCombat(p.Name) != nil { + sess.WriteLine("You can't do that during combat!") + return + } + + boneCount := p.CountItem("bones") + if boneCount == 0 { + sess.WriteLine("You don't have any bones.") + return + } + + if p.Action != nil { + g.cancelAction(p) + } + + g.consumeJunkCost(p, mod) + + for i := 0; i < 28; i++ { + slot := p.InvSlot(i) + if slot != nil && slot.ItemID == "bones" { + slot.ItemID = "nutrient_bar" + } + } + + sciXP := mod.BaseXP * boneCount + g.awardSkillXP(sess, p, player.Science, sciXP) + g.AccountStore.SaveCharacter(p) + + sess.WriteLine(fmt.Sprintf("You convert %d bones into nutrient bars.", boneCount)) + if p.OptionBool("xp_drops") { + sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) + } +} + +func (g *Game) triggerEmGrab(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { + if targetArg == "" { + sess.WriteLine("Grab what? Usage: trigger em grab ") + return + } + + if p.FirstFreeSlot() < 0 { + sess.WriteLine("Your inventory is full.") + return + } + + groundItems := g.World.GroundItems(p.RoomID) + var matchedID string + for itemID := range groundItems { + def, _ := g.ItemStore.Load(itemID) + if def != nil && def.MatchesName(targetArg) { + matchedID = itemID + break + } + if strings.HasPrefix(itemID, strings.ToLower(targetArg)) { + matchedID = itemID + break + } + } + + if matchedID == "" { + sess.WriteLine("You don't see that here.") + return + } + + if p.Action != nil { + g.cancelAction(p) + } + + g.consumeJunkCost(p, mod) + + qty := groundItems[matchedID] + g.World.RemoveGroundItem(p.RoomID, matchedID, qty) + + def, _ := g.ItemStore.Load(matchedID) + name := matchedID + if def != nil { + name = def.Name + } + + freeSlot := p.FirstFreeSlot() + p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: matchedID, Quantity: qty}) + + sciXP := mod.BaseXP + g.awardSkillXP(sess, p, player.Science, sciXP) + g.AccountStore.SaveCharacter(p) + + sess.WriteLine(fmt.Sprintf("You magnetically pull the %s toward you.", name)) + if p.OptionBool("xp_drops") { + sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf("+%dxp sci", sciXP))) + } +} + +func (g *Game) triggerSuperheat(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { + if combat.GetCombat(p.Name) != nil { + sess.WriteLine("You can't do that during combat!") + return + } + + if targetArg == "" { + sess.WriteLine("Superheat what? Usage: trigger superheat ") + return + } + + slot, inv := g.findInventoryItem(p, targetArg) + if slot < 0 { + sess.WriteLine("You don't have that item.") + return + } + + recipe := g.RecipeStore.FindByInput("smelt", inv.ItemID) + if recipe == nil { + sess.WriteLine("You can't superheat that.") + return + } + + if recipe.Level > 0 && p.Level(player.SkillName(recipe.Skill)) < recipe.Level { + sess.WriteLine(fmt.Sprintf("You need level %d %s to smelt that.", recipe.Level, recipe.Skill)) + return + } + + for _, e := range recipe.Consume { + for _, itemID := range e.Items { + qty := e.Quantity + if qty <= 0 { + qty = 1 + } + if p.CountItem(itemID) < qty { + def, _ := g.ItemStore.Load(itemID) + name := itemID + if def != nil { + name = def.Name + } + sess.WriteLine(fmt.Sprintf("You need %d %s.", qty, name)) + return + } + } + } + + if p.Action != nil { + g.cancelAction(p) + } + + g.consumeJunkCost(p, mod) + + for _, e := range recipe.Consume { + for _, itemID := range e.Items { + qty := e.Quantity + if qty <= 0 { + qty = 1 + } + p.RemoveItem(itemID, qty) + } + } + + outputQty := recipe.OutputQty + if outputQty <= 0 { + outputQty = 1 + } + placed := false + for i := 0; i < 28; i++ { + slot := p.InvSlot(i) + if slot != nil && slot.ItemID == recipe.Output { + slot.Quantity += outputQty + placed = true + break + } + } + if !placed { + freeSlot := p.FirstFreeSlot() + p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: recipe.Output, Quantity: outputQty}) + } + + sciXP := mod.BaseXP + g.awardSkillXP(sess, p, player.Science, sciXP) + if recipe.XP > 0 { + g.awardSkillXP(sess, p, player.SkillName(recipe.Skill), recipe.XP) + } + g.AccountStore.SaveCharacter(p) + + outputDef, _ := g.ItemStore.Load(recipe.Output) + outputName := recipe.Output + if outputDef != nil { + outputName = outputDef.Name + } + inputDef, _ := g.ItemStore.Load(inv.ItemID) + inputName := inv.ItemID + if inputDef != nil { + inputName = inputDef.Name + } + + sess.WriteLine(fmt.Sprintf("You superheat the %s and produce a %s.", inputName, outputName)) + if p.OptionBool("xp_drops") { + parts := []string{fmt.Sprintf("+%dxp sci", sciXP)} + if recipe.XP > 0 { + parts = append(parts, fmt.Sprintf("+%dxp %s", recipe.XP, player.SkillAbbr[player.SkillName(recipe.Skill)])) + } + sess.WriteLine(g.colorize(sess, "xp", "("+strings.Join(parts, ", ")+")")) + } +} + +func (g *Game) triggerPlankMake(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { + if combat.GetCombat(p.Name) != nil { + sess.WriteLine("You can't do that during combat!") + return + } + + logTypes := map[string]struct { + plankID string + name string + cost int + }{ + "logs": {"planks", "planks", 3}, + "oak_logs": {"oak_planks", "oak planks", 7}, + "teak_logs": {"teak_planks", "teak planks", 14}, + "mahogany_logs": {"mahogany_planks", "mahogany planks", 28}, + } + + if targetArg != "" { + slot, inv := g.findInventoryItem(p, targetArg) + if slot < 0 { + sess.WriteLine("You don't have that item.") + return + } + info, ok := logTypes[inv.ItemID] + if !ok { + sess.WriteLine("You can't turn that into planks.") + return + } + + if p.Credits < info.cost { + sess.WriteLine(fmt.Sprintf("You need %d credits for Plank Make (70%% of sawmill cost).", info.cost)) + return + } + + if p.Action != nil { + g.cancelAction(p) + } + + g.consumeJunkCost(p, mod) + + p.RemoveItem(inv.ItemID, 1) + p.Credits -= info.cost + + freeSlot := p.FirstFreeSlot() + if freeSlot == -1 { + sess.WriteLine("Your inventory is full.") + return + } + p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: info.plankID, Quantity: 1}) + + sciXP := mod.BaseXP + g.awardSkillXP(sess, p, player.Science, sciXP) + g.awardSkillXP(sess, p, player.Construction, 10) + g.AccountStore.SaveCharacter(p) + + sess.WriteLine(fmt.Sprintf("You convert the log into %s.", info.name)) + if p.OptionBool("xp_drops") { + parts := []string{fmt.Sprintf("+%dxp sci", sciXP), "+10xp con"} + sess.WriteLine(g.colorize(sess, "xp", "("+strings.Join(parts, ", ")+")")) + } + return + } + + for logID, info := range logTypes { + qty := p.CountItem(logID) + if qty == 0 { + continue + } + + totalCost := info.cost * qty + if p.Credits < totalCost { + continue + } + + if p.Action != nil { + g.cancelAction(p) + } + + g.consumeJunkCost(p, mod) + + p.RemoveItem(logID, qty) + p.Credits -= totalCost + + processed := 0 + for i := 0; i < qty; i++ { + freeSlot := p.FirstFreeSlot() + if freeSlot == -1 { + g.World.AddGroundItem(p.RoomID, info.plankID, qty-i) + break + } + p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: info.plankID, Quantity: 1}) + processed++ + } + + sciXP := mod.BaseXP * qty + g.awardSkillXP(sess, p, player.Science, sciXP) + conXP := 10 * qty + g.awardSkillXP(sess, p, player.Construction, conXP) + g.AccountStore.SaveCharacter(p) + + sess.WriteLine(fmt.Sprintf("You convert %d logs into %s for %d credits.", processed, info.name, totalCost)) + if processed < qty { + sess.WriteLine(fmt.Sprintf("Your inventory is full. The remaining %d planks fall to the ground.", qty-processed)) + } + if p.OptionBool("xp_drops") { + parts := []string{fmt.Sprintf("+%dxp sci", sciXP), fmt.Sprintf("+%dxp con", conXP)} + sess.WriteLine(g.colorize(sess, "xp", "("+strings.Join(parts, ", ")+")")) + } + return + } + + sess.WriteLine("You don't have any logs to convert.") +} diff --git a/internal/game/cmd_use.go b/internal/game/cmd_use.go index fbe5945..4f830a8 100644 --- a/internal/game/cmd_use.go +++ b/internal/game/cmd_use.go @@ -10,6 +10,13 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeUse(sess *net.Session, args []string, rawInput string) { + if g.tryFinishingBlow(sess, strings.Join(args, " ")) { + return + } + g.doUse(sess, strings.Join(args, " ")) +} + func (g *Game) doUse(sess *net.Session, input string) { if strings.TrimSpace(input) == "" { g.doHelp(sess, "use") diff --git a/internal/game/cmd_walk.go b/internal/game/cmd_walk.go index eca608f..9485af5 100644 --- a/internal/game/cmd_walk.go +++ b/internal/game/cmd_walk.go @@ -10,6 +10,10 @@ import ( "thehouseoficarus/internal/world" ) +func (g *Game) executeWalk(sess *net.Session, args []string, rawInput string) { + g.doWalk(sess, args) +} + func (g *Game) doWalk(sess *net.Session, args []string) { p := sess.Player if len(args) == 0 { diff --git a/internal/game/cmd_wear.go b/internal/game/cmd_wear.go index 36765e8..f2fd84c 100644 --- a/internal/game/cmd_wear.go +++ b/internal/game/cmd_wear.go @@ -9,6 +9,10 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) executeWear(sess *net.Session, args []string, rawInput string) { + g.doWear(sess, strings.Join(args, " ")) +} + func (g *Game) checkRequirements(p *player.Player, def *object.ItemDef) string { if len(def.Requirements) == 0 { return "" diff --git a/internal/game/color.go b/internal/game/color.go deleted file mode 100644 index 962728a..0000000 --- a/internal/game/color.go +++ /dev/null @@ -1,79 +0,0 @@ -package game - -import ( - "thehouseoficarus/internal/color" - "thehouseoficarus/internal/config" - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/object" -) - -func (g *Game) colorMode(sess *net.Session) string { - if p := sess.Player; p != nil { - return p.OptionString("color") - } - return "none" -} - -func (g *Game) resolveColor(sess *net.Session, category string) color.ColorSpec { - if sess.Account != nil && sess.Account.Colors != nil { - if val, ok := sess.Account.Colors[category]; ok { - if val == "off" { - return color.NoColor() - } - if val != "" { - return color.Parse(val) - } - } - } - if g.ColorConfig != nil { - if val, ok := (*g.ColorConfig)[category]; ok && val != "" { - return color.Parse(val) - } - } - if val, ok := config.DefaultColors()[category]; ok && val != "" { - return color.Parse(val) - } - return color.NoColor() -} - -func (g *Game) colorize(sess *net.Session, category, text string) string { - spec := g.resolveColor(sess, category) - return color.Render(g.colorMode(sess), spec, text) -} - -func levelColorSpec(myLevel, theirLevel int) color.ColorSpec { - diff := theirLevel - myLevel - switch { - case diff == 0: - return color.Parse("231") - case diff > 0 && diff < 5: - return color.Parse("208") - case diff >= 5: - return color.Parse("196") - case diff < 0 && diff > -5: - return color.Parse("190") - default: - return color.Parse("34") - } -} - -func (g *Game) levelColorize(sess *net.Session, myLevel, theirLevel int, text string) string { - spec := levelColorSpec(myLevel, theirLevel) - return color.Render(g.colorMode(sess), spec, text) -} - -func (g *Game) objColorize(sess *net.Session, objDef *object.ObjectDef, text string) string { - if objDef != nil && objDef.Color != "" { - spec := color.Parse(objDef.Color) - return color.Render(g.colorMode(sess), spec, text) - } - return text -} - -func (g *Game) itemColorize(sess *net.Session, itemDef *object.ItemDef, text string) string { - if itemDef != nil && itemDef.Color != "" { - spec := color.Parse(itemDef.Color) - return color.Render(g.colorMode(sess), spec, text) - } - return g.colorize(sess, "item", text) -} diff --git a/internal/game/construction.go b/internal/game/construction.go deleted file mode 100644 index 06713cd..0000000 --- a/internal/game/construction.go +++ /dev/null @@ -1,74 +0,0 @@ -package game - -import ( - "fmt" - - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/player" -) - -func (g *Game) processSawmill(sess *net.Session, p *player.Player) { - logTypes := map[string]struct { - plankID string - cost int - name string - }{ - "logs": {"planks", 5, "regular planks"}, - "oak_logs": {"oak_planks", 10, "oak planks"}, - "teak_logs": {"teak_planks", 20, "teak planks"}, - "mahogany_logs": {"mahogany_planks", 40, "mahogany planks"}, - } - - totalCost := 0 - totalPlanks := 0 - type plankResult struct { - plankID string - qty int - } - - var results []plankResult - - for logID, info := range logTypes { - qty := p.CountItem(logID) - if qty == 0 { - continue - } - cost := qty * info.cost - totalCost += cost - totalPlanks += qty - results = append(results, plankResult{info.plankID, qty}) - p.RemoveItem(logID, qty) - } - - if totalPlanks == 0 { - sess.WriteLine("You don't have any logs to process.") - return - } - - if p.Credits < totalCost { - sess.WriteLine(fmt.Sprintf("You need %d credits to process all your logs (you have %d).", totalCost, p.Credits)) - return - } - - p.Credits -= totalCost - - processed := 0 - for _, r := range results { - for i := 0; i < r.qty; i++ { - freeSlot := p.FirstFreeSlot() - if freeSlot == -1 { - g.World.AddGroundItem(p.RoomID, r.plankID, r.qty-i) - break - } - p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: r.plankID, Quantity: 1}) - processed++ - } - } - - g.AccountStore.SaveCharacter(p) - - sess.WriteLine(fmt.Sprintf("The sawmill operator processes your logs into %d planks for %d credits.", processed, totalCost)) - if processed < totalPlanks { - sess.WriteLine(fmt.Sprintf("Your inventory is full. The remaining %d planks fall to the ground.", totalPlanks-processed)) - } -} diff --git a/internal/game/core_course.go b/internal/game/core_course.go new file mode 100644 index 0000000..908466d --- /dev/null +++ b/internal/game/core_course.go @@ -0,0 +1,135 @@ +package game + +import ( + "path/filepath" + "sync" + + "thehouseoficarus/internal/action" + "gopkg.in/yaml.v3" +) + +type ObstacleDef struct { + RoomID int `yaml:"room_id"` + Verb string `yaml:"verb"` + TicksPerPhase float64 `yaml:"ticks_per_phase"` + XP int `yaml:"xp"` + FailDamage [2]int `yaml:"fail_damage"` + Messages []string `yaml:"messages"` +} + +type CourseConfig struct { + ID string `yaml:"id"` + Name string `yaml:"name"` + RequiredLevel int `yaml:"required_level"` + StartRoom int `yaml:"start_room"` + CompletionXP int `yaml:"completion_xp"` + Obstacles []ObstacleDef `yaml:"obstacles"` +} + +type ObstacleInfo struct { + CourseID string + CourseName string + ObstacleIndex int + TotalObstacles int + Verb string + Messages []string + TicksPerPhase float64 + ObstacleXP int + CompletionXP int + FailDamage [2]int + NextRoom int + StartRoom int + RequiredLevel int +} + +var obstacleVerbs = map[string]bool{} + +var verbGerund = map[string]string{ + "scramble": "scrambling", + "jump": "jumping", + "swing": "swinging", + "balance": "balancing", + "climb": "climbing", + "crawl": "crawling", + "vault": "vaulting", + "leap": "leaping", + "slide": "sliding", +} + +type CourseStore struct { + dataDir string + mu sync.Mutex + courses map[string]*CourseConfig + roomToObstacle map[int]*ObstacleInfo + loaded bool +} + +func NewCourseStore(dataDir string) *CourseStore { + return &CourseStore{ + dataDir: dataDir, + courses: make(map[string]*CourseConfig), + } +} + +func (cs *CourseStore) LoadAll() { + cs.mu.Lock() + defer cs.mu.Unlock() + cs.loadAllLocked() +} + +func (cs *CourseStore) GetObstacle(roomID int) *ObstacleInfo { + cs.mu.Lock() + defer cs.mu.Unlock() + if !cs.loaded { + cs.loadAllLocked() + } + return cs.roomToObstacle[roomID] +} + +func (cs *CourseStore) loadAllLocked() { + cs.loaded = true + cs.roomToObstacle = make(map[int]*ObstacleInfo) + localVerbs := make(map[string]bool) + + action.WalkYAMLDir(filepath.Join(cs.dataDir, "courses"), func(path, id string, data []byte) error { + var cfg CourseConfig + if err := yaml.Unmarshal(data, &cfg); err != nil { + return nil + } + cs.courses[cfg.ID] = &cfg + + totalObstacles := len(cfg.Obstacles) + for i, obs := range cfg.Obstacles { + nextRoom := 0 + if i < totalObstacles-1 { + nextRoom = cfg.Obstacles[i+1].RoomID + } + + completionXP := 0 + if i == totalObstacles-1 { + completionXP = cfg.CompletionXP + } + + info := &ObstacleInfo{ + CourseID: cfg.ID, + CourseName: cfg.Name, + ObstacleIndex: i, + TotalObstacles: totalObstacles, + Verb: obs.Verb, + Messages: obs.Messages, + TicksPerPhase: obs.TicksPerPhase, + ObstacleXP: obs.XP, + CompletionXP: completionXP, + FailDamage: obs.FailDamage, + NextRoom: nextRoom, + StartRoom: cfg.StartRoom, + RequiredLevel: cfg.RequiredLevel, + } + cs.roomToObstacle[obs.RoomID] = info + localVerbs[obs.Verb] = true + } + return nil + }) + + obstacleVerbs = localVerbs +} diff --git a/internal/game/core_equip.go b/internal/game/core_equip.go new file mode 100644 index 0000000..02b8348 --- /dev/null +++ b/internal/game/core_equip.go @@ -0,0 +1,41 @@ +package game + +import ( + "thehouseoficarus/internal/object" + "thehouseoficarus/internal/player" +) + +func (g *Game) playerEquipBonuses(p *player.Player) object.ItemStats { + var totals object.ItemStats + for _, itemID := range p.Equipment { + def, err := g.ItemStore.Load(itemID) + if err != nil { + continue + } + totals.StabAttack += def.Stats.StabAttack + totals.SlashAttack += def.Stats.SlashAttack + totals.CrushAttack += def.Stats.CrushAttack + totals.ScienceAttack += def.Stats.ScienceAttack + totals.RangedAttack += def.Stats.RangedAttack + totals.StabDefense += def.Stats.StabDefense + totals.SlashDefense += def.Stats.SlashDefense + totals.CrushDefense += def.Stats.CrushDefense + totals.ScienceDefense += def.Stats.ScienceDefense + totals.RangedDefense += def.Stats.RangedDefense + totals.StrengthBonus += def.Stats.StrengthBonus + totals.RangedStrength += def.Stats.RangedStrength + totals.ScienceDamage += def.Stats.ScienceDamage + totals.TechnologyBonus += def.Stats.TechnologyBonus + } + return totals +} + +func (g *Game) playerWeaponSpeed(p *player.Player) float64 { + if itemID, ok := p.Equipment[object.SlotMainHand]; ok { + def, err := g.ItemStore.Load(itemID) + if err == nil && def.Speed > 0 { + return def.Speed + } + } + return 5.0 +} diff --git a/internal/game/core_flags.go b/internal/game/core_flags.go new file mode 100644 index 0000000..6595cc4 --- /dev/null +++ b/internal/game/core_flags.go @@ -0,0 +1,55 @@ +package game + +import "thehouseoficarus/internal/player" + +func getPlayerFlagInt(p *player.Player, key string) int { + if p.Flags == nil { + return 0 + } + val, ok := p.Flags[key] + if !ok { + return 0 + } + switch v := val.(type) { + case int: + return v + case int64: + return int(v) + case float64: + return int(v) + } + return 0 +} + +func getPlayerFlagString(p *player.Player, key string) string { + if p.Flags == nil { + return "" + } + val, ok := p.Flags[key] + if !ok { + return "" + } + s, _ := val.(string) + return s +} + +func setPlayerFlag(p *player.Player, key string, val any) { + p.EnsureFlags() + p.Flags[key] = val +} + +func intFromFlag(flags map[string]any, key string) int { + val, ok := flags[key] + if !ok { + return 0 + } + switch v := val.(type) { + case int: + return v + case int64: + return int(v) + case float64: + return int(v) + } + return 0 +} diff --git a/internal/game/core_hacking.go b/internal/game/core_hacking.go new file mode 100644 index 0000000..3457728 --- /dev/null +++ b/internal/game/core_hacking.go @@ -0,0 +1,93 @@ +package game + +import ( + "fmt" + "strings" + + "thehouseoficarus/internal/game/hacking" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) handleHackingInput(sess *net.Session, input string) { + p := sess.Player + if p == nil { + sess.State = net.StateGame + return + } + + hs, ok := g.hackingStates[p.Name] + if !ok { + sess.State = net.StateGame + g.writePrompt(sess) + return + } + + input = strings.TrimSpace(input) + lower := strings.ToLower(input) + + if lower == "jack out" || lower == "quit" || lower == "disconnect" { + g.endHacking(sess, p, false, false) + return + } + + hs.Started = true + output, done, won := hs.Minigame.HandleInput(input) + + sess.WriteLine(output) + + if done { + g.endHacking(sess, p, true, won) + return + } + + sess.Write("\nhack> ") +} + +func (g *Game) endHacking(sess *net.Session, p *player.Player, completed bool, won bool) { + hs, ok := g.hackingStates[p.Name] + if !ok { + sess.State = net.StateGame + g.writePrompt(sess) + return + } + + tDef := hacking.Terminals[hs.TerminalID] + var xp int + + if completed && won { + xp = hacking.CalcXP(tDef.BaseXPWin, hs.Level, hs.ReqLevel) + sess.WriteLine("\nConnection terminated. Contract complete.") + } else if completed { + xp = hacking.CalcXP(tDef.BaseXPLose, hs.Level, hs.ReqLevel) + sess.WriteLine("\nConnection lost.") + } else if hs.Started { + xp = hacking.CalcXP(tDef.BaseXPLose, hs.Level, hs.ReqLevel) + sess.WriteLine("\nYou jack out of the terminal.") + } else { + sess.WriteLine("\nYou jack out of the terminal.") + } + + if won { + if b, ok := hs.Minigame.(hacking.XPBonuser); ok { + bonus := b.BonusXP() + if bonus > 0 { + xp += hacking.CalcXP(bonus, hs.Level, hs.ReqLevel) + } + } + } + + if xp > 0 { + g.awardSkillXP(sess, p, player.Hacking, xp) + if p.OptionBool("xp_drops") { + sess.WriteLine(g.colorize(sess, "xp", + fmt.Sprintf("(+%dxp %s)", xp, player.SkillAbbr[player.Hacking]))) + } + g.AccountStore.SaveCharacter(p) + } + + delete(g.hackingStates, p.Name) + p.ActionState = nil + sess.State = net.StateGame + g.writePrompt(sess) +} diff --git a/internal/game/core_login_account.go b/internal/game/core_login_account.go new file mode 100644 index 0000000..87f8c62 --- /dev/null +++ b/internal/game/core_login_account.go @@ -0,0 +1,351 @@ +package game + +import ( + "fmt" + "os" + "strings" + + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) handleAccountName(sess *net.Session, input string) { + name := strings.TrimSpace(input) + if name == "" { + sess.Write("Account name: ") + return + } + actualName, err := g.AccountStore.FindAccount(name) + if err == nil { + sess.Account = &player.Account{Name: actualName} + sess.State = net.StatePassword + sess.Conn.SetEcho(false) + sess.Write("Password: ") + } else { + if verr := player.ValidName(name); verr != nil { + sess.WriteLine(verr.Error()) + sess.Write("Account name: ") + return + } + sess.Account = &player.Account{Name: name} + sess.State = net.StateNewAccountPass + sess.Conn.SetEcho(false) + sess.WriteLine("\r\nOh, a new visitor to this rock!") + sess.Write("Choose password: ") + } +} + +func (g *Game) handlePassword(sess *net.Session, input string) { + if input == "" { + sess.Write("Password: ") + return + } + if len(input) > 128 { + sess.Conn.SetEcho(true) + sess.WriteLine("Wrong password.") + sess.State = net.StateAccountName + sess.Write("Account name: ") + return + } + acc, err := g.AccountStore.LoadAccount(sess.Account.Name) + if err != nil { + sess.Conn.SetEcho(true) + sess.WriteLine("Error loading account.") + sess.State = net.StateAccountName + sess.Write("Account name: ") + return + } + if !player.CheckPassword(input, acc.PasswordHash) { + sess.Conn.SetEcho(true) + sess.WriteLine("Wrong password.") + sess.State = net.StateAccountName + sess.Write("Account name: ") + return + } + sess.Conn.SetEcho(true) + sess.Account = &player.Account{ + Name: acc.Name, + PasswordHash: acc.PasswordHash, + Characters: acc.Characters, + Aliases: acc.Aliases, + Colors: acc.Colors, + Options: acc.Options, + } + if sess.Account.Aliases == nil { + sess.Account.Aliases = make(map[string]string) + } + if sess.Account.Colors == nil { + sess.Account.Colors = make(map[string]string) + } + if sess.Account.Options == nil { + sess.Account.Options = make(map[string]any) + } + g.showMenu(sess) +} + +func (g *Game) handleNewAccountPass(sess *net.Session, input string) { + input = strings.TrimSpace(input) + if input == "" { + sess.Conn.SetEcho(true) + sess.Account = nil + sess.State = net.StateAccountName + sess.Write("Account name: ") + return + } + if verr := player.ValidPassword(input); verr != nil { + sess.WriteLine(verr.Error()) + sess.Write("Choose password: ") + return + } + sess.PendingPass = input + sess.State = net.StateNewAccountConfirm + sess.Write("Confirm password: ") +} + +func (g *Game) handleNewAccountConfirm(sess *net.Session, input string) { + input = strings.TrimSpace(input) + if input == "" { + sess.Conn.SetEcho(true) + sess.Account = nil + sess.State = net.StateAccountName + sess.Write("Account name: ") + return + } + if input != sess.PendingPass { + sess.Conn.SetEcho(true) + sess.WriteLine("Passwords do not match.") + sess.Account = nil + sess.State = net.StateAccountName + sess.Write("Account name: ") + return + } + + hash, err := player.HashPassword(input) + if err != nil { + sess.Conn.SetEcho(true) + sess.WriteLine(fmt.Sprintf("Error creating account: %v", err)) + sess.Account = nil + sess.State = net.StateAccountName + sess.Write("Account name: ") + return + } + + acc := &player.Account{ + Name: sess.Account.Name, + PasswordHash: hash, + } + if err := g.AccountStore.SaveAccount(acc); err != nil { + sess.Conn.SetEcho(true) + sess.WriteLine(fmt.Sprintf("Error creating account: %v", err)) + sess.Account = nil + sess.State = net.StateAccountName + sess.Write("Account name: ") + return + } + + sess.Conn.SetEcho(true) + sess.Account = &player.Account{ + Name: acc.Name, + PasswordHash: acc.PasswordHash, + Aliases: make(map[string]string), + Colors: make(map[string]string), + Options: make(map[string]any), + } + sess.PendingPass = "" + sess.State = net.StateColorChoice + sess.Write("\nShould I disable color? [y/N] ") +} + +func (g *Game) handleColorChoice(sess *net.Session, input string) { + input = strings.ToLower(strings.TrimSpace(input)) + if input == "y" || input == "yes" { + sess.Account.Options["color"] = "none" + acc, err := g.AccountStore.LoadAccount(sess.Account.Name) + if err == nil { + if acc.Options == nil { + acc.Options = make(map[string]any) + } + acc.Options["color"] = "none" + g.AccountStore.SaveAccount(acc) + } + } + g.showMenu(sess) +} + +func (g *Game) showMenu(sess *net.Session) { + sess.State = net.StateMenu + lines := []string{ + "", + fmt.Sprintf("Welcome back to Gaia 04, %s.", sess.Account.Name), + "", + } + if len(sess.Account.Characters) > 0 { + lines = append(lines, + " (C)onnect character to THOI", + "", + " (L)ist characters", + " (R)ename character", + " (D)elete character", + ) + } + lines = append(lines, + " (N)ew character", + " (P)urge account", + " (A)ccount rename", + " (Q)uit", + "", + ) + sess.WriteLines(lines...) + sess.Write("> ") +} + +func (g *Game) handleMenu(sess *net.Session, input string) { + switch strings.ToLower(strings.TrimSpace(input)) { + case "": + sess.Write("> ") + case "c": + if len(sess.Account.Characters) == 0 { + sess.WriteLine("\nHey, make a character with 'N' first!") + sess.Write("\n> ") + return + } + if len(sess.Account.Characters) == 1 { + g.connectCharacter(sess, sess.Account.Characters[0]) + return + } + sess.WriteLine("\nSelect character:") + for i, name := range sess.Account.Characters { + sess.WriteLine(fmt.Sprintf(" %d) %s", i+1, name)) + } + sess.State = net.StateNewCharName + sess.PendingChar = "connect" + sess.Write("\n> ") + + case "l": + if len(sess.Account.Characters) == 0 { + sess.WriteLine("\nYou don't have any characters! Make one with 'N'!") + } else { + sess.WriteLine("\nCharacters:") + for _, name := range sess.Account.Characters { + sess.WriteLine(fmt.Sprintf(" - %s", name)) + } + } + sess.Write("\n> ") + + case "n": + sess.State = net.StateNewCharName + sess.PendingChar = "" + sess.Write("What's your character name?: ") + + case "a": + sess.State = net.StateRenameAccount + sess.Write("New account name: ") + + case "r": + if len(sess.Account.Characters) == 0 { + sess.WriteLine("\nRename who? You don't have any characters!") + sess.Write("\n> ") + return + } + if len(sess.Account.Characters) == 1 { + sess.PendingChar = sess.Account.Characters[0] + sess.State = net.StateRenameCharName + sess.WriteLine(fmt.Sprintf("\nRenaming %s.", sess.PendingChar)) + sess.Write("New name: ") + return + } + sess.State = net.StateRenameChar + sess.WriteLine("\nRename which character?") + for i, name := range sess.Account.Characters { + sess.WriteLine(fmt.Sprintf(" %d) %s", i+1, name)) + } + sess.Write("\n> ") + + case "d": + if len(sess.Account.Characters) == 0 { + sess.WriteLine("\nNo characters to delete.") + sess.Write("\n> ") + return + } + if len(sess.Account.Characters) == 1 { + sess.PendingChar = sess.Account.Characters[0] + } else { + sess.State = net.StateDeleteChar + sess.WriteLine("\nDelete which character?") + for i, name := range sess.Account.Characters { + sess.WriteLine(fmt.Sprintf(" %d) %s", i+1, name)) + } + sess.Write("\n> ") + return + } + g.showDeleteConfirm(sess) + + case "p": + sess.State = net.StatePurgeAccount + sess.WriteLine(fmt.Sprintf("\nPurge account %s and all characters?\nTo be clear you are about to PERMANENTLY DELETE EVERYTHING!\nType PURGE %s to confirm, or anything else to cancel.", sess.Account.Name, sess.Account.Name)) + sess.Write("\n> ") + + case "q": + sess.WriteLine("Later.") + sess.Close() + return + + default: + sess.Write("> ") + } +} + +func (g *Game) handleRenameAccount(sess *net.Session, input string) { + newName := strings.TrimSpace(input) + if newName == "" { + sess.Write("New account name: ") + return + } + if verr := player.ValidName(newName); verr != nil { + sess.WriteLine(verr.Error()) + sess.Write("New account name: ") + return + } + oldName := sess.Account.Name + if newName == oldName { + sess.WriteLine("That's already your account name.") + g.showMenu(sess) + return + } + if g.AccountStore.AccountExists(newName) { + sess.WriteLine("An account with that name already exists.") + sess.Write("New account name: ") + return + } + + oldPath := g.AccountStore.AccountPath(oldName) + newPath := g.AccountStore.AccountPath(newName) + if err := os.Rename(oldPath, newPath); err != nil { + sess.WriteLine(fmt.Sprintf("Error renaming account: %v", err)) + g.showMenu(sess) + return + } + + sess.Account.Name = newName + sess.WriteLine(fmt.Sprintf("Account renamed to %s.", newName)) + g.showMenu(sess) +} + +func (g *Game) handlePurgeAccount(sess *net.Session, input string) { + input = strings.TrimSpace(input) + expected := "PURGE " + sess.Account.Name + if strings.ToUpper(input) != strings.ToUpper(expected) { + sess.WriteLine("Purge cancelled.") + g.showMenu(sess) + return + } + + for _, name := range sess.Account.Characters { + os.Remove(g.AccountStore.CharPath(name)) + } + + os.Remove(g.AccountStore.AccountPath(sess.Account.Name)) + + sess.WriteLine(fmt.Sprintf("Account %s has been purged. Thanks for playing.", sess.Account.Name)) + sess.Close() +} diff --git a/internal/game/core_login_char.go b/internal/game/core_login_char.go new file mode 100644 index 0000000..84f146b --- /dev/null +++ b/internal/game/core_login_char.go @@ -0,0 +1,244 @@ +package game + +import ( + "fmt" + "os" + "strings" + + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) handleNewCharName(sess *net.Session, input string) { + name := strings.TrimSpace(input) + + if sess.PendingChar == "connect" && len(sess.Account.Characters) > 0 { + if idx, err := parseChoiceIndex(name); err == nil && idx > 0 && idx <= len(sess.Account.Characters) { + sess.PendingChar = "" + g.connectCharacter(sess, sess.Account.Characters[idx-1]) + return + } + sess.WriteLine("Invalid choice.") + sess.Write("\n> ") + return + } + + if name == "" { + sess.Write("Character name: ") + return + } + + if verr := player.ValidName(name); verr != nil { + sess.WriteLine(verr.Error()) + sess.Write("Character name: ") + return + } + + if g.AccountStore.CharacterExists(name) { + sess.WriteLine("A character with that name already exists.") + sess.Write("Character name: ") + return + } + + p := player.New(name) + p.RoomID = 1 + + if err := g.AccountStore.SaveCharacter(p); err != nil { + sess.WriteLine(fmt.Sprintf("Error creating character: %v", err)) + sess.State = net.StateMenu + g.showMenu(sess) + return + } + + acc, _ := g.AccountStore.LoadAccount(sess.Account.Name) + acc.Characters = append(acc.Characters, name) + g.AccountStore.SaveAccount(acc) + sess.Account.Characters = acc.Characters + + g.connectCharacter(sess, name) +} + +func (g *Game) connectCharacter(sess *net.Session, name string) { + g.charsMu.Lock() + if existing := g.loggedInChars[name]; existing != nil { + g.charsMu.Unlock() + sess.WriteLine("This character is logged in elsewhere.") + sess.State = net.StateMenu + g.showMenu(sess) + return + } + + p, err := g.AccountStore.LoadCharacter(name) + if err != nil { + g.charsMu.Unlock() + sess.WriteLine(fmt.Sprintf("Error loading character: %v", err)) + sess.State = net.StateMenu + g.showMenu(sess) + return + } + + sess.Player = p + sess.State = net.StateGame + g.loggedInChars[name] = sess + g.charsMu.Unlock() + + if sess.Account != nil && sess.Account.Options != nil { + p.Options = make(map[string]any) + for k, v := range sess.Account.Options { + p.Options[k] = v + } + } + + g.World.SeedGroundItems(p.RoomID) + g.seedRoomMobs(p.RoomID) + g.seedRoomObjects(p.RoomID) + + if g.Hub != nil { + g.Hub.EnterRoom(sess, p.RoomID) + } + + g.doLook(sess) + g.checkAggro(sess) + sess.Write("\r\n> ") +} + +func (g *Game) handleRenameChar(sess *net.Session, input string) { + name := strings.TrimSpace(input) + if idx, err := parseChoiceIndex(name); err == nil && idx > 0 && idx <= len(sess.Account.Characters) { + sess.PendingChar = sess.Account.Characters[idx-1] + } else { + sess.PendingChar = name + } + + found := false + for _, c := range sess.Account.Characters { + if c == sess.PendingChar { + found = true + break + } + } + if !found { + sess.WriteLine(fmt.Sprintf("No character named %s on this account.", sess.PendingChar)) + g.showMenu(sess) + return + } + + sess.State = net.StateRenameCharName + sess.WriteLine(fmt.Sprintf("Renaming %s.", sess.PendingChar)) + sess.Write("New name: ") +} + +func (g *Game) handleRenameCharName(sess *net.Session, input string) { + newName := strings.TrimSpace(input) + oldName := sess.PendingChar + if newName == "" { + sess.Write("New name: ") + return + } + if verr := player.ValidName(newName); verr != nil { + sess.WriteLine(verr.Error()) + sess.Write("New name: ") + return + } + if newName == oldName { + sess.WriteLine("That's already the character's name.") + g.showMenu(sess) + return + } + if g.AccountStore.CharacterExists(newName) { + sess.WriteLine("A character with that name already exists.") + sess.Write("New name: ") + return + } + + oldPath := g.AccountStore.CharPath(oldName) + newPath := g.AccountStore.CharPath(newName) + if err := os.Rename(oldPath, newPath); err != nil { + sess.WriteLine(fmt.Sprintf("Error renaming: %v", err)) + g.showMenu(sess) + return + } + + p, _ := g.AccountStore.LoadCharacter(newName) + if p != nil { + p.Name = newName + g.AccountStore.SaveCharacter(p) + } + + acc, _ := g.AccountStore.LoadAccount(sess.Account.Name) + for i, c := range acc.Characters { + if c == oldName { + acc.Characters[i] = newName + break + } + } + g.AccountStore.SaveAccount(acc) + sess.Account.Characters = acc.Characters + + sess.PendingChar = "" + sess.WriteLine(fmt.Sprintf("%s renamed to %s.", oldName, newName)) + g.showMenu(sess) +} + +func (g *Game) showDeleteConfirm(sess *net.Session) { + sess.State = net.StateDeleteChar + sess.WriteLine(fmt.Sprintf("\nDelete %s? Type DELETE %s to confirm, or anything else to cancel.", sess.PendingChar, sess.PendingChar)) +} + +func (g *Game) handleDeleteChar(sess *net.Session, input string) { + if sess.PendingChar == "" { + name := strings.TrimSpace(input) + if idx, err := parseChoiceIndex(name); err == nil && idx > 0 && idx <= len(sess.Account.Characters) { + sess.PendingChar = sess.Account.Characters[idx-1] + } else { + sess.PendingChar = name + } + found := false + for _, c := range sess.Account.Characters { + if c == sess.PendingChar { + found = true + break + } + } + if !found { + sess.WriteLine(fmt.Sprintf("No character named %s on this account.", sess.PendingChar)) + sess.PendingChar = "" + g.showMenu(sess) + return + } + g.showDeleteConfirm(sess) + return + } + + input = strings.TrimSpace(input) + expected := "DELETE " + sess.PendingChar + if strings.ToUpper(input) != strings.ToUpper(expected) { + sess.WriteLine("Delete cancelled.") + sess.PendingChar = "" + g.showMenu(sess) + return + } + + charPath := g.AccountStore.CharPath(sess.PendingChar) + if err := os.Remove(charPath); err != nil { + sess.WriteLine(fmt.Sprintf("Error deleting: %v", err)) + sess.PendingChar = "" + g.showMenu(sess) + return + } + + acc, _ := g.AccountStore.LoadAccount(sess.Account.Name) + var newChars []string + for _, c := range acc.Characters { + if c != sess.PendingChar { + newChars = append(newChars, c) + } + } + acc.Characters = newChars + g.AccountStore.SaveAccount(acc) + sess.Account.Characters = newChars + + sess.WriteLine(fmt.Sprintf("%s has been deleted.", sess.PendingChar)) + sess.PendingChar = "" + g.showMenu(sess) +} diff --git a/internal/game/core_messages.go b/internal/game/core_messages.go new file mode 100644 index 0000000..1c9e85a --- /dev/null +++ b/internal/game/core_messages.go @@ -0,0 +1,13 @@ +package game + +const ( + MsgErrLoadRecipes = "Error loading recipes." + MsgNoCombat = "You can't do that during combat!" + MsgNoDontHave = "You don't have any '%s'." + MsgNeverMind = "Never mind." + MsgSomethingWrongObject = "Something is wrong with this object." + MsgSomethingWrongThat = "Something is wrong with that." + MsgInventoryFull = "Your inventory is too full!" + MsgAmbiguous = "That's ambiguous, which one?" + MsgWhichOne = "Which one?" +) diff --git a/internal/game/core_production.go b/internal/game/core_production.go new file mode 100644 index 0000000..227c4ad --- /dev/null +++ b/internal/game/core_production.go @@ -0,0 +1,803 @@ +package game + +import ( + "fmt" + "math/rand" + "sort" + "strconv" + "strings" + + "thehouseoficarus/internal/action" + "thehouseoficarus/internal/color" + "thehouseoficarus/internal/engine" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/object" + "thehouseoficarus/internal/player" + +) + +func (g *Game) startProduction(sess *net.Session, p *player.Player, recipe *action.RecipeDef, actionType, displayVerb, startMsg, endMsg string, count int) { + g.cancelAction(p) + g.cancelBackgroundAction(p) + + skill := recipe.EffectiveSkill() + if skill != "" { + skillLevel := p.Level(player.SkillName(skill)) + if skillLevel < recipe.Level { + sess.WriteLine(fmt.Sprintf("You need level %d %s to do that.", recipe.Level, skill)) + g.reprompt(sess) + return + } + } + + if !recipe.HasAllItemsQty(p.CountItem) { + sess.WriteLine("You don't have the required materials.") + g.reprompt(sess) + return + } + + outDef, _ := g.ItemStore.Load(recipe.Output) + + wait := recipe.Wait + if wait <= 0 { + wait = 4 + } + + outputName := recipe.Output + if outDef != nil { + outputName = outDef.Name + } + + p.Action = &action.Action{ + Type: actionType, + TargetID: recipe.ID, + TargetName: outputName, + Data: map[string]any{ + "recipe_id": recipe.ID, + "phase": 0, + "wait": wait, + "start_msg": startMsg, + "end_msg": endMsg, + "remaining": count, + }, + WaitLeft: engine.ToTicks(1), + } + + p.ActionState = &ActionState{Type: ActionProducing, TargetName: outputName, Verb: displayVerb} + + if g.Hub != nil { + for _, other := range g.Hub.PlayersInRoom(p.RoomID) { + if other != sess && other.Player != nil { + other.WriteLine(g.colorize(other, "broadcast", fmt.Sprintf("\n%s starts %s.", p.Name, displayVerb))) + } + } + } +} + +func (g *Game) startProductionFromRecipe(sess *net.Session, p *player.Player, recipe *action.RecipeDef, count int) { + _, stationName := g.findStation(p.RoomID, recipe.Station) + if stationName == "" { + stationName = "inventory" + } + + firstItem := recipe.FirstItemName(func(id string) (string, bool) { + def, err := g.ItemStore.Load(id) + if err != nil { + return id, false + } + return def.Name, true + }) + + info, ok := productionTypes[recipe.Type] + if !ok { + info = productionTypeInfo{recipe.Type, recipe.Type} + } + actionType := info.ActionType + displayVerb := info.DisplayVerb + + var startMsg, endMsg string + if stationName != "inventory" { + startMsg = fmt.Sprintf("You start %s %s on the %s.", displayVerb, firstItem, stationName) + } else { + startMsg = fmt.Sprintf("You start %s %s.", displayVerb, firstItem) + } + endMsg = fmt.Sprintf("You've finished %s.", displayVerb) + + g.startProduction(sess, p, recipe, actionType, displayVerb, startMsg, endMsg, count) +} + +func (g *Game) loadProductionRecipe(recipeID string) *action.RecipeDef { + all, err := g.RecipeStore.LoadAll() + if err == nil { + for _, r := range all { + if r.ID == recipeID { + return &r + } + } + } + if strings.HasPrefix(recipeID, "combine_") { + itemID := strings.TrimPrefix(recipeID, "combine_") + if itemDef, err := g.ItemStore.Load(itemID); err == nil && len(itemDef.MadeFrom) > 0 { + return g.buildCombineRecipe(itemDef) + } + } + return nil +} + +func (g *Game) advanceProduction(sess *net.Session, p *player.Player) bool { + recipeID := p.Action.Data["recipe_id"].(string) + phase := p.Action.Data["phase"].(int) + wait := p.Action.Data["wait"].(float64) + startMsg, _ := p.Action.Data["start_msg"].(string) + endMsg, _ := p.Action.Data["end_msg"].(string) + remaining, _ := p.Action.Data["remaining"].(int) + + recipe := g.loadProductionRecipe(recipeID) + if recipe == nil { + g.cancelAction(p) + return false + } + + if phase == 0 { + if startMsg != "" { + sess.WriteLine(fmt.Sprintf("\n%s", startMsg)) + } + p.Action.Data["phase"] = 1 + p.Action.WaitLeft = engine.ToTicks(wait) + return true + } + + skill := recipe.EffectiveSkill() + skillLevel := p.Level(player.SkillName(skill)) + chance := 1.0 + if recipe.Success != nil { + chance = action.SuccessChance(*recipe.Success, skillLevel, recipe.Level) + } + + if rand.Float64() < chance { + outputQty := recipe.OutputQty + if outputQty <= 0 { + outputQty = 1 + } + + byproducts := g.collectByproducts(p, recipe) + + placed := false + outDef, _ := g.ItemStore.Load(recipe.Output) + if outDef != nil && outDef.Stackable { + for i := 0; i < 28; i++ { + slot := p.InvSlot(i) + if slot != nil && slot.ItemID == recipe.Output { + recipe.ConsumeAll(p.HasItem, p.RemoveItem) + slot.Quantity += outputQty + placed = true + break + } + } + } + if !placed { + recipe.ConsumeAll(p.HasItem, p.RemoveItem) + freeSlot := p.FirstFreeSlot() + if freeSlot == -1 { + sess.WriteLine("Your inventory is too full!") + g.cancelAction(p) + return false + } + p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: recipe.Output, Quantity: outputQty}) + } + + for _, bp := range byproducts { + if slot := p.FirstFreeSlot(); slot >= 0 { + p.SetInvSlot(slot, &player.InventorySlot{ItemID: bp, Quantity: 1}) + } + } + + if recipe.XP > 0 { + if newLevel := p.AddSkillXP(player.SkillName(skill), recipe.XP); newLevel > 0 { + sess.WriteLine(g.colorize(sess, "level_up", fmt.Sprintf("*** You are now level %d %s! ***", newLevel, skill))) + } + } + g.AccountStore.SaveCharacter(p) + + msg := recipe.Message + if msg == "" { + outputName := recipe.Output + if outDef != nil { + outputName = outDef.Name + } + msg = fmt.Sprintf("You produce %s.", outputName) + } + if p.OptionBool("xp_drops") && recipe.XP > 0 { + abbr := player.SkillAbbr[player.SkillName(skill)] + msg += g.colorize(sess, "xp", fmt.Sprintf(" (+%dxp %s)", recipe.XP, abbr)) + } + sess.WriteLine(msg) + } else { + recipe.ConsumeAll(p.HasItem, p.RemoveItem) + + if recipe.Fail != "" { + freeSlot := p.FirstFreeSlot() + if freeSlot >= 0 { + p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: recipe.Fail, Quantity: 1}) + } + } + g.AccountStore.SaveCharacter(p) + + msg := recipe.FailMessage + if msg == "" { + msg = "You fail and the materials are lost." + } + sess.WriteLine(g.colorize(sess, "damage", msg)) + } + + if remaining > 0 { + remaining-- + p.Action.Data["remaining"] = remaining + if remaining <= 0 { + if endMsg != "" { + sess.WriteLine(fmt.Sprintf("\n%s", endMsg)) + } + g.cancelAction(p) + return false + } + } + + if g.canContinueProduction(p, recipe) { + p.Action.WaitLeft = engine.ToTicks(wait) + return true + } + + if endMsg != "" { + sess.WriteLine(fmt.Sprintf("\n%s", endMsg)) + } + g.cancelAction(p) + return false +} + +func (g *Game) collectByproducts(p *player.Player, recipe *action.RecipeDef) []string { + var byproducts []string + for _, e := range recipe.Consume { + if len(e.Byproducts) == 0 { + continue + } + for i, id := range e.Items { + if p.HasItem(id) && i < len(e.Byproducts) && e.Byproducts[i] != "" { + byproducts = append(byproducts, e.Byproducts[i]) + break + } + } + } + return byproducts +} + +func (g *Game) canContinueProduction(p *player.Player, recipe *action.RecipeDef) bool { + if !recipe.HasAllItemsQty(p.CountItem) { + return false + } + outputQty := recipe.OutputQty + if outputQty <= 0 { + outputQty = 1 + } + outDef, _ := g.ItemStore.Load(recipe.Output) + if outDef != nil && outDef.Stackable { + for i := 0; i < 28; i++ { + slot := p.InvSlot(i) + if slot != nil && slot.ItemID == recipe.Output { + return true + } + } + } + return p.FirstFreeSlot() >= 0 +} + +func (g *Game) handleRecipeChoice(sess *net.Session, input string) { + input = strings.TrimSpace(input) + + menuData := sess.PendingMenu + if len(menuData) == 0 { + sess.State = net.StateGame + g.reprompt(sess) + return + } + + if input == "" { + sess.PendingMenu = nil + sess.State = net.StateGame + sess.WriteLine("Never mind.") + g.reprompt(sess) + return + } + + if choice, err := strconv.Atoi(input); err == nil { + sess.PendingMenu = nil + sess.State = net.StateGame + if choice <= 0 || choice > len(menuData) { + sess.WriteLine("Never mind.") + g.reprompt(sess) + return + } + g.dispatchMenuEntry(sess, menuData[choice-1]) + return + } + + lower := strings.ToLower(input) + matchIdx := -1 + for i, entry := range menuData { + name := g.menuEntryName(entry) + if name == "" { + continue + } + if strings.ToLower(name) == lower || action.WordPrefixMatch(input, name) { + if matchIdx >= 0 { + sess.WriteLine("That's ambiguous.") + return + } + matchIdx = i + } + } + if matchIdx >= 0 { + sess.PendingMenu = nil + sess.State = net.StateGame + g.dispatchMenuEntry(sess, menuData[matchIdx]) + return + } + + sess.PendingMenu = nil + sess.State = net.StateGame + sess.WriteLine("Never mind.") + g.reprompt(sess) +} + +func (g *Game) menuEntryName(entry map[string]string) string { + if rid, ok := entry["recipe_id"]; ok { + all, _ := g.RecipeStore.LoadAll() + for _, r := range all { + if r.ID == rid { + if def, err := g.ItemStore.Load(r.Output); err == nil { + return def.Name + } + return r.Output + } + } + } + if rid, ok := entry["fletch_recipe_id"]; ok { + all, _ := g.RecipeStore.LoadAll() + for _, r := range all { + if r.ID == rid { + if def, err := g.ItemStore.Load(r.Output); err == nil { + return def.Name + } + return r.Output + } + } + } + if barID, ok := entry["bar_id"]; ok { + if def, _ := g.ItemStore.Load(barID); def != nil { + return def.Name + } + return barID + } + if cid, ok := entry["combine_item"]; ok { + if def, _ := g.ItemStore.Load(cid); def != nil { + return def.Name + } + return cid + } + return "" +} + +func (g *Game) dispatchMenuEntry(sess *net.Session, entry map[string]string) { + if cid, ok := entry["combine_item"]; ok { + g.promptHowMany(sess, "combine_"+cid) + return + } + if barID, ok := entry["bar_id"]; ok { + p := sess.Player + allRecipes, _ := g.RecipeStore.LoadAll() + g.showSmithTable(sess, p, barID, allRecipes) + return + } + if rid, ok := entry["fletch_recipe_id"]; ok { + p := sess.Player + allRecipes, _ := g.RecipeStore.LoadAll() + for _, r := range allRecipes { + if r.ID == rid { + g.startFletchAction(sess, p, &r, 0) + return + } + } + g.reprompt(sess) + return + } + if rid, ok := entry["recipe_id"]; ok { + g.promptHowMany(sess, rid) + return + } + g.reprompt(sess) +} + +func (g *Game) formatRecipeMaterials(r *action.RecipeDef) string { + var parts []string + for _, e := range r.Consume { + itemName := e.Items[0] + if def, err := g.ItemStore.Load(e.Items[0]); err == nil { + itemName = def.Name + } + if e.Quantity > 1 { + parts = append(parts, fmt.Sprintf("%s x%d", itemName, e.Quantity)) + } else { + parts = append(parts, itemName) + } + } + return strings.Join(parts, ", ") +} + +func (g *Game) showProductionTable(sess *net.Session, p *player.Player, recipes []action.RecipeDef, title, skill, lastFlagKey, promptVerb string, background bool) { + sort.Slice(recipes, func(i, j int) bool { + return recipes[i].Level < recipes[j].Level + }) + + mode := g.colorMode(sess) + skillLevel := p.Level(player.SkillName(skill)) + dimSpec := color.Parse("240") + + tbl := &Table{ + Title: title, + Columns: []string{"#", "Product", "Materials", "Level"}, + } + + for i, r := range recipes { + outDef, _ := g.ItemStore.Load(r.Output) + productName := r.Output + if outDef != nil { + productName = outDef.Name + } + + outputQty := r.OutputQty + if outputQty <= 0 { + outputQty = 1 + } + if outDef != nil && outDef.Stackable && outputQty > 1 { + productName = fmt.Sprintf("%s x%d", productName, outputQty) + } + + matStr := g.formatRecipeMaterials(&r) + levelStr := fmt.Sprint(r.Level) + numStr := fmt.Sprintf("%d", i+1) + + canMake := skillLevel >= r.Level && r.HasAllItemsQty(p.CountItem) + if canMake { + productName = g.itemColorize(sess, outDef, productName) + } else { + productName = color.Render(mode, dimSpec, productName) + matStr = color.Render(mode, dimSpec, matStr) + levelStr = color.Render(mode, dimSpec, levelStr) + numStr = color.Render(mode, dimSpec, numStr) + } + + tbl.Rows = append(tbl.Rows, []string{numStr, productName, matStr, levelStr}) + } + + unicode := p.OptionBool("unicode") + sess.WriteLine("") + for _, line := range tbl.Render(unicode) { + sess.WriteLine(line) + } + + lastRecipeID, _ := p.Flags[lastFlagKey].(string) + hint := "" + if lastRecipeID != "" { + for _, r := range recipes { + if r.ID == lastRecipeID { + if outDef, err := g.ItemStore.Load(r.Output); err == nil { + hint = outDef.Name + } + break + } + } + } + + if hint != "" { + sess.Write(fmt.Sprintf("%s what (enter for all %s): ", promptVerb, hint)) + } else { + sess.Write(fmt.Sprintf("%s what: ", promptVerb)) + } + + sess.PendingMenu = recipeMenuData(recipeDefIDs(recipes)) + sess.PendingSkill = skill + sess.PendingLastFlag = lastFlagKey + sess.PendingBackground = background + sess.State = net.StateProductChoice +} + +func (g *Game) handleProductChoice(sess *net.Session, input string) { + p := sess.Player + menuData := sess.PendingMenu + skill := sess.PendingSkill + lastFlagKey := sess.PendingLastFlag + background := sess.PendingBackground + sess.PendingMenu = nil + sess.PendingSkill = "" + sess.PendingLastFlag = "" + sess.PendingBackground = false + sess.State = net.StateGame + + input = strings.TrimSpace(input) + + allRecipes, err := g.RecipeStore.LoadAll() + if err != nil { + g.reprompt(sess) + return + } + + var recipes []action.RecipeDef + for _, entry := range menuData { + rid := entry["recipe_id"] + for _, r := range allRecipes { + if r.ID == rid { + recipes = append(recipes, r) + break + } + } + } + + if len(recipes) == 0 { + g.reprompt(sess) + return + } + + sort.Slice(recipes, func(i, j int) bool { + return recipes[i].Level < recipes[j].Level + }) + + lastRecipeID, _ := p.Flags[lastFlagKey].(string) + + sel, errMsg := g.resolveRecipeByInput(input, recipes, lastRecipeID) + switch errMsg { + case "ambiguous": + sess.WriteLine("That's ambiguous.") + g.reprompt(sess) + return + case "never_mind": + sess.WriteLine("Never mind.") + g.reprompt(sess) + return + } + + skillLevel := p.Level(player.SkillName(skill)) + if skillLevel < sel.Recipe.Level { + sess.WriteLine(fmt.Sprintf("You need level %d %s to make that.", sel.Recipe.Level, skill)) + g.reprompt(sess) + return + } + if !sel.Recipe.HasAllItemsQty(p.CountItem) { + sess.WriteLine("You don't have the materials for that.") + g.reprompt(sess) + return + } + + p.EnsureFlags() + p.Flags[lastFlagKey] = sel.Recipe.ID + g.AccountStore.SaveCharacter(p) + + if background { + g.startFletchAction(sess, p, sel.Recipe, sel.Count) + } else { + g.startProductionFromRecipe(sess, p, sel.Recipe, sel.Count) + } +} + +func (g *Game) hasToolType(p *player.Player, toolType string) bool { + if itemID, ok := p.Equipment[object.SlotMainHand]; ok { + if def, err := g.ItemStore.Load(itemID); err == nil && def.ToolType == toolType { + return true + } + } + for i := 0; i < 28; i++ { + slot := p.InvSlot(i) + if slot == nil { + continue + } + if def, err := g.ItemStore.Load(slot.ItemID); err == nil && def.ToolType == toolType { + return true + } + } + return false +} +type recipeEntry struct { + ItemName string + Recipe action.RecipeDef +} + +type productionTypeInfo struct { + ActionType string + DisplayVerb string +} + +var productionTypes = map[string]productionTypeInfo{ + "cooking": {"cook", "cooking"}, + "smelting": {"smelt", "smelting"}, + "smithing": {"smith", "smithing"}, + "crafting": {"craft", "crafting"}, + "combine": {"combine", "combining"}, + "fletching": {"fletch", "fletching"}, + "pharmacy": {"mix", "mixing"}, + "construction": {"construct", "constructing"}, +} + +var productionActionTypes map[string]bool + +func init() { + productionActionTypes = make(map[string]bool) + for _, pt := range productionTypes { + productionActionTypes[pt.ActionType] = true + } +} + +func recipeMenuData(recipeIDs []string) []map[string]string { + out := make([]map[string]string, len(recipeIDs)) + for i, id := range recipeIDs { + out[i] = map[string]string{"recipe_id": id} + } + return out +} + +func recipeDefIDs(defs []action.RecipeDef) []string { + ids := make([]string, len(defs)) + for i, d := range defs { + ids[i] = d.ID + } + return ids +} + +func entryMenuData(entries []recipeEntry) []map[string]string { + out := make([]map[string]string, len(entries)) + for i, e := range entries { + out[i] = map[string]string{"recipe_id": e.Recipe.ID} + } + return out +} + +func (g *Game) promptHowMany(sess *net.Session, recipeID string) { + sess.PendingRecipeID = recipeID + sess.State = net.StateHowMany + sess.Write("How many (return for all)?: ") +} + +type recipeSelection struct { + Recipe *action.RecipeDef + Count int +} + +func (g *Game) resolveRecipeByInput(input string, recipes []action.RecipeDef, lastRecipeID string) (sel recipeSelection, errMsg string) { + if input == "" { + if lastRecipeID == "" { + return sel, "never_mind" + } + for i := range recipes { + if recipes[i].ID == lastRecipeID { + sel.Recipe = &recipes[i] + return sel, "" + } + } + return sel, "never_mind" + } + + qty, productName := parseQty(input) + productName = strings.TrimSpace(productName) + + if idx, err := strconv.Atoi(productName); err == nil && idx > 0 && idx <= len(recipes) { + sel.Recipe = &recipes[idx-1] + sel.Count = qty + return sel, "" + } + + matchCount := 0 + for i := range recipes { + outDef, _ := g.ItemStore.Load(recipes[i].Output) + name := recipes[i].Output + if outDef != nil { + name = outDef.Name + } + if action.WordPrefixMatch(productName, name) { + if matchCount == 0 { + sel.Recipe = &recipes[i] + sel.Count = qty + } + matchCount++ + } + } + if matchCount > 1 { + return sel, "ambiguous" + } + if sel.Recipe == nil { + return sel, "never_mind" + } + return sel, "" +} + +func (g *Game) showMenuTable(sess *net.Session, title string, names []string) { + p := sess.Player + tbl := &Table{Title: title} + for i, name := range names { + tbl.Rows = append(tbl.Rows, []string{fmt.Sprintf("%d", i+1), name}) + } + unicode := p.OptionBool("unicode") + sess.WriteLine("") + for _, line := range tbl.Render(unicode) { + sess.WriteLine(line) + } +} + +func (g *Game) handleHowMany(sess *net.Session, input string) { + p := sess.Player + recipeID := sess.PendingRecipeID + sess.PendingRecipeID = "" + sess.State = net.StateGame + + input = strings.TrimSpace(input) + + var count int + if input == "" { + count = 0 + } else if n, err := strconv.Atoi(input); err == nil && n > 0 { + count = n + } else { + sess.WriteLine("Never mind.") + g.reprompt(sess) + return + } + + var recipe *action.RecipeDef + if strings.HasPrefix(recipeID, "combine_") { + itemID := strings.TrimPrefix(recipeID, "combine_") + itemDef, err := g.ItemStore.Load(itemID) + if err != nil || len(itemDef.MadeFrom) == 0 { + g.reprompt(sess) + return + } + recipe = g.buildCombineRecipe(itemDef) + } else { + all, err := g.RecipeStore.LoadAll() + if err != nil { + g.reprompt(sess) + return + } + for _, r := range all { + if r.ID == recipeID { + recipe = &r + break + } + } + } + + if recipe == nil { + g.reprompt(sess) + return + } + + g.startProductionFromRecipe(sess, p, recipe, count) +} + +func (g *Game) buildCombineRecipe(def *object.ItemDef) *action.RecipeDef { + var consume []action.ConsumeEntry + for _, mf := range def.MadeFrom { + consume = append(consume, action.ConsumeEntry{ + Items: mf.Items, + Quantity: mf.Quantity, + Byproducts: mf.Byproducts, + }) + } + wait := def.Ticks + if wait <= 0 { + wait = 2 + } + return &action.RecipeDef{ + ID: "combine_" + def.ID, + Type: "combine", + Wait: wait, + Consume: consume, + Output: def.ID, + Message: fmt.Sprintf("You create %s.", def.Name), + } +} diff --git a/internal/game/core_skill.go b/internal/game/core_skill.go new file mode 100644 index 0000000..c02cdf3 --- /dev/null +++ b/internal/game/core_skill.go @@ -0,0 +1,15 @@ +package game + +import ( + "fmt" + + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) awardSkillXP(sess *net.Session, p *player.Player, skill player.SkillName, xp int) { + newLevel := p.AddSkillXP(skill, xp) + if newLevel > 0 { + sess.WriteLine(g.colorize(sess, "level_up", fmt.Sprintf("*** You are now level %d %s! ***", newLevel, skill))) + } +} diff --git a/internal/game/core_startup.go b/internal/game/core_startup.go new file mode 100644 index 0000000..ab52762 --- /dev/null +++ b/internal/game/core_startup.go @@ -0,0 +1,770 @@ +package game + +import ( + "fmt" + "os" + "path/filepath" + "sort" + "strings" + + "thehouseoficarus/internal/action" +) + +type StartupIssue struct { + Level string + Type string + Message string +} + +func (g *Game) ValidateStartup() []StartupIssue { + var issues []StartupIssue + + issues = append(issues, validateDuplicateIDs(g.DataDir, "items", "item")...) + issues = append(issues, validateDuplicateIDs(g.DataDir, "rooms", "room")...) + issues = append(issues, validateDuplicateIDs(g.DataDir, "mobs", "mob")...) + issues = append(issues, validateDuplicateIDs(g.DataDir, "objects", "object")...) + issues = append(issues, validateDuplicateIDs(g.DataDir, "drops", "drop table")...) + issues = append(issues, validateDuplicateIDs(g.DataDir, "recipes", "recipe")...) + issues = append(issues, validateDuplicateIDs(g.DataDir, "courses", "course")...) + issues = append(issues, validateDuplicateIDs(g.DataDir, "modules", "module")...) + issues = append(issues, validateDuplicateIDs(g.DataDir, "help", "help topic")...) + + issues = append(issues, validateRoomReferences(g)...) + issues = append(issues, validateMobReferences(g)...) + issues = append(issues, validateObjectReferences(g)...) + issues = append(issues, validateItemReferences(g)...) + issues = append(issues, validateRecipeReferences(g)...) + issues = append(issues, validateDropTableReferences(g)...) + issues = append(issues, validateCourseReferences(g)...) + issues = append(issues, validateRoomWiring(g)...) + + return issues +} + +func validateDuplicateIDs(dataDir, subDir, label string) []StartupIssue { + dir := filepath.Join(dataDir, subDir) + dups := action.CheckDuplicateIDs(dir) + var issues []StartupIssue + for _, d := range dups { + short := make([]string, len(d.Paths)) + for i, p := range d.Paths { + short[i] = strings.TrimPrefix(p, dir+"/") + } + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "duplicate", + Message: fmt.Sprintf("Duplicate %s ID %q found in: %s", + label, d.ID, strings.Join(short, ", ")), + }) + } + return issues +} + +func validateRoomReferences(g *Game) []StartupIssue { + var issues []StartupIssue + roomIndex := g.World.RoomIndex() + itemIDs := g.ItemStore.IDSet() + mobIDs := g.MobStore.AllDefIDs() + objIDs := g.ObjectStore.IDSet() + + for id := range roomIndex { + room, err := g.World.LoadRoom(id) + if err != nil { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Room %d: failed to load: %v", id, err), + }) + continue + } + if room.Name == "" { + issues = append(issues, StartupIssue{ + Level: "WARN", + Type: "reference", + Message: fmt.Sprintf("Room %d: has no name", id), + }) + } + + for dir, exit := range room.Exits { + if exit.Room <= 0 { + continue + } + if _, ok := roomIndex[exit.Room]; !ok { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Room %d: exit %q targets nonexistent room %d", + id, dir, exit.Room), + }) + } + } + + for _, rm := range room.Mobs { + if rm.ID == "" { + continue + } + if _, ok := mobIDs[rm.ID]; !ok { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Room %d: references nonexistent mob %q", + id, rm.ID), + }) + } + for _, wr := range rm.WanderRooms { + if _, ok := roomIndex[wr]; !ok { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Room %d: mob %q wander_rooms references nonexistent room %d", + id, rm.ID, wr), + }) + } + } + } + + for _, s := range room.ItemSpawns { + if s.ID != "" && !itemIDs[s.ID] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Room %d: spawns nonexistent item %q", + id, s.ID), + }) + } + } + + for _, robj := range room.Objects { + if robj.ID != "" && !objIDs[robj.ID] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Room %d: references nonexistent object %q", + id, robj.ID), + }) + } + for _, wr := range robj.WanderRooms { + if _, ok := roomIndex[wr]; !ok { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Room %d: object %q wander_rooms references nonexistent room %d", + id, robj.ID, wr), + }) + } + } + } + } + + return issues +} + +func validateMobReferences(g *Game) []StartupIssue { + var issues []StartupIssue + itemIDs := g.ItemStore.IDSet() + dropIDs := dropTableIDSet(g.DataDir) + mobIDs := g.MobStore.AllDefIDs() + + for id := range mobIDs { + def, err := g.MobStore.LoadDef(id) + if err != nil { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Mob %q: failed to load: %v", id, err), + }) + continue + } + if def.Name == "" { + issues = append(issues, StartupIssue{ + Level: "WARN", + Type: "reference", + Message: fmt.Sprintf("Mob %q: has no name", id), + }) + } + + if def.Drops.Remains != "" && !itemIDs[def.Drops.Remains] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Mob %q: drops remains (item %q) does not exist", + id, def.Drops.Remains), + }) + } + + for _, d := range def.Drops.Loot { + if d.ItemID != "" && !itemIDs[d.ItemID] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Mob %q: loot item %q does not exist", + id, d.ItemID), + }) + } + if d.Table != "" && !dropIDs[d.Table] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Mob %q: loot table %q does not exist", + id, d.Table), + }) + } + } + + if def.StealTable != "" && !dropIDs[def.StealTable] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Mob %q: steal_table %q does not exist", + id, def.StealTable), + }) + } + + if def.FinishingBlow != "" && !itemIDs[def.FinishingBlow] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Mob %q: finishing_blow item %q does not exist", + id, def.FinishingBlow), + }) + } + } + + return issues +} + +func validateObjectReferences(g *Game) []StartupIssue { + var issues []StartupIssue + objIDs := g.ObjectStore.IDSet() + itemIDs := g.ItemStore.IDSet() + mobIDs := g.MobStore.AllDefIDs() + dropIDs := dropTableIDSet(g.DataDir) + roomIndex := g.World.RoomIndex() + + for id := range objIDs { + obj, err := g.ObjectStore.Load(id) + if err != nil { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Object %q: failed to load: %v", id, err), + }) + continue + } + if obj.Name == "" { + issues = append(issues, StartupIssue{ + Level: "WARN", + Type: "reference", + Message: fmt.Sprintf("Object %q: has no name", id), + }) + } + + if obj.RemovalItem != "" && !itemIDs[obj.RemovalItem] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Object %q: removal_item %q does not exist", + id, obj.RemovalItem), + }) + } + + if obj.StealTable != "" && !dropIDs[obj.StealTable] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Object %q: steal_table %q does not exist", + id, obj.StealTable), + }) + } + + if obj.GuardMob != "" && !mobIDs[obj.GuardMob] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Object %q: guard_mob %q does not exist", + id, obj.GuardMob), + }) + } + + for _, ui := range obj.UseInteractions { + if ui.Item != "" && !itemIDs[ui.Item] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Object %q: use_interaction item %q does not exist", + id, ui.Item), + }) + } + if ui.Action != nil { + issues = append(issues, validateNodeAction(fmt.Sprintf("Object %q: use_interaction", id), ui.Action, itemIDs, roomIndex)...) + } + } + + if obj.Gather != nil { + issues = append(issues, validateGatherConfig(fmt.Sprintf("Object %q: gather", id), obj.Gather, itemIDs, dropIDs)...) + } + + if obj.Talk != nil { + issues = append(issues, validateTalkConfig(fmt.Sprintf("Object %q: talk", id), obj.Talk, itemIDs, roomIndex)...) + } + + if obj.Use != nil { + issues = append(issues, validateUseConfig(fmt.Sprintf("Object %q: use", id), obj.Use, itemIDs)...) + } + } + + return issues +} + +func validateItemReferences(g *Game) []StartupIssue { + var issues []StartupIssue + itemIDs := g.ItemStore.IDSet() + dropIDs := dropTableIDSet(g.DataDir) + + for id := range itemIDs { + def, err := g.ItemStore.Load(id) + if err != nil { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Item %q: failed to load: %v", id, err), + }) + continue + } + if def.Name == "" { + issues = append(issues, StartupIssue{ + Level: "WARN", + Type: "reference", + Message: fmt.Sprintf("Item %q: has no name", id), + }) + } + + if def.SearchTable != "" && !dropIDs[def.SearchTable] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Item %q: search_table %q does not exist", + id, def.SearchTable), + }) + } + + if def.SearchMiscTable != "" && !dropIDs[def.SearchMiscTable] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Item %q: search_misc_table %q does not exist", + id, def.SearchMiscTable), + }) + } + + for _, mf := range def.MadeFrom { + for _, item := range mf.Items { + if item != "" && !itemIDs[item] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Item %q: made_from item %q does not exist", + id, item), + }) + } + } + for _, bp := range mf.Byproducts { + if bp != "" && !itemIDs[bp] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Item %q: made_from byproduct %q does not exist", + id, bp), + }) + } + } + } + + if def.FarmProduct != "" && !itemIDs[def.FarmProduct] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Item %q (seed): farm_product %q does not exist", + id, def.FarmProduct), + }) + } + } + + return issues +} + +func validateRecipeReferences(g *Game) []StartupIssue { + var issues []StartupIssue + itemIDs := g.ItemStore.IDSet() + + allRecipes, err := g.RecipeStore.LoadAll() + if err != nil { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Failed to load recipes: %v", err), + }) + return issues + } + + recipeIDs := make(map[string]bool) + for _, r := range allRecipes { + if r.ID != "" { + if recipeIDs[r.ID] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "duplicate", + Message: fmt.Sprintf("Recipe %q: duplicate ID field (two recipe files with same ID value)", + r.ID), + }) + } + recipeIDs[r.ID] = true + } + + for _, e := range r.Consume { + for _, item := range e.Items { + if item != "" && !itemIDs[item] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Recipe %q (%s): consumes nonexistent item %q", + r.ID, r.Type, item), + }) + } + } + } + + if r.Output != "" && !itemIDs[r.Output] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Recipe %q (%s): output item %q does not exist", + r.ID, r.Type, r.Output), + }) + } + + if r.Fail != "" && !itemIDs[r.Fail] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Recipe %q (%s): fail product %q does not exist", + r.ID, r.Type, r.Fail), + }) + } + } + + return issues +} + +func validateDropTableReferences(g *Game) []StartupIssue { + var issues []StartupIssue + dropIDs := dropTableIDSet(g.DataDir) + itemIDs := g.ItemStore.IDSet() + + for id := range dropIDs { + dt, err := action.LoadDropTable(g.DataDir, id) + if err != nil { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Drop table %q: failed to load: %v", id, err), + }) + continue + } + for _, d := range dt.Drops { + if d.ItemID != "" && !itemIDs[d.ItemID] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Drop table %q: drops nonexistent item %q", + id, d.ItemID), + }) + } + if d.Table != "" && !dropIDs[d.Table] && d.Table != id { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Drop table %q: references nonexistent sub-table %q", + id, d.Table), + }) + } + } + } + + return issues +} + +func validateCourseReferences(g *Game) []StartupIssue { + var issues []StartupIssue + roomIndex := g.World.RoomIndex() + + courses := g.CourseStore.AllCourses() + for id, cfg := range courses { + if cfg.StartRoom > 0 { + if _, ok := roomIndex[cfg.StartRoom]; !ok { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Course %q: start_room %d does not exist", + id, cfg.StartRoom), + }) + } + } + for _, obs := range cfg.Obstacles { + if _, ok := roomIndex[obs.RoomID]; !ok { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("Course %q: obstacle room %d does not exist", + id, obs.RoomID), + }) + } + } + } + + return issues +} + +func validateRoomWiring(g *Game) []StartupIssue { + var issues []StartupIssue + roomIndex := g.World.RoomIndex() + cfg := g.ValidationConfig + + sourceSet := make(map[int]bool) + for _, s := range cfg.CheckSources { + sourceSet[s] = true + } + + ignoreTo := make(map[int]bool) + for _, r := range cfg.IgnoreUnreachable { + ignoreTo[r] = true + } + + hasExitTo := make(map[int]bool) + for id := range roomIndex { + room, err := g.World.LoadRoom(id) + if err != nil { + continue + } + for _, exit := range room.Exits { + if exit.Room > 0 { + hasExitTo[exit.Room] = true + } + } + } + + var orphans []int + for id := range roomIndex { + if ignoreTo[id] { + continue + } + if sourceSet[id] { + continue + } + if !hasExitTo[id] { + orphans = append(orphans, id) + } + } + if len(orphans) > 0 { + sort.Ints(orphans) + var strs []string + for _, id := range orphans { + strs = append(strs, fmt.Sprintf("%d", id)) + } + issues = append(issues, StartupIssue{ + Level: "WARN", + Type: "integrity", + Message: fmt.Sprintf("Orphan rooms (no exit leads to them): %s", + strings.Join(strs, ", ")), + }) + } + + return issues +} + +func validateGatherConfig(prefix string, cfg *action.GatherConfig, itemIDs map[string]bool, dropIDs map[string]bool) []StartupIssue { + var issues []StartupIssue + + if cfg.Bait != "" && !itemIDs[cfg.Bait] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("%s: bait item %q does not exist", + prefix, cfg.Bait), + }) + } + + for _, d := range cfg.Drops { + if d.ItemID != "" && !itemIDs[d.ItemID] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("%s: drop item %q does not exist", + prefix, d.ItemID), + }) + } + if d.Table != "" && !dropIDs[d.Table] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("%s: drop table %q does not exist", + prefix, d.Table), + }) + } + } + + return issues +} + +func validateTalkConfig(prefix string, cfg *action.TalkConfig, itemIDs map[string]bool, roomIndex map[int]bool) []StartupIssue { + var issues []StartupIssue + if cfg == nil { + return issues + } + for nodeID, node := range cfg.Nodes { + nodePrefix := fmt.Sprintf("%s: node %q", prefix, nodeID) + if node.Action != nil { + issues = append(issues, validateNodeAction(nodePrefix, node.Action, itemIDs, roomIndex)...) + } + } + return issues +} + +func validateUseConfig(prefix string, cfg *action.UseConfig, itemIDs map[string]bool) []StartupIssue { + var issues []StartupIssue + if cfg == nil { + return issues + } + + for itemID := range cfg.Consume { + if itemID != "" && !itemIDs[itemID] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("%s: consumes nonexistent item %q", + prefix, itemID), + }) + } + } + + if cfg.Reward.ItemID != "" && !itemIDs[cfg.Reward.ItemID] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("%s: reward item %q does not exist", + prefix, cfg.Reward.ItemID), + }) + } + + return issues +} + +func validateNodeAction(prefix string, na *action.NodeAction, itemIDs map[string]bool, roomIndex map[int]bool) []StartupIssue { + var issues []StartupIssue + if na == nil { + return issues + } + + if na.GiveItem != "" && !itemIDs[na.GiveItem] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("%s: give_item %q does not exist", + prefix, na.GiveItem), + }) + } + + if na.TakeItem != "" && !itemIDs[na.TakeItem] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("%s: take_item %q does not exist", + prefix, na.TakeItem), + }) + } + + if na.Teleport > 0 { + if _, ok := roomIndex[na.Teleport]; !ok { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("%s: teleport to nonexistent room %d", + prefix, na.Teleport), + }) + } + } + + if na.Shop != nil { + for _, si := range na.Shop.Items { + if si.ItemID != "" && !itemIDs[si.ItemID] { + issues = append(issues, StartupIssue{ + Level: "ERROR", + Type: "reference", + Message: fmt.Sprintf("%s: shop item %q does not exist", + prefix, si.ItemID), + }) + } + } + } + + return issues +} + +func dropTableIDSet(dataDir string) map[string]bool { + dir := filepath.Join(dataDir, "drops") + ids := make(map[string]bool) + action.WalkYAMLDir(dir, func(path, id string, data []byte) error { + ids[id] = true + return nil + }) + return ids +} + +func (cs *CourseStore) AllCourses() map[string]*CourseConfig { + cs.mu.Lock() + defer cs.mu.Unlock() + if !cs.loaded { + cs.loadAllLocked() + } + return cs.courses +} + +func (g *Game) ValidateAndLog() { + LogStartupIssues(g.ValidateStartup()) +} + +func LogStartupIssues(issues []StartupIssue) { + if len(issues) == 0 { + fmt.Fprintf(os.Stderr, "Startup validation: OK\n") + return + } + + errors := 0 + warns := 0 + for _, issue := range issues { + if issue.Level == "ERROR" { + errors++ + } else { + warns++ + } + } + + fmt.Fprintf(os.Stderr, "\n=== Startup Validation: %d error(s), %d warning(s) ===\n\n", errors, warns) + + sort.Slice(issues, func(i, j int) bool { + if issues[i].Level != issues[j].Level { + return issues[i].Level == "ERROR" + } + return issues[i].Message < issues[j].Message + }) + + for _, issue := range issues { + tag := fmt.Sprintf("[%s]", issue.Level) + fmt.Fprintf(os.Stderr, " %-7s %s\n", tag, issue.Message) + } + fmt.Fprintln(os.Stderr) + + if errors > 0 { + fmt.Fprintf(os.Stderr, "*** %d startup errors detected. The server may behave unexpectedly. ***\n", errors) + } +} \ No newline at end of file diff --git a/internal/game/core_stations.go b/internal/game/core_stations.go new file mode 100644 index 0000000..d30a35c --- /dev/null +++ b/internal/game/core_stations.go @@ -0,0 +1,28 @@ +package game + +func (g *Game) findStation(roomID int, stationIDs []string) (defID string, displayName string) { + for _, obj := range g.World.AllObjInstances(roomID) { + if obj.Depleted { + continue + } + for _, sid := range stationIDs { + if obj.DefID == sid { + name := sid + if def, err := g.ObjectStore.Load(sid); err == nil { + name = def.Name + } + return sid, name + } + } + } + return "", "" +} + +func stationMatch(defID string, recipeStations []string) bool { + for _, rs := range recipeStations { + if rs == defID { + return true + } + } + return false +} diff --git a/internal/game/core_types.go b/internal/game/core_types.go new file mode 100644 index 0000000..d41b18a --- /dev/null +++ b/internal/game/core_types.go @@ -0,0 +1,29 @@ +package game + +import "thehouseoficarus/internal/object" + +var EquipSlots = []object.EquipSlot{ + object.SlotHead, object.SlotNeck, object.SlotTorso, object.SlotLegs, + object.SlotHands, object.SlotFeet, object.SlotBack, object.SlotAmmo, + object.SlotMainHand, object.SlotOffHand, object.SlotRing, +} + +type itemMatch struct { + ID string + Name string + Slot int +} + +type xpGain struct { + Skill string + XP int +} + +type deathDrop struct { + itemID string + quantity int + totalVal int + isEquip bool + equipSlot object.EquipSlot + invSlot int +} diff --git a/internal/game/core_utils.go b/internal/game/core_utils.go new file mode 100644 index 0000000..409422e --- /dev/null +++ b/internal/game/core_utils.go @@ -0,0 +1,116 @@ +package game + +import ( + "fmt" + "math/rand" + "strconv" + "strings" + + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" + "thehouseoficarus/internal/world" +) + +func plural(n int) string { + if n == 1 { + return "" + } + return "s" +} + +func parseQty(input string) (int, string) { + parts := strings.Fields(input) + if len(parts) > 1 { + if n, err := strconv.Atoi(parts[0]); err == nil && n > 0 { + return n, strings.Join(parts[1:], " ") + } + } + return 0, input +} + +func parseChoiceIndex(s string) (int, error) { + var idx int + _, err := fmt.Sscanf(s, "%d", &idx) + return idx, err +} + +func mobDisplayName(m *world.MobInstance, definite bool) string { + if m.Unique { + return m.Name + } + if definite { + return "the " + m.Name + } + return "a " + m.Name +} + +func mobCombatLevel(m *world.MobInstance) int { + base := float64(m.Defense+m.MaxHP) / 4.0 + melee := float64(m.Attack+m.Strength) / 4.0 + ranged := float64(m.Ranged) * 3.0 / 8.0 + science := float64(m.Science) * 3.0 / 8.0 + best := melee + if ranged > best { + best = ranged + } + if science > best { + best = science + } + return int(base + best + 0.5) +} + +func uniqueItemNames(matches []itemMatch) []string { + seen := make(map[string]bool) + var out []string + for _, m := range matches { + if !seen[m.Name] { + seen[m.Name] = true + out = append(out, m.Name) + } + } + return out +} + +func (g *Game) showWhichOne(sess *net.Session, matches []itemMatch) { + sess.WriteLine("Which one?") + seen := make(map[string]bool) + for _, m := range matches { + if seen[m.Name] { + continue + } + seen[m.Name] = true + def, _ := g.ItemStore.Load(m.ID) + coloredName := g.itemColorize(sess, def, m.Name) + sess.WriteLine(fmt.Sprintf(" - %s", coloredName)) + } +} + +func randInt(max int) int { + if max <= 0 { + return 0 + } + return rand.Intn(max) +} + +func formatPickupList(sess *net.Session, picked []string) { + for i, name := range picked { + if i == len(picked)-1 { + sess.WriteLine(name) + } else if i == len(picked)-2 { + sess.Write(name + " and ") + } else { + sess.Write(name + ", ") + } + } +} + +func (g *Game) newInventorySlot(itemID string, qty int) *player.InventorySlot { + slot := &player.InventorySlot{ItemID: itemID, Quantity: qty} + if def, err := g.ItemStore.Load(itemID); err == nil && def.MaxQuality > 0 { + slot.Quality = def.Quality + slot.MaxQuality = def.MaxQuality + } + return slot +} + + diff --git a/internal/game/course.go b/internal/game/course.go deleted file mode 100644 index 335c97f..0000000 --- a/internal/game/course.go +++ /dev/null @@ -1,141 +0,0 @@ -package game - -import ( - "os" - "path/filepath" - "sync" - - "gopkg.in/yaml.v3" -) - -type ObstacleDef struct { - RoomID int `yaml:"room_id"` - Verb string `yaml:"verb"` - TicksPerPhase float64 `yaml:"ticks_per_phase"` - XP int `yaml:"xp"` - FailDamage [2]int `yaml:"fail_damage"` - Messages []string `yaml:"messages"` -} - -type CourseConfig struct { - ID string `yaml:"id"` - Name string `yaml:"name"` - RequiredLevel int `yaml:"required_level"` - StartRoom int `yaml:"start_room"` - CompletionXP int `yaml:"completion_xp"` - Obstacles []ObstacleDef `yaml:"obstacles"` -} - -type ObstacleInfo struct { - CourseID string - CourseName string - ObstacleIndex int - TotalObstacles int - Verb string - Messages []string - TicksPerPhase float64 - ObstacleXP int - CompletionXP int - FailDamage [2]int - NextRoom int - StartRoom int - RequiredLevel int -} - -var obstacleVerbs = map[string]bool{} - -var verbGerund = map[string]string{ - "scramble": "scrambling", - "jump": "jumping", - "swing": "swinging", - "balance": "balancing", - "climb": "climbing", - "crawl": "crawling", - "vault": "vaulting", - "leap": "leaping", - "slide": "sliding", -} - -type CourseStore struct { - dataDir string - mu sync.Mutex - courses map[string]*CourseConfig - roomToObstacle map[int]*ObstacleInfo - loaded bool -} - -func NewCourseStore(dataDir string) *CourseStore { - return &CourseStore{ - dataDir: dataDir, - courses: make(map[string]*CourseConfig), - } -} - -func (cs *CourseStore) LoadAll() { - cs.mu.Lock() - defer cs.mu.Unlock() - cs.loadAllLocked() -} - -func (cs *CourseStore) GetObstacle(roomID int) *ObstacleInfo { - cs.mu.Lock() - defer cs.mu.Unlock() - if !cs.loaded { - cs.loadAllLocked() - } - return cs.roomToObstacle[roomID] -} - -func (cs *CourseStore) loadAllLocked() { - cs.loaded = true - cs.roomToObstacle = make(map[int]*ObstacleInfo) - localVerbs := make(map[string]bool) - - pattern := filepath.Join(cs.dataDir, "courses", "*.yaml") - files, _ := filepath.Glob(pattern) - - for _, f := range files { - data, err := os.ReadFile(f) - if err != nil { - continue - } - var cfg CourseConfig - if err := yaml.Unmarshal(data, &cfg); err != nil { - continue - } - cs.courses[cfg.ID] = &cfg - - totalObstacles := len(cfg.Obstacles) - for i, obs := range cfg.Obstacles { - nextRoom := 0 - if i < totalObstacles-1 { - nextRoom = cfg.Obstacles[i+1].RoomID - } - - completionXP := 0 - if i == totalObstacles-1 { - completionXP = cfg.CompletionXP - } - - info := &ObstacleInfo{ - CourseID: cfg.ID, - CourseName: cfg.Name, - ObstacleIndex: i, - TotalObstacles: totalObstacles, - Verb: obs.Verb, - Messages: obs.Messages, - TicksPerPhase: obs.TicksPerPhase, - ObstacleXP: obs.XP, - CompletionXP: completionXP, - FailDamage: obs.FailDamage, - NextRoom: nextRoom, - StartRoom: cfg.StartRoom, - RequiredLevel: cfg.RequiredLevel, - } - cs.roomToObstacle[obs.RoomID] = info - localVerbs[obs.Verb] = true - } - } - - obstacleVerbs = localVerbs -} diff --git a/internal/game/death.go b/internal/game/death.go deleted file mode 100644 index d2c1b73..0000000 --- a/internal/game/death.go +++ /dev/null @@ -1,66 +0,0 @@ -package game - -import ( - "sort" - - "thehouseoficarus/internal/player" -) - -func (g *Game) dropItemsOnDeath(p *player.Player) { - roomID := p.RoomID - - if p.Credits > 0 { - g.World.AddGroundItem(roomID, "credits", p.Credits) - p.Credits = 0 - } - - var items []deathDrop - - for slot, inv := range p.Inventory { - if inv == nil || inv.Quantity <= 0 { - continue - } - val := 0 - if def, err := g.ItemStore.Load(inv.ItemID); err == nil { - val = def.Value * inv.Quantity - } - items = append(items, deathDrop{ - itemID: inv.ItemID, - quantity: inv.Quantity, - totalVal: val, - invSlot: slot, - }) - } - - for eqSlot, itemID := range p.Equipment { - val := 0 - if def, err := g.ItemStore.Load(itemID); err == nil { - val = def.Value - } - items = append(items, deathDrop{ - itemID: itemID, - quantity: 1, - totalVal: val, - isEquip: true, - equipSlot: eqSlot, - }) - } - - if len(items) <= 3 { - return - } - - sort.Slice(items, func(i, j int) bool { - return items[i].totalVal > items[j].totalVal - }) - - for i := 3; i < len(items); i++ { - it := items[i] - if it.isEquip { - delete(p.Equipment, it.equipSlot) - } else { - p.SetInvSlot(it.invSlot, nil) - } - g.World.AddGroundItem(roomID, it.itemID, it.quantity) - } -} diff --git a/internal/game/equip_stats.go b/internal/game/equip_stats.go deleted file mode 100644 index 02b8348..0000000 --- a/internal/game/equip_stats.go +++ /dev/null @@ -1,41 +0,0 @@ -package game - -import ( - "thehouseoficarus/internal/object" - "thehouseoficarus/internal/player" -) - -func (g *Game) playerEquipBonuses(p *player.Player) object.ItemStats { - var totals object.ItemStats - for _, itemID := range p.Equipment { - def, err := g.ItemStore.Load(itemID) - if err != nil { - continue - } - totals.StabAttack += def.Stats.StabAttack - totals.SlashAttack += def.Stats.SlashAttack - totals.CrushAttack += def.Stats.CrushAttack - totals.ScienceAttack += def.Stats.ScienceAttack - totals.RangedAttack += def.Stats.RangedAttack - totals.StabDefense += def.Stats.StabDefense - totals.SlashDefense += def.Stats.SlashDefense - totals.CrushDefense += def.Stats.CrushDefense - totals.ScienceDefense += def.Stats.ScienceDefense - totals.RangedDefense += def.Stats.RangedDefense - totals.StrengthBonus += def.Stats.StrengthBonus - totals.RangedStrength += def.Stats.RangedStrength - totals.ScienceDamage += def.Stats.ScienceDamage - totals.TechnologyBonus += def.Stats.TechnologyBonus - } - return totals -} - -func (g *Game) playerWeaponSpeed(p *player.Player) float64 { - if itemID, ok := p.Equipment[object.SlotMainHand]; ok { - def, err := g.ItemStore.Load(itemID) - if err == nil && def.Speed > 0 { - return def.Speed - } - } - return 5.0 -} diff --git a/internal/game/game.go b/internal/game/game.go index b8eadce..5d6e21e 100644 --- a/internal/game/game.go +++ b/internal/game/game.go @@ -35,18 +35,19 @@ type QueuedCommand struct { } type Game struct { - World *world.World - ObjectStore *object.ObjectStore - ItemStore *object.ItemStore - AccountStore *player.AccountStore - MobStore *world.MobStore - RecipeStore *action.RecipeStore - CourseStore *CourseStore - Hub *net.Hub - Ticks *engine.Engine - WorldFlags map[string]any - ColorConfig *config.ColorsConfig - DataDir string + World *world.World + ObjectStore *object.ObjectStore + ItemStore *object.ItemStore + AccountStore *player.AccountStore + MobStore *world.MobStore + RecipeStore *action.RecipeStore + CourseStore *CourseStore + Hub *net.Hub + Ticks *engine.Engine + WorldFlags map[string]any + ColorConfig *config.ColorsConfig + DataDir string + ValidationConfig config.StartupValidationConfig restTimers map[string]uint64 charsMu sync.Mutex loggedInChars map[string]*net.Session @@ -59,7 +60,7 @@ type Game struct { hackingStates map[string]*hacking.Session } -func New(dataDir string, colorConfig *config.ColorsConfig) *Game { +func New(dataDir string, colorConfig *config.ColorsConfig, valConfig config.StartupValidationConfig) *Game { g := &Game{ World: world.New(dataDir), ObjectStore: object.NewObjectStore(dataDir), @@ -72,6 +73,7 @@ func New(dataDir string, colorConfig *config.ColorsConfig) *Game { WorldFlags: make(map[string]any), ColorConfig: colorConfig, DataDir: dataDir, + ValidationConfig: valConfig, restTimers: make(map[string]uint64), loggedInChars: make(map[string]*net.Session), freeQueue: make(map[string][]QueuedCommand), @@ -83,6 +85,7 @@ func New(dataDir string, colorConfig *config.ColorsConfig) *Game { } g.CourseStore.LoadAll() g.LoadMods() + g.ValidateAndLog() return g } diff --git a/internal/game/hacking.go b/internal/game/hacking.go deleted file mode 100644 index 3457728..0000000 --- a/internal/game/hacking.go +++ /dev/null @@ -1,93 +0,0 @@ -package game - -import ( - "fmt" - "strings" - - "thehouseoficarus/internal/game/hacking" - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/player" -) - -func (g *Game) handleHackingInput(sess *net.Session, input string) { - p := sess.Player - if p == nil { - sess.State = net.StateGame - return - } - - hs, ok := g.hackingStates[p.Name] - if !ok { - sess.State = net.StateGame - g.writePrompt(sess) - return - } - - input = strings.TrimSpace(input) - lower := strings.ToLower(input) - - if lower == "jack out" || lower == "quit" || lower == "disconnect" { - g.endHacking(sess, p, false, false) - return - } - - hs.Started = true - output, done, won := hs.Minigame.HandleInput(input) - - sess.WriteLine(output) - - if done { - g.endHacking(sess, p, true, won) - return - } - - sess.Write("\nhack> ") -} - -func (g *Game) endHacking(sess *net.Session, p *player.Player, completed bool, won bool) { - hs, ok := g.hackingStates[p.Name] - if !ok { - sess.State = net.StateGame - g.writePrompt(sess) - return - } - - tDef := hacking.Terminals[hs.TerminalID] - var xp int - - if completed && won { - xp = hacking.CalcXP(tDef.BaseXPWin, hs.Level, hs.ReqLevel) - sess.WriteLine("\nConnection terminated. Contract complete.") - } else if completed { - xp = hacking.CalcXP(tDef.BaseXPLose, hs.Level, hs.ReqLevel) - sess.WriteLine("\nConnection lost.") - } else if hs.Started { - xp = hacking.CalcXP(tDef.BaseXPLose, hs.Level, hs.ReqLevel) - sess.WriteLine("\nYou jack out of the terminal.") - } else { - sess.WriteLine("\nYou jack out of the terminal.") - } - - if won { - if b, ok := hs.Minigame.(hacking.XPBonuser); ok { - bonus := b.BonusXP() - if bonus > 0 { - xp += hacking.CalcXP(bonus, hs.Level, hs.ReqLevel) - } - } - } - - if xp > 0 { - g.awardSkillXP(sess, p, player.Hacking, xp) - if p.OptionBool("xp_drops") { - sess.WriteLine(g.colorize(sess, "xp", - fmt.Sprintf("(+%dxp %s)", xp, player.SkillAbbr[player.Hacking]))) - } - g.AccountStore.SaveCharacter(p) - } - - delete(g.hackingStates, p.Name) - p.ActionState = nil - sess.State = net.StateGame - g.writePrompt(sess) -} diff --git a/internal/game/help.go b/internal/game/help.go deleted file mode 100644 index 03e2b8c..0000000 --- a/internal/game/help.go +++ /dev/null @@ -1,155 +0,0 @@ -package game - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "thehouseoficarus/internal/net" - "gopkg.in/yaml.v3" -) - -type HelpDef struct { - Name string `yaml:"name"` - Category string `yaml:"category"` - Content string `yaml:"description"` -} - -type cmdEntry struct { - Name string - Type string - Desc string -} - -var commandList = []cmdEntry{ - {"alias", "Instant", "Create command shortcuts"}, - {"attack / kill", "Active", "Attack a mob"}, - {"autotrigger / auto", "Instant", "Set a module to auto-trigger"}, - {"bank", "Active", "Open bank interface"}, - {"burn", "Active", "Start a fire"}, - {"chop / cut", "Active", "Chop trees (Woodcutting)"}, - {"clean", "Free", "Clean grimy herbs (Pharmacy)"}, - {"color / colors", "Instant", "Customize display colors"}, - {"colortable", "Instant", "Display color reference chart"}, - {"construct / make", "Active", "Build furniture (Construction)"}, - {"cook", "Active", "Cook raw food on a fire or range"}, - {"craft", "Active", "Craft jewelry (Crafting)"}, - {"description / desc", "Instant", "Set your character description"}, - {"drink", "Free", "Drink a potion"}, - {"drop", "Active", "Drop items to the ground"}, - {"eat", "Free", "Eat food to restore hitpoints"}, - {"equipment / eq", "Instant", "Show equipped items"}, - {"exits", "Instant", "List available exits"}, - {"farm", "Active", "Farm crops (Farming)"}, - {"fish", "Active", "Fish at fishing spots (Fishing)"}, - {"fletch", "Free", "Fletch logs into bows (Fletching)"}, - {"get / take / pick", "Active", "Pick up items from the ground"}, - {"help", "Instant", "Show help topics"}, - {"id / identify", "Active", "Identify herbs (Pharmacy)"}, - {"inventory / i / inv", "Instant", "Show your inventory"}, - {"jack / jackin", "Active", "Jack into a terminal (Hacking)"}, - {"look / l", "Instant", "Look around or examine things"}, - {"map", "Instant", "Display an ASCII map of the area"}, - {"mine", "Active", "Mine rocks (Mining)"}, - {"mix", "Active", "Mix potions (Pharmacy)"}, - {"mods / modlist", "Instant", "List available science modules"}, - {"north / south / east / west / up / down", "Active", "Move in a direction"}, - {"option / options", "Instant", "View or change settings"}, - {"prompt", "Instant", "Set custom command prompt"}, - {"pull / push", "Active", "Interact with objects"}, - {"queued", "Instant", "Show pending tick actions"}, - {"quit", "Active", "Rest and disconnect"}, - {"remove / unwear / unwield", "Free", "Unequip items"}, - {"say", "Instant", "Chat with players in your room"}, - {"score / sc", "Instant", "View your stats and skills"}, - {"search", "Active", "Search items for loot"}, - {"smelt", "Active", "Smelt ore into bars (Smithing)"}, - {"smith", "Active", "Smith bars into items (Smithing)"}, - {"sneak", "Instant", "Toggle sneak mode"}, - {"steal", "Active", "Steal from mobs (Thieving)"}, - {"stoke", "Active", "Add logs to a fire"}, - {"style", "Instant", "Change combat style"}, - {"talk / speak / ask", "Active", "Talk to NPCs"}, - {"tech", "Instant", "Toggle technology abilities"}, - {"trigger", "Active", "Trigger a science module"}, - {"unalias", "Instant", "Remove command shortcuts"}, - {"use", "Active", "Use an object (crafting)"}, - {"walk", "Active", "Pathfind to a room or multi-step walk"}, - {"wear / wield", "Free", "Equip items"}, -} - -func LoadHelp(dataDir string) ([]HelpDef, error) { - dir := filepath.Join(dataDir, "help") - entries, err := os.ReadDir(dir) - if err != nil { - return nil, err - } - - var helps []HelpDef - for _, entry := range entries { - if entry.IsDir() || filepath.Ext(entry.Name()) != ".yaml" { - continue - } - data, err := os.ReadFile(filepath.Join(dir, entry.Name())) - if err != nil { - continue - } - var h HelpDef - if err := yaml.Unmarshal(data, &h); err != nil { - continue - } - helps = append(helps, h) - } - return helps, nil -} - -func (g *Game) doHelp(sess *net.Session, topic string) { - if topic == "" { - unicode := true - if p := sess.Player; p != nil { - unicode = p.OptionBool("unicode") - } - - sess.WriteLine("") - t := &Table{ - Title: "Commands", - Columns: []string{"Command", "Type", "Description"}, - } - for _, c := range commandList { - t.Rows = append(t.Rows, []string{c.Name, c.Type, c.Desc}) - } - for _, line := range t.Render(unicode) { - sess.WriteLine(line) - } - sess.WriteLine("") - sess.WriteLine("Command types: Instant (runs immediately), Free (queued before active),") - sess.WriteLine("Active (replaces current action, queued per tick).") - sess.WriteLine("") - sess.WriteLine("Use 'help ' for detailed usage of a specific command.") - sess.WriteLine("Use 'option' to view and change settings, 'color' to customize colors.") - return - } - - helps, err := LoadHelp(g.DataDir) - if err != nil || len(helps) == 0 { - sess.WriteLine("No help available.") - return - } - - topic = strings.ToLower(topic) - for _, h := range helps { - if strings.ToLower(h.Name) == topic { - sess.WriteLine(fmt.Sprintf("\n %s", h.Content)) - return - } - } - sess.WriteLine(fmt.Sprintf("No help found for '%s'.", topic)) -} - -func firstLine(s string) string { - if idx := strings.Index(s, "\n"); idx >= 0 { - return s[:idx] - } - return s -} diff --git a/internal/game/login_account.go b/internal/game/login_account.go deleted file mode 100644 index 87f8c62..0000000 --- a/internal/game/login_account.go +++ /dev/null @@ -1,351 +0,0 @@ -package game - -import ( - "fmt" - "os" - "strings" - - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/player" -) - -func (g *Game) handleAccountName(sess *net.Session, input string) { - name := strings.TrimSpace(input) - if name == "" { - sess.Write("Account name: ") - return - } - actualName, err := g.AccountStore.FindAccount(name) - if err == nil { - sess.Account = &player.Account{Name: actualName} - sess.State = net.StatePassword - sess.Conn.SetEcho(false) - sess.Write("Password: ") - } else { - if verr := player.ValidName(name); verr != nil { - sess.WriteLine(verr.Error()) - sess.Write("Account name: ") - return - } - sess.Account = &player.Account{Name: name} - sess.State = net.StateNewAccountPass - sess.Conn.SetEcho(false) - sess.WriteLine("\r\nOh, a new visitor to this rock!") - sess.Write("Choose password: ") - } -} - -func (g *Game) handlePassword(sess *net.Session, input string) { - if input == "" { - sess.Write("Password: ") - return - } - if len(input) > 128 { - sess.Conn.SetEcho(true) - sess.WriteLine("Wrong password.") - sess.State = net.StateAccountName - sess.Write("Account name: ") - return - } - acc, err := g.AccountStore.LoadAccount(sess.Account.Name) - if err != nil { - sess.Conn.SetEcho(true) - sess.WriteLine("Error loading account.") - sess.State = net.StateAccountName - sess.Write("Account name: ") - return - } - if !player.CheckPassword(input, acc.PasswordHash) { - sess.Conn.SetEcho(true) - sess.WriteLine("Wrong password.") - sess.State = net.StateAccountName - sess.Write("Account name: ") - return - } - sess.Conn.SetEcho(true) - sess.Account = &player.Account{ - Name: acc.Name, - PasswordHash: acc.PasswordHash, - Characters: acc.Characters, - Aliases: acc.Aliases, - Colors: acc.Colors, - Options: acc.Options, - } - if sess.Account.Aliases == nil { - sess.Account.Aliases = make(map[string]string) - } - if sess.Account.Colors == nil { - sess.Account.Colors = make(map[string]string) - } - if sess.Account.Options == nil { - sess.Account.Options = make(map[string]any) - } - g.showMenu(sess) -} - -func (g *Game) handleNewAccountPass(sess *net.Session, input string) { - input = strings.TrimSpace(input) - if input == "" { - sess.Conn.SetEcho(true) - sess.Account = nil - sess.State = net.StateAccountName - sess.Write("Account name: ") - return - } - if verr := player.ValidPassword(input); verr != nil { - sess.WriteLine(verr.Error()) - sess.Write("Choose password: ") - return - } - sess.PendingPass = input - sess.State = net.StateNewAccountConfirm - sess.Write("Confirm password: ") -} - -func (g *Game) handleNewAccountConfirm(sess *net.Session, input string) { - input = strings.TrimSpace(input) - if input == "" { - sess.Conn.SetEcho(true) - sess.Account = nil - sess.State = net.StateAccountName - sess.Write("Account name: ") - return - } - if input != sess.PendingPass { - sess.Conn.SetEcho(true) - sess.WriteLine("Passwords do not match.") - sess.Account = nil - sess.State = net.StateAccountName - sess.Write("Account name: ") - return - } - - hash, err := player.HashPassword(input) - if err != nil { - sess.Conn.SetEcho(true) - sess.WriteLine(fmt.Sprintf("Error creating account: %v", err)) - sess.Account = nil - sess.State = net.StateAccountName - sess.Write("Account name: ") - return - } - - acc := &player.Account{ - Name: sess.Account.Name, - PasswordHash: hash, - } - if err := g.AccountStore.SaveAccount(acc); err != nil { - sess.Conn.SetEcho(true) - sess.WriteLine(fmt.Sprintf("Error creating account: %v", err)) - sess.Account = nil - sess.State = net.StateAccountName - sess.Write("Account name: ") - return - } - - sess.Conn.SetEcho(true) - sess.Account = &player.Account{ - Name: acc.Name, - PasswordHash: acc.PasswordHash, - Aliases: make(map[string]string), - Colors: make(map[string]string), - Options: make(map[string]any), - } - sess.PendingPass = "" - sess.State = net.StateColorChoice - sess.Write("\nShould I disable color? [y/N] ") -} - -func (g *Game) handleColorChoice(sess *net.Session, input string) { - input = strings.ToLower(strings.TrimSpace(input)) - if input == "y" || input == "yes" { - sess.Account.Options["color"] = "none" - acc, err := g.AccountStore.LoadAccount(sess.Account.Name) - if err == nil { - if acc.Options == nil { - acc.Options = make(map[string]any) - } - acc.Options["color"] = "none" - g.AccountStore.SaveAccount(acc) - } - } - g.showMenu(sess) -} - -func (g *Game) showMenu(sess *net.Session) { - sess.State = net.StateMenu - lines := []string{ - "", - fmt.Sprintf("Welcome back to Gaia 04, %s.", sess.Account.Name), - "", - } - if len(sess.Account.Characters) > 0 { - lines = append(lines, - " (C)onnect character to THOI", - "", - " (L)ist characters", - " (R)ename character", - " (D)elete character", - ) - } - lines = append(lines, - " (N)ew character", - " (P)urge account", - " (A)ccount rename", - " (Q)uit", - "", - ) - sess.WriteLines(lines...) - sess.Write("> ") -} - -func (g *Game) handleMenu(sess *net.Session, input string) { - switch strings.ToLower(strings.TrimSpace(input)) { - case "": - sess.Write("> ") - case "c": - if len(sess.Account.Characters) == 0 { - sess.WriteLine("\nHey, make a character with 'N' first!") - sess.Write("\n> ") - return - } - if len(sess.Account.Characters) == 1 { - g.connectCharacter(sess, sess.Account.Characters[0]) - return - } - sess.WriteLine("\nSelect character:") - for i, name := range sess.Account.Characters { - sess.WriteLine(fmt.Sprintf(" %d) %s", i+1, name)) - } - sess.State = net.StateNewCharName - sess.PendingChar = "connect" - sess.Write("\n> ") - - case "l": - if len(sess.Account.Characters) == 0 { - sess.WriteLine("\nYou don't have any characters! Make one with 'N'!") - } else { - sess.WriteLine("\nCharacters:") - for _, name := range sess.Account.Characters { - sess.WriteLine(fmt.Sprintf(" - %s", name)) - } - } - sess.Write("\n> ") - - case "n": - sess.State = net.StateNewCharName - sess.PendingChar = "" - sess.Write("What's your character name?: ") - - case "a": - sess.State = net.StateRenameAccount - sess.Write("New account name: ") - - case "r": - if len(sess.Account.Characters) == 0 { - sess.WriteLine("\nRename who? You don't have any characters!") - sess.Write("\n> ") - return - } - if len(sess.Account.Characters) == 1 { - sess.PendingChar = sess.Account.Characters[0] - sess.State = net.StateRenameCharName - sess.WriteLine(fmt.Sprintf("\nRenaming %s.", sess.PendingChar)) - sess.Write("New name: ") - return - } - sess.State = net.StateRenameChar - sess.WriteLine("\nRename which character?") - for i, name := range sess.Account.Characters { - sess.WriteLine(fmt.Sprintf(" %d) %s", i+1, name)) - } - sess.Write("\n> ") - - case "d": - if len(sess.Account.Characters) == 0 { - sess.WriteLine("\nNo characters to delete.") - sess.Write("\n> ") - return - } - if len(sess.Account.Characters) == 1 { - sess.PendingChar = sess.Account.Characters[0] - } else { - sess.State = net.StateDeleteChar - sess.WriteLine("\nDelete which character?") - for i, name := range sess.Account.Characters { - sess.WriteLine(fmt.Sprintf(" %d) %s", i+1, name)) - } - sess.Write("\n> ") - return - } - g.showDeleteConfirm(sess) - - case "p": - sess.State = net.StatePurgeAccount - sess.WriteLine(fmt.Sprintf("\nPurge account %s and all characters?\nTo be clear you are about to PERMANENTLY DELETE EVERYTHING!\nType PURGE %s to confirm, or anything else to cancel.", sess.Account.Name, sess.Account.Name)) - sess.Write("\n> ") - - case "q": - sess.WriteLine("Later.") - sess.Close() - return - - default: - sess.Write("> ") - } -} - -func (g *Game) handleRenameAccount(sess *net.Session, input string) { - newName := strings.TrimSpace(input) - if newName == "" { - sess.Write("New account name: ") - return - } - if verr := player.ValidName(newName); verr != nil { - sess.WriteLine(verr.Error()) - sess.Write("New account name: ") - return - } - oldName := sess.Account.Name - if newName == oldName { - sess.WriteLine("That's already your account name.") - g.showMenu(sess) - return - } - if g.AccountStore.AccountExists(newName) { - sess.WriteLine("An account with that name already exists.") - sess.Write("New account name: ") - return - } - - oldPath := g.AccountStore.AccountPath(oldName) - newPath := g.AccountStore.AccountPath(newName) - if err := os.Rename(oldPath, newPath); err != nil { - sess.WriteLine(fmt.Sprintf("Error renaming account: %v", err)) - g.showMenu(sess) - return - } - - sess.Account.Name = newName - sess.WriteLine(fmt.Sprintf("Account renamed to %s.", newName)) - g.showMenu(sess) -} - -func (g *Game) handlePurgeAccount(sess *net.Session, input string) { - input = strings.TrimSpace(input) - expected := "PURGE " + sess.Account.Name - if strings.ToUpper(input) != strings.ToUpper(expected) { - sess.WriteLine("Purge cancelled.") - g.showMenu(sess) - return - } - - for _, name := range sess.Account.Characters { - os.Remove(g.AccountStore.CharPath(name)) - } - - os.Remove(g.AccountStore.AccountPath(sess.Account.Name)) - - sess.WriteLine(fmt.Sprintf("Account %s has been purged. Thanks for playing.", sess.Account.Name)) - sess.Close() -} diff --git a/internal/game/login_char.go b/internal/game/login_char.go deleted file mode 100644 index 84f146b..0000000 --- a/internal/game/login_char.go +++ /dev/null @@ -1,244 +0,0 @@ -package game - -import ( - "fmt" - "os" - "strings" - - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/player" -) - -func (g *Game) handleNewCharName(sess *net.Session, input string) { - name := strings.TrimSpace(input) - - if sess.PendingChar == "connect" && len(sess.Account.Characters) > 0 { - if idx, err := parseChoiceIndex(name); err == nil && idx > 0 && idx <= len(sess.Account.Characters) { - sess.PendingChar = "" - g.connectCharacter(sess, sess.Account.Characters[idx-1]) - return - } - sess.WriteLine("Invalid choice.") - sess.Write("\n> ") - return - } - - if name == "" { - sess.Write("Character name: ") - return - } - - if verr := player.ValidName(name); verr != nil { - sess.WriteLine(verr.Error()) - sess.Write("Character name: ") - return - } - - if g.AccountStore.CharacterExists(name) { - sess.WriteLine("A character with that name already exists.") - sess.Write("Character name: ") - return - } - - p := player.New(name) - p.RoomID = 1 - - if err := g.AccountStore.SaveCharacter(p); err != nil { - sess.WriteLine(fmt.Sprintf("Error creating character: %v", err)) - sess.State = net.StateMenu - g.showMenu(sess) - return - } - - acc, _ := g.AccountStore.LoadAccount(sess.Account.Name) - acc.Characters = append(acc.Characters, name) - g.AccountStore.SaveAccount(acc) - sess.Account.Characters = acc.Characters - - g.connectCharacter(sess, name) -} - -func (g *Game) connectCharacter(sess *net.Session, name string) { - g.charsMu.Lock() - if existing := g.loggedInChars[name]; existing != nil { - g.charsMu.Unlock() - sess.WriteLine("This character is logged in elsewhere.") - sess.State = net.StateMenu - g.showMenu(sess) - return - } - - p, err := g.AccountStore.LoadCharacter(name) - if err != nil { - g.charsMu.Unlock() - sess.WriteLine(fmt.Sprintf("Error loading character: %v", err)) - sess.State = net.StateMenu - g.showMenu(sess) - return - } - - sess.Player = p - sess.State = net.StateGame - g.loggedInChars[name] = sess - g.charsMu.Unlock() - - if sess.Account != nil && sess.Account.Options != nil { - p.Options = make(map[string]any) - for k, v := range sess.Account.Options { - p.Options[k] = v - } - } - - g.World.SeedGroundItems(p.RoomID) - g.seedRoomMobs(p.RoomID) - g.seedRoomObjects(p.RoomID) - - if g.Hub != nil { - g.Hub.EnterRoom(sess, p.RoomID) - } - - g.doLook(sess) - g.checkAggro(sess) - sess.Write("\r\n> ") -} - -func (g *Game) handleRenameChar(sess *net.Session, input string) { - name := strings.TrimSpace(input) - if idx, err := parseChoiceIndex(name); err == nil && idx > 0 && idx <= len(sess.Account.Characters) { - sess.PendingChar = sess.Account.Characters[idx-1] - } else { - sess.PendingChar = name - } - - found := false - for _, c := range sess.Account.Characters { - if c == sess.PendingChar { - found = true - break - } - } - if !found { - sess.WriteLine(fmt.Sprintf("No character named %s on this account.", sess.PendingChar)) - g.showMenu(sess) - return - } - - sess.State = net.StateRenameCharName - sess.WriteLine(fmt.Sprintf("Renaming %s.", sess.PendingChar)) - sess.Write("New name: ") -} - -func (g *Game) handleRenameCharName(sess *net.Session, input string) { - newName := strings.TrimSpace(input) - oldName := sess.PendingChar - if newName == "" { - sess.Write("New name: ") - return - } - if verr := player.ValidName(newName); verr != nil { - sess.WriteLine(verr.Error()) - sess.Write("New name: ") - return - } - if newName == oldName { - sess.WriteLine("That's already the character's name.") - g.showMenu(sess) - return - } - if g.AccountStore.CharacterExists(newName) { - sess.WriteLine("A character with that name already exists.") - sess.Write("New name: ") - return - } - - oldPath := g.AccountStore.CharPath(oldName) - newPath := g.AccountStore.CharPath(newName) - if err := os.Rename(oldPath, newPath); err != nil { - sess.WriteLine(fmt.Sprintf("Error renaming: %v", err)) - g.showMenu(sess) - return - } - - p, _ := g.AccountStore.LoadCharacter(newName) - if p != nil { - p.Name = newName - g.AccountStore.SaveCharacter(p) - } - - acc, _ := g.AccountStore.LoadAccount(sess.Account.Name) - for i, c := range acc.Characters { - if c == oldName { - acc.Characters[i] = newName - break - } - } - g.AccountStore.SaveAccount(acc) - sess.Account.Characters = acc.Characters - - sess.PendingChar = "" - sess.WriteLine(fmt.Sprintf("%s renamed to %s.", oldName, newName)) - g.showMenu(sess) -} - -func (g *Game) showDeleteConfirm(sess *net.Session) { - sess.State = net.StateDeleteChar - sess.WriteLine(fmt.Sprintf("\nDelete %s? Type DELETE %s to confirm, or anything else to cancel.", sess.PendingChar, sess.PendingChar)) -} - -func (g *Game) handleDeleteChar(sess *net.Session, input string) { - if sess.PendingChar == "" { - name := strings.TrimSpace(input) - if idx, err := parseChoiceIndex(name); err == nil && idx > 0 && idx <= len(sess.Account.Characters) { - sess.PendingChar = sess.Account.Characters[idx-1] - } else { - sess.PendingChar = name - } - found := false - for _, c := range sess.Account.Characters { - if c == sess.PendingChar { - found = true - break - } - } - if !found { - sess.WriteLine(fmt.Sprintf("No character named %s on this account.", sess.PendingChar)) - sess.PendingChar = "" - g.showMenu(sess) - return - } - g.showDeleteConfirm(sess) - return - } - - input = strings.TrimSpace(input) - expected := "DELETE " + sess.PendingChar - if strings.ToUpper(input) != strings.ToUpper(expected) { - sess.WriteLine("Delete cancelled.") - sess.PendingChar = "" - g.showMenu(sess) - return - } - - charPath := g.AccountStore.CharPath(sess.PendingChar) - if err := os.Remove(charPath); err != nil { - sess.WriteLine(fmt.Sprintf("Error deleting: %v", err)) - sess.PendingChar = "" - g.showMenu(sess) - return - } - - acc, _ := g.AccountStore.LoadAccount(sess.Account.Name) - var newChars []string - for _, c := range acc.Characters { - if c != sess.PendingChar { - newChars = append(newChars, c) - } - } - acc.Characters = newChars - g.AccountStore.SaveAccount(acc) - sess.Account.Characters = newChars - - sess.WriteLine(fmt.Sprintf("%s has been deleted.", sess.PendingChar)) - sess.PendingChar = "" - g.showMenu(sess) -} diff --git a/internal/game/map.go b/internal/game/map.go deleted file mode 100644 index 32d3d7c..0000000 --- a/internal/game/map.go +++ /dev/null @@ -1,317 +0,0 @@ -package game - -import ( - "strings" - - "thehouseoficarus/internal/world" -) - -type mapGlyphs struct { - topLeft, topRight rune - bottomLeft, bottomRight rune - side rune - topFill rune - connectorH, connectorV rune - upArrow, downArrow rune -} - -func mapGlyphsForPlayer(unicode bool) mapGlyphs { - if unicode { - return mapGlyphs{ - topLeft: '╔', topRight: '╗', bottomLeft: '╚', bottomRight: '╝', - side: '║', topFill: '═', connectorH: '─', connectorV: '│', - upArrow: '↑', downArrow: '↓', - } - } - return mapGlyphs{ - topLeft: '.', topRight: '.', bottomLeft: ':', bottomRight: ':', - side: ':', topFill: '.', connectorH: '-', connectorV: '|', - upArrow: '^', downArrow: 'v', - } -} - -type mapGraph struct { - posToRoom map[[2]int]int - roomToPos map[int][2]int -} - -var bfsDirs = []struct { - dir world.ExitDir - dx, dy int -}{ - {world.North, 0, -1}, - {world.South, 0, 1}, - {world.East, 1, 0}, - {world.West, -1, 0}, -} - -func buildGraph(g *Game, startRoomID int) *mapGraph { - mg := &mapGraph{ - posToRoom: make(map[[2]int]int), - roomToPos: make(map[int][2]int), - } - - type node struct { - roomID int - x, y int - } - queue := []node{{startRoomID, 0, 0}} - mg.posToRoom[[2]int{0, 0}] = startRoomID - mg.roomToPos[startRoomID] = [2]int{0, 0} - - for len(queue) > 0 { - n := queue[0] - queue = queue[1:] - - room, ok := loadRoom(g, n.roomID) - if !ok { - continue - } - - for _, d := range bfsDirs { - targetID, ok := exitTarget(room, d.dir) - if !ok { - continue - } - if _, visited := mg.roomToPos[targetID]; visited { - continue - } - nx, ny := n.x + d.dx, n.y + d.dy - mg.posToRoom[[2]int{nx, ny}] = targetID - mg.roomToPos[targetID] = [2]int{nx, ny} - queue = append(queue, node{targetID, nx, ny}) - } - } - - return mg -} - -func buildTinyMap(g *Game, roomID int, mg mapGlyphs) []string { - bg := buildGraph(g, roomID) - - grid := make([][]rune, 5) - for i := range grid { - grid[i] = make([]rune, 5) - for j := range grid[i] { - grid[i][j] = ' ' - } - } - - for y := -1; y <= 1; y++ { - for x := -1; x <= 1; x++ { - pos := [2]int{x, y} - rid, ok := bg.posToRoom[pos] - if !ok { - continue - } - gr := (y + 1) * 2 - gc := (x + 1) * 2 - if rid == roomID { - grid[gr][gc] = '@' - } else { - grid[gr][gc] = roomMapSymbol(g, rid) - } - } - } - - for y := -1; y <= 1; y++ { - for x := -1; x <= 0; x++ { - leftPos := [2]int{x, y} - rightPos := [2]int{x + 1, y} - leftRoom, leftOK := bg.posToRoom[leftPos] - rightRoom, rightOK := bg.posToRoom[rightPos] - if !leftOK || !rightOK { - continue - } - if exitsConnect(g, leftRoom, rightRoom, world.East, world.West) { - grid[(y+1)*2][(x+1)*2+1] = mg.connectorH - } - } - } - - for y := -1; y <= 0; y++ { - for x := -1; x <= 1; x++ { - topPos := [2]int{x, y} - bottomPos := [2]int{x, y + 1} - topRoom, topOK := bg.posToRoom[topPos] - bottomRoom, bottomOK := bg.posToRoom[bottomPos] - if !topOK || !bottomOK { - continue - } - if exitsConnect(g, topRoom, bottomRoom, world.South, world.North) { - grid[(y+1)*2+1][(x+1)*2] = mg.connectorV - } - } - } - - cur, _ := loadRoom(g, roomID) - if cur != nil { - if _, ok := exitTarget(cur, world.Up); ok { - grid[1][3] = mg.upArrow - } - if _, ok := exitTarget(cur, world.Down); ok { - grid[3][1] = mg.downArrow - } - } - - topFill := strings.Repeat(string(mg.topFill), 5) - lines := make([]string, 7) - lines[0] = string(mg.topLeft) + topFill + string(mg.topRight) - for row := 0; row < 5; row++ { - lines[row+1] = string(mg.side) + string(grid[row]) + string(mg.side) - } - botFill := strings.Repeat(string(mg.topFill), 5) - lines[6] = string(mg.bottomLeft) + botFill + string(mg.bottomRight) - - return lines -} - -func exitsConnect(g *Game, room1, room2 int, dir12, dir21 world.ExitDir) bool { - r1, ok := loadRoom(g, room1) - if !ok { - return false - } - if id, ok := exitTarget(r1, dir12); ok && id == room2 { - return true - } - r2, ok := loadRoom(g, room2) - if !ok { - return false - } - id, ok := exitTarget(r2, dir21) - return ok && id == room1 -} - -func exitTarget(room *world.Room, dir world.ExitDir) (int, bool) { - if room == nil { - return 0, false - } - exit, ok := room.Exits[dir] - if !ok { - return 0, false - } - return exit.Room, true -} - -func loadRoom(g *Game, roomID int) (*world.Room, bool) { - if roomID == 0 { - return nil, false - } - room, err := g.World.LoadRoom(roomID) - if err != nil { - return nil, false - } - return room, true -} - -func roomMapSymbol(g *Game, roomID int) rune { - room, ok := loadRoom(g, roomID) - if !ok { - return '?' - } - if room.MapSymbol != "" { - runes := []rune(room.MapSymbol) - return runes[0] - } - return 'o' -} - -func stripBlankRows(lines []string) []string { - var out []string - for _, line := range lines { - if strings.TrimSpace(line) != "" { - out = append(out, line) - } - } - return out -} - -func leftTrimCommon(lines []string) []string { - min := -1 - for _, line := range lines { - if strings.TrimSpace(line) == "" { - continue - } - n := 0 - for _, r := range line { - if r == ' ' { - n++ - } else { - break - } - } - if min < 0 || n < min { - min = n - } - } - if min <= 0 { - return lines - } - result := make([]string, len(lines)) - for i, line := range lines { - if len(line) <= min { - result[i] = "" - } else { - result[i] = line[min:] - } - } - return result -} - -func buildFullMap(g *Game, roomID, mapWidth, mapHeight int, mg mapGlyphs) []string { - bg := buildGraph(g, roomID) - - grid := make([][]rune, mapHeight) - for i := range grid { - grid[i] = make([]rune, mapWidth) - for j := range grid[i] { - grid[i][j] = ' ' - } - } - - cx := mapWidth / 2 - cy := mapHeight / 2 - - for pos, rid := range bg.posToRoom { - gr := cy + pos[1]*2 - gc := cx + pos[0]*2 - if gr < 0 || gr >= mapHeight || gc < 0 || gc >= mapWidth { - continue - } - if rid == roomID { - grid[gr][gc] = '@' - } else { - grid[gr][gc] = roomMapSymbol(g, rid) - } - } - - for pos, rid := range bg.posToRoom { - x, y := pos[0], pos[1] - - if rightID, ok := bg.posToRoom[[2]int{x + 1, y}]; ok { - if exitsConnect(g, rid, rightID, world.East, world.West) { - gr := cy + y*2 - gc := cx + x*2 + 1 - if gr >= 0 && gr < mapHeight && gc >= 0 && gc < mapWidth { - grid[gr][gc] = mg.connectorH - } - } - } - - if bottomID, ok := bg.posToRoom[[2]int{x, y + 1}]; ok { - if exitsConnect(g, rid, bottomID, world.South, world.North) { - gr := cy + y*2 + 1 - gc := cx + x*2 - if gr >= 0 && gr < mapHeight && gc >= 0 && gc < mapWidth { - grid[gr][gc] = mg.connectorV - } - } - } - } - - lines := make([]string, mapHeight) - for i := range grid { - lines[i] = string(grid[i]) - } - return lines -} diff --git a/internal/game/messages.go b/internal/game/messages.go deleted file mode 100644 index 1c9e85a..0000000 --- a/internal/game/messages.go +++ /dev/null @@ -1,13 +0,0 @@ -package game - -const ( - MsgErrLoadRecipes = "Error loading recipes." - MsgNoCombat = "You can't do that during combat!" - MsgNoDontHave = "You don't have any '%s'." - MsgNeverMind = "Never mind." - MsgSomethingWrongObject = "Something is wrong with this object." - MsgSomethingWrongThat = "Something is wrong with that." - MsgInventoryFull = "Your inventory is too full!" - MsgAmbiguous = "That's ambiguous, which one?" - MsgWhichOne = "Which one?" -) diff --git a/internal/game/player_flags.go b/internal/game/player_flags.go deleted file mode 100644 index 6595cc4..0000000 --- a/internal/game/player_flags.go +++ /dev/null @@ -1,55 +0,0 @@ -package game - -import "thehouseoficarus/internal/player" - -func getPlayerFlagInt(p *player.Player, key string) int { - if p.Flags == nil { - return 0 - } - val, ok := p.Flags[key] - if !ok { - return 0 - } - switch v := val.(type) { - case int: - return v - case int64: - return int(v) - case float64: - return int(v) - } - return 0 -} - -func getPlayerFlagString(p *player.Player, key string) string { - if p.Flags == nil { - return "" - } - val, ok := p.Flags[key] - if !ok { - return "" - } - s, _ := val.(string) - return s -} - -func setPlayerFlag(p *player.Player, key string, val any) { - p.EnsureFlags() - p.Flags[key] = val -} - -func intFromFlag(flags map[string]any, key string) int { - val, ok := flags[key] - if !ok { - return 0 - } - switch v := val.(type) { - case int: - return v - case int64: - return int(v) - case float64: - return int(v) - } - return 0 -} diff --git a/internal/game/production_core.go b/internal/game/production_core.go deleted file mode 100644 index 42f64e1..0000000 --- a/internal/game/production_core.go +++ /dev/null @@ -1,606 +0,0 @@ -package game - -import ( - "fmt" - "math/rand" - "sort" - "strconv" - "strings" - - "thehouseoficarus/internal/action" - "thehouseoficarus/internal/color" - "thehouseoficarus/internal/engine" - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/object" - "thehouseoficarus/internal/player" - -) - -func (g *Game) startProduction(sess *net.Session, p *player.Player, recipe *action.RecipeDef, actionType, displayVerb, startMsg, endMsg string, count int) { - g.cancelAction(p) - g.cancelBackgroundAction(p) - - skill := recipe.EffectiveSkill() - if skill != "" { - skillLevel := p.Level(player.SkillName(skill)) - if skillLevel < recipe.Level { - sess.WriteLine(fmt.Sprintf("You need level %d %s to do that.", recipe.Level, skill)) - g.reprompt(sess) - return - } - } - - if !recipe.HasAllItemsQty(p.CountItem) { - sess.WriteLine("You don't have the required materials.") - g.reprompt(sess) - return - } - - outDef, _ := g.ItemStore.Load(recipe.Output) - - wait := recipe.Wait - if wait <= 0 { - wait = 4 - } - - outputName := recipe.Output - if outDef != nil { - outputName = outDef.Name - } - - p.Action = &action.Action{ - Type: actionType, - TargetID: recipe.ID, - TargetName: outputName, - Data: map[string]any{ - "recipe_id": recipe.ID, - "phase": 0, - "wait": wait, - "start_msg": startMsg, - "end_msg": endMsg, - "remaining": count, - }, - WaitLeft: engine.ToTicks(1), - } - - p.ActionState = &ActionState{Type: ActionProducing, TargetName: outputName, Verb: displayVerb} - - if g.Hub != nil { - for _, other := range g.Hub.PlayersInRoom(p.RoomID) { - if other != sess && other.Player != nil { - other.WriteLine(g.colorize(other, "broadcast", fmt.Sprintf("\n%s starts %s.", p.Name, displayVerb))) - } - } - } -} - -func (g *Game) startProductionFromRecipe(sess *net.Session, p *player.Player, recipe *action.RecipeDef, count int) { - _, stationName := g.findStation(p.RoomID, recipe.Station) - if stationName == "" { - stationName = "inventory" - } - - firstItem := recipe.FirstItemName(func(id string) (string, bool) { - def, err := g.ItemStore.Load(id) - if err != nil { - return id, false - } - return def.Name, true - }) - - info, ok := productionTypes[recipe.Type] - if !ok { - info = productionTypeInfo{recipe.Type, recipe.Type} - } - actionType := info.ActionType - displayVerb := info.DisplayVerb - - var startMsg, endMsg string - if stationName != "inventory" { - startMsg = fmt.Sprintf("You start %s %s on the %s.", displayVerb, firstItem, stationName) - } else { - startMsg = fmt.Sprintf("You start %s %s.", displayVerb, firstItem) - } - endMsg = fmt.Sprintf("You've finished %s.", displayVerb) - - g.startProduction(sess, p, recipe, actionType, displayVerb, startMsg, endMsg, count) -} - -func (g *Game) loadProductionRecipe(recipeID string) *action.RecipeDef { - all, err := g.RecipeStore.LoadAll() - if err == nil { - for _, r := range all { - if r.ID == recipeID { - return &r - } - } - } - if strings.HasPrefix(recipeID, "combine_") { - itemID := strings.TrimPrefix(recipeID, "combine_") - if itemDef, err := g.ItemStore.Load(itemID); err == nil && len(itemDef.MadeFrom) > 0 { - return g.buildCombineRecipe(itemDef) - } - } - return nil -} - -func (g *Game) advanceProduction(sess *net.Session, p *player.Player) bool { - recipeID := p.Action.Data["recipe_id"].(string) - phase := p.Action.Data["phase"].(int) - wait := p.Action.Data["wait"].(float64) - startMsg, _ := p.Action.Data["start_msg"].(string) - endMsg, _ := p.Action.Data["end_msg"].(string) - remaining, _ := p.Action.Data["remaining"].(int) - - recipe := g.loadProductionRecipe(recipeID) - if recipe == nil { - g.cancelAction(p) - return false - } - - if phase == 0 { - if startMsg != "" { - sess.WriteLine(fmt.Sprintf("\n%s", startMsg)) - } - p.Action.Data["phase"] = 1 - p.Action.WaitLeft = engine.ToTicks(wait) - return true - } - - skill := recipe.EffectiveSkill() - skillLevel := p.Level(player.SkillName(skill)) - chance := 1.0 - if recipe.Success != nil { - chance = action.SuccessChance(*recipe.Success, skillLevel, recipe.Level) - } - - if rand.Float64() < chance { - outputQty := recipe.OutputQty - if outputQty <= 0 { - outputQty = 1 - } - - byproducts := g.collectByproducts(p, recipe) - - placed := false - outDef, _ := g.ItemStore.Load(recipe.Output) - if outDef != nil && outDef.Stackable { - for i := 0; i < 28; i++ { - slot := p.InvSlot(i) - if slot != nil && slot.ItemID == recipe.Output { - recipe.ConsumeAll(p.HasItem, p.RemoveItem) - slot.Quantity += outputQty - placed = true - break - } - } - } - if !placed { - recipe.ConsumeAll(p.HasItem, p.RemoveItem) - freeSlot := p.FirstFreeSlot() - if freeSlot == -1 { - sess.WriteLine("Your inventory is too full!") - g.cancelAction(p) - return false - } - p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: recipe.Output, Quantity: outputQty}) - } - - for _, bp := range byproducts { - if slot := p.FirstFreeSlot(); slot >= 0 { - p.SetInvSlot(slot, &player.InventorySlot{ItemID: bp, Quantity: 1}) - } - } - - if recipe.XP > 0 { - if newLevel := p.AddSkillXP(player.SkillName(skill), recipe.XP); newLevel > 0 { - sess.WriteLine(g.colorize(sess, "level_up", fmt.Sprintf("*** You are now level %d %s! ***", newLevel, skill))) - } - } - g.AccountStore.SaveCharacter(p) - - msg := recipe.Message - if msg == "" { - outputName := recipe.Output - if outDef != nil { - outputName = outDef.Name - } - msg = fmt.Sprintf("You produce %s.", outputName) - } - if p.OptionBool("xp_drops") && recipe.XP > 0 { - abbr := player.SkillAbbr[player.SkillName(skill)] - msg += g.colorize(sess, "xp", fmt.Sprintf(" (+%dxp %s)", recipe.XP, abbr)) - } - sess.WriteLine(msg) - } else { - recipe.ConsumeAll(p.HasItem, p.RemoveItem) - - if recipe.Fail != "" { - freeSlot := p.FirstFreeSlot() - if freeSlot >= 0 { - p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: recipe.Fail, Quantity: 1}) - } - } - g.AccountStore.SaveCharacter(p) - - msg := recipe.FailMessage - if msg == "" { - msg = "You fail and the materials are lost." - } - sess.WriteLine(g.colorize(sess, "damage", msg)) - } - - if remaining > 0 { - remaining-- - p.Action.Data["remaining"] = remaining - if remaining <= 0 { - if endMsg != "" { - sess.WriteLine(fmt.Sprintf("\n%s", endMsg)) - } - g.cancelAction(p) - return false - } - } - - if g.canContinueProduction(p, recipe) { - p.Action.WaitLeft = engine.ToTicks(wait) - return true - } - - if endMsg != "" { - sess.WriteLine(fmt.Sprintf("\n%s", endMsg)) - } - g.cancelAction(p) - return false -} - -func (g *Game) collectByproducts(p *player.Player, recipe *action.RecipeDef) []string { - var byproducts []string - for _, e := range recipe.Consume { - if len(e.Byproducts) == 0 { - continue - } - for i, id := range e.Items { - if p.HasItem(id) && i < len(e.Byproducts) && e.Byproducts[i] != "" { - byproducts = append(byproducts, e.Byproducts[i]) - break - } - } - } - return byproducts -} - -func (g *Game) canContinueProduction(p *player.Player, recipe *action.RecipeDef) bool { - if !recipe.HasAllItemsQty(p.CountItem) { - return false - } - outputQty := recipe.OutputQty - if outputQty <= 0 { - outputQty = 1 - } - outDef, _ := g.ItemStore.Load(recipe.Output) - if outDef != nil && outDef.Stackable { - for i := 0; i < 28; i++ { - slot := p.InvSlot(i) - if slot != nil && slot.ItemID == recipe.Output { - return true - } - } - } - return p.FirstFreeSlot() >= 0 -} - -func (g *Game) handleRecipeChoice(sess *net.Session, input string) { - input = strings.TrimSpace(input) - - menuData := sess.PendingMenu - if len(menuData) == 0 { - sess.State = net.StateGame - g.reprompt(sess) - return - } - - if input == "" { - sess.PendingMenu = nil - sess.State = net.StateGame - sess.WriteLine("Never mind.") - g.reprompt(sess) - return - } - - if choice, err := strconv.Atoi(input); err == nil { - sess.PendingMenu = nil - sess.State = net.StateGame - if choice <= 0 || choice > len(menuData) { - sess.WriteLine("Never mind.") - g.reprompt(sess) - return - } - g.dispatchMenuEntry(sess, menuData[choice-1]) - return - } - - lower := strings.ToLower(input) - matchIdx := -1 - for i, entry := range menuData { - name := g.menuEntryName(entry) - if name == "" { - continue - } - if strings.ToLower(name) == lower || action.WordPrefixMatch(input, name) { - if matchIdx >= 0 { - sess.WriteLine("That's ambiguous.") - return - } - matchIdx = i - } - } - if matchIdx >= 0 { - sess.PendingMenu = nil - sess.State = net.StateGame - g.dispatchMenuEntry(sess, menuData[matchIdx]) - return - } - - sess.PendingMenu = nil - sess.State = net.StateGame - sess.WriteLine("Never mind.") - g.reprompt(sess) -} - -func (g *Game) menuEntryName(entry map[string]string) string { - if rid, ok := entry["recipe_id"]; ok { - all, _ := g.RecipeStore.LoadAll() - for _, r := range all { - if r.ID == rid { - if def, err := g.ItemStore.Load(r.Output); err == nil { - return def.Name - } - return r.Output - } - } - } - if rid, ok := entry["fletch_recipe_id"]; ok { - all, _ := g.RecipeStore.LoadAll() - for _, r := range all { - if r.ID == rid { - if def, err := g.ItemStore.Load(r.Output); err == nil { - return def.Name - } - return r.Output - } - } - } - if barID, ok := entry["bar_id"]; ok { - if def, _ := g.ItemStore.Load(barID); def != nil { - return def.Name - } - return barID - } - if cid, ok := entry["combine_item"]; ok { - if def, _ := g.ItemStore.Load(cid); def != nil { - return def.Name - } - return cid - } - return "" -} - -func (g *Game) dispatchMenuEntry(sess *net.Session, entry map[string]string) { - if cid, ok := entry["combine_item"]; ok { - g.promptHowMany(sess, "combine_"+cid) - return - } - if barID, ok := entry["bar_id"]; ok { - p := sess.Player - allRecipes, _ := g.RecipeStore.LoadAll() - g.showSmithTable(sess, p, barID, allRecipes) - return - } - if rid, ok := entry["fletch_recipe_id"]; ok { - p := sess.Player - allRecipes, _ := g.RecipeStore.LoadAll() - for _, r := range allRecipes { - if r.ID == rid { - g.startFletchAction(sess, p, &r, 0) - return - } - } - g.reprompt(sess) - return - } - if rid, ok := entry["recipe_id"]; ok { - g.promptHowMany(sess, rid) - return - } - g.reprompt(sess) -} - -func (g *Game) formatRecipeMaterials(r *action.RecipeDef) string { - var parts []string - for _, e := range r.Consume { - itemName := e.Items[0] - if def, err := g.ItemStore.Load(e.Items[0]); err == nil { - itemName = def.Name - } - if e.Qty > 1 { - parts = append(parts, fmt.Sprintf("%s x%d", itemName, e.Qty)) - } else { - parts = append(parts, itemName) - } - } - return strings.Join(parts, ", ") -} - -func (g *Game) showProductionTable(sess *net.Session, p *player.Player, recipes []action.RecipeDef, title, skill, lastFlagKey, promptVerb string, background bool) { - sort.Slice(recipes, func(i, j int) bool { - return recipes[i].Level < recipes[j].Level - }) - - mode := g.colorMode(sess) - skillLevel := p.Level(player.SkillName(skill)) - dimSpec := color.Parse("240") - - tbl := &Table{ - Title: title, - Columns: []string{"#", "Product", "Materials", "Level"}, - } - - for i, r := range recipes { - outDef, _ := g.ItemStore.Load(r.Output) - productName := r.Output - if outDef != nil { - productName = outDef.Name - } - - outputQty := r.OutputQty - if outputQty <= 0 { - outputQty = 1 - } - if outDef != nil && outDef.Stackable && outputQty > 1 { - productName = fmt.Sprintf("%s x%d", productName, outputQty) - } - - matStr := g.formatRecipeMaterials(&r) - levelStr := fmt.Sprint(r.Level) - numStr := fmt.Sprintf("%d", i+1) - - canMake := skillLevel >= r.Level && r.HasAllItemsQty(p.CountItem) - if canMake { - productName = g.itemColorize(sess, outDef, productName) - } else { - productName = color.Render(mode, dimSpec, productName) - matStr = color.Render(mode, dimSpec, matStr) - levelStr = color.Render(mode, dimSpec, levelStr) - numStr = color.Render(mode, dimSpec, numStr) - } - - tbl.Rows = append(tbl.Rows, []string{numStr, productName, matStr, levelStr}) - } - - unicode := p.OptionBool("unicode") - sess.WriteLine("") - for _, line := range tbl.Render(unicode) { - sess.WriteLine(line) - } - - lastRecipeID, _ := p.Flags[lastFlagKey].(string) - hint := "" - if lastRecipeID != "" { - for _, r := range recipes { - if r.ID == lastRecipeID { - if outDef, err := g.ItemStore.Load(r.Output); err == nil { - hint = outDef.Name - } - break - } - } - } - - if hint != "" { - sess.Write(fmt.Sprintf("%s what (enter for all %s): ", promptVerb, hint)) - } else { - sess.Write(fmt.Sprintf("%s what: ", promptVerb)) - } - - sess.PendingMenu = recipeMenuData(recipeDefIDs(recipes)) - sess.PendingSkill = skill - sess.PendingLastFlag = lastFlagKey - sess.PendingBackground = background - sess.State = net.StateProductChoice -} - -func (g *Game) handleProductChoice(sess *net.Session, input string) { - p := sess.Player - menuData := sess.PendingMenu - skill := sess.PendingSkill - lastFlagKey := sess.PendingLastFlag - background := sess.PendingBackground - sess.PendingMenu = nil - sess.PendingSkill = "" - sess.PendingLastFlag = "" - sess.PendingBackground = false - sess.State = net.StateGame - - input = strings.TrimSpace(input) - - allRecipes, err := g.RecipeStore.LoadAll() - if err != nil { - g.reprompt(sess) - return - } - - var recipes []action.RecipeDef - for _, entry := range menuData { - rid := entry["recipe_id"] - for _, r := range allRecipes { - if r.ID == rid { - recipes = append(recipes, r) - break - } - } - } - - if len(recipes) == 0 { - g.reprompt(sess) - return - } - - sort.Slice(recipes, func(i, j int) bool { - return recipes[i].Level < recipes[j].Level - }) - - lastRecipeID, _ := p.Flags[lastFlagKey].(string) - - sel, errMsg := g.resolveRecipeByInput(input, recipes, lastRecipeID) - switch errMsg { - case "ambiguous": - sess.WriteLine("That's ambiguous.") - g.reprompt(sess) - return - case "never_mind": - sess.WriteLine("Never mind.") - g.reprompt(sess) - return - } - - skillLevel := p.Level(player.SkillName(skill)) - if skillLevel < sel.Recipe.Level { - sess.WriteLine(fmt.Sprintf("You need level %d %s to make that.", sel.Recipe.Level, skill)) - g.reprompt(sess) - return - } - if !sel.Recipe.HasAllItemsQty(p.CountItem) { - sess.WriteLine("You don't have the materials for that.") - g.reprompt(sess) - return - } - - p.EnsureFlags() - p.Flags[lastFlagKey] = sel.Recipe.ID - g.AccountStore.SaveCharacter(p) - - if background { - g.startFletchAction(sess, p, sel.Recipe, sel.Count) - } else { - g.startProductionFromRecipe(sess, p, sel.Recipe, sel.Count) - } -} - -func (g *Game) hasToolType(p *player.Player, toolType string) bool { - if itemID, ok := p.Equipment[object.SlotMainHand]; ok { - if def, err := g.ItemStore.Load(itemID); err == nil && def.ToolType == toolType { - return true - } - } - for i := 0; i < 28; i++ { - slot := p.InvSlot(i) - if slot == nil { - continue - } - if def, err := g.ItemStore.Load(slot.ItemID); err == nil && def.ToolType == toolType { - return true - } - } - return false -} diff --git a/internal/game/production_menu.go b/internal/game/production_menu.go deleted file mode 100644 index 329110b..0000000 --- a/internal/game/production_menu.go +++ /dev/null @@ -1,209 +0,0 @@ -package game - -import ( - "fmt" - "strconv" - "strings" - - "thehouseoficarus/internal/action" - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/object" -) - -type recipeEntry struct { - ItemName string - Recipe action.RecipeDef -} - -type productionTypeInfo struct { - ActionType string - DisplayVerb string -} - -var productionTypes = map[string]productionTypeInfo{ - "cooking": {"cook", "cooking"}, - "smelting": {"smelt", "smelting"}, - "smithing": {"smith", "smithing"}, - "crafting": {"craft", "crafting"}, - "combine": {"combine", "combining"}, - "fletching": {"fletch", "fletching"}, - "pharmacy": {"mix", "mixing"}, - "construction": {"construct", "constructing"}, -} - -var productionActionTypes map[string]bool - -func init() { - productionActionTypes = make(map[string]bool) - for _, pt := range productionTypes { - productionActionTypes[pt.ActionType] = true - } -} - -func recipeMenuData(recipeIDs []string) []map[string]string { - out := make([]map[string]string, len(recipeIDs)) - for i, id := range recipeIDs { - out[i] = map[string]string{"recipe_id": id} - } - return out -} - -func recipeDefIDs(defs []action.RecipeDef) []string { - ids := make([]string, len(defs)) - for i, d := range defs { - ids[i] = d.ID - } - return ids -} - -func entryMenuData(entries []recipeEntry) []map[string]string { - out := make([]map[string]string, len(entries)) - for i, e := range entries { - out[i] = map[string]string{"recipe_id": e.Recipe.ID} - } - return out -} - -func (g *Game) promptHowMany(sess *net.Session, recipeID string) { - sess.PendingRecipeID = recipeID - sess.State = net.StateHowMany - sess.Write("How many (return for all)?: ") -} - -type recipeSelection struct { - Recipe *action.RecipeDef - Count int -} - -func (g *Game) resolveRecipeByInput(input string, recipes []action.RecipeDef, lastRecipeID string) (sel recipeSelection, errMsg string) { - if input == "" { - if lastRecipeID == "" { - return sel, "never_mind" - } - for i := range recipes { - if recipes[i].ID == lastRecipeID { - sel.Recipe = &recipes[i] - return sel, "" - } - } - return sel, "never_mind" - } - - qty, productName := parseQty(input) - productName = strings.TrimSpace(productName) - - if idx, err := strconv.Atoi(productName); err == nil && idx > 0 && idx <= len(recipes) { - sel.Recipe = &recipes[idx-1] - sel.Count = qty - return sel, "" - } - - matchCount := 0 - for i := range recipes { - outDef, _ := g.ItemStore.Load(recipes[i].Output) - name := recipes[i].Output - if outDef != nil { - name = outDef.Name - } - if action.WordPrefixMatch(productName, name) { - if matchCount == 0 { - sel.Recipe = &recipes[i] - sel.Count = qty - } - matchCount++ - } - } - if matchCount > 1 { - return sel, "ambiguous" - } - if sel.Recipe == nil { - return sel, "never_mind" - } - return sel, "" -} - -func (g *Game) showMenuTable(sess *net.Session, title string, names []string) { - p := sess.Player - tbl := &Table{Title: title} - for i, name := range names { - tbl.Rows = append(tbl.Rows, []string{fmt.Sprintf("%d", i+1), name}) - } - unicode := p.OptionBool("unicode") - sess.WriteLine("") - for _, line := range tbl.Render(unicode) { - sess.WriteLine(line) - } -} - -func (g *Game) handleHowMany(sess *net.Session, input string) { - p := sess.Player - recipeID := sess.PendingRecipeID - sess.PendingRecipeID = "" - sess.State = net.StateGame - - input = strings.TrimSpace(input) - - var count int - if input == "" { - count = 0 - } else if n, err := strconv.Atoi(input); err == nil && n > 0 { - count = n - } else { - sess.WriteLine("Never mind.") - g.reprompt(sess) - return - } - - var recipe *action.RecipeDef - if strings.HasPrefix(recipeID, "combine_") { - itemID := strings.TrimPrefix(recipeID, "combine_") - itemDef, err := g.ItemStore.Load(itemID) - if err != nil || len(itemDef.MadeFrom) == 0 { - g.reprompt(sess) - return - } - recipe = g.buildCombineRecipe(itemDef) - } else { - all, err := g.RecipeStore.LoadAll() - if err != nil { - g.reprompt(sess) - return - } - for _, r := range all { - if r.ID == recipeID { - recipe = &r - break - } - } - } - - if recipe == nil { - g.reprompt(sess) - return - } - - g.startProductionFromRecipe(sess, p, recipe, count) -} - -func (g *Game) buildCombineRecipe(def *object.ItemDef) *action.RecipeDef { - var consume []action.ConsumeEntry - for _, mf := range def.MadeFrom { - consume = append(consume, action.ConsumeEntry{ - Items: mf.Items, - Qty: mf.Qty, - Byproducts: mf.Byproducts, - }) - } - wait := def.Ticks - if wait <= 0 { - wait = 2 - } - return &action.RecipeDef{ - ID: "combine_" + def.ID, - Type: "combine", - Wait: wait, - Consume: consume, - Output: def.ID, - Message: fmt.Sprintf("You create %s.", def.Name), - } -} diff --git a/internal/game/prompt.go b/internal/game/prompt.go deleted file mode 100644 index 2ecf367..0000000 --- a/internal/game/prompt.go +++ /dev/null @@ -1,100 +0,0 @@ -package game - -import ( - "fmt" - "strings" - - "thehouseoficarus/internal/color" - "thehouseoficarus/internal/combat" - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/player" -) - -func (g *Game) promptStr(sess *net.Session) string { - prompt := "> " - if p := sess.Player; p != nil { - if p.Prompt != "" { - prompt = p.Prompt - } - } - - prompt = g.expandPromptColors(sess, prompt) - prompt = g.expandPromptVars(sess, prompt) - return prompt -} - -func (g *Game) expandPromptColors(sess *net.Session, text string) string { - return color.ExpandTags(g.colorMode(sess), text) -} - -func (g *Game) expandPromptVars(sess *net.Session, text string) string { - p := sess.Player - if p == nil { - return text - } - - text = strings.ReplaceAll(text, "%%", "\x00") - text = strings.ReplaceAll(text, "%h", fmt.Sprint(p.HP)) - text = strings.ReplaceAll(text, "%H", fmt.Sprint(p.MaxHP())) - text = strings.ReplaceAll(text, "%b", fmt.Sprintf("%.1f", p.Battery)) - text = strings.ReplaceAll(text, "%B", fmt.Sprintf("%.0f", p.MaxBattery())) - text = strings.ReplaceAll(text, "%c", fmt.Sprint(p.Credits)) - text = strings.ReplaceAll(text, "%i", fmt.Sprint(p.FreeSlots())) - text = strings.ReplaceAll(text, "%s", attackStyleShort(p.AttackStyle)) - text = strings.ReplaceAll(text, "%S", attackStyleLong(p.AttackStyle)) - - mobHP, mobMaxHP := "", "" - if cs := combat.GetCombat(p.Name); cs != nil { - mob := g.MobStore.GetInstance(cs.MobID) - if mob != nil && mob.HP > 0 { - mobHP = fmt.Sprint(mob.HP) - mobMaxHP = fmt.Sprint(mob.MaxHP) - } - } - text = strings.ReplaceAll(text, "%m", mobHP) - text = strings.ReplaceAll(text, "%M", mobMaxHP) - - for _, sk := range player.AllSkills { - tag := string(sk) - text = strings.ReplaceAll(text, "%X_"+tag, fmt.Sprint(p.Skills[sk])) - text = strings.ReplaceAll(text, "%x_"+tag, fmt.Sprint(xpToLevel(p, sk))) - } - - text = strings.ReplaceAll(text, "\x00", "%") - return text -} - -func attackStyleShort(s player.AttackStyle) string { - switch s { - case player.Accurate: - return "acc" - case player.Aggressive: - return "agg" - case player.Defensive: - return "def" - case player.Balanced: - return "bal" - } - return "acc" -} - -func attackStyleLong(s player.AttackStyle) string { - switch s { - case player.Accurate: - return "accurate" - case player.Aggressive: - return "aggressive" - case player.Defensive: - return "defensive" - case player.Balanced: - return "balanced" - } - return "accurate" -} - -func xpToLevel(p *player.Player, sk player.SkillName) int { - currentXP := p.Skills[sk] - currentLevel := p.Level(sk) - nextLevelXP := player.XPForLevel(currentLevel + 1) - return nextLevelXP - currentXP -} diff --git a/internal/game/science.go b/internal/game/science.go deleted file mode 100644 index 8c7f0af..0000000 --- a/internal/game/science.go +++ /dev/null @@ -1,231 +0,0 @@ -package game - -import ( - "fmt" - "os" - "path/filepath" - "sort" - "strings" - - "gopkg.in/yaml.v3" - - "thehouseoficarus/internal/object" - "thehouseoficarus/internal/player" -) - -type ModCategory string - -const ( - ModCombat ModCategory = "combat" - ModUtility ModCategory = "utility" - ModEnchant ModCategory = "enchant" - ModProcessing ModCategory = "processing" - ModTransport ModCategory = "transport" -) - -type ModDef struct { - ID string `yaml:"id"` - Name string `yaml:"name"` - Level int `yaml:"level"` - MaxHit int `yaml:"max_hit"` - BaseXP int `yaml:"base_xp"` - JunkCost map[string]int `yaml:"junk_cost"` - Category ModCategory `yaml:"category"` - Element string `yaml:"element"` - Destination int `yaml:"destination"` -} - -var AllMods []*ModDef - -var modByID map[string]*ModDef - -func (g *Game) LoadMods() error { - dir := filepath.Join(g.DataDir, "modules") - entries, err := os.ReadDir(dir) - if err != nil { - return err - } - AllMods = nil - modByID = make(map[string]*ModDef) - for _, e := range entries { - if e.IsDir() || filepath.Ext(e.Name()) != ".yaml" { - continue - } - data, err := os.ReadFile(filepath.Join(dir, e.Name())) - if err != nil { - continue - } - var m ModDef - if err := yaml.Unmarshal(data, &m); err != nil { - continue - } - AllMods = append(AllMods, &m) - modByID[m.ID] = AllMods[len(AllMods)-1] - } - modByID = make(map[string]*ModDef, len(AllMods)) - for _, m := range AllMods { - modByID[m.ID] = m - } - return nil -} - -func GetMod(id string) *ModDef { - return modByID[id] -} - -func FindMod(input string) *ModDef { - if m, ok := modByID[input]; ok { - return m - } - lower := strings.ToLower(strings.ReplaceAll(input, " ", "_")) - for _, m := range AllMods { - if strings.HasPrefix(m.ID, lower) { - return m - } - } - lowerSpace := strings.ToLower(input) - for _, m := range AllMods { - if strings.HasPrefix(strings.ToLower(m.Name), lowerSpace) { - return m - } - } - return nil -} - -type chipEntry struct { - Input string - Output string - Qty int -} - -var enchantMap = map[string]map[string]string{ - "enchant_1": { - "sapphire_ring": "ring_of_recoil", - "sapphire_necklace": "necklace_of_passage", - "sapphire_bracelet": "bracelet_of_clay", - }, - "enchant_2": { - "emerald_ring": "ring_of_dueling", - "emerald_necklace": "binding_necklace", - "emerald_bracelet": "bracelet_of_slaughter", - }, - "enchant_3": { - "ruby_ring": "ring_of_forging", - "ruby_necklace": "digsite_pendant", - "ruby_bracelet": "inoculation_bracelet", - }, - "enchant_4": { - "diamond_ring": "ring_of_life", - "diamond_necklace": "phoenix_necklace", - "diamond_bracelet": "abyssal_bracelet", - }, -} - -var chipMap = map[string]chipEntry{ - "chip_sapphire": {"sapphire_bolts", "sapphire_bolts_e", 10}, - "chip_emerald": {"emerald_bolts", "emerald_bolts_e", 10}, - "chip_ruby": {"ruby_bolts", "ruby_bolts_e", 10}, - "chip_diamond": {"diamond_bolts", "diamond_bolts_e", 10}, -} - -func (g *Game) hasDeckEquipped(p *player.Player) bool { - itemID, ok := p.Equipment[object.SlotMainHand] - if !ok { - return false - } - def, err := g.ItemStore.Load(itemID) - if err != nil { - return false - } - return def.WeaponType == object.WeaponScience -} - -func (g *Game) equippedProvidesJunk(p *player.Player) string { - itemID, ok := p.Equipment[object.SlotMainHand] - if !ok { - return "" - } - def, err := g.ItemStore.Load(itemID) - if err != nil { - return "" - } - return def.ProvidesJunk -} - -func (g *Game) effectiveJunkCost(p *player.Player, mod *ModDef) map[string]int { - cost := make(map[string]int) - for k, v := range mod.JunkCost { - cost[k] = v - } - - hasDeck := g.hasDeckEquipped(p) - - if hasDeck { - delete(cost, "scrap_metal") - } - - providesJunk := g.equippedProvidesJunk(p) - if providesJunk != "" { - delete(cost, providesJunk) - } - - return cost -} - -func (g *Game) hasJunkCost(p *player.Player, mod *ModDef) bool { - cost := g.effectiveJunkCost(p, mod) - for itemID, qty := range cost { - if p.CountItem(itemID) < qty { - return false - } - } - return true -} - -func (g *Game) consumeJunkCost(p *player.Player, mod *ModDef) bool { - cost := g.effectiveJunkCost(p, mod) - for itemID, qty := range cost { - if !p.RemoveItem(itemID, qty) { - return false - } - } - g.AccountStore.SaveCharacter(p) - return true -} - -func (g *Game) junkCostString(p *player.Player, mod *ModDef) string { - cost := g.effectiveJunkCost(p, mod) - delete(cost, "scrap_metal") - if len(cost) == 0 { - return "free" - } - var parts []string - for itemID, qty := range cost { - def, _ := g.ItemStore.Load(itemID) - name := itemID - if def != nil { - name = def.Name - } - name = strings.TrimSuffix(name, "junk") - if qty > 1 { - parts = append(parts, fmt.Sprintf("%d %s", qty, name)) - } else { - parts = append(parts, name) - } - } - sort.Strings(parts) - return strings.Join(parts, ", ") -} - -func (g *Game) totalEquipScienceAttack(p *player.Player) int { - total := 0 - for _, itemID := range p.Equipment { - def, err := g.ItemStore.Load(itemID) - if err == nil { - total += def.Stats.ScienceAttack - } - } - return total -} - - diff --git a/internal/game/stations.go b/internal/game/stations.go deleted file mode 100644 index d30a35c..0000000 --- a/internal/game/stations.go +++ /dev/null @@ -1,28 +0,0 @@ -package game - -func (g *Game) findStation(roomID int, stationIDs []string) (defID string, displayName string) { - for _, obj := range g.World.AllObjInstances(roomID) { - if obj.Depleted { - continue - } - for _, sid := range stationIDs { - if obj.DefID == sid { - name := sid - if def, err := g.ObjectStore.Load(sid); err == nil { - name = def.Name - } - return sid, name - } - } - } - return "", "" -} - -func stationMatch(defID string, recipeStations []string) bool { - for _, rs := range recipeStations { - if rs == defID { - return true - } - } - return false -} diff --git a/internal/game/sys_assassin.go b/internal/game/sys_assassin.go new file mode 100644 index 0000000..1927399 --- /dev/null +++ b/internal/game/sys_assassin.go @@ -0,0 +1,174 @@ +package game + +import ( + "fmt" + "math/rand" + + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" + "thehouseoficarus/internal/world" +) + +type assassinTaskEntry struct { + MobID string + MinLevel int + MaxLevel int + MinCount int + MaxCount int + Weight int +} + +var assassinTaskTable = []assassinTaskEntry{ + {"man", 1, 15, 10, 25, 8}, + {"cow", 1, 15, 10, 25, 8}, + {"slug", 1, 99, 15, 45, 15}, + {"drone", 15, 99, 20, 50, 12}, + {"crawler", 30, 99, 15, 40, 10}, + {"phantom", 45, 99, 10, 30, 8}, +} + +func (g *Game) assignAssassinTask(sess *net.Session, p *player.Player) { + level := p.Level(player.Assassin) + var eligible []assassinTaskEntry + totalWeight := 0 + for _, entry := range assassinTaskTable { + if level >= entry.MinLevel && level <= entry.MaxLevel { + eligible = append(eligible, entry) + totalWeight += entry.Weight + } + } + if len(eligible) == 0 { + sess.WriteLine("The Client shakes their head. \"Nothing available for your level.\"") + return + } + roll := rand.Intn(totalWeight) + var chosen assassinTaskEntry + for _, entry := range eligible { + roll -= entry.Weight + if roll < 0 { + chosen = entry + break + } + } + count := chosen.MinCount + rand.Intn(chosen.MaxCount-chosen.MinCount+1) + setPlayerFlag(p, "assassin_task_mob", chosen.MobID) + setPlayerFlag(p, "assassin_task_total", count) + setPlayerFlag(p, "assassin_task_remaining", count) + g.AccountStore.SaveCharacter(p) + + def, err := g.MobStore.LoadDef(chosen.MobID) + name := chosen.MobID + if err == nil { + name = def.Name + } + sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf("\"Your target: %d %ss. Get to work.\"", count, name))) +} + +func (g *Game) onAssassinKill(sess *net.Session, p *player.Player, mob *world.MobInstance) { + taskMob := getPlayerFlagString(p, "assassin_task_mob") + if taskMob == "" || taskMob != mob.DefID { + return + } + remaining := getPlayerFlagInt(p, "assassin_task_remaining") + if remaining <= 0 { + return + } + xp := mob.MaxHP * 2 + g.awardSkillXP(sess, p, player.Assassin, xp) + if p.OptionBool("xp_drops") { + sess.WriteLine(g.colorize(sess, "xp", fmt.Sprintf(" (+%dxp asm)", xp))) + } + remaining-- + setPlayerFlag(p, "assassin_task_remaining", remaining) + if remaining <= 0 { + completed := getPlayerFlagInt(p, "assassin_tasks_completed") + 1 + streak := getPlayerFlagInt(p, "assassin_streak") + 1 + setPlayerFlag(p, "assassin_tasks_completed", completed) + setPlayerFlag(p, "assassin_streak", streak) + delete(p.Flags, "assassin_task_mob") + setPlayerFlag(p, "assassin_task_remaining", 0) + setPlayerFlag(p, "assassin_task_total", 0) + rep := 1 + bonus := streakBonus(streak) + rep += bonus + currentRep := getPlayerFlagInt(p, "assassin_reputation") + setPlayerFlag(p, "assassin_reputation", currentRep+rep) + sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf("\n*** Assassin task complete! ***"))) + if bonus > 0 { + sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf(" Streak bonus! %d tasks in a row. +%d bonus reputation.", streak, bonus))) + } + sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf(" Reputation earned: %d (total: %d)", rep, currentRep+rep))) + } else { + total := getPlayerFlagInt(p, "assassin_task_total") + def, _ := g.MobStore.LoadDef(taskMob) + name := taskMob + if def != nil { + name = def.Name + } + sess.WriteLine(g.colorize(sess, "assassin_task", fmt.Sprintf(" Assassin task: %d of %d %ss remaining.", remaining, total, name))) + } + g.AccountStore.SaveCharacter(p) +} + +func (g *Game) skipAssassinTask(sess *net.Session, p *player.Player) { + rep := getPlayerFlagInt(p, "assassin_reputation") + if rep < 30 { + sess.WriteLine("You don't have enough Reputation to skip. (Need 30, have " + fmt.Sprint(rep) + ")") + return + } + setPlayerFlag(p, "assassin_reputation", rep-30) + delete(p.Flags, "assassin_task_mob") + setPlayerFlag(p, "assassin_task_remaining", 0) + setPlayerFlag(p, "assassin_task_total", 0) + setPlayerFlag(p, "assassin_streak", 0) + g.AccountStore.SaveCharacter(p) +} + +func (g *Game) extendAssassinTask(sess *net.Session, p *player.Player) { + rep := getPlayerFlagInt(p, "assassin_reputation") + if rep < 30 { + sess.WriteLine("You don't have enough Reputation to extend. (Need 30, have " + fmt.Sprint(rep) + ")") + return + } + taskMob := getPlayerFlagString(p, "assassin_task_mob") + if taskMob == "" { + sess.WriteLine("You don't have an active task to extend.") + return + } + setPlayerFlag(p, "assassin_reputation", rep-30) + total := getPlayerFlagInt(p, "assassin_task_total") + remaining := getPlayerFlagInt(p, "assassin_task_remaining") + extension := total / 2 + if extension < 5 { + extension = 5 + } + setPlayerFlag(p, "assassin_task_total", total+extension) + setPlayerFlag(p, "assassin_task_remaining", remaining+extension) + g.AccountStore.SaveCharacter(p) + + def, _ := g.MobStore.LoadDef(taskMob) + name := taskMob + if def != nil { + name = def.Name + } + sess.WriteLine(fmt.Sprintf("Task extended by %d. Kill %d more %ss (%d total).", extension, remaining+extension, name, total+extension)) +} + +func streakBonus(streak int) int { + if streak%1000 == 0 { + return 50 + } + if streak%250 == 0 { + return 35 + } + if streak%100 == 0 { + return 25 + } + if streak%50 == 0 { + return 15 + } + if streak%10 == 0 { + return 5 + } + return 0 +} diff --git a/internal/game/sys_buff.go b/internal/game/sys_buff.go new file mode 100644 index 0000000..9449731 --- /dev/null +++ b/internal/game/sys_buff.go @@ -0,0 +1,55 @@ +package game + +import ( + "strings" + + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) BuffTick() { + if g.Hub == nil { + return + } + for _, sess := range g.Hub.AllSessions() { + if sess.Player == nil { + continue + } + p := sess.Player + remaining := make([]player.PotionBuff, 0, len(p.ActiveBuffs)) + dirty := false + for _, buff := range p.ActiveBuffs { + buff.TicksLeft-- + if buff.TicksLeft > 0 { + remaining = append(remaining, buff) + } else { + dirty = true + } + } + if dirty { + p.ActiveBuffs = remaining + sess.WriteLine(g.colorize(sess, "broadcast", "\nYour potion buff has worn off.")) + } + } +} + +func (g *Game) buffLevelBonus(p *player.Player, stat string) int { + if g.Hub == nil { + return 0 + } + totalPercent := 0 + for _, buff := range p.ActiveBuffs { + if strings.EqualFold(buff.Stat, stat) { + totalPercent += buff.BonusPercent + } + } + if totalPercent == 0 { + return 0 + } + baseLevel := p.Level(player.SkillName(strings.ToLower(stat))) + return baseLevel * totalPercent / 100 +} + +func (g *Game) totalBuffedLevel(sess *net.Session, p *player.Player, stat string) int { + return p.Level(player.SkillName(strings.ToLower(stat))) + g.buffLevelBonus(p, stat) +} diff --git a/internal/game/sys_combat.go b/internal/game/sys_combat.go new file mode 100644 index 0000000..030bed1 --- /dev/null +++ b/internal/game/sys_combat.go @@ -0,0 +1,114 @@ +package game + +import ( + "fmt" + "sort" + + "thehouseoficarus/internal/combat" + "thehouseoficarus/internal/engine" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) dropItemsOnDeath(p *player.Player) { + roomID := p.RoomID + + if p.Credits > 0 { + g.World.AddGroundItem(roomID, "credits", p.Credits) + p.Credits = 0 + } + + var items []deathDrop + + for slot, inv := range p.Inventory { + if inv == nil || inv.Quantity <= 0 { + continue + } + val := 0 + if def, err := g.ItemStore.Load(inv.ItemID); err == nil { + val = def.Value * inv.Quantity + } + items = append(items, deathDrop{ + itemID: inv.ItemID, + quantity: inv.Quantity, + totalVal: val, + invSlot: slot, + }) + } + + for eqSlot, itemID := range p.Equipment { + val := 0 + if def, err := g.ItemStore.Load(itemID); err == nil { + val = def.Value + } + items = append(items, deathDrop{ + itemID: itemID, + quantity: 1, + totalVal: val, + isEquip: true, + equipSlot: eqSlot, + }) + } + + if len(items) <= 3 { + return + } + + sort.Slice(items, func(i, j int) bool { + return items[i].totalVal > items[j].totalVal + }) + + for i := 3; i < len(items); i++ { + it := items[i] + if it.isEquip { + delete(p.Equipment, it.equipSlot) + } else { + p.SetInvSlot(it.invSlot, nil) + } + g.World.AddGroundItem(roomID, it.itemID, it.quantity) + } +} + +func (g *Game) checkAggro(sess *net.Session) { + p := sess.Player + + if combat.GetCombat(p.Name) != nil { + return + } + + playerLevel := p.CombatLevel() + mobs := g.MobStore.MobsInRoom(p.RoomID) + + for _, mob := range mobs { + if !mob.Aggressive || mob.HP <= 0 || mob.Protected { + continue + } + if combat.IsMobInCombat(mob.InstanceID) { + continue + } + mobLevel := mobCombatLevel(mob) + if playerLevel > mobLevel*2 { + continue + } + aggMob := mob + g.Ticks.Subscribe(engine.ToTicks(1), func() bool { + if combat.GetCombat(p.Name) != nil { + return false + } + if aggMob.HP <= 0 || aggMob.RoomID != p.RoomID { + return false + } + if combat.IsMobInCombat(aggMob.InstanceID) { + return false + } + attacker := aggMob.Name + if !aggMob.Unique { + attacker = "The " + aggMob.Name + } + sess.WriteLine(fmt.Sprintf("\n%s attacks you!", g.colorize(sess, "mob_name", attacker))) + g.startCombat(sess, p, aggMob) + return false + }) + break + } +} diff --git a/internal/game/sys_construction.go b/internal/game/sys_construction.go new file mode 100644 index 0000000..06713cd --- /dev/null +++ b/internal/game/sys_construction.go @@ -0,0 +1,74 @@ +package game + +import ( + "fmt" + + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) processSawmill(sess *net.Session, p *player.Player) { + logTypes := map[string]struct { + plankID string + cost int + name string + }{ + "logs": {"planks", 5, "regular planks"}, + "oak_logs": {"oak_planks", 10, "oak planks"}, + "teak_logs": {"teak_planks", 20, "teak planks"}, + "mahogany_logs": {"mahogany_planks", 40, "mahogany planks"}, + } + + totalCost := 0 + totalPlanks := 0 + type plankResult struct { + plankID string + qty int + } + + var results []plankResult + + for logID, info := range logTypes { + qty := p.CountItem(logID) + if qty == 0 { + continue + } + cost := qty * info.cost + totalCost += cost + totalPlanks += qty + results = append(results, plankResult{info.plankID, qty}) + p.RemoveItem(logID, qty) + } + + if totalPlanks == 0 { + sess.WriteLine("You don't have any logs to process.") + return + } + + if p.Credits < totalCost { + sess.WriteLine(fmt.Sprintf("You need %d credits to process all your logs (you have %d).", totalCost, p.Credits)) + return + } + + p.Credits -= totalCost + + processed := 0 + for _, r := range results { + for i := 0; i < r.qty; i++ { + freeSlot := p.FirstFreeSlot() + if freeSlot == -1 { + g.World.AddGroundItem(p.RoomID, r.plankID, r.qty-i) + break + } + p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: r.plankID, Quantity: 1}) + processed++ + } + } + + g.AccountStore.SaveCharacter(p) + + sess.WriteLine(fmt.Sprintf("The sawmill operator processes your logs into %d planks for %d credits.", processed, totalCost)) + if processed < totalPlanks { + sess.WriteLine(fmt.Sprintf("Your inventory is full. The remaining %d planks fall to the ground.", totalPlanks-processed)) + } +} diff --git a/internal/game/sys_science.go b/internal/game/sys_science.go new file mode 100644 index 0000000..23aeef4 --- /dev/null +++ b/internal/game/sys_science.go @@ -0,0 +1,220 @@ +package game + +import ( + "fmt" + "path/filepath" + "sort" + "strings" + + "gopkg.in/yaml.v3" + + "thehouseoficarus/internal/action" + "thehouseoficarus/internal/object" + "thehouseoficarus/internal/player" +) + +type ModCategory string + +const ( + ModCombat ModCategory = "combat" + ModUtility ModCategory = "utility" + ModEnchant ModCategory = "enchant" + ModProcessing ModCategory = "processing" + ModTransport ModCategory = "transport" +) + +type ModDef struct { + ID string `yaml:"id"` + Name string `yaml:"name"` + Level int `yaml:"level"` + MaxHit int `yaml:"max_hit"` + BaseXP int `yaml:"base_xp"` + JunkCost map[string]int `yaml:"junk_cost"` + Category ModCategory `yaml:"category"` + Element string `yaml:"element"` + Destination int `yaml:"destination"` +} + +var AllMods []*ModDef + +var modByID map[string]*ModDef + +func (g *Game) LoadMods() error { + dir := filepath.Join(g.DataDir, "modules") + AllMods = nil + modByID = make(map[string]*ModDef) + action.WalkYAMLDir(dir, func(path, id string, data []byte) error { + var m ModDef + if err := yaml.Unmarshal(data, &m); err != nil { + return nil + } + AllMods = append(AllMods, &m) + return nil + }) + modByID = make(map[string]*ModDef, len(AllMods)) + for _, m := range AllMods { + modByID[m.ID] = m + } + return nil +} + +func GetMod(id string) *ModDef { + return modByID[id] +} + +func FindMod(input string) *ModDef { + if m, ok := modByID[input]; ok { + return m + } + lower := strings.ToLower(strings.ReplaceAll(input, " ", "_")) + for _, m := range AllMods { + if strings.HasPrefix(m.ID, lower) { + return m + } + } + lowerSpace := strings.ToLower(input) + for _, m := range AllMods { + if strings.HasPrefix(strings.ToLower(m.Name), lowerSpace) { + return m + } + } + return nil +} + +type chipEntry struct { + Input string + Output string + Qty int +} + +var enchantMap = map[string]map[string]string{ + "enchant_1": { + "sapphire_ring": "ring_of_recoil", + "sapphire_necklace": "necklace_of_passage", + "sapphire_bracelet": "bracelet_of_clay", + }, + "enchant_2": { + "emerald_ring": "ring_of_dueling", + "emerald_necklace": "binding_necklace", + "emerald_bracelet": "bracelet_of_slaughter", + }, + "enchant_3": { + "ruby_ring": "ring_of_forging", + "ruby_necklace": "digsite_pendant", + "ruby_bracelet": "inoculation_bracelet", + }, + "enchant_4": { + "diamond_ring": "ring_of_life", + "diamond_necklace": "phoenix_necklace", + "diamond_bracelet": "abyssal_bracelet", + }, +} + +var chipMap = map[string]chipEntry{ + "chip_sapphire": {"sapphire_bolts", "sapphire_bolts_e", 10}, + "chip_emerald": {"emerald_bolts", "emerald_bolts_e", 10}, + "chip_ruby": {"ruby_bolts", "ruby_bolts_e", 10}, + "chip_diamond": {"diamond_bolts", "diamond_bolts_e", 10}, +} + +func (g *Game) hasDeckEquipped(p *player.Player) bool { + itemID, ok := p.Equipment[object.SlotMainHand] + if !ok { + return false + } + def, err := g.ItemStore.Load(itemID) + if err != nil { + return false + } + return def.WeaponType == object.WeaponScience +} + +func (g *Game) equippedProvidesJunk(p *player.Player) string { + itemID, ok := p.Equipment[object.SlotMainHand] + if !ok { + return "" + } + def, err := g.ItemStore.Load(itemID) + if err != nil { + return "" + } + return def.ProvidesJunk +} + +func (g *Game) effectiveJunkCost(p *player.Player, mod *ModDef) map[string]int { + cost := make(map[string]int) + for k, v := range mod.JunkCost { + cost[k] = v + } + + hasDeck := g.hasDeckEquipped(p) + + if hasDeck { + delete(cost, "scrap_metal") + } + + providesJunk := g.equippedProvidesJunk(p) + if providesJunk != "" { + delete(cost, providesJunk) + } + + return cost +} + +func (g *Game) hasJunkCost(p *player.Player, mod *ModDef) bool { + cost := g.effectiveJunkCost(p, mod) + for itemID, qty := range cost { + if p.CountItem(itemID) < qty { + return false + } + } + return true +} + +func (g *Game) consumeJunkCost(p *player.Player, mod *ModDef) bool { + cost := g.effectiveJunkCost(p, mod) + for itemID, qty := range cost { + if !p.RemoveItem(itemID, qty) { + return false + } + } + g.AccountStore.SaveCharacter(p) + return true +} + +func (g *Game) junkCostString(p *player.Player, mod *ModDef) string { + cost := g.effectiveJunkCost(p, mod) + delete(cost, "scrap_metal") + if len(cost) == 0 { + return "free" + } + var parts []string + for itemID, qty := range cost { + def, _ := g.ItemStore.Load(itemID) + name := itemID + if def != nil { + name = def.Name + } + name = strings.TrimSuffix(name, "junk") + if qty > 1 { + parts = append(parts, fmt.Sprintf("%d %s", qty, name)) + } else { + parts = append(parts, name) + } + } + sort.Strings(parts) + return strings.Join(parts, ", ") +} + +func (g *Game) totalEquipScienceAttack(p *player.Player) int { + total := 0 + for _, itemID := range p.Equipment { + def, err := g.ItemStore.Load(itemID) + if err == nil { + total += def.Stats.ScienceAttack + } + } + return total +} + + diff --git a/internal/game/sys_technology.go b/internal/game/sys_technology.go new file mode 100644 index 0000000..a24c66d --- /dev/null +++ b/internal/game/sys_technology.go @@ -0,0 +1,250 @@ +package game + +import ( + "fmt" + "strings" + + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" + "thehouseoficarus/internal/world" +) + +type TechEffects struct { + AttackPercent int + StrengthPercent int + DefensePercent int + RangedPercent int + SciencePercent int + ProtectMelee bool + ProtectRanged bool + ProtectScience bool + DamageReduction float64 + HPRegenMulti float64 + PreserveDrain float64 + RetributionPct float64 +} + +type TechDef struct { + ID string + Name string + Level int + DrainRate float64 + Category string + Group string + Effects TechEffects +} + +var AllTechs []TechDef +var techByID map[string]*TechDef + +func init() { + AllTechs = []TechDef{ + {ID: "clarity_1", Name: "Clarity", Level: 4, DrainRate: 0.05, Category: "attack", Group: "attack_tier", Effects: TechEffects{AttackPercent: 5}}, + {ID: "clarity_2", Name: "Enhanced Clarity", Level: 16, DrainRate: 0.10, Category: "attack", Group: "attack_tier", Effects: TechEffects{AttackPercent: 10}}, + {ID: "clarity_3", Name: "Superior Clarity", Level: 44, DrainRate: 0.15, Category: "attack", Group: "attack_tier", Effects: TechEffects{AttackPercent: 15}}, + + {ID: "amplifier_1", Name: "Power Amplifier", Level: 7, DrainRate: 0.05, Category: "strength", Group: "strength_tier", Effects: TechEffects{StrengthPercent: 5}}, + {ID: "amplifier_2", Name: "Enhanced Amplifier", Level: 23, DrainRate: 0.10, Category: "strength", Group: "strength_tier", Effects: TechEffects{StrengthPercent: 10}}, + {ID: "amplifier_3", Name: "Superior Amplifier", Level: 49, DrainRate: 0.15, Category: "strength", Group: "strength_tier", Effects: TechEffects{StrengthPercent: 15}}, + + {ID: "shield_1", Name: "Energy Shield", Level: 10, DrainRate: 0.05, Category: "defense", Group: "defense_tier", Effects: TechEffects{DefensePercent: 5}}, + {ID: "shield_2", Name: "Enhanced Shield", Level: 28, DrainRate: 0.10, Category: "defense", Group: "defense_tier", Effects: TechEffects{DefensePercent: 10}}, + {ID: "shield_3", Name: "Superior Shield", Level: 52, DrainRate: 0.15, Category: "defense", Group: "defense_tier", Effects: TechEffects{DefensePercent: 15}}, + + {ID: "targeting_1", Name: "Targeting System", Level: 8, DrainRate: 0.05, Category: "ranged", Group: "ranged_tier", Effects: TechEffects{RangedPercent: 5}}, + {ID: "targeting_2", Name: "Enhanced Targeting", Level: 22, DrainRate: 0.10, Category: "ranged", Group: "ranged_tier", Effects: TechEffects{RangedPercent: 10}}, + {ID: "targeting_3", Name: "Superior Targeting", Level: 46, DrainRate: 0.15, Category: "ranged", Group: "ranged_tier", Effects: TechEffects{RangedPercent: 15}}, + + {ID: "focus_1", Name: "Neural Focus", Level: 9, DrainRate: 0.05, Category: "science", Group: "science_tier", Effects: TechEffects{SciencePercent: 5}}, + {ID: "focus_2", Name: "Enhanced Focus", Level: 27, DrainRate: 0.10, Category: "science", Group: "science_tier", Effects: TechEffects{SciencePercent: 10}}, + {ID: "focus_3", Name: "Superior Focus", Level: 55, DrainRate: 0.15, Category: "science", Group: "science_tier", Effects: TechEffects{SciencePercent: 15}}, + + {ID: "protect_melee", Name: "Kinetic Barrier", Level: 37, DrainRate: 0.20, Category: "protection", Group: "protection", Effects: TechEffects{ProtectMelee: true, DamageReduction: 0.4}}, + {ID: "protect_ranged", Name: "Projectile Screen", Level: 40, DrainRate: 0.20, Category: "protection", Group: "protection", Effects: TechEffects{ProtectRanged: true, DamageReduction: 0.4}}, + {ID: "protect_science", Name: "Neural Firewall", Level: 43, DrainRate: 0.20, Category: "protection", Group: "protection", Effects: TechEffects{ProtectScience: true, DamageReduction: 0.4}}, + + {ID: "regen", Name: "Nano Repair", Level: 22, DrainRate: 0.10, Category: "utility", Group: "regen_tier", Effects: TechEffects{HPRegenMulti: 2.0}}, + {ID: "rapid_heal", Name: "Rapid Repair", Level: 31, DrainRate: 0.15, Category: "utility", Group: "regen_tier", Effects: TechEffects{HPRegenMulti: 4.0}}, + {ID: "preserve", Name: "Power Saver", Level: 55, DrainRate: 0.05, Category: "utility", Group: "", Effects: TechEffects{PreserveDrain: 0.2}}, + {ID: "retribution", Name: "Dead Man's Switch", Level: 46, DrainRate: 0.10, Category: "utility", Group: "", Effects: TechEffects{RetributionPct: 0.25}}, + + {ID: "overclock", Name: "Overclock", Level: 60, DrainRate: 0.25, Category: "combo", Group: "attack_tier", Effects: TechEffects{AttackPercent: 15, StrengthPercent: 15}}, + {ID: "fortify", Name: "Fortify", Level: 65, DrainRate: 0.25, Category: "combo", Group: "defense_tier", Effects: TechEffects{DefensePercent: 15, HPRegenMulti: 2.0}}, + } + + techByID = make(map[string]*TechDef, len(AllTechs)) + for i := range AllTechs { + techByID[AllTechs[i].ID] = &AllTechs[i] + } +} + +func GetTechDef(id string) *TechDef { + return techByID[id] +} + +func TechByPrefixMatch(input string) []*TechDef { + input = strings.ToLower(input) + var exact []*TechDef + var prefix []*TechDef + for i := range AllTechs { + lower := strings.ToLower(AllTechs[i].Name) + lowerID := strings.ToLower(AllTechs[i].ID) + if lower == input || lowerID == input { + exact = append(exact, &AllTechs[i]) + } else if strings.HasPrefix(lower, input) || strings.HasPrefix(lowerID, input) { + prefix = append(prefix, &AllTechs[i]) + } + } + if len(exact) > 0 { + return exact + } + return prefix +} + +func techEffectString(tech TechDef) string { + var parts []string + e := tech.Effects + if e.AttackPercent > 0 { + parts = append(parts, fmt.Sprintf("+%d%% Attack", e.AttackPercent)) + } + if e.StrengthPercent > 0 { + parts = append(parts, fmt.Sprintf("+%d%% Strength", e.StrengthPercent)) + } + if e.DefensePercent > 0 { + parts = append(parts, fmt.Sprintf("+%d%% Defense", e.DefensePercent)) + } + if e.RangedPercent > 0 { + parts = append(parts, fmt.Sprintf("+%d%% Ranged", e.RangedPercent)) + } + if e.SciencePercent > 0 { + parts = append(parts, fmt.Sprintf("+%d%% Science", e.SciencePercent)) + } + if e.ProtectMelee { + parts = append(parts, fmt.Sprintf("%.0f%% melee protection", e.DamageReduction*100)) + } + if e.ProtectRanged { + parts = append(parts, fmt.Sprintf("%.0f%% ranged protection", e.DamageReduction*100)) + } + if e.ProtectScience { + parts = append(parts, fmt.Sprintf("%.0f%% science protection", e.DamageReduction*100)) + } + if e.HPRegenMulti > 0 { + parts = append(parts, fmt.Sprintf("%.0fx HP regen", e.HPRegenMulti)) + } + if e.PreserveDrain > 0 { + parts = append(parts, fmt.Sprintf("%.0f%% drain reduction", e.PreserveDrain*100)) + } + if e.RetributionPct > 0 { + parts = append(parts, fmt.Sprintf("%.0f%% retribution", e.RetributionPct*100)) + } + return strings.Join(parts, ", ") +} + +func (g *Game) totalTechBonus(p *player.Player) int { + total := 0 + for _, itemID := range p.Equipment { + def, err := g.ItemStore.Load(itemID) + if err == nil { + total += def.Stats.TechnologyBonus + } + } + return total +} + +func (g *Game) techLevelBonus(p *player.Player, stat string) int { + if len(p.ActiveTechs) == 0 { + return 0 + } + + totalPercent := 0 + for id := range p.ActiveTechs { + def := GetTechDef(id) + if def == nil { + continue + } + switch stat { + case "attack": + totalPercent += def.Effects.AttackPercent + case "strength": + totalPercent += def.Effects.StrengthPercent + case "defense": + totalPercent += def.Effects.DefensePercent + case "ranged": + totalPercent += def.Effects.RangedPercent + case "science": + totalPercent += def.Effects.SciencePercent + } + } + + if totalPercent == 0 { + return 0 + } + + var baseLevel int + switch stat { + case "attack": + baseLevel = p.Level(player.Attack) + case "strength": + baseLevel = p.Level(player.Strength) + case "defense": + baseLevel = p.Level(player.Defense) + case "ranged": + baseLevel = p.Level(player.Ranged) + case "science": + baseLevel = p.Level(player.Science) + } + + return baseLevel * totalPercent / 100 +} + +func (g *Game) tryRecharge(sess *net.Session, p *player.Player, input string) bool { + lower := strings.ToLower(strings.TrimSpace(input)) + instances := g.World.FindObjInstances(p.RoomID, lower) + for _, st := range instances { + if st.DefID == "charging_station" || st.DefID == "power_conduit" { + if p.Battery >= p.MaxBattery() { + sess.WriteLine("\nYour battery is already full.") + } else { + p.Battery = p.MaxBattery() + g.AccountStore.SaveCharacter(p) + sess.WriteLine(g.colorize(sess, "battery", + "\nYou connect to the charging station. Your battery is fully recharged.")) + } + return true + } + } + return false +} + +func (g *Game) applyTechProtection(p *player.Player, mob *world.MobInstance, dmg int) int { + if len(p.ActiveTechs) == 0 { + return dmg + } + + attackType := mob.AttackType + if attackType == "" { + attackType = "crush" + } + + var protectTechID string + switch attackType { + case "stab", "slash", "crush": + protectTechID = "protect_melee" + case "ranged": + protectTechID = "protect_ranged" + case "science": + protectTechID = "protect_science" + } + + if protectTechID != "" && p.HasActiveTech(protectTechID) { + def := GetTechDef(protectTechID) + if def != nil { + reduced := int(float64(dmg) * (1.0 - def.Effects.DamageReduction)) + if reduced < 0 { + reduced = 0 + } + return reduced + } + } + return dmg +} diff --git a/internal/game/table.go b/internal/game/table.go deleted file mode 100644 index b96dca1..0000000 --- a/internal/game/table.go +++ /dev/null @@ -1,150 +0,0 @@ -package game - -import ( - "strings" - - "thehouseoficarus/internal/color" -) - -type tableGlyphs struct { - topLeft, topSep, topRight rune - side, colSep rune - sepLeft, sepCross, sepRight rune - botLeft, botSep, botRight rune - fillH, fillHSep rune - titleSep rune -} - -func tableGlyphSet(unicode bool) tableGlyphs { - if unicode { - return tableGlyphs{ - topLeft: '╔', topSep: '╤', topRight: '╗', side: '║', colSep: '│', - sepLeft: '╟', sepCross: '┼', sepRight: '╢', - botLeft: '╚', botSep: '╧', botRight: '╝', fillH: '═', fillHSep: '─', - titleSep: '┬', - } - } - return tableGlyphs{ - topLeft: '+', topSep: '+', topRight: '+', side: '|', colSep: '|', - sepLeft: '+', sepCross: '+', sepRight: '+', - botLeft: '+', botSep: '+', botRight: '+', fillH: '-', fillHSep: '-', - titleSep: '+', - } -} - -type Table struct { - Title string - Columns []string - Rows [][]string -} - -func (t *Table) Render(unicode bool) []string { - g := tableGlyphSet(unicode) - - nCols := len(t.Columns) - if nCols == 0 && len(t.Rows) > 0 { - nCols = len(t.Rows[0]) - } - if nCols == 0 { - return nil - } - - colWidths := make([]int, nCols) - for i, h := range t.Columns { - colWidths[i] = color.VisibleLen(h) - } - for _, row := range t.Rows { - for i, cell := range row { - if i >= nCols { - break - } - vl := color.VisibleLen(cell) - if vl > colWidths[i] { - colWidths[i] = vl - } - } - } - - makeSep := func(left, cross, right rune, fill rune) string { - var b strings.Builder - b.WriteRune(left) - for i := 0; i < nCols; i++ { - if i > 0 { - b.WriteRune(cross) - } - b.WriteString(strings.Repeat(string(fill), colWidths[i]+2)) - } - b.WriteRune(right) - return b.String() - } - - makeRow := func(cells []string) string { - var b strings.Builder - b.WriteRune(g.side) - for i := 0; i < nCols; i++ { - if i > 0 { - b.WriteRune(g.colSep) - } - cell := "" - if i < len(cells) { - cell = cells[i] - } - pad := colWidths[i] - color.VisibleLen(cell) - if pad < 0 { - pad = 0 - } - b.WriteString(" " + cell + strings.Repeat(" ", pad) + " ") - } - b.WriteRune(g.side) - return b.String() - } - - hasTitle := t.Title != "" - hasCols := len(t.Columns) > 0 - - var out []string - - if hasTitle { - innerWidth := 0 - for _, w := range colWidths { - innerWidth += w + 2 - } - innerWidth += nCols - 1 - - var tb strings.Builder - tb.WriteRune(g.topLeft) - tb.WriteString(strings.Repeat(string(g.fillH), innerWidth)) - tb.WriteRune(g.topRight) - out = append(out, tb.String()) - - var tr strings.Builder - tr.WriteRune(g.side) - tr.WriteString(" ") - tr.WriteString(t.Title) - padding := innerWidth - 2 - color.VisibleLen(t.Title) - if padding < 0 { - padding = 0 - } - tr.WriteString(strings.Repeat(" ", padding)) - tr.WriteString(" ") - tr.WriteRune(g.side) - out = append(out, tr.String()) - - out = append(out, makeSep(g.sepLeft, g.titleSep, g.sepRight, g.fillHSep)) - } else { - out = append(out, makeSep(g.topLeft, g.topSep, g.topRight, g.fillH)) - } - - if hasCols { - out = append(out, makeRow(t.Columns)) - out = append(out, makeSep(g.sepLeft, g.sepCross, g.sepRight, g.fillHSep)) - } - - for _, row := range t.Rows { - out = append(out, makeRow(row)) - } - - out = append(out, makeSep(g.botLeft, g.botSep, g.botRight, g.fillH)) - - return out -} diff --git a/internal/game/tech.go b/internal/game/tech.go deleted file mode 100644 index a24c66d..0000000 --- a/internal/game/tech.go +++ /dev/null @@ -1,250 +0,0 @@ -package game - -import ( - "fmt" - "strings" - - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/player" - "thehouseoficarus/internal/world" -) - -type TechEffects struct { - AttackPercent int - StrengthPercent int - DefensePercent int - RangedPercent int - SciencePercent int - ProtectMelee bool - ProtectRanged bool - ProtectScience bool - DamageReduction float64 - HPRegenMulti float64 - PreserveDrain float64 - RetributionPct float64 -} - -type TechDef struct { - ID string - Name string - Level int - DrainRate float64 - Category string - Group string - Effects TechEffects -} - -var AllTechs []TechDef -var techByID map[string]*TechDef - -func init() { - AllTechs = []TechDef{ - {ID: "clarity_1", Name: "Clarity", Level: 4, DrainRate: 0.05, Category: "attack", Group: "attack_tier", Effects: TechEffects{AttackPercent: 5}}, - {ID: "clarity_2", Name: "Enhanced Clarity", Level: 16, DrainRate: 0.10, Category: "attack", Group: "attack_tier", Effects: TechEffects{AttackPercent: 10}}, - {ID: "clarity_3", Name: "Superior Clarity", Level: 44, DrainRate: 0.15, Category: "attack", Group: "attack_tier", Effects: TechEffects{AttackPercent: 15}}, - - {ID: "amplifier_1", Name: "Power Amplifier", Level: 7, DrainRate: 0.05, Category: "strength", Group: "strength_tier", Effects: TechEffects{StrengthPercent: 5}}, - {ID: "amplifier_2", Name: "Enhanced Amplifier", Level: 23, DrainRate: 0.10, Category: "strength", Group: "strength_tier", Effects: TechEffects{StrengthPercent: 10}}, - {ID: "amplifier_3", Name: "Superior Amplifier", Level: 49, DrainRate: 0.15, Category: "strength", Group: "strength_tier", Effects: TechEffects{StrengthPercent: 15}}, - - {ID: "shield_1", Name: "Energy Shield", Level: 10, DrainRate: 0.05, Category: "defense", Group: "defense_tier", Effects: TechEffects{DefensePercent: 5}}, - {ID: "shield_2", Name: "Enhanced Shield", Level: 28, DrainRate: 0.10, Category: "defense", Group: "defense_tier", Effects: TechEffects{DefensePercent: 10}}, - {ID: "shield_3", Name: "Superior Shield", Level: 52, DrainRate: 0.15, Category: "defense", Group: "defense_tier", Effects: TechEffects{DefensePercent: 15}}, - - {ID: "targeting_1", Name: "Targeting System", Level: 8, DrainRate: 0.05, Category: "ranged", Group: "ranged_tier", Effects: TechEffects{RangedPercent: 5}}, - {ID: "targeting_2", Name: "Enhanced Targeting", Level: 22, DrainRate: 0.10, Category: "ranged", Group: "ranged_tier", Effects: TechEffects{RangedPercent: 10}}, - {ID: "targeting_3", Name: "Superior Targeting", Level: 46, DrainRate: 0.15, Category: "ranged", Group: "ranged_tier", Effects: TechEffects{RangedPercent: 15}}, - - {ID: "focus_1", Name: "Neural Focus", Level: 9, DrainRate: 0.05, Category: "science", Group: "science_tier", Effects: TechEffects{SciencePercent: 5}}, - {ID: "focus_2", Name: "Enhanced Focus", Level: 27, DrainRate: 0.10, Category: "science", Group: "science_tier", Effects: TechEffects{SciencePercent: 10}}, - {ID: "focus_3", Name: "Superior Focus", Level: 55, DrainRate: 0.15, Category: "science", Group: "science_tier", Effects: TechEffects{SciencePercent: 15}}, - - {ID: "protect_melee", Name: "Kinetic Barrier", Level: 37, DrainRate: 0.20, Category: "protection", Group: "protection", Effects: TechEffects{ProtectMelee: true, DamageReduction: 0.4}}, - {ID: "protect_ranged", Name: "Projectile Screen", Level: 40, DrainRate: 0.20, Category: "protection", Group: "protection", Effects: TechEffects{ProtectRanged: true, DamageReduction: 0.4}}, - {ID: "protect_science", Name: "Neural Firewall", Level: 43, DrainRate: 0.20, Category: "protection", Group: "protection", Effects: TechEffects{ProtectScience: true, DamageReduction: 0.4}}, - - {ID: "regen", Name: "Nano Repair", Level: 22, DrainRate: 0.10, Category: "utility", Group: "regen_tier", Effects: TechEffects{HPRegenMulti: 2.0}}, - {ID: "rapid_heal", Name: "Rapid Repair", Level: 31, DrainRate: 0.15, Category: "utility", Group: "regen_tier", Effects: TechEffects{HPRegenMulti: 4.0}}, - {ID: "preserve", Name: "Power Saver", Level: 55, DrainRate: 0.05, Category: "utility", Group: "", Effects: TechEffects{PreserveDrain: 0.2}}, - {ID: "retribution", Name: "Dead Man's Switch", Level: 46, DrainRate: 0.10, Category: "utility", Group: "", Effects: TechEffects{RetributionPct: 0.25}}, - - {ID: "overclock", Name: "Overclock", Level: 60, DrainRate: 0.25, Category: "combo", Group: "attack_tier", Effects: TechEffects{AttackPercent: 15, StrengthPercent: 15}}, - {ID: "fortify", Name: "Fortify", Level: 65, DrainRate: 0.25, Category: "combo", Group: "defense_tier", Effects: TechEffects{DefensePercent: 15, HPRegenMulti: 2.0}}, - } - - techByID = make(map[string]*TechDef, len(AllTechs)) - for i := range AllTechs { - techByID[AllTechs[i].ID] = &AllTechs[i] - } -} - -func GetTechDef(id string) *TechDef { - return techByID[id] -} - -func TechByPrefixMatch(input string) []*TechDef { - input = strings.ToLower(input) - var exact []*TechDef - var prefix []*TechDef - for i := range AllTechs { - lower := strings.ToLower(AllTechs[i].Name) - lowerID := strings.ToLower(AllTechs[i].ID) - if lower == input || lowerID == input { - exact = append(exact, &AllTechs[i]) - } else if strings.HasPrefix(lower, input) || strings.HasPrefix(lowerID, input) { - prefix = append(prefix, &AllTechs[i]) - } - } - if len(exact) > 0 { - return exact - } - return prefix -} - -func techEffectString(tech TechDef) string { - var parts []string - e := tech.Effects - if e.AttackPercent > 0 { - parts = append(parts, fmt.Sprintf("+%d%% Attack", e.AttackPercent)) - } - if e.StrengthPercent > 0 { - parts = append(parts, fmt.Sprintf("+%d%% Strength", e.StrengthPercent)) - } - if e.DefensePercent > 0 { - parts = append(parts, fmt.Sprintf("+%d%% Defense", e.DefensePercent)) - } - if e.RangedPercent > 0 { - parts = append(parts, fmt.Sprintf("+%d%% Ranged", e.RangedPercent)) - } - if e.SciencePercent > 0 { - parts = append(parts, fmt.Sprintf("+%d%% Science", e.SciencePercent)) - } - if e.ProtectMelee { - parts = append(parts, fmt.Sprintf("%.0f%% melee protection", e.DamageReduction*100)) - } - if e.ProtectRanged { - parts = append(parts, fmt.Sprintf("%.0f%% ranged protection", e.DamageReduction*100)) - } - if e.ProtectScience { - parts = append(parts, fmt.Sprintf("%.0f%% science protection", e.DamageReduction*100)) - } - if e.HPRegenMulti > 0 { - parts = append(parts, fmt.Sprintf("%.0fx HP regen", e.HPRegenMulti)) - } - if e.PreserveDrain > 0 { - parts = append(parts, fmt.Sprintf("%.0f%% drain reduction", e.PreserveDrain*100)) - } - if e.RetributionPct > 0 { - parts = append(parts, fmt.Sprintf("%.0f%% retribution", e.RetributionPct*100)) - } - return strings.Join(parts, ", ") -} - -func (g *Game) totalTechBonus(p *player.Player) int { - total := 0 - for _, itemID := range p.Equipment { - def, err := g.ItemStore.Load(itemID) - if err == nil { - total += def.Stats.TechnologyBonus - } - } - return total -} - -func (g *Game) techLevelBonus(p *player.Player, stat string) int { - if len(p.ActiveTechs) == 0 { - return 0 - } - - totalPercent := 0 - for id := range p.ActiveTechs { - def := GetTechDef(id) - if def == nil { - continue - } - switch stat { - case "attack": - totalPercent += def.Effects.AttackPercent - case "strength": - totalPercent += def.Effects.StrengthPercent - case "defense": - totalPercent += def.Effects.DefensePercent - case "ranged": - totalPercent += def.Effects.RangedPercent - case "science": - totalPercent += def.Effects.SciencePercent - } - } - - if totalPercent == 0 { - return 0 - } - - var baseLevel int - switch stat { - case "attack": - baseLevel = p.Level(player.Attack) - case "strength": - baseLevel = p.Level(player.Strength) - case "defense": - baseLevel = p.Level(player.Defense) - case "ranged": - baseLevel = p.Level(player.Ranged) - case "science": - baseLevel = p.Level(player.Science) - } - - return baseLevel * totalPercent / 100 -} - -func (g *Game) tryRecharge(sess *net.Session, p *player.Player, input string) bool { - lower := strings.ToLower(strings.TrimSpace(input)) - instances := g.World.FindObjInstances(p.RoomID, lower) - for _, st := range instances { - if st.DefID == "charging_station" || st.DefID == "power_conduit" { - if p.Battery >= p.MaxBattery() { - sess.WriteLine("\nYour battery is already full.") - } else { - p.Battery = p.MaxBattery() - g.AccountStore.SaveCharacter(p) - sess.WriteLine(g.colorize(sess, "battery", - "\nYou connect to the charging station. Your battery is fully recharged.")) - } - return true - } - } - return false -} - -func (g *Game) applyTechProtection(p *player.Player, mob *world.MobInstance, dmg int) int { - if len(p.ActiveTechs) == 0 { - return dmg - } - - attackType := mob.AttackType - if attackType == "" { - attackType = "crush" - } - - var protectTechID string - switch attackType { - case "stab", "slash", "crush": - protectTechID = "protect_melee" - case "ranged": - protectTechID = "protect_ranged" - case "science": - protectTechID = "protect_science" - } - - if protectTechID != "" && p.HasActiveTech(protectTechID) { - def := GetTechDef(protectTechID) - if def != nil { - reduced := int(float64(dmg) * (1.0 - def.Effects.DamageReduction)) - if reduced < 0 { - reduced = 0 - } - return reduced - } - } - return dmg -} diff --git a/internal/game/types.go b/internal/game/types.go deleted file mode 100644 index d41b18a..0000000 --- a/internal/game/types.go +++ /dev/null @@ -1,29 +0,0 @@ -package game - -import "thehouseoficarus/internal/object" - -var EquipSlots = []object.EquipSlot{ - object.SlotHead, object.SlotNeck, object.SlotTorso, object.SlotLegs, - object.SlotHands, object.SlotFeet, object.SlotBack, object.SlotAmmo, - object.SlotMainHand, object.SlotOffHand, object.SlotRing, -} - -type itemMatch struct { - ID string - Name string - Slot int -} - -type xpGain struct { - Skill string - XP int -} - -type deathDrop struct { - itemID string - quantity int - totalVal int - isEquip bool - equipSlot object.EquipSlot - invSlot int -} diff --git a/internal/game/ui_color.go b/internal/game/ui_color.go new file mode 100644 index 0000000..962728a --- /dev/null +++ b/internal/game/ui_color.go @@ -0,0 +1,79 @@ +package game + +import ( + "thehouseoficarus/internal/color" + "thehouseoficarus/internal/config" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/object" +) + +func (g *Game) colorMode(sess *net.Session) string { + if p := sess.Player; p != nil { + return p.OptionString("color") + } + return "none" +} + +func (g *Game) resolveColor(sess *net.Session, category string) color.ColorSpec { + if sess.Account != nil && sess.Account.Colors != nil { + if val, ok := sess.Account.Colors[category]; ok { + if val == "off" { + return color.NoColor() + } + if val != "" { + return color.Parse(val) + } + } + } + if g.ColorConfig != nil { + if val, ok := (*g.ColorConfig)[category]; ok && val != "" { + return color.Parse(val) + } + } + if val, ok := config.DefaultColors()[category]; ok && val != "" { + return color.Parse(val) + } + return color.NoColor() +} + +func (g *Game) colorize(sess *net.Session, category, text string) string { + spec := g.resolveColor(sess, category) + return color.Render(g.colorMode(sess), spec, text) +} + +func levelColorSpec(myLevel, theirLevel int) color.ColorSpec { + diff := theirLevel - myLevel + switch { + case diff == 0: + return color.Parse("231") + case diff > 0 && diff < 5: + return color.Parse("208") + case diff >= 5: + return color.Parse("196") + case diff < 0 && diff > -5: + return color.Parse("190") + default: + return color.Parse("34") + } +} + +func (g *Game) levelColorize(sess *net.Session, myLevel, theirLevel int, text string) string { + spec := levelColorSpec(myLevel, theirLevel) + return color.Render(g.colorMode(sess), spec, text) +} + +func (g *Game) objColorize(sess *net.Session, objDef *object.ObjectDef, text string) string { + if objDef != nil && objDef.Color != "" { + spec := color.Parse(objDef.Color) + return color.Render(g.colorMode(sess), spec, text) + } + return text +} + +func (g *Game) itemColorize(sess *net.Session, itemDef *object.ItemDef, text string) string { + if itemDef != nil && itemDef.Color != "" { + spec := color.Parse(itemDef.Color) + return color.Render(g.colorMode(sess), spec, text) + } + return g.colorize(sess, "item", text) +} diff --git a/internal/game/ui_help.go b/internal/game/ui_help.go new file mode 100644 index 0000000..151d1ba --- /dev/null +++ b/internal/game/ui_help.go @@ -0,0 +1,152 @@ +package game + +import ( + "fmt" + "path/filepath" + "strings" + + "thehouseoficarus/internal/action" + "thehouseoficarus/internal/net" + "gopkg.in/yaml.v3" +) + +type HelpDef struct { + Name string `yaml:"name"` + Category string `yaml:"category"` + Content string `yaml:"description"` +} + +type cmdEntry struct { + Name string + Type string + Desc string +} + +var commandList = []cmdEntry{ + {"alias", "Instant", "Create command shortcuts"}, + {"attack / kill", "Active", "Attack a mob"}, + {"autotrigger / auto", "Instant", "Set a module to auto-trigger"}, + {"bank", "Active", "Open bank interface"}, + {"burn", "Active", "Start a fire"}, + {"chop / cut", "Active", "Chop trees (Woodcutting)"}, + {"clean", "Free", "Clean grimy herbs (Pharmacy)"}, + {"color / colors", "Instant", "Customize display colors"}, + {"colortable", "Instant", "Display color reference chart"}, + {"construct / make", "Active", "Build furniture (Construction)"}, + {"cook", "Active", "Cook raw food on a fire or range"}, + {"craft", "Active", "Craft jewelry (Crafting)"}, + {"description / desc", "Instant", "Set your character description"}, + {"drink", "Free", "Drink a potion"}, + {"drop", "Active", "Drop items to the ground"}, + {"eat", "Free", "Eat food to restore hitpoints"}, + {"equipment / eq", "Instant", "Show equipped items"}, + {"exits", "Instant", "List available exits"}, + {"farm", "Active", "Farm crops (Farming)"}, + {"fish", "Active", "Fish at fishing spots (Fishing)"}, + {"fletch", "Free", "Fletch logs into bows (Fletching)"}, + {"get / take / pick", "Active", "Pick up items from the ground"}, + {"help", "Instant", "Show help topics"}, + {"id / identify", "Active", "Identify herbs (Pharmacy)"}, + {"inventory / i / inv", "Instant", "Show your inventory"}, + {"jack / jackin", "Active", "Jack into a terminal (Hacking)"}, + {"look / l", "Instant", "Look around or examine things"}, + {"map", "Instant", "Display an ASCII map of the area"}, + {"mine", "Active", "Mine rocks (Mining)"}, + {"mix", "Active", "Mix potions (Pharmacy)"}, + {"mods / modlist", "Instant", "List available science modules"}, + {"north / south / east / west / up / down", "Active", "Move in a direction"}, + {"option / options", "Instant", "View or change settings"}, + {"prompt", "Instant", "Set custom command prompt"}, + {"pull / push", "Active", "Interact with objects"}, + {"queued", "Instant", "Show pending tick actions"}, + {"quit", "Active", "Rest and disconnect"}, + {"remove / unwear / unwield", "Free", "Unequip items"}, + {"say", "Instant", "Chat with players in your room"}, + {"score / sc", "Instant", "View your stats and skills"}, + {"search", "Active", "Search items for loot"}, + {"smelt", "Active", "Smelt ore into bars (Smithing)"}, + {"smith", "Active", "Smith bars into items (Smithing)"}, + {"sneak", "Instant", "Toggle sneak mode"}, + {"steal", "Active", "Steal from mobs (Thieving)"}, + {"stoke", "Active", "Add logs to a fire"}, + {"style", "Instant", "Change combat style"}, + {"talk / speak / ask", "Active", "Talk to NPCs"}, + {"tech", "Instant", "Toggle technology abilities"}, + {"trigger", "Active", "Trigger a science module"}, + {"unalias", "Instant", "Remove command shortcuts"}, + {"use", "Active", "Use an object (crafting)"}, + {"walk", "Active", "Pathfind to a room or multi-step walk"}, + {"wear / wield", "Free", "Equip items"}, +} + +func LoadHelp(dataDir string) ([]HelpDef, error) { + dir := filepath.Join(dataDir, "help") + var helps []HelpDef + action.WalkYAMLDir(dir, func(path, id string, data []byte) error { + var h HelpDef + if err := yaml.Unmarshal(data, &h); err != nil { + return nil + } + helps = append(helps, h) + return nil + }) + return helps, nil +} + +func (g *Game) doHelp(sess *net.Session, topic string) { + if topic == "" { + unicode := true + if p := sess.Player; p != nil { + unicode = p.OptionBool("unicode") + } + + sess.WriteLine("") + t := &Table{ + Title: "Commands", + Columns: []string{"Command", "Type", "Description"}, + } + for _, c := range commandList { + t.Rows = append(t.Rows, []string{c.Name, c.Type, c.Desc}) + } + for _, line := range t.Render(unicode) { + sess.WriteLine(line) + } + sess.WriteLine("") + sess.WriteLine("Command types: Instant (runs immediately), Free (queued before active),") + sess.WriteLine("Active (replaces current action, queued per tick).") + sess.WriteLine("") + sess.WriteLine("Use 'help ' for detailed usage of a specific command.") + sess.WriteLine("Use 'option' to view and change settings, 'color' to customize colors.") + return + } + + helps, err := LoadHelp(g.DataDir) + if err != nil || len(helps) == 0 { + sess.WriteLine("No help available.") + return + } + + topic = strings.ToLower(topic) + for _, h := range helps { + if strings.ToLower(h.Name) == topic { + sess.WriteLine(fmt.Sprintf("\n %s", h.Content)) + return + } + } + sess.WriteLine(fmt.Sprintf("No help found for '%s'.", topic)) +} + +func firstLine(s string) string { + if idx := strings.Index(s, "\n"); idx >= 0 { + return s[:idx] + } + return s +} + +func (g *Game) executeHelp(sess *net.Session, args []string, rawInput string) { + if len(args) == 0 { + g.doHelp(sess, "") + } else { + g.doHelp(sess, strings.Join(args, " ")) + } +} diff --git a/internal/game/ui_map.go b/internal/game/ui_map.go new file mode 100644 index 0000000..32d3d7c --- /dev/null +++ b/internal/game/ui_map.go @@ -0,0 +1,317 @@ +package game + +import ( + "strings" + + "thehouseoficarus/internal/world" +) + +type mapGlyphs struct { + topLeft, topRight rune + bottomLeft, bottomRight rune + side rune + topFill rune + connectorH, connectorV rune + upArrow, downArrow rune +} + +func mapGlyphsForPlayer(unicode bool) mapGlyphs { + if unicode { + return mapGlyphs{ + topLeft: '╔', topRight: '╗', bottomLeft: '╚', bottomRight: '╝', + side: '║', topFill: '═', connectorH: '─', connectorV: '│', + upArrow: '↑', downArrow: '↓', + } + } + return mapGlyphs{ + topLeft: '.', topRight: '.', bottomLeft: ':', bottomRight: ':', + side: ':', topFill: '.', connectorH: '-', connectorV: '|', + upArrow: '^', downArrow: 'v', + } +} + +type mapGraph struct { + posToRoom map[[2]int]int + roomToPos map[int][2]int +} + +var bfsDirs = []struct { + dir world.ExitDir + dx, dy int +}{ + {world.North, 0, -1}, + {world.South, 0, 1}, + {world.East, 1, 0}, + {world.West, -1, 0}, +} + +func buildGraph(g *Game, startRoomID int) *mapGraph { + mg := &mapGraph{ + posToRoom: make(map[[2]int]int), + roomToPos: make(map[int][2]int), + } + + type node struct { + roomID int + x, y int + } + queue := []node{{startRoomID, 0, 0}} + mg.posToRoom[[2]int{0, 0}] = startRoomID + mg.roomToPos[startRoomID] = [2]int{0, 0} + + for len(queue) > 0 { + n := queue[0] + queue = queue[1:] + + room, ok := loadRoom(g, n.roomID) + if !ok { + continue + } + + for _, d := range bfsDirs { + targetID, ok := exitTarget(room, d.dir) + if !ok { + continue + } + if _, visited := mg.roomToPos[targetID]; visited { + continue + } + nx, ny := n.x + d.dx, n.y + d.dy + mg.posToRoom[[2]int{nx, ny}] = targetID + mg.roomToPos[targetID] = [2]int{nx, ny} + queue = append(queue, node{targetID, nx, ny}) + } + } + + return mg +} + +func buildTinyMap(g *Game, roomID int, mg mapGlyphs) []string { + bg := buildGraph(g, roomID) + + grid := make([][]rune, 5) + for i := range grid { + grid[i] = make([]rune, 5) + for j := range grid[i] { + grid[i][j] = ' ' + } + } + + for y := -1; y <= 1; y++ { + for x := -1; x <= 1; x++ { + pos := [2]int{x, y} + rid, ok := bg.posToRoom[pos] + if !ok { + continue + } + gr := (y + 1) * 2 + gc := (x + 1) * 2 + if rid == roomID { + grid[gr][gc] = '@' + } else { + grid[gr][gc] = roomMapSymbol(g, rid) + } + } + } + + for y := -1; y <= 1; y++ { + for x := -1; x <= 0; x++ { + leftPos := [2]int{x, y} + rightPos := [2]int{x + 1, y} + leftRoom, leftOK := bg.posToRoom[leftPos] + rightRoom, rightOK := bg.posToRoom[rightPos] + if !leftOK || !rightOK { + continue + } + if exitsConnect(g, leftRoom, rightRoom, world.East, world.West) { + grid[(y+1)*2][(x+1)*2+1] = mg.connectorH + } + } + } + + for y := -1; y <= 0; y++ { + for x := -1; x <= 1; x++ { + topPos := [2]int{x, y} + bottomPos := [2]int{x, y + 1} + topRoom, topOK := bg.posToRoom[topPos] + bottomRoom, bottomOK := bg.posToRoom[bottomPos] + if !topOK || !bottomOK { + continue + } + if exitsConnect(g, topRoom, bottomRoom, world.South, world.North) { + grid[(y+1)*2+1][(x+1)*2] = mg.connectorV + } + } + } + + cur, _ := loadRoom(g, roomID) + if cur != nil { + if _, ok := exitTarget(cur, world.Up); ok { + grid[1][3] = mg.upArrow + } + if _, ok := exitTarget(cur, world.Down); ok { + grid[3][1] = mg.downArrow + } + } + + topFill := strings.Repeat(string(mg.topFill), 5) + lines := make([]string, 7) + lines[0] = string(mg.topLeft) + topFill + string(mg.topRight) + for row := 0; row < 5; row++ { + lines[row+1] = string(mg.side) + string(grid[row]) + string(mg.side) + } + botFill := strings.Repeat(string(mg.topFill), 5) + lines[6] = string(mg.bottomLeft) + botFill + string(mg.bottomRight) + + return lines +} + +func exitsConnect(g *Game, room1, room2 int, dir12, dir21 world.ExitDir) bool { + r1, ok := loadRoom(g, room1) + if !ok { + return false + } + if id, ok := exitTarget(r1, dir12); ok && id == room2 { + return true + } + r2, ok := loadRoom(g, room2) + if !ok { + return false + } + id, ok := exitTarget(r2, dir21) + return ok && id == room1 +} + +func exitTarget(room *world.Room, dir world.ExitDir) (int, bool) { + if room == nil { + return 0, false + } + exit, ok := room.Exits[dir] + if !ok { + return 0, false + } + return exit.Room, true +} + +func loadRoom(g *Game, roomID int) (*world.Room, bool) { + if roomID == 0 { + return nil, false + } + room, err := g.World.LoadRoom(roomID) + if err != nil { + return nil, false + } + return room, true +} + +func roomMapSymbol(g *Game, roomID int) rune { + room, ok := loadRoom(g, roomID) + if !ok { + return '?' + } + if room.MapSymbol != "" { + runes := []rune(room.MapSymbol) + return runes[0] + } + return 'o' +} + +func stripBlankRows(lines []string) []string { + var out []string + for _, line := range lines { + if strings.TrimSpace(line) != "" { + out = append(out, line) + } + } + return out +} + +func leftTrimCommon(lines []string) []string { + min := -1 + for _, line := range lines { + if strings.TrimSpace(line) == "" { + continue + } + n := 0 + for _, r := range line { + if r == ' ' { + n++ + } else { + break + } + } + if min < 0 || n < min { + min = n + } + } + if min <= 0 { + return lines + } + result := make([]string, len(lines)) + for i, line := range lines { + if len(line) <= min { + result[i] = "" + } else { + result[i] = line[min:] + } + } + return result +} + +func buildFullMap(g *Game, roomID, mapWidth, mapHeight int, mg mapGlyphs) []string { + bg := buildGraph(g, roomID) + + grid := make([][]rune, mapHeight) + for i := range grid { + grid[i] = make([]rune, mapWidth) + for j := range grid[i] { + grid[i][j] = ' ' + } + } + + cx := mapWidth / 2 + cy := mapHeight / 2 + + for pos, rid := range bg.posToRoom { + gr := cy + pos[1]*2 + gc := cx + pos[0]*2 + if gr < 0 || gr >= mapHeight || gc < 0 || gc >= mapWidth { + continue + } + if rid == roomID { + grid[gr][gc] = '@' + } else { + grid[gr][gc] = roomMapSymbol(g, rid) + } + } + + for pos, rid := range bg.posToRoom { + x, y := pos[0], pos[1] + + if rightID, ok := bg.posToRoom[[2]int{x + 1, y}]; ok { + if exitsConnect(g, rid, rightID, world.East, world.West) { + gr := cy + y*2 + gc := cx + x*2 + 1 + if gr >= 0 && gr < mapHeight && gc >= 0 && gc < mapWidth { + grid[gr][gc] = mg.connectorH + } + } + } + + if bottomID, ok := bg.posToRoom[[2]int{x, y + 1}]; ok { + if exitsConnect(g, rid, bottomID, world.South, world.North) { + gr := cy + y*2 + 1 + gc := cx + x*2 + if gr >= 0 && gr < mapHeight && gc >= 0 && gc < mapWidth { + grid[gr][gc] = mg.connectorV + } + } + } + } + + lines := make([]string, mapHeight) + for i := range grid { + lines[i] = string(grid[i]) + } + return lines +} diff --git a/internal/game/ui_prompt.go b/internal/game/ui_prompt.go new file mode 100644 index 0000000..2ecf367 --- /dev/null +++ b/internal/game/ui_prompt.go @@ -0,0 +1,100 @@ +package game + +import ( + "fmt" + "strings" + + "thehouseoficarus/internal/color" + "thehouseoficarus/internal/combat" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) promptStr(sess *net.Session) string { + prompt := "> " + if p := sess.Player; p != nil { + if p.Prompt != "" { + prompt = p.Prompt + } + } + + prompt = g.expandPromptColors(sess, prompt) + prompt = g.expandPromptVars(sess, prompt) + return prompt +} + +func (g *Game) expandPromptColors(sess *net.Session, text string) string { + return color.ExpandTags(g.colorMode(sess), text) +} + +func (g *Game) expandPromptVars(sess *net.Session, text string) string { + p := sess.Player + if p == nil { + return text + } + + text = strings.ReplaceAll(text, "%%", "\x00") + text = strings.ReplaceAll(text, "%h", fmt.Sprint(p.HP)) + text = strings.ReplaceAll(text, "%H", fmt.Sprint(p.MaxHP())) + text = strings.ReplaceAll(text, "%b", fmt.Sprintf("%.1f", p.Battery)) + text = strings.ReplaceAll(text, "%B", fmt.Sprintf("%.0f", p.MaxBattery())) + text = strings.ReplaceAll(text, "%c", fmt.Sprint(p.Credits)) + text = strings.ReplaceAll(text, "%i", fmt.Sprint(p.FreeSlots())) + text = strings.ReplaceAll(text, "%s", attackStyleShort(p.AttackStyle)) + text = strings.ReplaceAll(text, "%S", attackStyleLong(p.AttackStyle)) + + mobHP, mobMaxHP := "", "" + if cs := combat.GetCombat(p.Name); cs != nil { + mob := g.MobStore.GetInstance(cs.MobID) + if mob != nil && mob.HP > 0 { + mobHP = fmt.Sprint(mob.HP) + mobMaxHP = fmt.Sprint(mob.MaxHP) + } + } + text = strings.ReplaceAll(text, "%m", mobHP) + text = strings.ReplaceAll(text, "%M", mobMaxHP) + + for _, sk := range player.AllSkills { + tag := string(sk) + text = strings.ReplaceAll(text, "%X_"+tag, fmt.Sprint(p.Skills[sk])) + text = strings.ReplaceAll(text, "%x_"+tag, fmt.Sprint(xpToLevel(p, sk))) + } + + text = strings.ReplaceAll(text, "\x00", "%") + return text +} + +func attackStyleShort(s player.AttackStyle) string { + switch s { + case player.Accurate: + return "acc" + case player.Aggressive: + return "agg" + case player.Defensive: + return "def" + case player.Balanced: + return "bal" + } + return "acc" +} + +func attackStyleLong(s player.AttackStyle) string { + switch s { + case player.Accurate: + return "accurate" + case player.Aggressive: + return "aggressive" + case player.Defensive: + return "defensive" + case player.Balanced: + return "balanced" + } + return "accurate" +} + +func xpToLevel(p *player.Player, sk player.SkillName) int { + currentXP := p.Skills[sk] + currentLevel := p.Level(sk) + nextLevelXP := player.XPForLevel(currentLevel + 1) + return nextLevelXP - currentXP +} diff --git a/internal/game/ui_table.go b/internal/game/ui_table.go new file mode 100644 index 0000000..b96dca1 --- /dev/null +++ b/internal/game/ui_table.go @@ -0,0 +1,150 @@ +package game + +import ( + "strings" + + "thehouseoficarus/internal/color" +) + +type tableGlyphs struct { + topLeft, topSep, topRight rune + side, colSep rune + sepLeft, sepCross, sepRight rune + botLeft, botSep, botRight rune + fillH, fillHSep rune + titleSep rune +} + +func tableGlyphSet(unicode bool) tableGlyphs { + if unicode { + return tableGlyphs{ + topLeft: '╔', topSep: '╤', topRight: '╗', side: '║', colSep: '│', + sepLeft: '╟', sepCross: '┼', sepRight: '╢', + botLeft: '╚', botSep: '╧', botRight: '╝', fillH: '═', fillHSep: '─', + titleSep: '┬', + } + } + return tableGlyphs{ + topLeft: '+', topSep: '+', topRight: '+', side: '|', colSep: '|', + sepLeft: '+', sepCross: '+', sepRight: '+', + botLeft: '+', botSep: '+', botRight: '+', fillH: '-', fillHSep: '-', + titleSep: '+', + } +} + +type Table struct { + Title string + Columns []string + Rows [][]string +} + +func (t *Table) Render(unicode bool) []string { + g := tableGlyphSet(unicode) + + nCols := len(t.Columns) + if nCols == 0 && len(t.Rows) > 0 { + nCols = len(t.Rows[0]) + } + if nCols == 0 { + return nil + } + + colWidths := make([]int, nCols) + for i, h := range t.Columns { + colWidths[i] = color.VisibleLen(h) + } + for _, row := range t.Rows { + for i, cell := range row { + if i >= nCols { + break + } + vl := color.VisibleLen(cell) + if vl > colWidths[i] { + colWidths[i] = vl + } + } + } + + makeSep := func(left, cross, right rune, fill rune) string { + var b strings.Builder + b.WriteRune(left) + for i := 0; i < nCols; i++ { + if i > 0 { + b.WriteRune(cross) + } + b.WriteString(strings.Repeat(string(fill), colWidths[i]+2)) + } + b.WriteRune(right) + return b.String() + } + + makeRow := func(cells []string) string { + var b strings.Builder + b.WriteRune(g.side) + for i := 0; i < nCols; i++ { + if i > 0 { + b.WriteRune(g.colSep) + } + cell := "" + if i < len(cells) { + cell = cells[i] + } + pad := colWidths[i] - color.VisibleLen(cell) + if pad < 0 { + pad = 0 + } + b.WriteString(" " + cell + strings.Repeat(" ", pad) + " ") + } + b.WriteRune(g.side) + return b.String() + } + + hasTitle := t.Title != "" + hasCols := len(t.Columns) > 0 + + var out []string + + if hasTitle { + innerWidth := 0 + for _, w := range colWidths { + innerWidth += w + 2 + } + innerWidth += nCols - 1 + + var tb strings.Builder + tb.WriteRune(g.topLeft) + tb.WriteString(strings.Repeat(string(g.fillH), innerWidth)) + tb.WriteRune(g.topRight) + out = append(out, tb.String()) + + var tr strings.Builder + tr.WriteRune(g.side) + tr.WriteString(" ") + tr.WriteString(t.Title) + padding := innerWidth - 2 - color.VisibleLen(t.Title) + if padding < 0 { + padding = 0 + } + tr.WriteString(strings.Repeat(" ", padding)) + tr.WriteString(" ") + tr.WriteRune(g.side) + out = append(out, tr.String()) + + out = append(out, makeSep(g.sepLeft, g.titleSep, g.sepRight, g.fillHSep)) + } else { + out = append(out, makeSep(g.topLeft, g.topSep, g.topRight, g.fillH)) + } + + if hasCols { + out = append(out, makeRow(t.Columns)) + out = append(out, makeSep(g.sepLeft, g.sepCross, g.sepRight, g.fillHSep)) + } + + for _, row := range t.Rows { + out = append(out, makeRow(row)) + } + + out = append(out, makeSep(g.botLeft, g.botSep, g.botRight, g.fillH)) + + return out +} diff --git a/internal/game/utils.go b/internal/game/utils.go deleted file mode 100644 index 9148ea3..0000000 --- a/internal/game/utils.go +++ /dev/null @@ -1,121 +0,0 @@ -package game - -import ( - "fmt" - "math/rand" - "strconv" - "strings" - - "thehouseoficarus/internal/net" - "thehouseoficarus/internal/player" - "thehouseoficarus/internal/world" -) - -func plural(n int) string { - if n == 1 { - return "" - } - return "s" -} - -func parseQty(input string) (int, string) { - parts := strings.Fields(input) - if len(parts) > 1 { - if n, err := strconv.Atoi(parts[0]); err == nil && n > 0 { - return n, strings.Join(parts[1:], " ") - } - } - return 0, input -} - -func parseChoiceIndex(s string) (int, error) { - var idx int - _, err := fmt.Sscanf(s, "%d", &idx) - return idx, err -} - -func mobDisplayName(m *world.MobInstance, definite bool) string { - if m.Unique { - return m.Name - } - if definite { - return "the " + m.Name - } - return "a " + m.Name -} - -func mobCombatLevel(m *world.MobInstance) int { - base := float64(m.Defense+m.MaxHP) / 4.0 - melee := float64(m.Attack+m.Strength) / 4.0 - ranged := float64(m.Ranged) * 3.0 / 8.0 - science := float64(m.Science) * 3.0 / 8.0 - best := melee - if ranged > best { - best = ranged - } - if science > best { - best = science - } - return int(base + best + 0.5) -} - -func uniqueItemNames(matches []itemMatch) []string { - seen := make(map[string]bool) - var out []string - for _, m := range matches { - if !seen[m.Name] { - seen[m.Name] = true - out = append(out, m.Name) - } - } - return out -} - -func (g *Game) showWhichOne(sess *net.Session, matches []itemMatch) { - sess.WriteLine("Which one?") - seen := make(map[string]bool) - for _, m := range matches { - if seen[m.Name] { - continue - } - seen[m.Name] = true - def, _ := g.ItemStore.Load(m.ID) - coloredName := g.itemColorize(sess, def, m.Name) - sess.WriteLine(fmt.Sprintf(" - %s", coloredName)) - } -} - -func randInt(max int) int { - if max <= 0 { - return 0 - } - return rand.Intn(max) -} - -func formatPickupList(sess *net.Session, picked []string) { - for i, name := range picked { - if i == len(picked)-1 { - sess.WriteLine(name) - } else if i == len(picked)-2 { - sess.Write(name + " and ") - } else { - sess.Write(name + ", ") - } - } -} - -func (g *Game) newInventorySlot(itemID string, qty int) *player.InventorySlot { - slot := &player.InventorySlot{ItemID: itemID, Quantity: qty} - if def, err := g.ItemStore.Load(itemID); err == nil && def.MaxQuality > 0 { - slot.Quality = def.Quality - slot.MaxQuality = def.MaxQuality - } - return slot -} - -func (g *Game) awardSkillXP(sess *net.Session, p *player.Player, skill player.SkillName, xp int) { - newLevel := p.AddSkillXP(skill, xp) - if newLevel > 0 { - sess.WriteLine(g.colorize(sess, "level_up", fmt.Sprintf("*** You are now level %d %s! ***", newLevel, skill))) - } -} diff --git a/internal/object/item.go b/internal/object/item.go index 7c682a4..8ec1565 100644 --- a/internal/object/item.go +++ b/internal/object/item.go @@ -74,7 +74,7 @@ type ItemDef struct { type MadeFromEntry struct { Items []string `yaml:"items"` - Qty int `yaml:"qty"` + Quantity int `yaml:"quantity"` Byproducts []string `yaml:"byproducts"` } diff --git a/internal/object/item_store.go b/internal/object/item_store.go index 9e932ba..d75179f 100644 --- a/internal/object/item_store.go +++ b/internal/object/item_store.go @@ -4,28 +4,34 @@ import ( "fmt" "os" "path/filepath" - "strings" + "thehouseoficarus/internal/action" "gopkg.in/yaml.v3" ) type ItemStore struct { - dataDir string - cache map[string]*ItemDef + dataDir string + pathIndex map[string]string + cache map[string]*ItemDef } func NewItemStore(dataDir string) *ItemStore { - return &ItemStore{ - dataDir: dataDir, - cache: make(map[string]*ItemDef), + s := &ItemStore{ + dataDir: dataDir, + pathIndex: action.BuildPathIndex(filepath.Join(dataDir, "items")), + cache: make(map[string]*ItemDef), } + return s } func (s *ItemStore) Load(id string) (*ItemDef, error) { if def, ok := s.cache[id]; ok { return def, nil } - path := filepath.Join(s.dataDir, "items", id+".yaml") + path, ok := s.pathIndex[id] + if !ok { + return nil, fmt.Errorf("read item %s: no such item", id) + } data, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("read item %s: %w", id, err) @@ -40,21 +46,31 @@ func (s *ItemStore) Load(id string) (*ItemDef, error) { func (s *ItemStore) LoadAll() ([]*ItemDef, error) { dir := filepath.Join(s.dataDir, "items") - entries, err := os.ReadDir(dir) - if err != nil { - return nil, err - } var defs []*ItemDef - for _, e := range entries { - if e.IsDir() || filepath.Ext(e.Name()) != ".yaml" { - continue + err := action.WalkYAMLDir(dir, func(path, id string, data []byte) error { + if def, ok := s.cache[id]; ok { + defs = append(defs, def) + return nil } - id := strings.TrimSuffix(e.Name(), ".yaml") - def, err := s.Load(id) - if err != nil { - continue + var def ItemDef + if err := yaml.Unmarshal(data, &def); err != nil { + return nil } - defs = append(defs, def) + s.cache[id] = &def + defs = append(defs, &def) + return nil + }) + return defs, err +} + +func (s *ItemStore) PathIndex() map[string]string { + return s.pathIndex +} + +func (s *ItemStore) IDSet() map[string]bool { + ids := make(map[string]bool) + for id := range s.pathIndex { + ids[id] = true } - return defs, nil + return ids } diff --git a/internal/object/object.go b/internal/object/object.go index 4d8db69..826a315 100644 --- a/internal/object/object.go +++ b/internal/object/object.go @@ -3,7 +3,7 @@ package object import "thehouseoficarus/internal/action" type UseInteraction struct { - Item string `yaml:"item"` + Item string `yaml:"item_id"` Condition *action.Condition `yaml:"condition"` Message string `yaml:"message"` Action *action.NodeAction `yaml:"action"` diff --git a/internal/object/store.go b/internal/object/store.go index a884601..a11ff7a 100644 --- a/internal/object/store.go +++ b/internal/object/store.go @@ -5,18 +5,21 @@ import ( "os" "path/filepath" + "thehouseoficarus/internal/action" "gopkg.in/yaml.v3" ) type ObjectStore struct { - dataDir string - cache map[string]*ObjectDef + dataDir string + pathIndex map[string]string + cache map[string]*ObjectDef } func NewObjectStore(dataDir string) *ObjectStore { return &ObjectStore{ - dataDir: dataDir, - cache: make(map[string]*ObjectDef), + dataDir: dataDir, + pathIndex: action.BuildPathIndex(filepath.Join(dataDir, "objects")), + cache: make(map[string]*ObjectDef), } } @@ -24,7 +27,10 @@ func (s *ObjectStore) Load(id string) (*ObjectDef, error) { if def, ok := s.cache[id]; ok { return def, nil } - path := filepath.Join(s.dataDir, "objects", fmt.Sprintf("%s.yaml", id)) + path, ok := s.pathIndex[id] + if !ok { + return nil, fmt.Errorf("read object %s: no such object", id) + } data, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("read object %s: %w", id, err) @@ -36,3 +42,15 @@ func (s *ObjectStore) Load(id string) (*ObjectDef, error) { s.cache[id] = &def return &def, nil } + +func (s *ObjectStore) PathIndex() map[string]string { + return s.pathIndex +} + +func (s *ObjectStore) IDSet() map[string]bool { + ids := make(map[string]bool) + for id := range s.pathIndex { + ids[id] = true + } + return ids +} diff --git a/internal/world/mob.go b/internal/world/mob.go index f7988ce..9d07532 100644 --- a/internal/world/mob.go +++ b/internal/world/mob.go @@ -144,6 +144,7 @@ func (m *MobInstance) StartRegen() { type MobStore struct { dataDir string mu sync.Mutex + pathIndex map[string]string defs map[string]*MobDef instances map[string]*MobInstance } @@ -151,6 +152,7 @@ type MobStore struct { func NewMobStore(dataDir string) *MobStore { return &MobStore{ dataDir: dataDir, + pathIndex: action.BuildPathIndex(filepath.Join(dataDir, "mobs")), defs: make(map[string]*MobDef), instances: make(map[string]*MobInstance), } @@ -164,7 +166,10 @@ func (s *MobStore) LoadDef(id string) (*MobDef, error) { } s.mu.Unlock() - path := filepath.Join(s.dataDir, "mobs", id+".yaml") + path, ok := s.pathIndex[id] + if !ok { + return nil, fmt.Errorf("read mob %s: no such mob", id) + } data, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("read mob %s: %w", id, err) @@ -180,6 +185,14 @@ func (s *MobStore) LoadDef(id string) (*MobDef, error) { return &def, nil } +func (s *MobStore) AllDefIDs() map[string]bool { + ids := make(map[string]bool) + for id := range s.pathIndex { + ids[id] = true + } + return ids +} + func (s *MobStore) GetInstance(id string) *MobInstance { s.mu.Lock() defer s.mu.Unlock() diff --git a/internal/world/room.go b/internal/world/room.go index c0f531e..f006acc 100644 --- a/internal/world/room.go +++ b/internal/world/room.go @@ -41,8 +41,8 @@ var ExitOrder = []ExitDir{ } type SpawnDef struct { - ItemID string `yaml:"item_id"` - Quantity int `yaml:"quantity"` + ID string `yaml:"id"` + Quantity int `yaml:"quantity"` RespawnTicks float64 `yaml:"respawn_ticks"` } @@ -72,7 +72,7 @@ type Room struct { MapSymbol string `yaml:"map_symbol"` Exits map[ExitDir]ExitDef `yaml:"exits"` Objects []RoomObject `yaml:"objects"` - Spawns []SpawnDef `yaml:"spawns"` + ItemSpawns []SpawnDef `yaml:"item_spawns"` Mobs []RoomMob `yaml:"mobs"` OnEnter []EnterStep `yaml:"on_enter"` } diff --git a/internal/world/world.go b/internal/world/world.go index 3094c54..0b40918 100644 --- a/internal/world/world.go +++ b/internal/world/world.go @@ -7,36 +7,38 @@ import ( "strings" "sync" + "thehouseoficarus/internal/action" "gopkg.in/yaml.v3" ) type World struct { - dataDir string - mu sync.Mutex - groundItems map[int][]*groundEntry - seeded map[int]bool - objStates map[string]*ObjState - objMoves []ObjMove + dataDir string + mu sync.Mutex + roomPathIndex map[int]string + groundItems map[int][]*groundEntry + seeded map[int]bool + objStates map[string]*ObjState + objMoves []ObjMove } func New(dataDir string) *World { return &World{ - dataDir: dataDir, - groundItems: make(map[int][]*groundEntry), - seeded: make(map[int]bool), - objStates: make(map[string]*ObjState), + dataDir: dataDir, + roomPathIndex: action.BuildRoomIndex(filepath.Join(dataDir, "rooms")), + groundItems: make(map[int][]*groundEntry), + seeded: make(map[int]bool), + objStates: make(map[string]*ObjState), } } func (w *World) LoadRoom(id int) (*Room, error) { - path := filepath.Join(w.dataDir, "rooms", fmt.Sprintf("%d.yaml", id)) + path, ok := w.roomPathIndex[id] + if !ok { + return nil, fmt.Errorf("read room %d: no such room", id) + } data, err := os.ReadFile(path) if err != nil { - path = filepath.Join(w.dataDir, "rooms", "player_housing", fmt.Sprintf("%d.yaml", id)) - data, err = os.ReadFile(path) - if err != nil { - return nil, fmt.Errorf("read room %d: %w", id, err) - } + return nil, fmt.Errorf("read room %d: %w", id, err) } var room Room if err := yaml.Unmarshal(data, &room); err != nil { @@ -46,8 +48,8 @@ func (w *World) LoadRoom(id int) (*Room, error) { if room.Exits == nil { room.Exits = make(map[ExitDir]ExitDef) } - if room.Spawns == nil { - room.Spawns = make([]SpawnDef, 0) + if room.ItemSpawns == nil { + room.ItemSpawns = make([]SpawnDef, 0) } if room.Mobs == nil { room.Mobs = make([]RoomMob, 0) @@ -84,10 +86,10 @@ func (w *World) SeedGroundItems(roomID int) { w.mu.Lock() defer w.mu.Unlock() - for _, s := range room.Spawns { + for _, s := range room.ItemSpawns { merged := false for _, e := range w.groundItems[roomID] { - if e.quantity > 0 && strings.EqualFold(e.itemID, s.ItemID) && + if e.quantity > 0 && strings.EqualFold(e.itemID, s.ID) && (e.reserveTimer <= 0 || e.reservedFor == "") && e.despawnTimer <= 0 { e.quantity += s.Quantity @@ -100,7 +102,7 @@ func (w *World) SeedGroundItems(roomID int) { } if !merged { e := &groundEntry{ - itemID: s.ItemID, + itemID: s.ID, quantity: s.Quantity, isSpawn: true, respawnDelay: int(s.RespawnTicks), @@ -111,6 +113,14 @@ func (w *World) SeedGroundItems(roomID int) { } } +func (w *World) RoomIndex() map[int]bool { + ids := make(map[int]bool) + for id := range w.roomPathIndex { + ids[id] = true + } + return ids +} + func (w *World) Tick() { w.mu.Lock() defer w.mu.Unlock() diff --git a/worldbuilding_guide/construction.md b/worldbuilding_guide/construction.md index d4ba840..5775fbf 100644 --- a/worldbuilding_guide/construction.md +++ b/worldbuilding_guide/construction.md @@ -96,7 +96,7 @@ station: [workbench] tool: saw consume: - items: [oak_logs] - qty: 1 + quantity: 1 output: oak_planks message: "You saw the oak logs into sturdy oak planks." ``` @@ -111,7 +111,7 @@ wait: 6 station: [workbench] consume: - items: [planks] - qty: 3 + quantity: 3 output: wooden_table message: "You build a sturdy wooden table." ``` diff --git a/worldbuilding_guide/items.md b/worldbuilding_guide/items.md index a1ca8c1..2e36349 100644 --- a/worldbuilding_guide/items.md +++ b/worldbuilding_guide/items.md @@ -149,10 +149,10 @@ color: "222" ticks: 2 made_from: - items: [pot_of_flour] - qty: 1 + quantity: 1 byproducts: [empty_pot] - items: [bucket_of_water, pitcher_of_water] - qty: 1 + quantity: 1 byproducts: [empty_bucket, empty_pitcher] ``` @@ -169,10 +169,10 @@ Use `""` for items that produce no byproduct: ```yaml made_from: - items: [pot_of_flour, loose_flour] - qty: 1 + quantity: 1 byproducts: [empty_pot, ""] # pot returns empty_pot, loose flour returns nothing - items: [bucket_of_water] - qty: 1 + quantity: 1 byproducts: [empty_bucket] ``` @@ -181,10 +181,10 @@ Omit `byproducts` entirely if no items in that slot produce a byproduct: ```yaml made_from: - items: [pot_of_flour] - qty: 1 + quantity: 1 byproducts: [empty_pot] # returns empty_pot - items: [salt] - qty: 1 # no byproducts field — salt is consumed entirely + quantity: 1 # no byproducts field — salt is consumed entirely ``` See also `recipes.md` for station-based recipes. diff --git a/worldbuilding_guide/objects.md b/worldbuilding_guide/objects.md index a7da5e6..38eaeeb 100644 --- a/worldbuilding_guide/objects.md +++ b/worldbuilding_guide/objects.md @@ -124,9 +124,9 @@ Simple message (no action): id: anvil name: anvil use_interactions: - - item: silver_bar + - item_id: silver_bar message: "You should use this with a mold at a furnace." - - item: gold_bar + - item_id: gold_bar message: "You should use this with a mold at a furnace." ``` @@ -135,11 +135,11 @@ Puzzle interaction (take item, set flag): id: crystal_slot name: crystal slot use_interactions: - - item: crystal_key + - item_id: crystal_key condition: flag: crystal_inserted message: "The crystal key is already in the slot." - - item: crystal_key + - item_id: crystal_key message: "You insert the crystal key into the slot. It clicks into place." action: take_item: crystal_key @@ -150,7 +150,7 @@ use_interactions: Quest item exchange: ```yaml use_interactions: - - item: ancient_scroll + - item_id: ancient_scroll condition: player_flag: quest_started message: "You place the scroll on the pedestal. The door rumbles open!" @@ -166,7 +166,7 @@ use_interactions: | Field | Type | Description | | ----------- | ---------- | ------------------------------------------------ | -| `item` | string | Item ID that triggers this interaction | +| `item_id` | string | Item ID that triggers this interaction | | `condition` | Condition | Optional condition (same as exits/talk/use_interactions) | | `message` | string | Message shown to the player | | `action` | NodeAction | Optional actions (same as talk node actions) | diff --git a/worldbuilding_guide/recipes.md b/worldbuilding_guide/recipes.md index 81a1240..29b513a 100644 --- a/worldbuilding_guide/recipes.md +++ b/worldbuilding_guide/recipes.md @@ -4,7 +4,7 @@ Recipes define how items are processed on stations to produce new items. They are the foundation for cooking, smithing, crafting, and fletching. -Recipe files live in `data/recipes/.yaml`. +Recipe files live in `data/recipes//.yaml` (e.g., `data/recipes/smithing/smith_bronze_dagger.yaml`). ### Recipe vs MadeFrom @@ -39,7 +39,7 @@ Each consume entry defines an ingredient slot with multiple valid items. The fir ```yaml consume: - items: [item_id, alternative_id, ...] - qty: 1 + quantity: 1 byproducts: [byproduct_for_item, byproduct_for_alt, ...] ``` @@ -48,10 +48,10 @@ consume: ```yaml consume: - items: [bucket_of_water, vial_of_water] - qty: 1 + quantity: 1 byproducts: [empty_bucket, ""] # bucket returns empty, vial is consumed entirely - items: [herb] - qty: 1 # no byproducts — herb is consumed entirely + quantity: 1 # no byproducts — herb is consumed entirely ``` ### Station-based recipe (cooking on a fire) @@ -66,7 +66,7 @@ wait: 6 station: [fire, cooking_range] consume: - items: [raw_trout] - qty: 1 + quantity: 1 output: trout fail: burnt_fish message: "Cooked to perfection. It looks great!" @@ -85,7 +85,7 @@ wait: 6 station: [cooking_range] consume: - items: [bread_dough] - qty: 1 + quantity: 1 output: bread fail: burnt_meat message: "You bake the dough into a fresh loaf of bread." @@ -106,9 +106,9 @@ wait: 4 station: [furnace] consume: - items: [iron_ore] - qty: 1 + quantity: 1 - items: [coal] - qty: 2 + quantity: 2 output: steel_bar message: "You remove a white hot steel bar!" fail_message: "You fail to smelt a usable bar." @@ -137,7 +137,7 @@ wait: 4 station: [anvil] consume: - items: [steel_bar] - qty: 5 + quantity: 5 output: steel_platebody message: "You hammer out a steel platebody." ``` @@ -154,7 +154,7 @@ wait: 4 station: [anvil] consume: - items: [iron_bar] - qty: 1 + quantity: 1 output: iron_nails output_qty: 15 message: "You hammer out some iron nails." @@ -171,9 +171,9 @@ name: bread dough color: "222" made_from: - items: [pot_of_flour] - qty: 1 + quantity: 1 - items: [bucket_of_water, pitcher_of_water, vial_of_water] - qty: 1 + quantity: 1 ``` The player uses `use flour on water` to combine them. The system finds that `bread_dough` can be made from these ingredients and produces it. diff --git a/worldbuilding_guide/rooms.md b/worldbuilding_guide/rooms.md index f6e74ea..3d6db7d 100644 --- a/worldbuilding_guide/rooms.md +++ b/worldbuilding_guide/rooms.md @@ -67,14 +67,14 @@ exits: blocked_message: "The bridge is out, and the toll collector blocks the path." ``` -### Spawns — ground items that respawn +### Item Spawns — ground items that respawn ```yaml -spawns: - - item_id: bronze_pickaxe +item_spawns: + - id: bronze_pickaxe quantity: 1 respawn_ticks: 30 # reappears 30 ticks (18 seconds) after being picked up - - item_id: copper_ore + - id: copper_ore quantity: 3 respawn_ticks: 50 ``` -- cgit v1.2.3