natural_20 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +99 -0
  9. data/Rakefile +6 -0
  10. data/bin/compute_lights +19 -0
  11. data/bin/console +19 -0
  12. data/bin/nat20 +135 -0
  13. data/bin/nat20.cmd +3 -0
  14. data/bin/nat20author +104 -0
  15. data/bin/setup +8 -0
  16. data/char_classes/fighter.yml +45 -0
  17. data/char_classes/rogue.yml +54 -0
  18. data/characters/halfling_rogue.yml +46 -0
  19. data/characters/high_elf_fighter.yml +49 -0
  20. data/fixtures/battle_sim.yml +58 -0
  21. data/fixtures/battle_sim_2.yml +30 -0
  22. data/fixtures/battle_sim_3.yml +26 -0
  23. data/fixtures/battle_sim_4.yml +26 -0
  24. data/fixtures/battle_sim_objects.yml +101 -0
  25. data/fixtures/corridors.yml +24 -0
  26. data/fixtures/elf_rogue.yml +39 -0
  27. data/fixtures/halfling_rogue.yml +41 -0
  28. data/fixtures/high_elf_fighter.yml +49 -0
  29. data/fixtures/human_fighter.yml +48 -0
  30. data/fixtures/path_finding_test.yml +11 -0
  31. data/fixtures/path_finding_test_2.yml +15 -0
  32. data/fixtures/path_finding_test_3.yml +26 -0
  33. data/fixtures/thin_walls.yml +53 -0
  34. data/fixtures/traps.yml +25 -0
  35. data/game.yml +20 -0
  36. data/items/equipment.yml +101 -0
  37. data/items/objects.yml +73 -0
  38. data/items/weapons.yml +297 -0
  39. data/lib/natural_20.rb +68 -0
  40. data/lib/natural_20/actions/action.rb +40 -0
  41. data/lib/natural_20/actions/attack_action.rb +372 -0
  42. data/lib/natural_20/actions/concerns/action_damage.rb +14 -0
  43. data/lib/natural_20/actions/dash_action.rb +46 -0
  44. data/lib/natural_20/actions/disengage_action.rb +53 -0
  45. data/lib/natural_20/actions/dodge_action.rb +45 -0
  46. data/lib/natural_20/actions/escape_grapple_action.rb +97 -0
  47. data/lib/natural_20/actions/first_aid_action.rb +109 -0
  48. data/lib/natural_20/actions/grapple_action.rb +185 -0
  49. data/lib/natural_20/actions/ground_interact_action.rb +74 -0
  50. data/lib/natural_20/actions/help_action.rb +56 -0
  51. data/lib/natural_20/actions/hide_action.rb +53 -0
  52. data/lib/natural_20/actions/interact_action.rb +91 -0
  53. data/lib/natural_20/actions/inventory_action.rb +23 -0
  54. data/lib/natural_20/actions/look_action.rb +63 -0
  55. data/lib/natural_20/actions/move_action.rb +254 -0
  56. data/lib/natural_20/actions/multiattack_action.rb +41 -0
  57. data/lib/natural_20/actions/prone_action.rb +38 -0
  58. data/lib/natural_20/actions/short_rest_action.rb +53 -0
  59. data/lib/natural_20/actions/shove_action.rb +142 -0
  60. data/lib/natural_20/actions/stand_action.rb +47 -0
  61. data/lib/natural_20/actions/use_item_action.rb +57 -0
  62. data/lib/natural_20/ai_controller/path_compute.rb +140 -0
  63. data/lib/natural_20/ai_controller/standard.rb +288 -0
  64. data/lib/natural_20/battle.rb +544 -0
  65. data/lib/natural_20/battle_map.rb +843 -0
  66. data/lib/natural_20/cli/builder/fighter_builder.rb +104 -0
  67. data/lib/natural_20/cli/builder/rogue_builder.rb +62 -0
  68. data/lib/natural_20/cli/character_builder.rb +210 -0
  69. data/lib/natural_20/cli/commandline_ui.rb +612 -0
  70. data/lib/natural_20/cli/inventory_ui.rb +136 -0
  71. data/lib/natural_20/cli/map_renderer.rb +165 -0
  72. data/lib/natural_20/concerns/container.rb +32 -0
  73. data/lib/natural_20/concerns/entity.rb +1213 -0
  74. data/lib/natural_20/concerns/evaluator/entity_state_evaluator.rb +59 -0
  75. data/lib/natural_20/concerns/fighter_actions/second_wind_action.rb +51 -0
  76. data/lib/natural_20/concerns/fighter_class.rb +35 -0
  77. data/lib/natural_20/concerns/health_flavor.rb +27 -0
  78. data/lib/natural_20/concerns/lootable.rb +94 -0
  79. data/lib/natural_20/concerns/movement_helper.rb +195 -0
  80. data/lib/natural_20/concerns/multiattack.rb +54 -0
  81. data/lib/natural_20/concerns/navigation.rb +87 -0
  82. data/lib/natural_20/concerns/notable.rb +37 -0
  83. data/lib/natural_20/concerns/rogue_class.rb +26 -0
  84. data/lib/natural_20/controller.rb +11 -0
  85. data/lib/natural_20/die_roll.rb +331 -0
  86. data/lib/natural_20/event_manager.rb +288 -0
  87. data/lib/natural_20/item_library/base_item.rb +27 -0
  88. data/lib/natural_20/item_library/chest.rb +230 -0
  89. data/lib/natural_20/item_library/door_object.rb +189 -0
  90. data/lib/natural_20/item_library/ground.rb +124 -0
  91. data/lib/natural_20/item_library/healing_potion.rb +51 -0
  92. data/lib/natural_20/item_library/object.rb +153 -0
  93. data/lib/natural_20/item_library/pit_trap.rb +69 -0
  94. data/lib/natural_20/item_library/stone_wall.rb +18 -0
  95. data/lib/natural_20/npc.rb +173 -0
  96. data/lib/natural_20/player_character.rb +414 -0
  97. data/lib/natural_20/session.rb +168 -0
  98. data/lib/natural_20/utils/cover.rb +35 -0
  99. data/lib/natural_20/utils/ray_tracer.rb +90 -0
  100. data/lib/natural_20/utils/static_light_builder.rb +72 -0
  101. data/lib/natural_20/utils/weapons.rb +78 -0
  102. data/lib/natural_20/version.rb +4 -0
  103. data/locales/en.yml +304 -0
  104. data/maps/game_map.yml +168 -0
  105. data/natural_20.gemspec +46 -0
  106. data/npcs/goblin.yml +64 -0
  107. data/npcs/human_guard.yml +48 -0
  108. data/npcs/ogre.yml +61 -0
  109. data/npcs/owlbear.yml +55 -0
  110. data/npcs/wolf.yml +46 -0
  111. data/races/elf.yml +44 -0
  112. data/races/halfling.yml +22 -0
  113. data/races/human.yml +13 -0
  114. metadata +373 -0
