lib/gemwarrior/world.rb in gemwarrior-0.7.5 vs lib/gemwarrior/world.rb in gemwarrior-0.7.6
- old
+ new
@@ -1,296 +1,297 @@
-# lib/gemwarrior/world.rb
-# World where the locations, monsters, items, etc. exist
-
-require 'yaml'
-
-require_relative 'entities/item'
-require_relative 'entities/location'
-
-module Gemwarrior
- class World
- # CONSTANTS
- LOCATION_DATA_FILE = "data/locations.yml"
- WORLD_DIM_WIDTH = 10
- WORLD_DIM_HEIGHT = 10
-
- ## ERRORS
- ERROR_LIST_PARAM_INVALID = 'That is not something that can be listed.'
- ERROR_LOCATION_DESCRIBE_ENTITY_INVALID = 'You do not see that here.'
-
- attr_accessor :monsters, :locations, :player, :debug_mode, :use_wordnik
-
- def initialize
- self.monsters = init_monsters
- self.locations = init_locations
- self.player = nil
- end
-
- def print_all_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
- 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}
- 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
- return
- end
-
- def list(param, details = false)
- case param
- when 'players'
- puts '[PLAYERS]'
- player.check_self(false)
- when 'monsters'
- puts "[MONSTERS](#{monsters.length})"
- if details
- monsters.map { |m| print m.describe unless m.is_boss}
- monsters.map { |m| print m.describe if m.is_boss }
- return
- else
- monster_text = ">> monsters: #{monsters.map(&:name).join(', ')}"
- end
- when 'items'
- item_count = 0
- locations.each do |l|
- l.items.each do |i|
- item_count = item_count + 1
- end
- end
- puts "[ITEMS](#{item_count})"
- if details
- locations.each do |l|
- l.items.map { |i| print i.status }
- 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})"
- if details
- locations.map { |l| print l.status(self.debug_mode) }
- 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} ]".colorize(:green)
-
- if 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
-
- point.populate_monsters(self.monsters) unless point.checked_for_monsters?
-
- desc_text << "\n >> Curious object(s): #{point.list_items.join(', ')}" unless point.list_items.empty?
- desc_text << "\n >> Monster(s) abound: #{point.list_monsters.join(', ')}" unless point.list_monsters.empty?
- desc_text << "\n >> Boss(es) abound: #{point.list_bosses.join(', ')}" unless point.list_bosses.empty?
- desc_text << "\n >> Paths: #{point.list_paths.join(', ')}"
-
- if debug_mode
- desc_text << "\n >>> Actionable words: "
- desc_text << point.list_actionable_words.colorize(:white)
- end
-
- return desc_text
- end
-
- def describe_entity(point, entity_name)
- if point.list_items.map{|i| i.downcase}.include?(entity_name)
- point.items.each do |i|
- if i.name.downcase.eql?(entity_name.downcase)
- if debug_mode
- return i.status
- else
- return i.description
- end
- end
- end
- elsif
- if point.list_monsters.map{|m| m.downcase}.include?(entity_name)
- point.monsters_abounding.each do |m|
- if m.name.downcase.eql?(entity_name.downcase)
- if debug_mode
- return m.describe
- else
- return m.description
- end
- end
- end
- end
- elsif
- if point.list_bosses.map{|b| b.downcase}.include?(entity_name)
- point.bosses_abounding.each do |b|
- if b.name.downcase.eql?(entity_name.downcase)
- if debug_mode
- return b.describe
- else
- return b.description
- end
- end
- end
- end
- else
- ERROR_LOCATION_DESCRIBE_ENTITY_INVALID
- end
- 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
- end
- end
-
- return false
- end
-
- private
-
- def create_item_objects(item_names)
- items = []
- unless item_names.nil?
- item_names.each do |name|
- items.push(eval(name).new)
- end
- end
- return items
- end
-
- def create_boss_objects(bosses_names)
- bosses = []
- unless bosses_names.nil?
- bosses_names.each do |name|
- bosses.push(eval(name).new)
- end
- end
- return bosses
- end
-
- def init_monsters
- Dir.glob('lib/gemwarrior/entities/monsters/*.rb').each do |item|
- require_relative item[item.index('/', item.index('/')+1)+1..item.length]
- end
- Dir.glob('lib/gemwarrior/entities/monsters/bosses/*.rb').each do |item|
- require_relative item[item.index('/', item.index('/')+1)+1..item.length]
- end
-
- self.monsters = [
- Alexandrat.new,
- Amberoo.new,
- Amethystle.new,
- Apatiger.new,
- Aquamarine.new,
- Bloodstorm.new,
- Citrinaga.new,
- Coraliz.new,
- Cubicat.new,
- Diaman.new,
- Emerald.new,
- Garynetty.new
- ]
- end
-
- def init_locations
- Dir.glob('lib/gemwarrior/entities/items/*.rb').each do |item|
- require_relative item[item.index('/', item.index('/')+1)+1..item.length]
- end
-
- locations = []
-
- location_data = YAML.load_file(LOCATION_DATA_FILE)
-
- location_data.each {|l|
- locations.push(Location.new({
- :name => l["name"],
- :description => l["description"],
- :danger_level => l["danger_level"],
- :monster_level_range => l["monster_level_range"].nil? ? nil : l["monster_level_range"]["lo"]..l["monster_level_range"]["hi"],
- :coords => {
- :x => l["coords"]["x"],
- :y => l["coords"]["y"]
- },
- :locs_connected => {
- :north => l["locs_connected"]["north"],
- :east => l["locs_connected"]["east"],
- :south => l["locs_connected"]["south"],
- :west => l["locs_connected"]["west"]
- },
- :items => create_item_objects(l["items"]),
- :bosses_abounding => create_boss_objects(l["bosses_abounding"])
- }))
- }
-
- return locations
- end
- end
-end
+# lib/gemwarrior/world.rb
+# World where the locations, monsters, items, etc. exist
+
+require 'yaml'
+
+require_relative 'entities/item'
+require_relative 'entities/location'
+
+module Gemwarrior
+ class World
+ # CONSTANTS
+ LOCATION_DATA_FILE = "data/locations.yml"
+ WORLD_DIM_WIDTH = 10
+ WORLD_DIM_HEIGHT = 10
+
+ ## ERRORS
+ ERROR_LIST_PARAM_INVALID = 'That is not something that can be listed.'
+ ERROR_LOCATION_DESCRIBE_ENTITY_INVALID = 'You do not see that here.'
+
+ attr_accessor :monsters, :locations, :player, :debug_mode, :use_wordnik
+
+ def initialize
+ self.monsters = init_monsters
+ self.locations = init_locations
+ self.player = nil
+ end
+
+ def print_all_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
+ 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 => self.player.cur_coords[:z]}
+ 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
+ return
+ end
+
+ def list(param, details = false)
+ case param
+ when 'players'
+ puts '[PLAYERS]'
+ player.check_self(false)
+ when 'monsters'
+ puts "[MONSTERS](#{monsters.length})"
+ if details
+ monsters.map { |m| print m.describe unless m.is_boss}
+ monsters.map { |m| print m.describe if m.is_boss }
+ return
+ else
+ monster_text = ">> monsters: #{monsters.map(&:name).join(', ')}"
+ end
+ when 'items'
+ item_count = 0
+ locations.each do |l|
+ l.items.each do |i|
+ item_count = item_count + 1
+ end
+ end
+ puts "[ITEMS](#{item_count})"
+ if details
+ locations.each do |l|
+ l.items.map { |i| print i.status }
+ 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})"
+ if details
+ locations.map { |l| print l.status(self.debug_mode) }
+ 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} ]".colorize(:green)
+
+ if 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
+
+ point.populate_monsters(self.monsters) unless point.checked_for_monsters?
+
+ desc_text << "\n >> Curious object(s): #{point.list_items.join(', ')}" unless point.list_items.empty?
+ desc_text << "\n >> Monster(s) abound: #{point.list_monsters.join(', ')}" unless point.list_monsters.empty?
+ desc_text << "\n >> Boss(es) abound: #{point.list_bosses.join(', ')}" unless point.list_bosses.empty?
+ desc_text << "\n >> Paths: #{point.list_paths.join(', ')}"
+
+ if debug_mode
+ desc_text << "\n >>> Actionable words: "
+ desc_text << point.list_actionable_words.colorize(:white)
+ end
+
+ return desc_text
+ end
+
+ def describe_entity(point, entity_name)
+ if point.list_items.map{|i| i.downcase}.include?(entity_name)
+ point.items.each do |i|
+ if i.name.downcase.eql?(entity_name.downcase)
+ if debug_mode
+ return i.status
+ else
+ return i.description
+ end
+ end
+ end
+ elsif
+ if point.list_monsters.map{|m| m.downcase}.include?(entity_name)
+ point.monsters_abounding.each do |m|
+ if m.name.downcase.eql?(entity_name.downcase)
+ if debug_mode
+ return m.describe
+ else
+ return m.description
+ end
+ end
+ end
+ end
+ elsif
+ if point.list_bosses.map{|b| b.downcase}.include?(entity_name)
+ point.bosses_abounding.each do |b|
+ if b.name.downcase.eql?(entity_name.downcase)
+ if debug_mode
+ return b.describe
+ else
+ return b.description
+ end
+ end
+ end
+ end
+ else
+ ERROR_LOCATION_DESCRIBE_ENTITY_INVALID
+ end
+ 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
+ end
+ end
+
+ return false
+ end
+
+ private
+
+ def create_item_objects(item_names)
+ items = []
+ unless item_names.nil?
+ item_names.each do |name|
+ items.push(eval(name).new)
+ end
+ end
+ return items
+ end
+
+ def create_boss_objects(bosses_names)
+ bosses = []
+ unless bosses_names.nil?
+ bosses_names.each do |name|
+ bosses.push(eval(name).new)
+ end
+ end
+ return bosses
+ end
+
+ def init_monsters
+ Dir.glob('lib/gemwarrior/entities/monsters/*.rb').each do |item|
+ require_relative item[item.index('/', item.index('/')+1)+1..item.length]
+ end
+ Dir.glob('lib/gemwarrior/entities/monsters/bosses/*.rb').each do |item|
+ require_relative item[item.index('/', item.index('/')+1)+1..item.length]
+ end
+
+ self.monsters = [
+ Alexandrat.new,
+ Amberoo.new,
+ Amethystle.new,
+ Apatiger.new,
+ Aquamarine.new,
+ Bloodstorm.new,
+ Citrinaga.new,
+ Coraliz.new,
+ Cubicat.new,
+ Diaman.new,
+ Emerald.new,
+ Garynetty.new
+ ]
+ end
+
+ def init_locations
+ Dir.glob('lib/gemwarrior/entities/items/*.rb').each do |item|
+ require_relative item[item.index('/', item.index('/')+1)+1..item.length]
+ end
+
+ locations = []
+
+ location_data = YAML.load_file(LOCATION_DATA_FILE)
+
+ location_data.each {|l|
+ locations.push(Location.new({
+ :name => l["name"],
+ :description => l["description"],
+ :danger_level => l["danger_level"],
+ :monster_level_range => l["monster_level_range"].nil? ? nil : l["monster_level_range"]["lo"]..l["monster_level_range"]["hi"],
+ :coords => {
+ :x => l["coords"]["x"],
+ :y => l["coords"]["y"],
+ :z => l["coords"]["z"]
+ },
+ :locs_connected => {
+ :north => l["locs_connected"]["north"],
+ :east => l["locs_connected"]["east"],
+ :south => l["locs_connected"]["south"],
+ :west => l["locs_connected"]["west"]
+ },
+ :items => create_item_objects(l["items"]),
+ :bosses_abounding => create_boss_objects(l["bosses_abounding"])
+ }))
+ }
+
+ return locations
+ end
+ end
+end