natural_20 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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