# a zone is a namespace for rooms and information a specific area. class Zone attr_accessor :name, :access_list, :devnotes include CoralMUD::FileIO # standard saving mechanisms. include CoralMUD::VirtualTags # virtual tag system included. def initialize @name = DEFAULT_STRING @devnotes = "No notes." @access_list = [] end def to_configure_properties ['@name', '@vtag', '@devnotes', '@access_list'] end def to_s mxptag("send 'edit #{Tag.full_tag(self)}'") + "[Zone #{@vtag}]" + mxptag("/send") end def add_access ch @access_list << case ch when Player then ch.name when String then ch end end def remove_access ch access_token = case ch when Player then ch.name when String then ch end @access_list.delete access_token end def can_access? ch case ch when Player then @access_list.include?(ch.name) when String then @access_list.include?(ch) end end def self.load_zones f = File.open('data/areas/zone_list.txt', 'r') arr = f.readlines log :info, "Loading all zones." arr.each do |a_file| a_file = "data/areas/#{a_file.strip}" z = Zone.new() z.load_from_file(a_file) # loads each room file. z.reassociate_tag() # Must be done because initializer is not called for the vtag object. log :debug, "Loading zone: #{z.vtag.to_s}" end end def self.save_all arr = [] # list of all file paths #loop through all Zone found. Tag.search_class Zone do |z| arr << z.save_zone end File.open('data/areas/zone_list.txt', 'w') do |f| arr.each {|str| f.puts str } end end def save_zone save_to_file "data/areas/%s.yml" % @vtag.to_s return "%s.yml" % @vtag.to_s end # doing something arcane here. We want the rooms to be saved inside of map. So we're going to just in time # throw in a value that doesn't exist on a zone but we will associate with it anyways called @rooms. # The variable never exists anywhere but on the transformation hash that is dumped to file. # When it's loaded back we'll separate the rooms from the area's actual data and the variable never gets used. def data_transform_on_save map arr = [] # array of config datas for rooms. # search and find every room that belongs to this area. Tag.search_namespace(self) do |found| next if !found.is_a? Room arr << found.gen_configure end map['@rooms'] = arr # rooms will get saved to file as part of this area. objarr = [] Tag.search_namespace(self) do |found| next if !found.is_a? Item objarr << found.gen_configure end map['@items'] = objarr arr = [] Tag.search_namespace(self) do |found| next if !found.is_a? NPC arr << found.gen_configure end map['@npcs'] = arr return map end # Now we need to use the data @rooms at the last minute as explained above when it's loading. # Each element of the array for @rooms is a room that needs to be loaded into the game. def data_transform_on_load version, map arr = map['@rooms'] arr.each do |r| r['@namespace'] = self # this is its namespace. room = Room.new() room.configure(r) # loads each room file. room.associate_with_area # Must be done after we have the vnum end map['@rooms'] = nil items = map['@items'] items.each do |oarr| oarr['@namespace'] = self obj = Item.new() obj.configure(oarr) end npcs = map['@npcs'] npcs.each do |m| m['@namespace'] = self npc = NPC.new() npc.configure(m) end map['@npcs'] = nil map['@items'] = nil return map end end