lib/gemwarrior/world.rb in gemwarrior-0.10.8 vs lib/gemwarrior/world.rb in gemwarrior-0.11.0

- old
+ new

@@ -1,9 +1,10 @@ # lib/gemwarrior/world.rb # World where the locations, monsters, items, etc. exist require_relative 'game_options' +require_relative 'game_assets' require_relative 'inventory' require_relative 'entities/item' require_relative 'entities/items/herb' require_relative 'entities/location' require_relative 'entities/player' @@ -14,142 +15,23 @@ ERROR_LIST_PARAM_INVALID = 'That is not something that can be listed.' ERROR_DESCRIBE_ENTITY_INVALID = 'You do not see that here.' WORLD_DIM_WIDTH = 10 WORLD_DIM_HEIGHT = 10 - attr_accessor :monsters, :locations, :player, :duration, :emerald_beaten + attr_accessor :monsters, :locations, :weapons, :player, :duration, :emerald_beaten - def print_vars - puts "======================\n" - puts "All Variables in World\n" - puts "======================\n" - puts "#{list('players', true)}\n" - puts "#{list('monsters', true)}\n\n" - puts "#{list('items', true)}\n\n" - puts "#{list('locations', true)}\n" - end - - def print_map(floor) - 0.upto(WORLD_DIM_HEIGHT - 1) do |count_y| - print ' ' - 0.upto(WORLD_DIM_WIDTH - 1) do - print '---' - end - print "\n" - print "#{(WORLD_DIM_HEIGHT - 1) - count_y} " - 0.upto(WORLD_DIM_WIDTH - 1) do |count_x| - cur_map_coords = { - x: count_x, - y: (WORLD_DIM_HEIGHT - 1) - count_y, - z: floor.nil? ? self.player.cur_coords[:z] : floor.to_i - } - if self.player.cur_coords.eql?(cur_map_coords) - print '|O|' - elsif location_by_coords(cur_map_coords) - print '|X|' - else - print '| |' - end - end - print "\n" - end - print ' ' - 0.upto(WORLD_DIM_WIDTH - 1) do - print '---' - end - puts - print ' ' - 0.upto(WORLD_DIM_WIDTH - 1) do |count_x| - print "#{count_x} " - end - if GameOptions.data['debug_mode'] - puts - puts - puts "Current level: #{player.cur_coords[:z]}" - puts '| | = invalid location' - puts '|X| = valid location' - puts '|O| = player' - end - return - end - - def list(param, details = false) - case param - when 'players' - puts '[PLAYERS]' - player.check_self(false) - when 'monsters' - puts "[MONSTERS](#{monsters.length})".colorize(:yellow) - if details - monsters.map { |m| print m.describe } - return - else - ">> monsters: #{monsters.map(&:name).join(', ')}" - end - when 'items' - item_count = 0 - locations.each do |l| - l.items.each do - item_count += 1 - end - end - puts "[ITEMS](#{item_count})".colorize(:yellow) - if details - locations.each do |l| - l.items.map { |i| print i.describe } - end - return - else - item_list = [] - locations.each do |l| - l.items.map { |i| item_list << i.name } - end - ">> #{item_list.sort.join(', ')}" - end - when 'locations' - puts "[LOCATIONS](#{locations.length})".colorize(:yellow) - if details - locations.map { |l| print l.status } - return - else - ">> #{locations.map(&:name).join(', ')}" - end - else - ERROR_LIST_PARAM_INVALID - end - end - - def location_by_coords(coords) - locations.each do |l| - if l.coords.eql?(coords) - return l - end - end - return nil - end - - def location_coords_by_name(name) - locations.each do |l| - if l.name.downcase.eql?(name.downcase) - return l.coords - end - end - return nil - end - def describe(point) - desc_text = '' - desc_text << "[>>> #{point.name.upcase} <<<]".colorize(:cyan) + desc_text = "[>>> #{point.name_display.upcase} <<<]".colorize(:cyan) if GameOptions.data['debug_mode'] desc_text << " DL[#{point.danger_level.to_s}] MLR[#{point.monster_level_range.to_s}]".colorize(:yellow) end desc_text << "\n" - desc_text << point.description.colorize(:green) + desc_text << point.description - point.populate_monsters(self.monsters) unless point.checked_for_monsters? + point.populate_monsters(GameMonsters.data) unless point.checked_for_monsters? desc_text << "\n >> Monster(s): #{point.list_monsters.join(', ')}".colorize(:yellow) unless point.list_monsters.empty? desc_text << "\n >> Boss(es): #{point.list_bosses.join(', ')}".colorize(:red) unless point.list_bosses.empty? desc_text << "\n >> Thing(s): #{point.list_items.join(', ')}".colorize(:white) unless point.list_items.empty? desc_text << "\n >> Path(s): #{point.list_paths.join(', ')}".colorize(:white) @@ -157,65 +39,204 @@ if GameOptions.data['debug_mode'] desc_text << "\n >>> Actionable: ".colorize(color: :red, background: :grey) desc_text << point.list_actionable_words.colorize(color: :white, background: :grey) end - return desc_text + desc_text end def describe_entity(point, entity_name) entity_name.downcase! - if point.has_item?(entity_name) + if point.contains_item?(entity_name) point.items.each do |i| if i.name.downcase.eql?(entity_name) if GameOptions.data['debug_mode'] - return i.describe + return i.describe_detailed else - return i.description + return i.describe end end end elsif point.has_monster?(entity_name) point.monsters_abounding.each do |m| if m.name.downcase.eql?(entity_name) if GameOptions.data['debug_mode'] - return m.describe + return m.describe_detailed else - return m.description + return m.describe end end end elsif point.has_boss?(entity_name) point.bosses_abounding.each do |b| if b.name.downcase.eql?(entity_name) if GameOptions.data['debug_mode'] - return b.describe + return b.describe_detailed else - return b.description + return b.describe end end end elsif player.inventory.contains_item?(entity_name) player.inventory.describe_item(entity_name) else ERROR_DESCRIBE_ENTITY_INVALID end end + def location_by_coords(coords) + locations.each do |l| + return l if l.coords.eql?(coords) + end + nil + end + + def location_coords_by_name(name) + locations.each do |l| + if l.name.downcase.eql?(name.downcase) or l.name_display.downcase.eql?(name.downcase) + return l.coords + end + end + nil + end + + def location_by_name(location_name) + loc = locations[locations.map(&:name).index(location_name)] + if loc.nil? + loc = locations[locations.map(&:name_display).index(location_name)] + end + loc.nil? ? nil : loc + end + def can_move?(direction) location_by_coords(player.cur_coords).has_loc_to_the?(direction) end def has_monster_to_attack?(monster_name) possible_combatants = location_by_coords(player.cur_coords).monsters_abounding.map(&:name) | location_by_coords(player.cur_coords).bosses_abounding.map(&:name) possible_combatants.each do |combatant| - if combatant.downcase.eql?(monster_name.downcase) - return true + return true if combatant.downcase.eql?(monster_name.downcase) + end + false + end + + def list(param, details = false) + case param + when 'players' + puts '[PLAYERS]'.colorize(:yellow) + if details + player.check_self(false) + else + ">> players: #{player.name}" end + when 'creatures' + puts "[CREATURES](#{GameCreatures.data.length})".colorize(:yellow) + if details + GameCreatures.data.map { |c| print c.describe_detailed } + return + else + ">> creatures: #{GameCreatures.data.map(&:name).join(', ')}" + end + when 'items' + puts "[ITEMS](#{GameItems.data.length})".colorize(:yellow) + if details + GameItems.data.map { |i| print i.describe_detailed } + return + else + ">> items: #{GameItems.data.map(&:name).join(', ')}" + end + when 'locations' + puts "[LOCATIONS](#{locations.length})".colorize(:yellow) + if details + locations.map { |l| print l.describe_detailed } + return + else + ">> locations: #{locations.map(&:name).join(', ')}" + end + when 'monsters' + puts "[MONSTERS](#{GameMonsters.data.length})".colorize(:yellow) + if details + GameMonsters.data.map { |m| print m.describe_detailed } + return + else + ">> monsters: #{GameMonsters.data.map(&:name).join(', ')}" + end + when 'people' + puts "[PEOPLE](#{GamePeople.data.length})".colorize(:yellow) + if details + GamePeople.data.map { |p| print p.describe_detailed } + return + else + ">> people: #{GamePeople.data.map(&:name).join(', ')}" + end + when 'weapons' + puts "[WEAPONS](#{GameWeapons.data.length})".colorize(:yellow) + if details + GameWeapons.data.map { |w| print w.describe_detailed } + return + else + ">> weapons: #{GameWeapons.data.map(&:name).join(', ')}" + end + else + ERROR_LIST_PARAM_INVALID end + end - return false + def print_vars(show_details = false) + puts "======================\n" + puts "All Variables in World\n" + puts "======================\n" + puts "#{list('players', show_details)}\n\n" + puts "#{list('creatures', show_details)}\n\n" + puts "#{list('monsters', show_details)}\n\n" + puts "#{list('items', show_details)}\n\n" + puts "#{list('weapons', show_details)}\n\n" + puts "#{list('locations', show_details)}\n" + puts + end + + def print_map(floor) + 0.upto(WORLD_DIM_HEIGHT - 1) do |count_y| + print ' ' + 0.upto(WORLD_DIM_WIDTH - 1) do + print '---' + end + print "\n" + print "#{(WORLD_DIM_HEIGHT - 1) - count_y} " + 0.upto(WORLD_DIM_WIDTH - 1) do |count_x| + cur_map_coords = { + x: count_x, + y: (WORLD_DIM_HEIGHT - 1) - count_y, + z: floor.nil? ? self.player.cur_coords[:z] : floor.to_i + } + if self.player.cur_coords.eql?(cur_map_coords) + print '|O|' + elsif location_by_coords(cur_map_coords) + print '|X|' + else + print '| |' + end + end + print "\n" + end + print ' ' + 0.upto(WORLD_DIM_WIDTH - 1) do + print '---' + end + puts + print ' ' + 0.upto(WORLD_DIM_WIDTH - 1) do |count_x| + print "#{count_x} " + end + if GameOptions.data['debug_mode'] + puts + puts + puts "Current level: #{player.cur_coords[:z]}" + puts '| | = invalid location' + puts '|X| = valid location' + puts '|O| = player' + end end end end