Browse Source

Working on serialization of game data.

Beoran 8 years ago
parent
commit
761304afd3
4 changed files with 119 additions and 43 deletions
  1. 0 6
      data/script/account.rb
  2. 3 9
      data/script/main.rb
  3. 109 25
      data/script/serdes.rb
  4. 7 3
      data/var/account/B/Beoran/Beoran.account

+ 0 - 6
data/script/account.rb

@@ -8,12 +8,6 @@ class Account
   serdes_reader :pass
   serdes_reader :algo
   
-  def initialize(nam, pas, alg = 'plain') 
-    @id   = nam
-    @algo = alg
-    @pass = pas
-  end
-
 end
 
 

+ 3 - 9
data/script/main.rb

@@ -196,15 +196,9 @@ if f
 end
 =end
 
-rec = { :name => 'Dyon', :algo => 'plain', :pass => 'noyd8pass',
-:desc => "A buff, tanned man\n with blonde hair."
-} 
-recs = [ rec ]
-Sitef.save_filename('Dyon.test', recs);
 
-rrecs, rerrs = Sitef.load_filename('Dyon.test');
-p rrecs, rerrs
-
-a = Account.new('Dyon', 'noyd8pass')
+a = Account.new(:id => 'Dyon', :pass => 'noyd8pass')
 p a.id
 a.save
+
+Account.

+ 109 - 25
data/script/serdes.rb

@@ -16,29 +16,94 @@ end
 module Serdes
   
   module ClassMethods
-    def serdes_add_to_register(name)
-      @serder_register ||= []
-      @serder_register << name
+    def serdes_add_to_fields(name, type = nil)
+      @serdes_fields ||= []
+      info = { :name => name, :type => type}
+      @serdes_fields << info
     end
     
-    def serdes_reader(name)
-      serdes_add_to_register(name)
+    def serdes_reader(name, type = nil)
+      serdes_add_to_fields(name, type)
       attr_reader(name)
     end
     
     def serdes_writer(name)
-      serdes_add_to_register(name)
+      serdes_add_to_fields(name, type = nil)
       attr_writer(name)
     end
     
     def serdes_accessor(name)
-      serdes_add_to_register(name)
+      serdes_add_to_fields(name, type)
       attr_accessor(name)
     end
     
-    def serdes_register()
-      @serder_register ||= []
-      return @serder_register
+    def serdes_fields()
+      @serdes_fields ||= []
+      return @serdes_fields
+    end
+    
+    
+    def serdes_register(obj)
+      @serdes_loaded ||= {}
+      @serdes_loaded[obj.id] = obj
+    end
+    
+    def serdes_delete(id)
+      @serdes_loaded ||= {}
+      @serdes_loaded.delete(id)
+    end
+    
+    
+    def serdes_get(id)
+      @serdes_loaded ||= {}
+      return @serdes_loaded[id.to_sym]
+    end
+    
+    def serdes_load(id)
+      full_name = serdes_dir_name(self) + '/' + serdes_file_name(self)
+      data  = Sitef.load_filename(full_name)
+      eldat = data.select do |el|
+        el['id'] == id
+      end
+      return nil unless eldat
+      
+      typedat = {}
+      self.serdes_fields.each do |info|
+        name  = info[:name]
+        type  = info[:type]
+        value = eldat[name]
+        type||= String
+        
+        typevalue = nil
+        
+        if type.respond_to?(:serdes_load)
+          typevalue = type.serdes_load(value)
+        elsif Kernel.respond_to?(type)
+          typevalue = Kernel.send(type, value) rescue nil 
+        else
+          typevalue = value
+        end
+      
+        typedat[key] = typevalue
+        return self.new(typedat)
+      end
+      
+      obj = self.new(typedat)
+      return obj
+    end
+    
+    def serdes_fetch(id)
+      res = serdes_get(id)
+      return res if res
+      return serdes_load(id)
+    end
+    
+    def from_serdes(id)
+      return serdes_fetch(id)
+    end
+    
+    def to_serdes(value)
+      return value.id.to_s
     end  
   end
   
@@ -47,35 +112,54 @@ module Serdes
     klass.extend(ClassMethods)
   end
   
-  def serdes_dir_name
-    top = self.class.to_s.gsub('::', '/').downcase
+  def self.serdes_dir_name(obj)
+    top = obj.class.to_s.gsub('::', '/').downcase
     top << '/' 
-    top << self.id.to_s[0]
+    top << obj.id.to_s[0]
     top << '/' 
-    top << self.id.to_s    
+    top << obj.id.to_s    
     return top
   end
   
-  def serdes_file_name
-    top = self.id.to_s.dup    
+  def self.serdes_file_name(obj)
+    top = obj.id.to_s.dup    
     top << '.'
-    top << self.class.to_s.gsub('::', '.').downcase
+    top << obj.class.to_s.gsub('::', '.').downcase
     return top 
   end
 
-  
-  def save
-    Dir.mkdir_p serdes_dir_name
+  def serdes_data
     data = {}
-    self.class.serdes_register.each do |name|
-      key = "#{name}" 
+    self.class.serdes_fetch.each do |info|
+      name  = info[:name]
+      type  = info[:type]
+      type||= String
+      key   = "#{name}" 
       value = "#{self.send(name.to_sym)}"
-      data[key] = value
+      if type.respond_to?(:to_serdes)
+         wrapvalue = type.to_serdes(value)
+      else 
+         wrapvalue = value.to_s
+      end
+      data[key]    = wrapvalue
     end
-    full_name = serdes_dir_name + '/' + serdes_file_name
+    p "serdes_data", data, self.class.serdes_register
+    return data
+  end
+  
+  def save
+    Dir.mkdir_p Serdes.serdes_dir_name(self)
+    data = serdes_data
+    full_name = Serdes.serdes_dir_name(self) + '/' + Serdes.serdes_file_name(self)
     Sitef.save_filename(full_name, [ data ] )
   end
   
-
+  def initialize(fields = {}) 
+    fields.each |key, value| do
+      instance_variable_set("@#{key}", value)
+    end
+    self.klass.serdes_register(self)
+  end
 
 end
+

+ 7 - 3
data/var/account/B/Beoran/Beoran.account

@@ -1,3 +1,7 @@
-name=Beoran
-algo=clear
-pass=memuma,27
+name: Beoran
+algo: clear
+pass: memuma,27
+character[2]:	[
+character[0]:	@Berne
+character[1]:	@Kei
+]