aboutsummaryrefslogtreecommitdiff
path: root/data/mobs/examples
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-25 19:37:20 -0400
committerhistoria <[not public]>2026-06-25 19:37:20 -0400
commitc55d0e4150b23f2c5c9f96bbc3d4dc2fc6dbaa36 (patch)
treed1c02acea2b4c8d0f672c1539cfdb373b6272ed0 /data/mobs/examples
parent068ce514ea3eebdc42b595c631b4b00ce4594577 (diff)
downloadthehouseoficarus-c55d0e4150b23f2c5c9f96bbc3d4dc2fc6dbaa36.tar.gz
feat: yaml conversation trees more robust
Diffstat (limited to 'data/mobs/examples')
-rw-r--r--data/mobs/examples/ancient_construct.yaml47
-rw-r--r--data/mobs/examples/bandit.yaml38
-rw-r--r--data/mobs/examples/bioengineer.yaml44
-rw-r--r--data/mobs/examples/client.yaml214
-rw-r--r--data/mobs/examples/corrupted_scientist.yaml43
-rw-r--r--data/mobs/examples/cow.yaml28
-rw-r--r--data/mobs/examples/crawler.yaml32
-rw-r--r--data/mobs/examples/drone.yaml32
-rw-r--r--data/mobs/examples/elite_synth.yaml43
-rw-r--r--data/mobs/examples/enforcer_bot.yaml42
-rw-r--r--data/mobs/examples/estate_broker.yaml55
-rw-r--r--data/mobs/examples/farmer.yaml44
-rw-r--r--data/mobs/examples/feral_cyborg.yaml38
-rw-r--r--data/mobs/examples/general_store_clerk.yaml70
-rw-r--r--data/mobs/examples/ghoul.yaml38
-rw-r--r--data/mobs/examples/goblin.yaml32
-rw-r--r--data/mobs/examples/greater_drone.yaml33
-rw-r--r--data/mobs/examples/guard.yaml71
-rw-r--r--data/mobs/examples/heavy_mech.yaml42
-rw-r--r--data/mobs/examples/iron_sentinel.yaml31
-rw-r--r--data/mobs/examples/lesser_drone.yaml32
-rw-r--r--data/mobs/examples/man.yaml48
-rw-r--r--data/mobs/examples/molten_elemental.yaml42
-rw-r--r--data/mobs/examples/moss_giant.yaml32
-rw-r--r--data/mobs/examples/mutant_rat.yaml39
-rw-r--r--data/mobs/examples/newbie_trainer.yaml25
-rw-r--r--data/mobs/examples/phantom.yaml32
-rw-r--r--data/mobs/examples/plasma_wraith.yaml43
-rw-r--r--data/mobs/examples/psionic_entity.yaml46
-rw-r--r--data/mobs/examples/rat.yaml22
-rw-r--r--data/mobs/examples/sawmill_operator.yaml50
-rw-r--r--data/mobs/examples/scrap_bot.yaml39
-rw-r--r--data/mobs/examples/security_turret.yaml41
-rw-r--r--data/mobs/examples/skeleton.yaml31
-rw-r--r--data/mobs/examples/slug.yaml27
-rw-r--r--data/mobs/examples/solar_panel_frame.yaml33
-rw-r--r--data/mobs/examples/tanner.yaml65
-rw-r--r--data/mobs/examples/titan_sentinel.yaml41
-rw-r--r--data/mobs/examples/veteran_merc.yaml42
-rw-r--r--data/mobs/examples/void_reaper.yaml52
-rw-r--r--data/mobs/examples/war_drone.yaml42
-rw-r--r--data/mobs/examples/weapons_smith.yaml64
-rw-r--r--data/mobs/examples/zombie.yaml33
43 files changed, 1938 insertions, 0 deletions
diff --git a/data/mobs/examples/ancient_construct.yaml b/data/mobs/examples/ancient_construct.yaml
new file mode 100644
index 0000000..190e8c2
--- /dev/null
+++ b/data/mobs/examples/ancient_construct.yaml
@@ -0,0 +1,47 @@
+name: ancient construct
+description: "An impossibly old machine from before the regression, still operational. Its design is alien even by modern standards, covered in glowing runes that predate recorded history."
+attack: 58
+strength: 62
+defense: 66
+hp: 152
+speed: 4
+aggressive: true
+respawn_ticks: 150
+attack_type: slash
+attack_bonus: 55
+strength_bonus: 55
+stab_defense: 95
+slash_defense: 100
+crush_defense: 85
+science_defense: -40
+ranged_defense: 70
+weakness: chaos
+idle_descriptions:
+ - "etches glowing symbols into the air"
+ - "reconfigures its form with clicking sounds"
+ - "projects a holographic star map"
+ - "emits a resonant chime that shakes the walls"
+combat_descriptions:
+ - "slices at %s with a blade of pure light"
+ - "unleashes a cascade of ancient energy at %s"
+ - "teleports behind %s and strikes"
+size: massive
+drops:
+ remains: scrap
+ loot:
+ - item_id: credits
+ weight: 40
+ quantity: 10000
+ - item_id: bloodjunk
+ weight: 20
+ quantity: 8
+ - item_id: deathjunk
+ weight: 15
+ quantity: 8
+ - table: gem_table
+ weight: 10
+ - item_id: uncut_diamond
+ weight: 5
+ quantity: 3
+ - table: herb_table_high
+ weight: 10
diff --git a/data/mobs/examples/bandit.yaml b/data/mobs/examples/bandit.yaml
new file mode 100644
index 0000000..51e4b8e
--- /dev/null
+++ b/data/mobs/examples/bandit.yaml
@@ -0,0 +1,38 @@
+name: bandit
+description: "A scrappy outlaw with a cybernetic arm and patched armor. He eyes you with predatory intent."
+attack: 10
+strength: 12
+defense: 12
+hp: 28
+speed: 5
+aggressive: true
+respawn_ticks: 30
+attack_type: slash
+attack_bonus: 5
+strength_bonus: 5
+stab_defense: 10
+slash_defense: 15
+crush_defense: 8
+science_defense: -5
+ranged_defense: 12
+idle_descriptions:
+ - "scans the horizon for targets"
+ - "wipes a blade on his sleeve"
+ - "spits on the ground"
+ - "adjusts a cybernetic knuckle"
+combat_descriptions:
+ - "slashes at %s with a serrated blade"
+ - "delivers a crushing punch with a cybernetic fist"
+ - "lunges at %s with a battle cry"
+size: medium
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 70
+ quantity: 30
+ - item_id: credits
+ weight: 20
+ quantity: 80
+ - table: herb_table_low
+ weight: 10
diff --git a/data/mobs/examples/bioengineer.yaml b/data/mobs/examples/bioengineer.yaml
new file mode 100644
index 0000000..4761991
--- /dev/null
+++ b/data/mobs/examples/bioengineer.yaml
@@ -0,0 +1,44 @@
+name: Bioengineer
+description: "A lab-coated scientist carrying a satchel of genetically modified seeds. Her pockets are stuffed with rare specimens."
+combat_descriptions:
+ - "jabs a syringe at %s"
+ - "is being overpowered by %s"
+ - "fights desperately against %s"
+idle_descriptions:
+ - "scribbles notes on a clipboard"
+ - "carefully inspects a vial of green liquid"
+ - "adjusts her safety goggles"
+ - "mutters about gene splicing yields"
+attack: 6
+strength: 4
+defense: 5
+hp: 25
+speed: 5
+aggressive: false
+respawn_ticks: 50
+attack_type: crush
+stab_defense: 0
+slash_defense: 0
+crush_defense: 0
+science_defense: 0
+ranged_defense: 0
+steal_table: bioengineer_steal
+steal_level: 38
+steal_xp: 45
+steal_speed: 4
+size: small
+drops:
+ remains: "bones"
+ loot:
+ - item_id: "sweetcorn_seed"
+ weight: 30
+ quantity: 2
+ - item_id: "strawberry_seed"
+ weight: 25
+ quantity: 1
+ - item_id: "watermelon_seed"
+ weight: 15
+ quantity: 1
+ - item_id: "ranarr_seed"
+ weight: 5
+ quantity: 1 \ No newline at end of file
diff --git a/data/mobs/examples/client.yaml b/data/mobs/examples/client.yaml
new file mode 100644
index 0000000..91b6802
--- /dev/null
+++ b/data/mobs/examples/client.yaml
@@ -0,0 +1,214 @@
+aggressive: false
+attack: 1
+defense: 1
+description: A shadowy figure in a dark coat. They speak in clipped, measured tones and seem to know everything about every creature in the sector.
+hp: 100
+idle_descriptions:
+ - reviews a holographic dossier
+ - marks a location on a worn star chart
+ - flips a credit chit between their fingers
+ - mutters coordinates under their breath
+ - glances at you appraisingly
+ - taps a data pad with a stylus
+name: The Client
+protected: true
+respawn_ticks: 30
+speed: 5
+strength: 1
+talk:
+ nodes:
+ assign_task:
+ action:
+ assign_task: true
+ message: '"Let me check what''s available..." The Client scrolls through their data pad.'
+ options:
+ - text: '"Understood."'
+ - goto: start
+ text: '"What else do you have?"'
+ buy_acid:
+ action:
+ cost: 10
+ give_item: acid_vial
+ message: '"Handle with care." The Client passes you a vial of corrosive acid.'
+ options:
+ - condition:
+ min_credits: 10
+ goto: buy_acid
+ text: '"Buy more."'
+ - goto: supplies
+ text: '"Thanks."'
+ buy_auto_acid:
+ action:
+ reputation_cost: 200
+ set_player_flags:
+ assassin_unlocked_auto_acid_vial: true
+ message: '"Auto-acid purchased. Acid vials will no longer be consumed."'
+ options:
+ - goto: rep_shop
+ text: '"Thanks."'
+ buy_auto_salt:
+ action:
+ reputation_cost: 200
+ set_player_flags:
+ assassin_unlocked_auto_salt: true
+ message: '"Auto-salt purchased. You''ll no longer consume salt on finishing blows."'
+ options:
+ - goto: rep_shop
+ text: '"Thanks."'
+ buy_extend_unlock:
+ action:
+ reputation_cost: 100
+ set_player_flags:
+ assassin_unlocked_extend: true
+ message: '"You can now extend tasks via our conversation."'
+ options:
+ - goto: rep_shop
+ text: '"Thanks."'
+ buy_gloves:
+ action:
+ cost: 50
+ give_item: insulated_gloves
+ message: '"These''ll keep the current from frying your hands." The Client tosses you a pair of thick rubber gloves.'
+ options:
+ - goto: supplies
+ text: '"Thanks."'
+ buy_salt:
+ action:
+ cost: 5
+ give_item: salt
+ message: '"Here you go." The Client slides a packet of salt across the table.'
+ options:
+ - condition:
+ min_credits: 5
+ goto: buy_salt
+ text: '"Buy more."'
+ - goto: supplies
+ text: '"Thanks."'
+ buy_superiors:
+ action:
+ reputation_cost: 300
+ set_player_flags:
+ assassin_unlocked_superiors: true
+ message: '"Superior encounters unlocked. Watch yourself out there."'
+ options:
+ - goto: rep_shop
+ text: '"Thanks."'
+ buy_visor:
+ action:
+ cost: 75
+ give_item: spectral_visor
+ message: '"Spectral frequency filter. Makes the invisible visible — and keeps their attacks from scrambling your brain."'
+ options:
+ - goto: supplies
+ text: '"Thanks."'
+ current_task:
+ message: '"Let me check your file." The Client pulls up your record.'
+ options:
+ - text: '"Okay."'
+ extend_confirm:
+ message: '"Extending your task costs 30 Reputation and adds more kills. Want to proceed?"'
+ options:
+ - goto: extend_done
+ text: '"Yes, extend it."'
+ - goto: start
+ text: '"Never mind."'
+ extend_done:
+ action:
+ extend_task: true
+ message: '"Done. I''ve added more targets to your contract."'
+ options:
+ - text: '"Thanks."'
+ rep_shop:
+ message: '"Here''s what I''ve got. All purchases are permanent."'
+ options:
+ - condition:
+ not: true
+ player_flag: assassin_unlocked_auto_salt
+ goto: buy_auto_salt
+ text: '"Auto-finish: Salt (200 Rep) - Never consume salt on finishing blows."'
+ - condition:
+ not: true
+ player_flag: assassin_unlocked_auto_acid_vial
+ goto: buy_auto_acid
+ text: '"Auto-finish: Acid Vial (200 Rep) - Never consume acid vials on finishing blows."'
+ - condition:
+ not: true
+ player_flag: assassin_unlocked_superiors
+ goto: buy_superiors
+ text: '"Unlock Superior Mobs (300 Rep) - Rare superior variants may spawn."'
+ - condition:
+ not: true
+ player_flag: assassin_unlocked_extend
+ goto: buy_extend_unlock
+ text: '"Unlock Extended Tasks (100 Rep) - Allows extending tasks."'
+ - goto: start
+ text: '"Back."'
+ skip_confirm:
+ message: '"Skipping a task costs 30 Reputation and resets your streak. Are you sure?"'
+ options:
+ - goto: skip_done
+ text: '"Yes, skip it."'
+ - goto: start
+ text: '"Never mind."'
+ skip_done:
+ action:
+ skip_task: true
+ message: '"Task cancelled. Your streak has been reset."'
+ options:
+ - goto: assign_task
+ text: '"Give me a new one."'
+ - text: '"Goodbye."'
+ start:
+ message: The Client looks up from their data pad. "What do you need?"
+ options:
+ - condition:
+ not: true
+ player_flag: assassin_task_mob
+ goto: assign_task
+ text: '"I need a job."'
+ - condition:
+ not: false
+ player_flag: assassin_task_mob
+ goto: current_task
+ text: '"What''s my current task?"'
+ - condition:
+ not: false
+ player_flag: assassin_task_mob
+ goto: skip_confirm
+ text: '"I want to skip my task."'
+ - condition:
+ all_of:
+ - not: false
+ player_flag: assassin_task_mob
+ - player_flag: assassin_unlocked_extend
+ value: true
+ goto: extend_confirm
+ text: '"I want to extend my task."'
+ - goto: rep_shop
+ text: '"I''d like to browse the Reputation Shop."'
+ - goto: supplies
+ text: '"I need supplies."'
+ - text: '"Goodbye."'
+ supplies:
+ message: '"I stock everything you need for the job. Cheap, too."'
+ options:
+ - condition:
+ min_credits: 5
+ goto: buy_salt
+ text: '"Buy salt (5 credits each)."'
+ - condition:
+ min_credits: 10
+ goto: buy_acid
+ text: '"Buy acid vial (10 credits each)."'
+ - condition:
+ min_credits: 50
+ goto: buy_gloves
+ text: '"Buy insulated gloves (50 credits)."'
+ - condition:
+ min_credits: 75
+ goto: buy_visor
+ text: '"Buy spectral visor (75 credits)."'
+ - goto: start
+ text: '"Back."'
+unique: true
+size: small
diff --git a/data/mobs/examples/corrupted_scientist.yaml b/data/mobs/examples/corrupted_scientist.yaml
new file mode 100644
index 0000000..2083c03
--- /dev/null
+++ b/data/mobs/examples/corrupted_scientist.yaml
@@ -0,0 +1,43 @@
+name: corrupted scientist
+description: "A researcher whose mind was consumed by their own experiments. Energy crackles around their fingertips and their lab coat is singed and tattered."
+attack: 1
+strength: 1
+defense: 18
+hp: 40
+science: 50
+speed: 5
+aggressive: true
+respawn_ticks: 45
+attack_type: science
+attack_bonus: 0
+strength_bonus: 0
+stab_defense: 25
+slash_defense: 25
+crush_defense: 20
+science_defense: 35
+ranged_defense: -5
+weakness: eco
+idle_descriptions:
+ - "mutters incomprehensible formulas"
+ - "energy arcs between their fingers"
+ - "scribbles equations on the wall in soot"
+ - "stares at their own hands in horror"
+combat_descriptions:
+ - "blasts %s with a burst of unstable energy"
+ - "unleashes a wave of chaotic force at %s"
+ - "channels raw power through their hands at %s"
+size: medium
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 50
+ quantity: 150
+ - item_id: solarjunk
+ weight: 20
+ quantity: 2
+ - item_id: hydrojunk
+ weight: 15
+ quantity: 2
+ - table: herb_table_mid
+ weight: 15
diff --git a/data/mobs/examples/cow.yaml b/data/mobs/examples/cow.yaml
new file mode 100644
index 0000000..7f1ee3c
--- /dev/null
+++ b/data/mobs/examples/cow.yaml
@@ -0,0 +1,28 @@
+name: cow
+description: "A placid dairy cow, chewing cud."
+attack: 1
+strength: 1
+defense: 1
+hp: 8
+speed: 5
+aggressive: false
+respawn_ticks: 30
+attack_type: crush
+stab_defense: 1
+slash_defense: 1
+crush_defense: 1
+science_defense: 0
+ranged_defense: 0
+idle_descriptions:
+ - "moos softly"
+ - "chews on some grass"
+ - "swishes its tail lazily"
+ - "stares at you with big brown eyes"
+size: large
+drops:
+ remains: bones
+ loot:
+ - item_id: cowhide
+ weight: 100
+ - item_id: raw_beef
+ weight: 100
diff --git a/data/mobs/examples/crawler.yaml b/data/mobs/examples/crawler.yaml
new file mode 100644
index 0000000..9021c51
--- /dev/null
+++ b/data/mobs/examples/crawler.yaml
@@ -0,0 +1,32 @@
+name: crawler
+description: "A heavily armored bio-mechanical creature with a chitinous exoskeleton. Its regenerative biology prevents death unless dissolved with acid."
+assassin_level: 30
+finishing_blow: acid_vial
+attack: 25
+strength: 22
+defense: 30
+hp: 80
+speed: 5
+aggressive: false
+respawn_ticks: 45
+idle_descriptions:
+ - "scrapes its mandibles together menacingly"
+ - "clicks and chitters in an alien rhythm"
+ - "tests the air with feathered antennae"
+ - "coils its segmented body defensively"
+combat_descriptions:
+ - "snaps its mandibles at %s"
+ - "lashes out with a barbed tail at %s"
+ - "charges headlong into %s"
+size: large
+drops:
+ remains: chitin_plate
+ loot:
+ - item_id: credits
+ weight: 70
+ quantity: 250
+ - item_id: acid_vial
+ weight: 10
+ - item_id: credits
+ weight: 20
+ quantity: 500
diff --git a/data/mobs/examples/drone.yaml b/data/mobs/examples/drone.yaml
new file mode 100644
index 0000000..5ac6552
--- /dev/null
+++ b/data/mobs/examples/drone.yaml
@@ -0,0 +1,32 @@
+name: drone
+description: "A malfunctioning security drone crackling with electrical discharge. Its attacks are especially dangerous to anyone not wearing insulated gloves."
+assassin_level: 15
+damage_without: insulated_gloves
+attack: 15
+strength: 14
+defense: 12
+hp: 45
+speed: 4
+aggressive: true
+respawn_ticks: 35
+idle_descriptions:
+ - "hovers erratically, sparking"
+ - "emits a high-pitched whine"
+ - "scans the area with a flickering red beam"
+ - "rotates its weapon array with a mechanical click"
+combat_descriptions:
+ - "fires an electrical bolt at %s"
+ - "charges its capacitors and zaps %s"
+ - "swoops down on %s with crackling energy"
+size: small
+drops:
+ remains: circuit_board
+ loot:
+ - item_id: credits
+ weight: 80
+ quantity: 75
+ - item_id: insulated_gloves
+ weight: 5
+ - item_id: credits
+ weight: 15
+ quantity: 200
diff --git a/data/mobs/examples/elite_synth.yaml b/data/mobs/examples/elite_synth.yaml
new file mode 100644
index 0000000..b095716
--- /dev/null
+++ b/data/mobs/examples/elite_synth.yaml
@@ -0,0 +1,43 @@
+name: elite synth
+description: "A sleek combat android with glowing blue optics and a compact energy weapon. Its chassis is polished alloy and its movements are disturbingly fluid."
+attack: 1
+strength: 1
+defense: 38
+hp: 104
+science: 65
+speed: 4
+aggressive: true
+respawn_ticks: 75
+attack_type: science
+attack_bonus: 0
+strength_bonus: 0
+stab_defense: 45
+slash_defense: 45
+crush_defense: 40
+science_defense: 55
+ranged_defense: -15
+weakness: chaos
+idle_descriptions:
+ - "calibrates targeting sensors with a soft chime"
+ - "projects a holographic tactical display"
+ - "emits a binary chirp"
+ - "reconfigures its weapon array silently"
+combat_descriptions:
+ - "unleashes a coherent energy beam at %s"
+ - "fires a pulse of disruptor energy at %s"
+ - "overloads its emitters and blasts %s"
+size: medium
+drops:
+ remains: circuit_board
+ loot:
+ - item_id: credits
+ weight: 50
+ quantity: 1500
+ - item_id: biojunk
+ weight: 20
+ quantity: 3
+ - item_id: naturejunk
+ weight: 15
+ quantity: 3
+ - table: gem_table
+ weight: 15
diff --git a/data/mobs/examples/enforcer_bot.yaml b/data/mobs/examples/enforcer_bot.yaml
new file mode 100644
index 0000000..78150c3
--- /dev/null
+++ b/data/mobs/examples/enforcer_bot.yaml
@@ -0,0 +1,42 @@
+name: enforcer bot
+description: "A heavy riot control automaton with impact shields and a shock baton. It moves with deliberate, crushing steps."
+attack: 30
+strength: 35
+defense: 32
+hp: 70
+speed: 5
+aggressive: true
+respawn_ticks: 55
+attack_type: crush
+attack_bonus: 25
+strength_bonus: 25
+stab_defense: 40
+slash_defense: 40
+crush_defense: 50
+science_defense: -15
+ranged_defense: 30
+weakness: solar
+idle_descriptions:
+ - "patrols the area with heavy footsteps"
+ - "deploys its riot shield with a hiss"
+ - "announces a warning in garbled speech"
+ - "tests its shock baton against a wall"
+combat_descriptions:
+ - "smashes %s with a shock baton"
+ - "slams its riot shield into %s"
+ - "delivers a stunning blow to %s"
+size: large
+drops:
+ remains: scrap
+ loot:
+ - item_id: credits
+ weight: 60
+ quantity: 350
+ - item_id: scrap
+ weight: 20
+ quantity: 5
+ - item_id: credits
+ weight: 15
+ quantity: 800
+ - table: gem_table
+ weight: 5
diff --git a/data/mobs/examples/estate_broker.yaml b/data/mobs/examples/estate_broker.yaml
new file mode 100644
index 0000000..a156e83
--- /dev/null
+++ b/data/mobs/examples/estate_broker.yaml
@@ -0,0 +1,55 @@
+color: "227"
+description: A sharply-dressed real estate agent with a datapad and a practiced smile.
+idle: The estate broker flashes a professional smile.
+name: estate broker
+protected: true
+talk:
+ nodes:
+ already_own:
+ message: Yes, you're already a proud homeowner here! Your house is waiting for you. Use the Estate Directory to enter it, or expand your workshop.
+ options:
+ - goto: start
+ text: Good to know.
+ goodbye:
+ message: Come back when you're ready to invest in your future!
+ info:
+ message: Each house comes with an entrance hall and a workshop equipped with a workbench. You can use the workbench with a saw to turn logs into planks, or assemble planks into furniture. Furniture can be sold for a profit or displayed in your home. Future developments will allow adding more rooms to your house.
+ options:
+ - action:
+ cost: 10
+ set_player_flags:
+ owns_house_local_neighborhood: local_neighborhood
+ condition:
+ not: true
+ player_flag: owns_house_local_neighborhood
+ goto: purchased
+ text: Sounds great! I'll buy one.
+ - goto: goodbye
+ text: Maybe later.
+ purchased:
+ message: Excellent! The plot is yours. You'll find your new home in the Local Neighborhood just north of here. Use the Estate Directory terminal to enter your house. The home comes with a workshop — perfect for construction projects.
+ options:
+ - goto: start
+ text: Thanks!
+ start:
+ message: Welcome to the Local Neighborhood development! I'm selling premium housing plots for only 10 credits. Interested in buying a house?
+ options:
+ - action:
+ cost: 10
+ set_player_flags:
+ owns_house_local_neighborhood: local_neighborhood
+ condition:
+ not: true
+ player_flag: owns_house_local_neighborhood
+ goto: purchased
+ text: Yes, I'd like to buy a house.
+ - condition:
+ player_flag: owns_house_local_neighborhood
+ goto: already_own
+ text: I already own a house here.
+ - goto: goodbye
+ text: No thanks.
+ - goto: info
+ text: What do I get with a house?
+unique: true
+size: small
diff --git a/data/mobs/examples/farmer.yaml b/data/mobs/examples/farmer.yaml
new file mode 100644
index 0000000..591f1a3
--- /dev/null
+++ b/data/mobs/examples/farmer.yaml
@@ -0,0 +1,44 @@
+name: Farmer
+description: "A weathered farmer in muddy overalls, pockets bulging with seeds."
+combat_descriptions:
+ - "swings a shovel at %s"
+ - "is getting beaten by %s"
+ - "grapples with %s"
+idle_descriptions:
+ - "examines a handful of seeds"
+ - "wipes dirt from his hands"
+ - "mutters about the growing season"
+ - "adjusts his wide-brimmed hat"
+attack: 3
+strength: 3
+defense: 3
+hp: 15
+speed: 5
+aggressive: false
+respawn_ticks: 40
+attack_type: crush
+stab_defense: 0
+slash_defense: 0
+crush_defense: 0
+science_defense: 0
+ranged_defense: 0
+steal_table: farmer_steal
+steal_level: 10
+steal_xp: 15
+steal_speed: 4
+size: small
+drops:
+ remains: "bones"
+ loot:
+ - item_id: "potato_seed"
+ weight: 40
+ quantity: 3
+ - item_id: "onion_seed"
+ weight: 30
+ quantity: 2
+ - item_id: "cabbage_seed"
+ weight: 20
+ quantity: 2
+ - item_id: "tomato_seed"
+ weight: 10
+ quantity: 1 \ No newline at end of file
diff --git a/data/mobs/examples/feral_cyborg.yaml b/data/mobs/examples/feral_cyborg.yaml
new file mode 100644
index 0000000..8b30cc3
--- /dev/null
+++ b/data/mobs/examples/feral_cyborg.yaml
@@ -0,0 +1,38 @@
+name: feral cyborg
+description: "A heavily augmented human whose implants have driven them to madness. Razor-sharp blades extend from their forearms and their optical implant glows red."
+attack: 34
+strength: 36
+defense: 32
+hp: 82
+speed: 4
+aggressive: true
+respawn_ticks: 50
+attack_type: slash
+attack_bonus: 30
+strength_bonus: 28
+stab_defense: 35
+slash_defense: 45
+crush_defense: 30
+science_defense: -10
+ranged_defense: 35
+idle_descriptions:
+ - "paces back and forth, muttering"
+ - "retracts and extends forearm blades"
+ - "emits a distorted laugh"
+ - "scratches at their own cybernetics"
+combat_descriptions:
+ - "slashes %s with forearm blades"
+ - "delivers a powered kick to %s"
+ - "grapples %s with augmented strength"
+size: medium
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 60
+ quantity: 300
+ - item_id: scrap
+ weight: 25
+ quantity: 3
+ - table: herb_table_mid
+ weight: 15
diff --git a/data/mobs/examples/general_store_clerk.yaml b/data/mobs/examples/general_store_clerk.yaml
new file mode 100644
index 0000000..8a07191
--- /dev/null
+++ b/data/mobs/examples/general_store_clerk.yaml
@@ -0,0 +1,70 @@
+aggressive: false
+attack: 1
+attack_type: crush
+crush_defense: 0
+defense: 1
+description: A friendly merchant with a tidy apron, standing behind a well-stocked counter.
+hp: 50
+idle_descriptions:
+ - arranges items on the shelves
+ - polishes the counter
+ - counts credits in the register
+ - greets a passerby with a nod
+name: Shopkeeper
+protected: true
+ranged_defense: 0
+respawn_ticks: 30
+science_defense: 0
+slash_defense: 0
+speed: 5
+stab_defense: 0
+strength: 1
+talk:
+ nodes:
+ shop:
+ action:
+ shop:
+ items:
+ - buy_price: 10
+ item_id: fishing_rod
+ sell_price: 2
+ - buy_price: 2
+ item_id: fishing_bait
+ sell_price: 0
+ - buy_price: 10
+ item_id: matches
+ sell_price: 2
+ - buy_price: 40
+ item_id: firesteel
+ sell_price: 10
+ - buy_price: 30
+ item_id: lighter
+ sell_price: 7
+ - buy_price: 20
+ item_id: hammer
+ sell_price: 5
+ - buy_price: 10
+ item_id: knife
+ sell_price: 2
+ - buy_price: 10
+ item_id: chisel
+ sell_price: 2
+ - buy_price: 10
+ item_id: bread
+ sell_price: 2
+ - buy_price: 20
+ item_id: bowstring
+ sell_price: 5
+ message: What would you like to buy or sell?
+ message: '"Take your time. What can I get you?"'
+ options:
+ - goto: start
+ text: '"I''m done."'
+ start:
+ message: '"Welcome to the General Store! Need any supplies?"'
+ options:
+ - goto: shop
+ text: '"I''d like to browse."'
+ - text: '"Goodbye."'
+unique: true
+size: small
diff --git a/data/mobs/examples/ghoul.yaml b/data/mobs/examples/ghoul.yaml
new file mode 100644
index 0000000..ae8fed6
--- /dev/null
+++ b/data/mobs/examples/ghoul.yaml
@@ -0,0 +1,38 @@
+name: ghoul
+description: "A radiation-scarred crew member, barely recognizable as human. Its flesh glows faintly and its eyes are hollow sockets."
+attack: 22
+strength: 22
+defense: 20
+hp: 54
+speed: 4
+aggressive: true
+respawn_ticks: 35
+attack_type: crush
+attack_bonus: 15
+strength_bonus: 12
+stab_defense: 20
+slash_defense: 25
+crush_defense: 15
+science_defense: -5
+ranged_defense: 20
+weakness: hydro
+idle_descriptions:
+ - "shambles aimlessly and moans"
+ - "scratches at the walls leaving glowing marks"
+ - "stares blankly into the darkness"
+ - "emits a low, rattling groan"
+combat_descriptions:
+ - "claws at %s with irradiated hands"
+ - "lunges at %s with a gurgling shriek"
+ - "bites %s with decaying teeth"
+size: medium
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 60
+ quantity: 80
+ - item_id: scrap
+ weight: 25
+ - table: herb_table_low
+ weight: 15
diff --git a/data/mobs/examples/goblin.yaml b/data/mobs/examples/goblin.yaml
new file mode 100644
index 0000000..a02c112
--- /dev/null
+++ b/data/mobs/examples/goblin.yaml
@@ -0,0 +1,32 @@
+name: goblin
+description: "A small green-skinned goblin with a rusty blade."
+attack: 1
+strength: 3
+defense: 3
+hp: 12
+speed: 5
+aggressive: true
+respawn_ticks: 25
+attack_type: slash
+attack_bonus: 3
+strength_bonus: 2
+stab_defense: 4
+slash_defense: 3
+crush_defense: -2
+science_defense: 0
+ranged_defense: 3
+idle_descriptions:
+ - "mutters something unintelligible"
+ - "waves a rusty blade around"
+ - "picks its nose"
+ - "kicks a pebble"
+size: small
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 80
+ quantity: 5
+ - item_id: credits
+ weight: 20
+ quantity: 25
diff --git a/data/mobs/examples/greater_drone.yaml b/data/mobs/examples/greater_drone.yaml
new file mode 100644
index 0000000..11cf8e2
--- /dev/null
+++ b/data/mobs/examples/greater_drone.yaml
@@ -0,0 +1,33 @@
+name: greater drone
+description: "A large, heavily armored drone with multiple energy emitters. Red warning lights pulse along its hull."
+attack: 1
+strength: 1
+defense: 30
+hp: 120
+ranged: 0
+science: 40
+speed: 4
+aggressive: true
+respawn_ticks: 80
+attack_type: science
+attack_bonus: 0
+strength_bonus: 0
+stab_defense: 55
+slash_defense: 55
+crush_defense: 50
+science_defense: 40
+ranged_defense: -20
+idle_descriptions:
+ - "projects a defensive energy shield"
+ - "recalibrates its targeting array"
+ - "emits a warning klaxon"
+ - "deploys sensor probes"
+size: medium
+drops:
+ loot:
+ - item_id: scrap
+ weight: 40
+ quantity: 3
+ - item_id: credits
+ weight: 60
+ quantity: 1500
diff --git a/data/mobs/examples/guard.yaml b/data/mobs/examples/guard.yaml
new file mode 100644
index 0000000..7bd7d19
--- /dev/null
+++ b/data/mobs/examples/guard.yaml
@@ -0,0 +1,71 @@
+aggressive: false
+attack: 5
+attack_bonus: 8
+attack_type: slash
+crush_defense: 10
+defense: 5
+description: A stern-looking guard in weathered armor.
+hp: 30
+idle_descriptions:
+ - scans the area with a watchful eye
+ - adjusts the grip on his weapon
+ - nods curtly at passersby
+ - leans against the gate, arms folded
+name: Guard
+protected: true
+ranged_defense: 12
+respawn_ticks: 60
+science_defense: -5
+slash_defense: 15
+speed: 5
+stab_defense: 12
+strength: 5
+strength_bonus: 6
+talk:
+ nodes:
+ about_gate:
+ action:
+ set_player_flags:
+ talked_to_guard: true
+ message: '"Supplies. Weapons. Things you don''t need to worry about." He shifts his weight. "Tell you what — bring me some copper ore and I''ll stamp you a pass."'
+ options:
+ - text: '"I''ll be back."'
+ - condition:
+ has_item: copper_ore
+ goto: trade_ore
+ text: '"I have some right here."'
+ - text: '"Goodbye."'
+ has_pass:
+ action:
+ set_flags:
+ gate_open: true
+ message: '"Let me see that..." He examines your pass and nods. "Alright, I''ll open the gate for you."'
+ options:
+ - text: '"Thanks."'
+ start:
+ message: '"Halt! This area is restricted." The guard eyes you suspiciously.'
+ options:
+ - goto: about_gate
+ text: '"What''s behind that gate?"'
+ - condition:
+ has_item: copper_ore
+ goto: trade_ore
+ text: '"I have copper ore."'
+ - condition:
+ player_flag: got_pass
+ value: true
+ goto: has_pass
+ text: '"I have a pass."'
+ - text: '"Goodbye."'
+ trade_ore:
+ action:
+ give_item: pass_stub
+ set_player_flags:
+ got_pass: true
+ talked_to_guard: true
+ take_item: copper_ore
+ message: '"Good quality ore. This''ll do." He stamps a slip of paper and hands it to you. "That''s your pass. Don''t lose it."'
+ options:
+ - text: '"Thanks."'
+unique: true
+size: medium
diff --git a/data/mobs/examples/heavy_mech.yaml b/data/mobs/examples/heavy_mech.yaml
new file mode 100644
index 0000000..e2f5f5a
--- /dev/null
+++ b/data/mobs/examples/heavy_mech.yaml
@@ -0,0 +1,42 @@
+name: heavy mech
+description: "A lumbering assault mech with layered armor plating and a rotary cannon arm. Steam vents from its exhaust ports with each step."
+attack: 40
+strength: 44
+defense: 44
+hp: 94
+speed: 5
+aggressive: true
+respawn_ticks: 70
+attack_type: crush
+attack_bonus: 35
+strength_bonus: 35
+stab_defense: 55
+slash_defense: 55
+crush_defense: 65
+science_defense: -25
+ranged_defense: 40
+weakness: solar
+idle_descriptions:
+ - "scans the room with a blue optical beam"
+ - "vents a cloud of steam"
+ - "rotates its cannon with a mechanical whine"
+ - "announces a threat level assessment"
+combat_descriptions:
+ - "fires its rotary cannon at %s"
+ - "smashes %s with a hydraulic fist"
+ - "unleashes a missile salvo at %s"
+size: massive
+drops:
+ remains: scrap
+ loot:
+ - item_id: credits
+ weight: 55
+ quantity: 1000
+ - item_id: scrap
+ weight: 25
+ quantity: 8
+ - table: gem_table
+ weight: 10
+ - item_id: lawjunk
+ weight: 10
+ quantity: 2
diff --git a/data/mobs/examples/iron_sentinel.yaml b/data/mobs/examples/iron_sentinel.yaml
new file mode 100644
index 0000000..bf8b9b5
--- /dev/null
+++ b/data/mobs/examples/iron_sentinel.yaml
@@ -0,0 +1,31 @@
+name: iron sentinel
+description: "A massive bipedal automaton forged from pre-regression alloys. Its joints grind with each deliberate step."
+attack: 25
+strength: 30
+defense: 45
+hp: 180
+speed: 6
+aggressive: true
+respawn_ticks: 100
+attack_type: crush
+attack_bonus: 40
+strength_bonus: 35
+stab_defense: 80
+slash_defense: 80
+crush_defense: 70
+science_defense: -30
+ranged_defense: 50
+idle_descriptions:
+ - "stands motionless, servos whining softly"
+ - "turns its armored head with a mechanical grind"
+ - "vents steam from exhaust ports"
+ - "scans the area with a red optical sensor"
+size: large
+drops:
+ loot:
+ - item_id: scrap
+ weight: 30
+ quantity: 5
+ - item_id: credits
+ weight: 60
+ quantity: 5000
diff --git a/data/mobs/examples/lesser_drone.yaml b/data/mobs/examples/lesser_drone.yaml
new file mode 100644
index 0000000..c9e50a5
--- /dev/null
+++ b/data/mobs/examples/lesser_drone.yaml
@@ -0,0 +1,32 @@
+name: lesser drone
+description: "A floating metallic drone with a pulsing energy core. Its surface crackles with electric discharge."
+attack: 1
+strength: 1
+defense: 18
+hp: 55
+ranged: 0
+science: 20
+speed: 4
+aggressive: true
+respawn_ticks: 50
+attack_type: science
+attack_bonus: 0
+strength_bonus: 0
+stab_defense: 35
+slash_defense: 35
+crush_defense: 30
+science_defense: 20
+ranged_defense: -10
+idle_descriptions:
+ - "hovers silently, scanning the area"
+ - "emits a low electronic hum"
+ - "projects a thin beam of light across the floor"
+ - "rotates slowly in place"
+size: small
+drops:
+ loot:
+ - item_id: scrap
+ weight: 60
+ - item_id: credits
+ weight: 40
+ quantity: 300
diff --git a/data/mobs/examples/man.yaml b/data/mobs/examples/man.yaml
new file mode 100644
index 0000000..8478f41
--- /dev/null
+++ b/data/mobs/examples/man.yaml
@@ -0,0 +1,48 @@
+name: man
+description: "A shabby-looking man loitering in the town square."
+combat_descriptions:
+ - "is engaged in a fight to the death with %s"
+ - "is getting pummelled by %s"
+ - "is locked in combat with %s"
+ - "trades blows with %s"
+ - "circles warily around %s"
+idle_descriptions:
+ - "scribbles something in a small notebook"
+ - "gazes skyward at the clouds"
+ - "leans against a wall, looking bored"
+ - "scratches his head thoughtfully"
+ - "stares off into the distance"
+ - "adjusts his tunic and stretches"
+attack: 1
+strength: 1
+defense: 1
+hp: 7
+speed: 5
+aggressive: false
+respawn_ticks: 30
+steal_table: man_steal
+steal_level: 1
+steal_xp: 8
+steal_speed: 4
+attack_type: crush
+stab_defense: 0
+slash_defense: 0
+crush_defense: 0
+science_defense: 0
+ranged_defense: 0
+size: small
+drops:
+ remains: "bones"
+ loot:
+ - item_id: "credits"
+ weight: 98
+ quantity: 10
+ - item_id: "credits"
+ weight: 2
+ quantity: 150
+ - item_id: "grimy_guam"
+ weight: 8
+ - item_id: "grimy_marrentill"
+ weight: 4
+ - item_id: "grimy_tarromin"
+ weight: 2
diff --git a/data/mobs/examples/molten_elemental.yaml b/data/mobs/examples/molten_elemental.yaml
new file mode 100644
index 0000000..9c46ccb
--- /dev/null
+++ b/data/mobs/examples/molten_elemental.yaml
@@ -0,0 +1,42 @@
+name: molten elemental
+description: "A flowing mass of liquid metal and superheated slag, roughly humanoid. The air around it shimmers with heat and droplets of molten alloy drip to the floor."
+attack: 48
+strength: 52
+defense: 52
+hp: 115
+speed: 5
+aggressive: true
+respawn_ticks: 80
+attack_type: crush
+attack_bonus: 40
+strength_bonus: 42
+stab_defense: 60
+slash_defense: 60
+crush_defense: 70
+science_defense: -30
+ranged_defense: 45
+weakness: hydro
+idle_descriptions:
+ - "bubbles and churns, throwing off sparks"
+ - "melts a nearby chunk of metal absent-mindedly"
+ - "pulses with an inner orange glow"
+ - "drips glowing droplets onto the floor"
+combat_descriptions:
+ - "hurls a glob of molten metal at %s"
+ - "engulfs %s in a wave of liquid fire"
+ - "smashes %s with a superheated limb"
+size: large
+drops:
+ remains: scrap
+ loot:
+ - item_id: credits
+ weight: 50
+ quantity: 2000
+ - item_id: biojunk
+ weight: 20
+ quantity: 3
+ - item_id: bloodjunk
+ weight: 15
+ quantity: 2
+ - table: herb_table_high
+ weight: 15
diff --git a/data/mobs/examples/moss_giant.yaml b/data/mobs/examples/moss_giant.yaml
new file mode 100644
index 0000000..f19f0a3
--- /dev/null
+++ b/data/mobs/examples/moss_giant.yaml
@@ -0,0 +1,32 @@
+name: moss giant
+description: "A towering creature covered in moss and vines, its rocky skin dripping with moisture."
+attack: 12
+strength: 14
+defense: 10
+hp: 60
+speed: 7
+aggressive: true
+respawn_ticks: 45
+attack_type: crush
+attack_bonus: 10
+strength_bonus: 12
+stab_defense: 15
+slash_defense: 12
+crush_defense: 18
+science_defense: -5
+ranged_defense: 15
+idle_descriptions:
+ - "surveys its territory with dull eyes"
+ - "pulls a vine from its shoulder"
+ - "stamps the ground, sending tremors"
+ - "scratches its mossy hide"
+size: massive
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 50
+ quantity: 120
+ - item_id: credits
+ weight: 50
+ quantity: 500
diff --git a/data/mobs/examples/mutant_rat.yaml b/data/mobs/examples/mutant_rat.yaml
new file mode 100644
index 0000000..7836ef9
--- /dev/null
+++ b/data/mobs/examples/mutant_rat.yaml
@@ -0,0 +1,39 @@
+name: mutant rat
+description: "A bloated rodent with glowing green eyes and exposed muscle tissue. Bio-engineering runoff has made it unnaturally aggressive."
+attack: 13
+strength: 13
+defense: 12
+hp: 32
+speed: 4
+aggressive: true
+respawn_ticks: 25
+attack_type: crush
+attack_bonus: 8
+strength_bonus: 6
+stab_defense: 15
+slash_defense: 15
+crush_defense: 10
+science_defense: -10
+ranged_defense: 5
+weakness: bio
+idle_descriptions:
+ - "scurries frantically in circles"
+ - "gnaws on a rusted pipe"
+ - "emits a gurgling screech"
+ - "twitches unnaturally"
+combat_descriptions:
+ - "bites %s with glowing teeth"
+ - "slashes %s with mutated claws"
+ - "lunges at %s with unnatural speed"
+size: small
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 60
+ quantity: 20
+ - item_id: scrap
+ weight: 30
+ - item_id: credits
+ weight: 10
+ quantity: 60
diff --git a/data/mobs/examples/newbie_trainer.yaml b/data/mobs/examples/newbie_trainer.yaml
new file mode 100644
index 0000000..3897dba
--- /dev/null
+++ b/data/mobs/examples/newbie_trainer.yaml
@@ -0,0 +1,25 @@
+name: Newbie Trainer
+description: "A friendly-looking instructor ready to help new adventurers."
+unique: true
+protected: true
+attack: 1
+strength: 1
+defense: 1
+hp: 50
+speed: 5
+aggressive: false
+respawn_ticks: 30
+attack_type: crush
+stab_defense: 0
+slash_defense: 0
+crush_defense: 0
+science_defense: 0
+ranged_defense: 0
+idle_descriptions:
+ - "reviews a training manual"
+ - "adjusts a practice dummy"
+ - "demonstrates a sword stance to no one in particular"
+ - "offers a friendly nod to passersby"
+ - "polishes a wooden shield"
+ - "checks a stopwatch and jots something down"
+size: small
diff --git a/data/mobs/examples/phantom.yaml b/data/mobs/examples/phantom.yaml
new file mode 100644
index 0000000..d871b76
--- /dev/null
+++ b/data/mobs/examples/phantom.yaml
@@ -0,0 +1,32 @@
+name: phantom
+description: "A semi-transparent entity that phases in and out of visible light. Its psychic attacks are devastating to anyone without a spectral visor."
+assassin_level: 45
+damage_without: spectral_visor
+attack: 35
+strength: 30
+defense: 25
+hp: 100
+speed: 3
+aggressive: true
+respawn_ticks: 50
+idle_descriptions:
+ - "flickers between visible and invisible"
+ - "emits a low, resonant hum"
+ - "drifts through a wall and back again"
+ - "stares at you with hollow, glowing eyes"
+combat_descriptions:
+ - "blasts %s with a psychic wave"
+ - "phases through %s's defenses"
+ - "unleashes a spectral shriek at %s"
+size: medium
+drops:
+ remains: ectoplasm
+ loot:
+ - item_id: credits
+ weight: 60
+ quantity: 500
+ - item_id: spectral_visor
+ weight: 3
+ - item_id: credits
+ weight: 37
+ quantity: 1000
diff --git a/data/mobs/examples/plasma_wraith.yaml b/data/mobs/examples/plasma_wraith.yaml
new file mode 100644
index 0000000..c4ced2b
--- /dev/null
+++ b/data/mobs/examples/plasma_wraith.yaml
@@ -0,0 +1,43 @@
+name: plasma wraith
+description: "A shimmering entity of contained plasma, vaguely humanoid in shape. It radiates intense heat and hums with barely contained energy."
+attack: 1
+strength: 1
+defense: 22
+hp: 56
+science: 65
+speed: 4
+aggressive: true
+respawn_ticks: 60
+attack_type: science
+attack_bonus: 0
+strength_bonus: 0
+stab_defense: 30
+slash_defense: 30
+crush_defense: 25
+science_defense: 45
+ranged_defense: -10
+weakness: hydro
+idle_descriptions:
+ - "drifts silently, leaving heat shimmer in its wake"
+ - "pulses with internal light"
+ - "phases partially through a wall"
+ - "emits a low frequency hum"
+combat_descriptions:
+ - "lashes %s with a whip of plasma"
+ - "engulfs %s in a superheated cloud"
+ - "discharges a concentrated beam at %s"
+size: medium
+drops:
+ remains: ectoplasm
+ loot:
+ - item_id: credits
+ weight: 50
+ quantity: 400
+ - item_id: chaosjunk
+ weight: 20
+ quantity: 2
+ - item_id: cosmicjunk
+ weight: 15
+ quantity: 2
+ - table: gem_table
+ weight: 15
diff --git a/data/mobs/examples/psionic_entity.yaml b/data/mobs/examples/psionic_entity.yaml
new file mode 100644
index 0000000..1c518bf
--- /dev/null
+++ b/data/mobs/examples/psionic_entity.yaml
@@ -0,0 +1,46 @@
+name: psionic entity
+description: "A barely visible distortion in the air, only detectable by the pressure it exerts on your mind. When it focuses, you see a shimmering outline of something vast and ancient."
+attack: 1
+strength: 1
+defense: 42
+hp: 128
+science: 97
+speed: 4
+aggressive: true
+respawn_ticks: 100
+attack_type: science
+attack_bonus: 0
+strength_bonus: 0
+stab_defense: 50
+slash_defense: 50
+crush_defense: 45
+science_defense: 70
+ranged_defense: -20
+idle_descriptions:
+ - "probes the edges of your consciousness"
+ - "flickers between visible and invisible states"
+ - "emits a subsonic pulse you feel in your teeth"
+ - "momentarily shows you visions of another dimension"
+combat_descriptions:
+ - "assaults %s's mind with psionic force"
+ - "tears at %s's perception of reality"
+ - "unleashes a devastating mental blast at %s"
+size: large
+drops:
+ remains: ectoplasm
+ loot:
+ - item_id: credits
+ weight: 40
+ quantity: 5000
+ - item_id: lawjunk
+ weight: 20
+ quantity: 5
+ - item_id: cosmicjunk
+ weight: 15
+ quantity: 5
+ - table: gem_table
+ weight: 15
+ - item_id: spectral_visor
+ weight: 5
+ - table: herb_table_high
+ weight: 5
diff --git a/data/mobs/examples/rat.yaml b/data/mobs/examples/rat.yaml
new file mode 100644
index 0000000..4265674
--- /dev/null
+++ b/data/mobs/examples/rat.yaml
@@ -0,0 +1,22 @@
+name: rat
+description: "A large, mangy rat with beady red eyes."
+attack: 1
+strength: 1
+defense: 1
+hp: 2
+speed: 4
+aggressive: false
+respawn_ticks: 20
+attack_type: crush
+stab_defense: 0
+slash_defense: 0
+crush_defense: 0
+science_defense: 0
+ranged_defense: 0
+idle_descriptions:
+ - "sniffs around the ground"
+ - "nibbles on something"
+ - "scurries in circles"
+size: small
+drops:
+ remains: bones
diff --git a/data/mobs/examples/sawmill_operator.yaml b/data/mobs/examples/sawmill_operator.yaml
new file mode 100644
index 0000000..b70362f
--- /dev/null
+++ b/data/mobs/examples/sawmill_operator.yaml
@@ -0,0 +1,50 @@
+color: "186"
+description: A burly worker in a thick apron, covered in sawdust. He operates the industrial sawmill.
+idle: The sawmill operator wipes sawdust from his goggles.
+name: sawmill operator
+protected: true
+talk:
+ nodes:
+ goodbye:
+ message: Come back anytime you need more planks!
+ prices:
+ message: |-
+ Here's what I charge per log:
+ Regular logs: 5 credits
+ Oak logs: 10 credits
+ Teak logs: 20 credits
+ Mahogany logs: 40 credits
+
+ Want me to process your logs?
+ options:
+ - condition:
+ any_of:
+ - has_item: logs
+ - has_item: oak_logs
+ - has_item: teak_logs
+ - has_item: mahogany_logs
+ goto: process
+ text: Yes, process all my logs.
+ - goto: goodbye
+ text: No thanks.
+ process:
+ action:
+ sawmill: true
+ message: ""
+ start:
+ message: Welcome to the lumberyard! I can turn your logs into planks — for a small fee, of course. What can I do for ya?
+ options:
+ - condition:
+ any_of:
+ - has_item: logs
+ - has_item: oak_logs
+ - has_item: teak_logs
+ - has_item: mahogany_logs
+ goto: prices
+ text: Turn all my logs into planks.
+ - goto: prices
+ text: What are your prices?
+ - goto: goodbye
+ text: Nothing for now.
+unique: true
+size: small
diff --git a/data/mobs/examples/scrap_bot.yaml b/data/mobs/examples/scrap_bot.yaml
new file mode 100644
index 0000000..a8b34d8
--- /dev/null
+++ b/data/mobs/examples/scrap_bot.yaml
@@ -0,0 +1,39 @@
+name: scrap bot
+description: "A malfunctioning maintenance robot that has gone rogue. Its chassis is covered in dents and rust, and one optical sensor flickers erratically."
+attack: 15
+strength: 15
+defense: 14
+hp: 30
+speed: 5
+aggressive: true
+respawn_ticks: 30
+attack_type: crush
+attack_bonus: 10
+strength_bonus: 8
+stab_defense: 20
+slash_defense: 15
+crush_defense: 25
+science_defense: -5
+ranged_defense: 10
+idle_descriptions:
+ - "beeps erratically and twitches"
+ - "bumps into a wall and reverses"
+ - "emits a burst of static"
+ - "scans the floor with a flickering beam"
+combat_descriptions:
+ - "rams %s with its chassis"
+ - "swings a broken manipulator arm at %s"
+ - "discharges a spark at %s"
+size: medium
+drops:
+ remains: scrap
+ loot:
+ - item_id: credits
+ weight: 60
+ quantity: 40
+ - item_id: scrap
+ weight: 30
+ quantity: 2
+ - item_id: credits
+ weight: 10
+ quantity: 100
diff --git a/data/mobs/examples/security_turret.yaml b/data/mobs/examples/security_turret.yaml
new file mode 100644
index 0000000..9929106
--- /dev/null
+++ b/data/mobs/examples/security_turret.yaml
@@ -0,0 +1,41 @@
+name: security turret
+description: "A ceiling-mounted auto-turret with twin barrels and a red targeting laser. It tracks you with mechanical precision."
+attack: 1
+strength: 1
+defense: 16
+hp: 44
+ranged: 34
+speed: 5
+aggressive: true
+respawn_ticks: 40
+attack_type: ranged
+attack_bonus: 0
+strength_bonus: 0
+stab_defense: 30
+slash_defense: 20
+crush_defense: 40
+science_defense: -20
+ranged_defense: 15
+weakness: solar
+idle_descriptions:
+ - "pans the room with a targeting laser"
+ - "emits a rhythmic clicking sound"
+ - "calibrates its targeting sensors"
+ - "beeps a warning tone"
+combat_descriptions:
+ - "fires twin bolts at %s"
+ - "unleashes a burst of rounds at %s"
+ - "locks onto %s and opens fire"
+size: small
+drops:
+ remains: scrap
+ loot:
+ - item_id: credits
+ weight: 70
+ quantity: 100
+ - item_id: scrap
+ weight: 20
+ quantity: 3
+ - item_id: credits
+ weight: 10
+ quantity: 250
diff --git a/data/mobs/examples/skeleton.yaml b/data/mobs/examples/skeleton.yaml
new file mode 100644
index 0000000..ba82afc
--- /dev/null
+++ b/data/mobs/examples/skeleton.yaml
@@ -0,0 +1,31 @@
+name: skeleton
+description: "An animated pile of bones, held together by dark energy."
+attack: 8
+strength: 6
+defense: 8
+hp: 22
+speed: 5
+aggressive: true
+respawn_ticks: 30
+attack_type: stab
+attack_bonus: 6
+strength_bonus: 4
+stab_defense: 10
+slash_defense: 18
+crush_defense: -5
+science_defense: -8
+ranged_defense: 10
+idle_descriptions:
+ - "rattles ominously"
+ - "clicks its jaw open and shut"
+ - "stares with empty eye sockets"
+size: medium
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 70
+ quantity: 30
+ - item_id: credits
+ weight: 30
+ quantity: 100
diff --git a/data/mobs/examples/slug.yaml b/data/mobs/examples/slug.yaml
new file mode 100644
index 0000000..64082ec
--- /dev/null
+++ b/data/mobs/examples/slug.yaml
@@ -0,0 +1,27 @@
+name: slug
+description: "A bloated, translucent slug the size of a dog. Its skin glistens with toxic mucus. It cannot be killed by conventional means — only salt can destroy it."
+assassin_level: 1
+finishing_blow: salt
+attack: 3
+strength: 3
+defense: 1
+hp: 15
+speed: 6
+aggressive: false
+respawn_ticks: 25
+idle_descriptions:
+ - "oozes along the floor leaving a slimy trail"
+ - "contracts and expands rhythmically"
+ - "extends its eyestalks toward you"
+ - "secretes a glob of toxic mucus"
+combat_descriptions:
+ - "lunges slimily at %s"
+ - "sprays mucus toward %s"
+ - "writhes in combat with %s"
+size: small
+drops:
+ remains: slug_mucus
+ loot:
+ - item_id: credits
+ weight: 100
+ quantity: 15
diff --git a/data/mobs/examples/solar_panel_frame.yaml b/data/mobs/examples/solar_panel_frame.yaml
new file mode 100644
index 0000000..90269f2
--- /dev/null
+++ b/data/mobs/examples/solar_panel_frame.yaml
@@ -0,0 +1,33 @@
+name: solar panel frame
+description: "A half-assembled photovoltaic array on a steel frame. Panels, brackets and cabling are laid out, waiting to be fitted. This is work, not a fight — fix the panels into place to complete the array."
+kind: task
+verb: assemble
+progress_noun: assembly
+complete_message: "You bolt the final panel into place and the solar array hums to life!"
+hp: 40
+defense: 10
+speed: 5
+aggressive: false
+respawn_ticks: 40
+attack_type: crush
+crush_defense: 0
+stab_defense: 40
+slash_defense: 40
+ranged_defense: 10
+science_defense: 10
+idle_descriptions:
+ - "stands half-assembled, panels waiting to be fitted"
+ - "has loose cabling dangling from an open junction box"
+ - "catches the light on its few mounted panels"
+size: medium
+drops:
+ loot:
+ - item_id: credits
+ weight: 70
+ quantity: 40
+ - item_id: credits
+ weight: 25
+ quantity: 90
+ - item_id: coal
+ weight: 5
+ quantity: 1
diff --git a/data/mobs/examples/tanner.yaml b/data/mobs/examples/tanner.yaml
new file mode 100644
index 0000000..2e5d89a
--- /dev/null
+++ b/data/mobs/examples/tanner.yaml
@@ -0,0 +1,65 @@
+aggressive: false
+attack: 1
+attack_type: crush
+crush_defense: 0
+defense: 1
+description: A weathered craftsman with stained hands and a leather apron.
+hp: 50
+idle_descriptions:
+ - scrapes at a piece of hide
+ - examines a stack of leathers
+ - sharpens a tanning knife
+ - wipes sweat from his brow
+name: Tanner
+protected: true
+ranged_defense: 0
+respawn_ticks: 30
+science_defense: 0
+slash_defense: 0
+speed: 5
+stab_defense: 0
+strength: 1
+talk:
+ nodes:
+ start:
+ message: '"Bring me some cowhides and I''ll tan them for you. Leather is 10 credits, hard leather is 50."'
+ options:
+ - condition:
+ all_of:
+ - has_item: cowhide
+ - min_credits: 10
+ goto: tan_leather
+ text: '"Tan a cowhide into leather (10 credits)."'
+ - condition:
+ all_of:
+ - has_item: cowhide
+ - min_credits: 50
+ goto: tan_hard_leather
+ text: '"Tan a cowhide into hard leather (50 credits)."'
+ - text: '"Never mind."'
+ tan_hard_leather:
+ action:
+ cost: 50
+ give_item: hard_leather
+ take_item: cowhide
+ message: The tanner takes your cowhide and subjects it to an intense curing process. "Here's your hard leather."
+ options:
+ - condition:
+ has_item: cowhide
+ goto: start
+ text: '"Tan another."'
+ - text: '"Thanks."'
+ tan_leather:
+ action:
+ cost: 10
+ give_item: leather
+ take_item: cowhide
+ message: The tanner takes your cowhide and works it skillfully. "Here's your leather."
+ options:
+ - condition:
+ has_item: cowhide
+ goto: start
+ text: '"Tan another."'
+ - text: '"Thanks."'
+unique: true
+size: small
diff --git a/data/mobs/examples/titan_sentinel.yaml b/data/mobs/examples/titan_sentinel.yaml
new file mode 100644
index 0000000..32ddcc2
--- /dev/null
+++ b/data/mobs/examples/titan_sentinel.yaml
@@ -0,0 +1,41 @@
+name: titan sentinel
+description: "A colossal automaton, the bigger brother of the iron sentinel. Its armor is reinforced adamantite alloy and its optics burn with crimson fire."
+attack: 50
+strength: 52
+defense: 56
+hp: 132
+speed: 5
+aggressive: true
+respawn_ticks: 120
+attack_type: crush
+attack_bonus: 48
+strength_bonus: 45
+stab_defense: 90
+slash_defense: 90
+crush_defense: 80
+science_defense: -35
+ranged_defense: 60
+weakness: solar
+idle_descriptions:
+ - "stands motionless, gyros humming"
+ - "scans the area with a sweeping crimson beam"
+ - "vents superheated exhaust"
+ - "rotates its armored torso with a deep grinding sound"
+combat_descriptions:
+ - "smashes %s with a titan-grade fist"
+ - "unleashes a devastating plasma barrage at %s"
+ - "drives %s into the ground with overwhelming force"
+size: massive
+drops:
+ loot:
+ - item_id: scrap
+ weight: 30
+ quantity: 10
+ - item_id: credits
+ weight: 50
+ quantity: 8000
+ - table: gem_table
+ weight: 15
+ - item_id: deathjunk
+ weight: 5
+ quantity: 5
diff --git a/data/mobs/examples/veteran_merc.yaml b/data/mobs/examples/veteran_merc.yaml
new file mode 100644
index 0000000..88238b6
--- /dev/null
+++ b/data/mobs/examples/veteran_merc.yaml
@@ -0,0 +1,42 @@
+name: veteran merc
+description: "A battle-hardened soldier with a high-powered rifle and tactical armor covered in campaign patches. Their cybernetic eye locks onto you instantly."
+attack: 1
+strength: 1
+defense: 40
+hp: 93
+ranged: 79
+speed: 5
+aggressive: true
+respawn_ticks: 65
+attack_type: ranged
+attack_bonus: 0
+strength_bonus: 0
+stab_defense: 40
+slash_defense: 40
+crush_defense: 35
+science_defense: 20
+ranged_defense: 55
+idle_descriptions:
+ - "checks their rifle's ammunition counter"
+ - "adjusts their tactical vest"
+ - "scans the area through their scope"
+ - "spits and mutters a war story"
+combat_descriptions:
+ - "fires a high-caliber round at %s"
+ - "puts %s in their crosshairs and squeezes the trigger"
+ - "unleashes suppressive fire at %s"
+size: medium
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 55
+ quantity: 1200
+ - item_id: chaosjunk
+ weight: 15
+ quantity: 2
+ - item_id: deathjunk
+ weight: 15
+ quantity: 2
+ - table: herb_table_mid
+ weight: 15
diff --git a/data/mobs/examples/void_reaper.yaml b/data/mobs/examples/void_reaper.yaml
new file mode 100644
index 0000000..e54d776
--- /dev/null
+++ b/data/mobs/examples/void_reaper.yaml
@@ -0,0 +1,52 @@
+name: void reaper
+description: "A shadowy figure that seems to absorb light itself. Its form shifts between a hooded specter and an armored construct. A scythe of dark energy flickers in its grasp."
+attack: 62
+strength: 68
+defense: 72
+hp: 170
+speed: 3
+aggressive: true
+respawn_ticks: 200
+attack_type: slash
+attack_bonus: 60
+strength_bonus: 60
+stab_defense: 100
+slash_defense: 110
+crush_defense: 90
+science_defense: -45
+ranged_defense: 75
+weakness: bio
+assassin_level: 80
+finishing_blow: lawjunk
+idle_descriptions:
+ - "flickers in and out of existence"
+ - "draws the warmth from the surrounding air"
+ - "whispers in a language that predates humanity"
+ - "reaches out with shadowy tendrils"
+combat_descriptions:
+ - "swings its void scythe at %s"
+ - "drains the life force from %s"
+ - "envelops %s in absolute darkness"
+size: massive
+drops:
+ remains: ectoplasm
+ loot:
+ - item_id: credits
+ weight: 30
+ quantity: 20000
+ - item_id: law_identifier
+ weight: 5
+ - item_id: death_identifier
+ weight: 5
+ - item_id: blood_identifier
+ weight: 5
+ - item_id: bloodjunk
+ weight: 20
+ quantity: 10
+ - table: gem_table
+ weight: 15
+ - item_id: uncut_diamond
+ weight: 10
+ quantity: 5
+ - table: herb_table_high
+ weight: 10
diff --git a/data/mobs/examples/war_drone.yaml b/data/mobs/examples/war_drone.yaml
new file mode 100644
index 0000000..587ad09
--- /dev/null
+++ b/data/mobs/examples/war_drone.yaml
@@ -0,0 +1,42 @@
+name: war drone
+description: "An upgraded combat drone with reinforced plating and a heavier weapons array. Its targeting systems whir as it locks onto you."
+attack: 25
+strength: 28
+defense: 25
+hp: 65
+speed: 4
+aggressive: true
+respawn_ticks: 50
+attack_type: slash
+attack_bonus: 20
+strength_bonus: 18
+stab_defense: 35
+slash_defense: 30
+crush_defense: 40
+science_defense: -10
+ranged_defense: 20
+weakness: solar
+idle_descriptions:
+ - "hovers aggressively, weapons armed"
+ - "emits a low, threatening hum"
+ - "paints a targeting reticle on the wall"
+ - "cycles through weapon modes with a click"
+combat_descriptions:
+ - "fires a plasma bolt at %s"
+ - "slashes at %s with a rotary blade"
+ - "launches a concussion grenade at %s"
+size: medium
+drops:
+ remains: circuit_board
+ loot:
+ - item_id: credits
+ weight: 60
+ quantity: 200
+ - item_id: scrap
+ weight: 20
+ quantity: 4
+ - item_id: credits
+ weight: 10
+ quantity: 500
+ - table: gem_table
+ weight: 10
diff --git a/data/mobs/examples/weapons_smith.yaml b/data/mobs/examples/weapons_smith.yaml
new file mode 100644
index 0000000..0ba8237
--- /dev/null
+++ b/data/mobs/examples/weapons_smith.yaml
@@ -0,0 +1,64 @@
+aggressive: false
+attack: 1
+attack_type: crush
+crush_defense: 0
+defense: 1
+description: A burly smith with soot-stained hands and a heavy leather apron, standing proudly by the forge.
+hp: 80
+idle_descriptions:
+ - hammers at a glowing blade on the anvil
+ - wipes soot from his brow
+ - inspects a finished sword
+ - tends to the furnace fire
+name: Weaponsmith
+protected: true
+ranged_defense: 0
+respawn_ticks: 30
+science_defense: 0
+slash_defense: 0
+speed: 5
+stab_defense: 0
+strength: 1
+talk:
+ nodes:
+ shop:
+ action:
+ shop:
+ items:
+ - buy_price: 25
+ item_id: bronze_sword
+ sell_price: 6
+ - buy_price: 60
+ item_id: iron_sword
+ sell_price: 15
+ - buy_price: 20
+ item_id: bronze_axe
+ sell_price: 5
+ - buy_price: 50
+ item_id: iron_axe
+ sell_price: 12
+ - buy_price: 20
+ item_id: bronze_pickaxe
+ sell_price: 5
+ - buy_price: 50
+ item_id: iron_pickaxe
+ sell_price: 12
+ - buy_price: 16
+ item_id: bronze_med_helm
+ sell_price: 4
+ - buy_price: 40
+ item_id: iron_med_helm
+ sell_price: 10
+ message: The Smithy — buy or sell weapons and armor.
+ message: '"Here''s the current inventory. All quality guaranteed."'
+ options:
+ - goto: start
+ text: '"That''s all for now."'
+ start:
+ message: '"Welcome to the Smithy! Finest weapons and armor on the asteroid."'
+ options:
+ - goto: shop
+ text: '"Show me what you''ve got."'
+ - text: '"Nothing right now."'
+unique: true
+size: small
diff --git a/data/mobs/examples/zombie.yaml b/data/mobs/examples/zombie.yaml
new file mode 100644
index 0000000..f5989e0
--- /dev/null
+++ b/data/mobs/examples/zombie.yaml
@@ -0,0 +1,33 @@
+name: zombie
+description: "A shambling corpse reanimated by residual asteroid radiation."
+attack: 10
+strength: 8
+defense: 8
+hp: 30
+speed: 6
+aggressive: true
+respawn_ticks: 35
+attack_type: crush
+attack_bonus: 4
+strength_bonus: 6
+stab_defense: 8
+slash_defense: 20
+crush_defense: -8
+science_defense: -15
+ranged_defense: 8
+weakness: solar
+idle_descriptions:
+ - "groans and shuffles forward"
+ - "reaches out with decaying arms"
+ - "stumbles and catches itself"
+ - "stares blankly ahead"
+size: medium
+drops:
+ remains: bones
+ loot:
+ - item_id: credits
+ weight: 60
+ quantity: 50
+ - item_id: credits
+ weight: 40
+ quantity: 200