@@ -0,0 +1,4 @@
1
+ # typed: strict
2
+ module Natural20
3
+ VERSION = "0.1.0"
4
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,304 @@
1
+ ---
2
+ en:
3
+ action:
4
+ attack_action: '%{name} with %{weapon_name} -> Hit: +%{mod} Dmg: %{dmg}'
5
+ attack_action_throw: '%{name} with %{weapon_name} (Throw) -> Hit: +%{mod} Dmg: %{dmg}'
6
+ dash: Dash
7
+ dash_bonus: Bonus Action -> Dash
8
+ disengage: Disengage
9
+ disengage_bonus: Bonus Action -> Disengage
10
+ dodge: Dodge
11
+ drop_grapple: Drop Grapple
12
+ escape_grapple: Escape a Grapple
13
+ first_aid: Perform First Aid
14
+ grapple: Grapple
15
+ ground_interact: Pickup items
16
+ help: Help
17
+ hide: Hide
18
+ hide_bonus: Bonus Action -> Hide
19
+ interact: Interact/Loot
20
+ inventory: Show Character Sheet & Inventory
21
+ look: Look Around (Perception Check)
22
+ move: Move
23
+ npc_action: '%{name} with %{action_name}'
24
+ opportunity_attack: Opportunity Attack for %{name} on %{target}
25
+ prone: Go Prone
26
+ push: Shove (Push Away)
27
+ short_rest: Short Rest
28
+ shove: Shove (Knock Prone)
29
+ stand: Stand Up
30
+ use_item: Use Item
31
+ attack_status:
32
+ being_helped: Being being_helped
33
+ prone: Target Prone
34
+ ranged_with_enemy_in_melee: Ranged weapon with enemy in melee range
35
+ small_creature_using_heavy: Heavy weapon used by small creature
36
+ squeezed: Target is squeezing into a tight location
37
+ target_dodge: Target is Dodging
38
+ target_is_prone: Target is prone in melee
39
+ target_is_prone_range: Ranged attack on prone target
40
+ target_long_range: Long range penalty
41
+ unseen_attacker: Attacker is unseen
42
+ back: Back
43
+ battle_end: Battle ended in %{num} rounds
44
+ battle_simulator: Battle Simulator
45
+ builder:
46
+ ability_score:
47
+ fixed: Fixed ability score 15, 14, 13, 12, 10, 8
48
+ point_buy: Point purchase
49
+ random: Random dice roll
50
+ ability_score_method: Select method to generate ability scores
51
+ assign_ability_scores: Assign ability scores to attributes [%{scores}]
52
+ cha: Select Charisma ability score
53
+ class: Select a class
54
+ con: Select Constitution ability score
55
+ default_description: An adventurer with something to prove
56
+ description: Enter a description for your character
57
+ dex: Select Dexterity ability score
58
+ enter_name: Enter name for your character
59
+ fighter:
60
+ archery: Archery - You gain a +2 bonus to attack rolls you make with ranged weapons.
61
+ defense: Defence - While you are wearing armor, you gain a +1 bonus to AC.
62
+ dueling: Dueling - When you are wielding a melee weapon in one hand and no other weapons, you gain a +2 bonus to damage rolls with that weapon.
63
+ great_weapon_fighting: Great Weapon Fighting - When you roll a 1 or 2 on a damage die for an attack you make with a melee weapon that you are wielding with two hands, you can reroll the die and must use the new roll, even if the new roll is a 1 or a 2. The weapon must have the two-handed or versatile property for you to gain this benefit.
64
+ protection: Protection - When a creature you can see attacks a target other than you that is within 5 feet of you, you can use your reaction to impose disadvantage on the attack roll. You must be wielding a shield.
65
+ select_fighting_style: Please select a fighting style
66
+ select_skill: Select a fighter skill. Pick 2
67
+ select_starting_weapon: Select starting weapon set
68
+ two_weapon_fighting: Two-Weapon Fighting - When you engage in two-weapon fighting, you can add your ability modifier to the damage of the second attack.
69
+ int: Select Intelligence ability score
70
+ races:
71
+ dark_elf: Dark Elf
72
+ high_elf: High Elf
73
+ lightfoot: Lightfoot
74
+ stout: Stout
75
+ wood_elf: Wood Elf
76
+ review: Confirm this character?
77
+ rogue:
78
+ expertise: Select Expertise
79
+ select_skill: Select a Rogue skill. Pick 4
80
+ select_starting_weapon: Select a starting weapon
81
+ select_starting_weapon_2: Select second weapon set
82
+ select_languages: Select languages
83
+ select_race: Please select a race
84
+ select_skill: null
85
+ select_subrace: Please select a sub-race
86
+ skill:
87
+ acrobatics: Acrobatics
88
+ animal_handling: Animal Handling
89
+ athletics: Athletics
90
+ deception: Deception
91
+ history: History
92
+ insight: Insight
93
+ intimidation: Intimidation
94
+ investigation: Investigation
95
+ perception: Perception
96
+ performance: Performance
97
+ persuasion: Persuasion
98
+ sleight_of_hand: Sleight of Hand
99
+ stealth: Stealth
100
+ survival: Survival
101
+ thieves_tools: Thieves Tools
102
+ str: Select Strength ability score
103
+ token: Select a token to represent this character on the board
104
+ token_color: Select a color for your token
105
+ wis: Select Wisdom ability score
106
+ character_builder: Character Builder ...
107
+ character_sheet:
108
+ ac: 'AC: %{ac}'
109
+ class: 'Class: %{name}'
110
+ expertise: Expertise
111
+ hp: 'HP: %{current}/%{max}'
112
+ inventory: Inventory %{weight}/%{carry_capacity} lbs
113
+ languages: 'Languages:'
114
+ level: 'Level: %{level}'
115
+ name: 'Name: %{name}'
116
+ race: 'Race: %{race}'
117
+ skill_mod: '%{prefix} %{skill} %{bonus}'
118
+ skills: Skills
119
+ speed: 'Speed: %{speed}ft.'
120
+ subrace: 'Subrace: %{race}'
121
+ character_status_line: '%{hp}/%{max_hp} actions: %{total_actions} bonus action: %{bonus_action}, movement: %{available_movement} ft. statuses: %{statuses}'
122
+ dead_goblin_items: Dead Goblin's items
123
+ dice_roll:
124
+ ability_score: 'Rolling for ability score #%{roll_num}'
125
+ acrobatics: Rolling for an acrobatics check
126
+ athletics: Rolling for an athletics check
127
+ attack: Rolling for attack (to hit)
128
+ damage: Roll for attack damage
129
+ death_saving_throw: Roll for death saving throw
130
+ description: '%{description} (%{roll_str})'
131
+ dexterity: Roll for dexterity (skill check)
132
+ great_weapon_fighting_reroll: Damage die reroll on a 1 or 2 for Great Weapon Fighting style
133
+ healing_potion: Roll for healing potion (heal amount)
134
+ hit_die: Roll for hit die
135
+ hit_die_selection: Use a hit die to regain HP for %{name} (%{hp}/%{max_hp})?
136
+ initiative: Roll for initiative
137
+ medicine: Roll for medicine check
138
+ perception: Roll for a perception check
139
+ prompt: '%{name} - %{description}'
140
+ roll_attempt: 'roll %{number}/%{total}. Please roll a d%{die_type} [1-%{die_type}]:'
141
+ roll_attempt_advantage: 'roll %{number}/%{total}. roll a d%{die_type} [1-%{die_type}] (advantage):'
142
+ roll_attempt_disadvantage: 'roll %{number}/%{total}. roll a d%{die_type} [1-%{die_type}] (disadvantage):'
143
+ second_wind: Roll for second wind hp gain
144
+ sneak_attack: Roll for sneak attack damage
145
+ special_weapon_damage: Roll for special weapon additional damage
146
+ stealth: Rolling for stealth check
147
+ strength_check: Roll for strength (skill check)
148
+ thieves_tools: Roll for thieves tools (skill check)
149
+ wisdom_check: Roll for wisdom check
150
+ dice_roller: Dice Roller
151
+ drop: Drop Item
152
+ end_turn: '%{name}: End turn.'
153
+ engine_title: Welcome to Wizards and Goblins (DnD 5e Adventure Engine)
154
+ entity:
155
+ health_flavor:
156
+ almost_dead: barely hanging on, one more solid blow may take them down
157
+ dead: appears to be dead
158
+ max: looks to be in good condition
159
+ over_10: looking in bad condition, unable to fight or survive much longer
160
+ over_25: starting to look more ragged or visibly slowing down
161
+ over_50: visibly wounded with some injuries, but still fighting strong
162
+ over_75: doesn't show any signs of slowing, just a few minor inconveniencing injuries
163
+ unconscious: appears to be unconscious
164
+ event:
165
+ acrobatics:
166
+ failure: '%{roll} = %{value} (dc 10) %{name} failed on an acrobatics check'
167
+ success: '%{roll} = %{value} (dc 10) %{name} succeeded on an acrobatics check'
168
+ athletics:
169
+ failure: '%{roll} = %{value} (dc 10) %{name} failed on an athletics check'
170
+ success: '%{roll} = %{value} (dc 10) %{name} succeeded on an athletics check'
171
+ attack: '%{opportunity}%{source} attacked %{target} with %{attack_name} to Hit%{advantage}: %{attack_roll} = %{attack_value} for %{damage} damage.'
172
+ attack_no_roll: '%{opportunity}%{source} attacked %{target} with %{attack_name} to Hit for %{damage} damage.'
173
+ combat_end: Combat has ended
174
+ combat_start: Combat has started!
175
+ death_fail: 'Death Saving Throw: %{name} rolls a %{roll} = %{value} (fail). Saves: %{saves} Fails: %{fails}'
176
+ death_fail_hit: 'Death Saving Throw Failure. Saves: %{saves} Fails: %{fails}'
177
+ death_save: 'Death Saving Throw: %{name} rolls a %{roll} = %{value} (success). Saves: %{saves} Fails: %{fails}'
178
+ dodge: '%{name} takes the dodge action.'
179
+ drop_grapple: '%{source} has dropped grapple on %{target}'
180
+ escape_grapple_failure: '%{source} failed to escape the grapple from %{target}. %{source_roll} = %{source_roll_value} vs %{target_roll} = %{target_roll_value}'
181
+ escape_grapple_success: '%{source} successfully escaped the grapple from %{target}. %{source_roll} = %{source_roll_value} vs %{target_roll} = %{target_roll_value}'
182
+ feature_protection: '%{source} quickly uses shield in an attempt to protect %{target} from %{attacker}''s attack.'
183
+ first_aid: '%{roll} = %{value} %{name} (DC 10) successfully applied first aid to %{target}'
184
+ first_aid_failure: '%{roll} = %{value} %{name} (DC 10) failed to apply first aid to %{target}'
185
+ flavor:
186
+ wolf:
187
+ lunge: The wolf lunges forward and %{target} is now prone
188
+ grapple_failure: '%{source} failed to grapple %{target}. %{source_roll} = %{source_roll_value} vs %{target_roll} = %{target_roll_value}'
189
+ grapple_success: '%{source} successfully grappled %{target}. %{source_roll} = %{source_roll_value} vs %{target_roll} = %{target_roll_value}'
190
+ grapple_success_no_roll: '%{source} successfully grappled %{target}'
191
+ great_weapon_fighting_roll: 'Great Weapon Fighting (reroll): %{prev_roll} -> %{roll}'
192
+ hit_die: '%{source} rolls hit die %{roll} = %{value}'
193
+ knock_prone_failure: '%{source_roll} < %{target_roll}. %{source} tried but failed to knock %{target} prone'
194
+ knock_prone_success: '%{source_roll} >= %{target_roll}. %{source} knocks %{target} prone'
195
+ shove_failure: '%{source_roll} < %{target_roll}. ${source} tried but failed to shove %{target} 5ft away'
196
+ shove_success: '%{source_roll} >= %{target_roll}. ${source} shoves %{target} 5ft away'
197
+ something: (something)
198
+ status:
199
+ prone: '%{name} is now prone.'
200
+ stand: '%{name} stands up.'
201
+ exit: Exit
202
+ game_author: By %{author}
203
+ inventory:
204
+ cannot_change_armor_combat: Cannot change armor during combat
205
+ equiped_items: '%{name} (equipped)'
206
+ how_many: 'How many %{item_label} (1-%{item_count})? '
207
+ inventory_items: '%{name} x %{qty}'
208
+ language:
209
+ abyssal: Abyssal
210
+ celestial: Celestial
211
+ common: Common
212
+ deep_speech: Deep Speech
213
+ draconic: Draconic
214
+ dwarvish: Dwarvish
215
+ elvish: Elvish
216
+ giant: Giant
217
+ gnomish: Gnomish
218
+ goblin: Goblin
219
+ halfling: Halfling
220
+ infernal: Infernal
221
+ orc: Orc
222
+ primordial: Primordial
223
+ sylvan: Sylvan
224
+ thieves_cant: Thieves Cant
225
+ undercommon: Undercommon
226
+ manual_target: Target object using the map
227
+ multiple_target_prompt: Multiple targets at location(s) please select specific targets
228
+ missing_game: missing game.yml in the current folder
229
+ 'no': 'No'
230
+ object:
231
+ Arrows: Arrows
232
+ ItemLibrary::Chest:
233
+ loot: Retreive Contents
234
+ Wooden door key: Wooden Door Key
235
+ chain_mail: Chain Mail
236
+ chest:
237
+ lock: clink. chest is now locked
238
+ unlock: Ka-chink! chest is now unlocked
239
+ door:
240
+ door_blocked: (door is blocked)
241
+ key_required: (missing key)
242
+ lock: clink. door is now locked
243
+ unlock: Ka-chink! door is now unlocked
244
+ equip_problem:
245
+ armor_equipped: You already have an armor on (please unequip armor)
246
+ hands_full: Hand Slots are full (please unequip a weapon/shield)
247
+ ground: Ground
248
+ light_crossbow_and_20_bolts: Light crossbow and 20 bolts
249
+ lockpick_failed: Lockpicking failed and the theives tools are now broken
250
+ longbow_and_arrows: Longbow and Arrows
251
+ martial_weapon_and_shield: (1) Martial Weapon & Shield
252
+ properties:
253
+ ammunition: Ammunition - You make a ranged attack only if you have ammunition to fire from the weapon
254
+ finesse: Finesse - When making an attack with a finesse weapon, your Strength or Dexterity modifier can be used for the attack and damage roll (Best mod will be automatically be used)
255
+ heavy: Heavy - Small creatures have disadvantage on attack rolls with heavy weapons
256
+ light: Light - A light weapon is small and easy to handle, making it ideal for use when fighting with two weapons
257
+ ranged: Ranged - This weapon can be used to make a ranged attack
258
+ thrown: Thrown - You can throw the weapon to make a ranged attack
259
+ versatile: Versatile - This weapon can be used with one or two hands
260
+ rapier: Rapier
261
+ shortbow_and_quiver: a shortbow and quiver of 20 arrows
262
+ shortsword: Shortsword
263
+ two_handaxes: Two handaxes
264
+ two_martial_weapons: (2) Martial Weapons
265
+ weapons:
266
+ chain_mail: Chain Mail
267
+ dagger: Dagger
268
+ hand_crossbow: Hand Crossbow
269
+ longbow: Longbow
270
+ longbow_and_arrows: Longbow and Arrows
271
+ longsword: Longsword
272
+ rapier: Rapier
273
+ scimitar: Scimitar
274
+ shortbow: Shortbow
275
+ shortsword: Shortsword
276
+ options:
277
+ automatic_roll: Roll Dice for me automatically (Computer will roll for you)
278
+ dice_roll: Toggle Manual Dice Roll ...
279
+ roll_dice_manually: Prompt for each player die roll (Make sure you have a dice set on hand)
280
+ title: Game Options
281
+ perception:
282
+ dark: Dark and hard to make out
283
+ hide_success: (You are hidden from %{label})
284
+ looking_around: Looking around using Perception %{perception}
285
+ navigation: ESC- back, (wsad) - inspect square, x, space, enter - select
286
+ navigation_look: ESC- back, (wsad) - inspect square
287
+ note_with_language: (in %{note_language}) %{note}
288
+ passed: (perception) %{note}
289
+ terrain_and_surroundings: Terrain and Surroundings
290
+ using_darkvision: 'Using darkvision:'
291
+ prompt_dice_roller: Dice Roll (ex. d20, d8+1) (a) >
292
+ save_already_present: A save game is already present. This will overwrite your game. Are you sure?
293
+ select_npcs: Select NPCs
294
+ select_party_member: Select Party Member %{index}
295
+ skip_hit_die: Skip Hit Die
296
+ tpk: The entire party has fallen. Game Over!
297
+ unequip: Unequip
298
+ validation:
299
+ shove:
300
+ invalid_target_size: The target must be no more than one size larger than you
301
+ waive_opportunity_attack: Waive Opportunity Attack
302
+ with_advantage: advantage
303
+ with_disadvantage: disadvantage
304
+ 'yes': 'Yes'
data/maps/game_map.yml ADDED
@@ -0,0 +1,168 @@
1
+ name: Battle Sim
2
+ description: Map for Battle Sim
3
+ map:
4
+ floor_type: rock
5
+ illumination: 0.0
6
+ base:
7
+ - z.........
8
+ - ..........
9
+ - HHH..HHHHd
10
+ - ..d..Hwwww
11
+ - .HHHHHwwwt
12
+ - ..T..dwwow
13
+ - HHHH=HHHHH
14
+ - ..H...wYw.
15
+ - ..d...www.
16
+ light:
17
+ - ..........
18
+ - ..........
19
+ - ..........
20
+ - ..........
21
+ - ..........
22
+ - ..........
23
+ - ..........
24
+ - ..........
25
+ - ..........
26
+ meta:
27
+ - ....O.....
28
+ - .....Y....
29
+ - ???..?????
30
+ - .....?b..j
31
+ - .?????..i.
32
+ - .........e
33
+ - ??????????
34
+ - AB?.g....W
35
+ - ..?......W
36
+ notes:
37
+ - type: point
38
+ positions:
39
+ - [6, 7]
40
+ - [8, 7]
41
+ - [6, 8]
42
+ - [7, 8]
43
+ - [8, 8]
44
+ notes:
45
+ - note: A pool of stinky water
46
+ - type: rectangle
47
+ positions:
48
+ - [5, 3, 8, 5]
49
+ notes:
50
+ - note: A flooded room with a treasure in the center
51
+ triggers:
52
+ on_map_entry:
53
+ - type: message
54
+ content: "You and your party were hired to retreive a ruby gem from a certain treasure chest deep in this dungeon.\nGood Luck!"
55
+ object_received:
56
+ - type: message
57
+ if: object_type:ruby_gem & entity:pc
58
+ content: "You have successfully retrieved the ruby gem! Congratulations\nPat yourself on the back for doing this incredibly tough challenge."
59
+ - type: battle_end
60
+ if: object_type:ruby_gem & entity:pc
61
+ legend:
62
+ Y:
63
+ name: Field brazier
64
+ type: brazier
65
+ t:
66
+ name: Treasure Chest
67
+ type: chest
68
+ inventory:
69
+ - type: studded_leather
70
+ qty: 2
71
+ - type: gold_piece
72
+ label: Gold Pieces
73
+ qty: 10
74
+ z:
75
+ name: Treasure Chest
76
+ type: chest
77
+ inventory:
78
+ - type: ruby_gem
79
+ label: A transparent clear red gemstone worth around 5,000 gp
80
+ qty: 1
81
+ H:
82
+ name: Stone Wall
83
+ type: stone_wall
84
+ d:
85
+ name: Mysterious Door
86
+ type: wooden_door
87
+ state: closed
88
+ p:
89
+ name: chasm
90
+ type: bottomless_pit
91
+ notes:
92
+ - note: A bottomless chasm, you can't see where it ends
93
+ =:
94
+ label: Front Door
95
+ type: wooden_door
96
+ state: closed
97
+ locked: true
98
+ key: wooden_door_key
99
+ w:
100
+ name: Pool of water
101
+ type: water
102
+ A:
103
+ name: spawn_point_1
104
+ type: spawn_point
105
+ B:
106
+ name: spawn_point_2
107
+ type: spawn_point
108
+ C:
109
+ name: spawn_point_3
110
+ type: spawn_point
111
+ D:
112
+ name: spawn_point_4
113
+ type: spawn_point
114
+ O:
115
+ name: The Owlbear
116
+ type: npc
117
+ sub_type: owlbear
118
+ group: b
119
+ T:
120
+ name: pit_trap
121
+ type: pit_trap
122
+ perception_dc: 20
123
+ b:
124
+ name: Stivnux
125
+ type: npc
126
+ sub_type: goblin
127
+ i:
128
+ name: Tolkiq
129
+ type: npc
130
+ sub_type: goblin
131
+ j:
132
+ name: Kobs
133
+ type: npc
134
+ sub_type: goblin
135
+ e:
136
+ name: Frenabs
137
+ type: npc
138
+ sub_type: goblin
139
+ overrides:
140
+ battle_defaults:
141
+ statuses:
142
+ - hiding
143
+ stealth: 1d20+6
144
+ W:
145
+ name: Wolf
146
+ type: npc
147
+ sub_type: wolf
148
+ o:
149
+ name: barrel
150
+ type: barrel
151
+ g:
152
+ name: dead_goblin
153
+ type: npc
154
+ sub_type: goblin
155
+ overrides:
156
+ hp: 0
157
+ notes:
158
+ - note: Remnants of a dead goblin, corpse is still fresh
159
+ highlight: true
160
+ - if: inventory:wooden_door_key
161
+ note: In his hand is a wooden door key.
162
+ perception_dc: 10
163
+ statuses:
164
+ - dead
165
+ inventory:
166
+ - type: wooden_door_key
167
+ label: Key to a wooden door
168
+ qty: 1