module Natural20::InventoryUI
Public Instance Methods
character_sheet(entity)
click to toggle source
Displays the character sheet of the specified entity @param entity [Natural20::Entity]
# File lib/natural_20/cli/inventory_ui.rb, line 6 def character_sheet(entity) puts t('character_sheet.name', name: entity.name) puts t('character_sheet.level', level: entity.level) puts t('character_sheet.class', name: entity.class_properties.keys.join(',')) puts ' str dex con int wis cha' puts ' ---- ---- ---- ---- ---- ---- ' puts "|#{entity.all_ability_scores.map { |s| " #{s} " }.join('||')}|" puts "|#{entity.all_ability_mods.map { |s| " #{s.negative? ? s : "+#{s}"} " }.join('||')}|" puts ' ---- ---- ---- ---- ---- ----' puts t('character_sheet.race', race: entity.race.humanize) puts t('character_sheet.subrace', race: entity.subrace.to_s.humanize) if entity.subrace puts t('character_sheet.hp', current: entity.hp, max: entity.max_hp) puts t('character_sheet.ac', ac: entity.armor_class) puts t('character_sheet.speed', speed: entity.speed) puts t('character_sheet.proficiency_bonus', bonus: entity.proficiency_bonus) puts t('character_sheet.spell_attack', spell_attack: entity.spell_attack_modifier) if entity.has_spells? puts t('character_sheet.languages') entity.languages.each do |lang| puts " #{t("language.#{lang}")}" end puts t('character_sheet.skills') Natural20::Entity::ALL_SKILLS.each do |skill| bonus_mod = entity.send("#{skill}_mod") prefix = entity.proficient?(skill) ? '*' : ' ' puts " #{t('character_sheet.skill_mod', prefix: prefix, skill: skill.to_s.ljust(20, ' '), bonus: bonus_mod.negative? ? bonus_mod : "+#{bonus_mod}")}" end unless entity.expertise.blank? puts t('character_sheet.expertise') entity.expertise.each do |prof| puts " #{prof.humanize}" end end end
how_many?(item_inventory_choice)
click to toggle source
# File lib/natural_20/cli/inventory_ui.rb, line 125 def how_many?(item_inventory_choice) if item_inventory_choice.qty > 1 item_count = item_inventory_choice.qty m = item_inventory_choice item_label = t("object.#{m.label}", default: m.label) count = prompt.ask(t('inventory.how_many', item_label: item_label, item_count: item_count), default: item_count) do |q| q.in "1-#{item_count}" q.messages[:range?] = '%{value} out of expected range %{in}' end count.to_i else 1 end end
inventory_ui(entity)
click to toggle source
@param entity [Natural20::Entity]
# File lib/natural_20/cli/inventory_ui.rb, line 42 def inventory_ui(entity) begin character_sheet(entity) item_inventory_choice = prompt.select( t('character_sheet.inventory', weight: entity.inventory_weight, carry_capacity: entity.carry_capacity), per_page: 20 ) do |menu| entity.equipped_items.each do |m| proficient_str = '' if m.subtype == 'weapon' && !entity.proficient_with_weapon?(m) proficient_str = '(not proficient)'.colorize(:red) end proficient_str = '(not proficient)'.colorize(:red) if %w[armor shield].include?(m.type) && !entity.proficient_with_armor?(m.name) menu.choice "#{m.label} (equipped) #{proficient_str}", m end entity.inventory.each do |m| menu.choice "#{m.label} x #{m.qty}", m end menu.choice 'Back', :back end return nil if item_inventory_choice == :back weapon_details = session.load_weapon(item_inventory_choice.name) if weapon_details puts ' ' puts '-------' puts (weapon_details[:label] || weapon_details[:name]).colorize(:blue) puts "Damage Stats: to Hit +#{entity.attack_roll_mod(weapon_details)}. #{damage_modifier(entity, weapon_details)} #{weapon_details[:damage_type]} Damage" puts "Proficiency: #{entity.proficient_with_weapon?(weapon_details) ? t(:yes) : t(:no)}" puts 'Properties:' weapon_details[:properties]&.each do |p| puts " #{t("object.properties.#{p}")}" end puts weapon_details[:description] || '' end if item_inventory_choice.equipped choice = prompt.select(item_inventory_choice.label) do |menu| menu.choice t(:unequip), :unequip menu.choice t(:back), :back end next if choice == :back if battle.combat? && weapon_details[:type] == 'armor' puts t('inventory.cannot_change_armor_combat') next end entity.unequip(item_inventory_choice.name) else choice = prompt.select(item_inventory_choice.label) do |menu| reasons = entity.check_equip(item_inventory_choice.name) if reasons == :ok || reasons != :unequippable if reasons == :ok menu.choice 'Equip', :equip else menu.choice 'Equip', :equip, disabled: t("object.equip_problem.#{reasons}") end end menu.choice t(:drop), :drop if map.ground_at(*map.entity_or_object_pos(entity)) menu.choice 'Back', :back end case choice when :back next when :drop # drop item to the ground qty = how_many?(item_inventory_choice) entity.drop_items!(battle, [[item_inventory_choice, qty]]) when :equip if battle.combat? && weapon_details[:type] == 'armor' puts t('inventory.cannot_change_armor_combat') next end entity.equip(item_inventory_choice.name) end end end while true end