summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmir Rajan <[email protected]>2021-03-11 13:15:40 -0600
committerGitHub <[email protected]>2021-03-11 13:15:40 -0600
commitcd14cc76cb4e17465fcc228d69dc1ae7efca81b1 (patch)
tree108dfffe6555edee92ef0fb5e3bb5332d1e37b70
parent9aed616a037d9630946e261b84d889cd95a7e321 (diff)
downloaddragonruby-game-toolkit-contrib-cd14cc76cb4e17465fcc228d69dc1ae7efca81b1.tar.gz
dragonruby-game-toolkit-contrib-cd14cc76cb4e17465fcc228d69dc1ae7efca81b1.zip
Create entity.rb
-rw-r--r--dragon/entity.rb91
1 files changed, 91 insertions, 0 deletions
diff --git a/dragon/entity.rb b/dragon/entity.rb
new file mode 100644
index 0000000..09fa794
--- /dev/null
+++ b/dragon/entity.rb
@@ -0,0 +1,91 @@
+# coding: utf-8
+# Copyright 2019 DragonRuby LLC
+# MIT License
+# entity.rb has been released under MIT (*only this file*).
+
+module GTK
+ class Entity
+ def self.id!
+ @id ||= 0
+ @id += 1
+ @id
+ end
+
+ def self.__reset_id__!
+ @id = 0
+ end
+
+ def self.strict_entities
+ @strict_entities ||= {}
+ @strict_entities
+ end
+
+ def self.parse_serialization_data data
+ r = Entity.parse_serialization_data data
+ return r if r.is_a? OpenEntity
+ return r if r.is_a? StrictEntity
+ raise <<-S
+* ERROR:
+The save data looks to be corrupt.
+
+S
+ end
+
+ def self.parse_serialization_data value
+ if value.is_a?(Hash) && value[:entity_id] && value[:entity_strict]
+ o = new_entity_strict value[:entity_name], value
+ o.load_entity_data! value
+ return o
+ elsif value.is_a?(Hash) && value[:entity_id]
+ o = OpenEntity.new
+ o.load_entity_data! value
+ return o
+ elsif value.is_a? Array
+ return value.map { |entry| Entity.parse_serialization_data entry }
+ else
+ return value
+ end
+ end
+
+ def self.new_entity entity_type, init_hash = nil, block = nil
+ n = OpenEntity.new(entity_type)
+ n.entity_type = entity_type
+ n.created_at = Kernel.tick_count
+ n.global_created_at = Kernel.global_tick_count
+
+ if init_hash
+ init_hash.each do |k, v|
+ n.as_hash[k] = v
+ end
+ end
+
+ block.call(n) if block
+
+ n
+ end
+
+ def self.new_entity_strict entity_type, init_hash = nil, block = nil
+ if !Entity.strict_entities[entity_type]
+ init_hash ||= { }
+
+ n = new_entity entity_type, init_hash, block
+ klass = Class.new(StrictEntity)
+
+ klass.class_eval do
+ init_hash.each do |k, v|
+ attr_accessor k
+ end
+
+ n.as_hash.each do |k, v|
+ attr_accessor k if !init_hash[k]
+ end
+ end
+
+ Entity.strict_entities[entity_type] = klass
+ end
+
+ klass = Entity.strict_entities[entity_type]
+ (klass.new entity_type, init_hash, block)
+ end
+ end
+end