diff options
Diffstat (limited to 'app')
| -rw-r--r-- | app/ECS/base_component.rb | 46 | ||||
| -rw-r--r-- | app/ECS/components/06_level.rb | 25 | ||||
| -rw-r--r-- | app/ECS/systems/00_player.rb | 14 | ||||
| -rw-r--r-- | app/lib/component_manager.rb (renamed from app/ECS/component_manager.rb) | 0 | ||||
| -rw-r--r-- | app/lib/components/00_renderable.rb (renamed from app/ECS/components/00_renderable.rb) | 2 | ||||
| -rw-r--r-- | app/lib/components/01_sprite.rb (renamed from app/ECS/components/01_sprite.rb) | 2 | ||||
| -rw-r--r-- | app/lib/components/02_label.rb (renamed from app/ECS/components/02_label.rb) | 2 | ||||
| -rw-r--r-- | app/lib/components/03_player_control.rb (renamed from app/ECS/components/03_player_control.rb) | 10 | ||||
| -rw-r--r-- | app/lib/components/04_map.rb (renamed from app/ECS/components/04_map.rb) | 2 | ||||
| -rw-r--r-- | app/lib/components/05_interactable.rb (renamed from app/ECS/components/05_interactable.rb) | 2 | ||||
| -rw-r--r-- | app/lib/components/06_collidable.rb (renamed from app/ECS/components/07_collidable.rb) | 2 | ||||
| -rw-r--r-- | app/lib/components/07_battle.rb | 4 | ||||
| -rw-r--r-- | app/lib/components/07_indoor.rb | 4 | ||||
| -rw-r--r-- | app/lib/components/07_overworld.rb | 16 | ||||
| -rw-r--r-- | app/lib/components/debug_singleton.rb (renamed from app/ECS/components/debug_singleton.rb) | 0 | ||||
| -rw-r--r-- | app/lib/entity_manager.rb (renamed from app/ECS/entity_manager.rb) | 0 | ||||
| -rw-r--r-- | app/lib/helpers/00_tileset.rb (renamed from app/helpers/00_tileset.rb) | 6 | ||||
| -rw-r--r-- | app/lib/helpers/01_component.rb | 76 | ||||
| -rw-r--r-- | app/lib/signatures.rb (renamed from app/ECS/signatures.rb) | 12 | ||||
| -rw-r--r-- | app/lib/system_manager.rb (renamed from app/ECS/system_manager.rb) | 0 | ||||
| -rw-r--r-- | app/lib/systems/00_update_levels.rb | 34 | ||||
| -rw-r--r-- | app/lib/systems/10_player.rb | 41 | ||||
| -rw-r--r-- | app/lib/systems/99_render.rb (renamed from app/ECS/systems/99_render.rb) | 0 | ||||
| -rw-r--r-- | app/lib/test.rb (renamed from app/ECS/test.rb) | 0 | ||||
| -rw-r--r-- | app/main.rb | 15 | ||||
| -rw-r--r-- | app/tick.rb | 59 |
26 files changed, 217 insertions, 157 deletions
diff --git a/app/ECS/base_component.rb b/app/ECS/base_component.rb deleted file mode 100644 index f32322b..0000000 --- a/app/ECS/base_component.rb +++ /dev/null @@ -1,46 +0,0 @@ -class BaseComponent - class <<self - def id - @id ||= ID.send(ComponentHelper.underscore(ancestors[0].name.split('::').last)) - end - - def data - @data ||= {} - end - - def add(entity_id) - data[entity_id] = new - end - - def delete(entity_id) - data.delete entity_id - end - end -end - -module ComponentHelper - class <<self - def up? char - char == char.upcase - end - - def down? char - char == char.downcase - end - - def underscore(input) - output = input[0].downcase - (1...(input.length - 1)).each do |iter| - if down?(input[iter]) && up?(input[iter + 1]) - output += "#{input[iter].downcase}_" - elsif up?(input[iter - 1]) && up?(input[iter]) && down?(input[iter + 1]) - output += "_#{input[iter].downcase}" - else - output += input[iter].downcase - end - end - output += input[-1].downcase unless input.length == 1 - output - end - end -end diff --git a/app/ECS/components/06_level.rb b/app/ECS/components/06_level.rb deleted file mode 100644 index 4d692e6..0000000 --- a/app/ECS/components/06_level.rb +++ /dev/null @@ -1,25 +0,0 @@ -class Components - # If an entity can be rendered on screen - class Level < BaseComponent - attr_accessor :z - - def initialize - @grid = [[]] #Array.new(1) { Array.new(1) } - end - - def set(x: x, y: y, **opts) - smart_array(x, y).merge(opts) - end - - # Things that the smart_array holds - # - # player: is the player in the square? - # hitbox: true/false - # interact: id/false - def smart_array(x, y) - @grid[x] = [] if @grid[x].nil? - @grix[x][y] = {} if @grid[x][y].nil? - @grid[x][y] - end - end -end diff --git a/app/ECS/systems/00_player.rb b/app/ECS/systems/00_player.rb deleted file mode 100644 index 21dedfd..0000000 --- a/app/ECS/systems/00_player.rb +++ /dev/null @@ -1,14 +0,0 @@ -class Systems - class Player - def self.run - Components::PlayerControl.data.each do |id, data| - if !(Components::Sprite.id & Entity.signatures[id]).zero? - Components::Sprite.data[id].y -= 64 if $gtk.args.inputs.keyboard.key_down.send(data.north) - Components::Sprite.data[id].y += 64 if $gtk.args.inputs.keyboard.key_down.send(data.south) - Components::Sprite.data[id].x += 64 if $gtk.args.inputs.keyboard.key_down.send(data.east) - Components::Sprite.data[id].x -= 64 if $gtk.args.inputs.keyboard.key_down.send(data.west) - end - end - end - end -end diff --git a/app/ECS/component_manager.rb b/app/lib/component_manager.rb index f5261a2..f5261a2 100644 --- a/app/ECS/component_manager.rb +++ b/app/lib/component_manager.rb diff --git a/app/ECS/components/00_renderable.rb b/app/lib/components/00_renderable.rb index 4008691..3971c8c 100644 --- a/app/ECS/components/00_renderable.rb +++ b/app/lib/components/00_renderable.rb @@ -1,6 +1,6 @@ class Components # If an entity can be rendered on screen - class Renderable < BaseComponent + class Renderable < Helper::BaseComponent attr_accessor :z def initialize diff --git a/app/ECS/components/01_sprite.rb b/app/lib/components/01_sprite.rb index 5aa71ba..8d30cdf 100644 --- a/app/ECS/components/01_sprite.rb +++ b/app/lib/components/01_sprite.rb @@ -1,6 +1,6 @@ class Components # If an entity can be rendered on screen - class Sprite < BaseComponent + class Sprite < Helper::BaseComponent attr_accessor :x, :y, :w, :h, :path, :angle, :a, :r, :g, :b, :source_x, :source_y, :source_w, :source_h, diff --git a/app/ECS/components/02_label.rb b/app/lib/components/02_label.rb index aed00ed..13544b7 100644 --- a/app/ECS/components/02_label.rb +++ b/app/lib/components/02_label.rb @@ -1,6 +1,6 @@ class Components # A dragonruby label wrapper - class Label < BaseComponent + class Label < Helper::BaseComponent attr_accessor :x, :y, :text, :size_enum, :alignment_enum, :a, :r, :g, :b, :font, :vertical_alignment_enum diff --git a/app/ECS/components/03_player_control.rb b/app/lib/components/03_player_control.rb index 58d0102..d5d8f7a 100644 --- a/app/ECS/components/03_player_control.rb +++ b/app/lib/components/03_player_control.rb @@ -1,13 +1,13 @@ class Components # Gives control(keyboard or otherwise) over an object - class PlayerControl < BaseComponent + class PlayerControl < Helper::BaseComponent attr_accessor :north, :south, :east, :west, :interact, :menu def initialize - @north = 'w' - @south = 's' - @east = 'd' - @west = 'a' + @north = 'up' + @south = 'down' + @east = 'right' + @west = 'left' @interact = 'space' @menu = 'enter' end diff --git a/app/ECS/components/04_map.rb b/app/lib/components/04_map.rb index 804fc02..7700e9f 100644 --- a/app/ECS/components/04_map.rb +++ b/app/lib/components/04_map.rb @@ -1,6 +1,6 @@ class Components # dragonruby label wrapper - class Map < BaseComponent + class Map < Helper::BaseComponent attr_accessor :json_name, :json, :x, :y, :tilewidth, :tileheight, :a, :r, :g, :b diff --git a/app/ECS/components/05_interactable.rb b/app/lib/components/05_interactable.rb index 305bb02..636a216 100644 --- a/app/ECS/components/05_interactable.rb +++ b/app/lib/components/05_interactable.rb @@ -1,6 +1,6 @@ class Components # If an entity can be rendered on screen - class Interactable < BaseComponent + class Interactable < Helper::BaseComponent attr_accessor :z def initialize diff --git a/app/ECS/components/07_collidable.rb b/app/lib/components/06_collidable.rb index 207e138..76ce51e 100644 --- a/app/ECS/components/07_collidable.rb +++ b/app/lib/components/06_collidable.rb @@ -1,6 +1,6 @@ class Components # If an entity can be rendered on screen - class Collidable < BaseComponent + class Collidable < Helper::BaseComponent class <<self def add(entity_id) super(entity_id) diff --git a/app/lib/components/07_battle.rb b/app/lib/components/07_battle.rb new file mode 100644 index 0000000..b4ef622 --- /dev/null +++ b/app/lib/components/07_battle.rb @@ -0,0 +1,4 @@ +class Components + class Battle < Helper::Level + end +end diff --git a/app/lib/components/07_indoor.rb b/app/lib/components/07_indoor.rb new file mode 100644 index 0000000..e409da8 --- /dev/null +++ b/app/lib/components/07_indoor.rb @@ -0,0 +1,4 @@ +class Components + class Indoor < Helper::Level + end +end diff --git a/app/lib/components/07_overworld.rb b/app/lib/components/07_overworld.rb new file mode 100644 index 0000000..55ab38a --- /dev/null +++ b/app/lib/components/07_overworld.rb @@ -0,0 +1,16 @@ +class Components + class Overworld < Helper::Level + attr_accessor :x, :y + + def initialize + @x = 0 + @y = 0 + end + + def set(**opts) + opts.each do |key, value| + self.send "#{key}=", value + end + end + end +end diff --git a/app/ECS/components/debug_singleton.rb b/app/lib/components/debug_singleton.rb index f298172..f298172 100644 --- a/app/ECS/components/debug_singleton.rb +++ b/app/lib/components/debug_singleton.rb diff --git a/app/ECS/entity_manager.rb b/app/lib/entity_manager.rb index 7d0d1ff..7d0d1ff 100644 --- a/app/ECS/entity_manager.rb +++ b/app/lib/entity_manager.rb diff --git a/app/helpers/00_tileset.rb b/app/lib/helpers/00_tileset.rb index d64006d..3890550 100644 --- a/app/helpers/00_tileset.rb +++ b/app/lib/helpers/00_tileset.rb @@ -6,8 +6,10 @@ class Helper class <<self attr_accessor :json_data - def get_json_tiles(json_name) - return nil if json_name == 'hitbox' && !Components::DebugSingleton.data + def get_json_tiles(json_name, hitbox: false) + unless hitbox + return nil if json_name == 'hitbox' && !Components::DebugSingleton.data + end if self.json_data[json_name].nil? self.json_data[json_name] = $gtk.parse_json_file "assets/json/#{json_name}.json" diff --git a/app/lib/helpers/01_component.rb b/app/lib/helpers/01_component.rb new file mode 100644 index 0000000..4937ec9 --- /dev/null +++ b/app/lib/helpers/01_component.rb @@ -0,0 +1,76 @@ +class Helper + class BaseComponent + class <<self + def id + @id ||= ID.send(Helper::ComponentHelper.underscore(ancestors[0].name.split('::').last)) + end + + def data + @data ||= {} + end + + def add(entity_id) + data[entity_id] = new + end + + def delete(entity_id) + data.delete entity_id + end + end + end + + class Level < Helper::BaseComponent + class <<self + def data + @data ||= { add: [], remove: [], grid: Helper::Array2D.new } + end + + def add(entity_id) + super + data[:add].push entity_id + end + + def remove(entity_id) + data[:remove].push entity_id + super + end + end + end + + class Array2D < Array + def [](val) + unless val.nil? + return self[val] = [] if super.nil? + end + super + end + end + + + module ComponentHelper + class <<self + def up? char + char == char.upcase + end + + def down? char + char == char.downcase + end + + def underscore(input) + output = input[0].downcase + (1...(input.length - 1)).each do |iter| + if down?(input[iter]) && up?(input[iter + 1]) + output += "#{input[iter].downcase}_" + elsif up?(input[iter - 1]) && up?(input[iter]) && down?(input[iter + 1]) + output += "_#{input[iter].downcase}" + else + output += input[iter].downcase + end + end + output += input[-1].downcase unless input.length == 1 + output + end + end + end +end diff --git a/app/ECS/signatures.rb b/app/lib/signatures.rb index a6df0ac..f7e1cd4 100644 --- a/app/ECS/signatures.rb +++ b/app/lib/signatures.rb @@ -24,12 +24,20 @@ class ID 0b0_100_000 end - def level + def collidable 0b0_001_000_000 end - def collidable + def overworld 0b0_010_000_000 end + + def indoor + 0b0_100_000_000 + end + + def battle + 0b0_001_000_000_000 + end end end diff --git a/app/ECS/system_manager.rb b/app/lib/system_manager.rb index e63375c..e63375c 100644 --- a/app/ECS/system_manager.rb +++ b/app/lib/system_manager.rb diff --git a/app/lib/systems/00_update_levels.rb b/app/lib/systems/00_update_levels.rb new file mode 100644 index 0000000..6f3a056 --- /dev/null +++ b/app/lib/systems/00_update_levels.rb @@ -0,0 +1,34 @@ +class Systems + class UpdateLevels + @co = Components::Overworld + def self.run + @co.data[:add].each do |id| + @co.data[:add].delete(id) + if !(Components::Sprite.id & Entity.signatures[id]).zero? + @co.data[:grid][@co.data[id].x][@co.data[id].y] = {} if @co.data[:grid][@co.data[id].x][@co.data[id].y].nil? + #@co.data[:grid][@co.data[id].x][@co.data[id].y].merge!({ player: true }) + puts @co.data[:grid][@co.data[id].x][@co.data[id].y].inspect + elsif !(Components::Map.id & Entity.signatures[id]).zero? + if Components::Map.data[id].json['tilesets'].last['source'].split('/').last.delete('\\').delete_suffix('.tsx') == 'hitbox' + Components::Map.data[id].json['layers'].each do |layer| + layer['chunks'].each do |chunk| + chunk['data'].each_slice(chunk['width']).with_index do |row, row_index| + row.each_with_index do |tile, column_index| + if tile.to_i == Components::Map.data[id].json['tilesets'].last['firstgid'].to_i + @co.data[:grid][column_index][row_index] = {} if @co.data[:grid][column_index][row_index].nil? + @co.data[:grid][column_index][row_index].merge!({ hitbox: true }) + end + end + end + end + end + end + end + puts @co.data[:grid] + end + Components::Overworld.data[:remove].each do |id| + Components::Overworld.data[:remove].delete(id) + end + end + end +end diff --git a/app/lib/systems/10_player.rb b/app/lib/systems/10_player.rb new file mode 100644 index 0000000..307731a --- /dev/null +++ b/app/lib/systems/10_player.rb @@ -0,0 +1,41 @@ +class Systems + class Player + @co = Components::Overworld + def self.run + Components::PlayerControl.data.each do |id, data| + puts6 "Right: #{@co.data[:grid][@co.data[id].x+1][@co.data[id].y]}" + puts6 "Left #{@co.data[:grid][@co.data[id].x-1][@co.data[id].y]}" + puts6 "Down #{@co.data[:grid][@co.data[id].x][@co.data[id].y+1]}" + puts6 "Up #{@co.data[:grid][@co.data[id].x][@co.data[id].y-1]}" + #puts6 @co.data[:grid][@co.data[id].x + 1][@co.data[id].y][:hitbox].nil? + + if !(Components::Sprite.id & Entity.signatures[id]).zero? + if $gtk.args.inputs.keyboard.key_down.send(data.north) &&\ + (@co.data[:grid][@co.data[id].x][@co.data[id].y - 1].nil? ||\ + @co.data[:grid][@co.data[id].x][@co.data[id].y - 1][:hitbox].nil?) + Components::Sprite.data[id].y -= 64 + @co.data[id].y -= 1 + elsif $gtk.args.inputs.keyboard.key_down.send(data.south) &&\ + (@co.data[:grid][@co.data[id].x][@co.data[id].y + 1].nil? ||\ + @co.data[:grid][@co.data[id].x][@co.data[id].y + 1][:hitbox].nil?) + Components::Sprite.data[id].y += 64 + @co.data[id].y += 1 + elsif $gtk.args.inputs.keyboard.key_down.send(data.east) &&\ + (@co.data[:grid][@co.data[id].x + 1][@co.data[id].y].nil? ||\ + @co.data[:grid][@co.data[id].x + 1][@co.data[id].y][:hitbox].nil?) + Components::Sprite.data[id].x += 64 + @co.data[id].x += 1 + elsif $gtk.args.inputs.keyboard.key_down.send(data.west) &&\ + (@co.data[:grid][@co.data[id].x - 1][@co.data[id].y].nil? || @co.data[:grid][@co.data[id].x - 1][@co.data[id].y][:hitbox].nil?) + Components::Sprite.data[id].x -= 64 + @co.data[id].x -= 1 + end + #Components::Sprite.data[id].y -= 64 if $gtk.args.inputs.keyboard.key_down.send(data.north) + #Components::Sprite.data[id].y += 64 if $gtk.args.inputs.keyboard.key_down.send(data.south) + #Components::Sprite.data[id].x += 64 if $gtk.args.inputs.keyboard.key_down.send(data.east) + #Components::Sprite.data[id].x -= 64 if $gtk.args.inputs.keyboard.key_down.send(data.west) + end + end + end + end +end diff --git a/app/ECS/systems/99_render.rb b/app/lib/systems/99_render.rb index c71c6fc..c71c6fc 100644 --- a/app/ECS/systems/99_render.rb +++ b/app/lib/systems/99_render.rb diff --git a/app/ECS/test.rb b/app/lib/test.rb index 13fd401..13fd401 100644 --- a/app/ECS/test.rb +++ b/app/lib/test.rb diff --git a/app/main.rb b/app/main.rb index a371d72..a05c9da 100644 --- a/app/main.rb +++ b/app/main.rb @@ -9,18 +9,17 @@ end require 'app/dragonruby-game-toolkit-contrib/dragon/grid.rb' -require_all 'helpers' +require_all 'lib/helpers' -require 'app/ECS/signatures.rb' +require 'app/lib/signatures.rb' -require 'app/ECS/entity_manager.rb' +require 'app/lib/entity_manager.rb' -require 'app/ECS/component_manager.rb' -require 'app/ECS/base_component.rb' -require_all 'ECS/components' +require 'app/lib/component_manager.rb' +require_all 'lib/components' -require 'app/ECS/system_manager.rb' -require_all 'ECS/systems' +require 'app/lib/system_manager.rb' +require_all 'lib/systems' require 'app/tick.rb' diff --git a/app/tick.rb b/app/tick.rb index d1b95a7..a4b2153 100644 --- a/app/tick.rb +++ b/app/tick.rb @@ -1,47 +1,15 @@ $gtk.args.grid.origin_top_left! -#$gtk.args.grid.origin_bottom_left! -#Components::DebugSingleton.data = true +Components::DebugSingleton.data = true -thing0 = Entity.new(ID.sprite, - ID.renderable, - ID.player_control) -Components::Sprite.data[thing0.id].set(x: 256, y: 128, w: 64, h: 64, path: 'dragonruby.png') -Components::Renderable.data[thing0.id].z = 10 -#Components::PlayerControl.data[thing0.id].set(north: 's', south: 'w') +@thing0 = Entity.new(ID.sprite, + ID.renderable, + ID.player_control, + ID.overworld) +Components::Sprite.data[@thing0.id].set(x: 256, y: 128, w: 64, h: 64, path: 'dragonruby.png') +Components::Renderable.data[@thing0.id].z = 10 +Components::Overworld.data[@thing0.id].set(x: 4, y: 2) -#@thing0 = Entity.new(ID.sprite, -# ID.renderable, -# ID.player_control) -#@thing3 = Entity.new(ID.sprite, -# ID.renderable, -# ID.player_control) -#Components::Sprite.data[@thing3.id].set(x: 576, y: 580, -# w: 128, h: 101, -# path: 'assets/non-free/Modern_Interiors/1_Interiors/16x16/Room_Builder_16x16.png', -# source_x: 0, source_y: 0, source_w: 16, source_h: 16) - -#json_tiles = Helper.get_json_tiles('tileset_Room_Builder_16x16') -#tile_number = 100 -#source_height_tiles = (tile_number.to_i / json_tiles['columns'].to_i).to_i -#hash = { w: json_tiles['tilewidth'], -# h: json_tiles['tileheight'], -# path: 'assets/non-free/Modern_Interiors/1_Interiors/16x16/Room_Builder_16x16.png', -# source_x: ((tile_number % json_tiles['columns']) - 1) * json_tiles['tilewidth'], -# source_y: json_tiles['imageheight'] - ((source_height_tiles + 1) * json_tiles['tileheight']), -# source_w: json_tiles['tilewidth'], -# source_h: json_tiles['tileheight'] } -#puts hash.inspect - -#Helper.get_tile( -#Components::Sprite.data[thing0.id].set(Helper.get_tile('tileset_Room_Builder_16x16', 936)) -#Components::Sprite.data[thing0.id].set(x: 576, y:280, -# w:128, h: 101) -@thing1 = Entity.new(ID.label, ID.renderable) -#Components::Label.data[@thing1.id].set(x: $gtk.args.grid.center[0], y: $gtk.args.grid.center[1], -# text: $gtk.args.grid.center.inspect, -# size_enum: 5, -# alignment_enum: 1) -#Components::Renderable.data[@thing1.id].z = 5 +#@thing1 = Entity.new(ID.label, ID.renderable) @thing2 = Entity.new(ID.label, ID.renderable) Components::Label.data[@thing2.id].set(x: 740, y: 520, @@ -50,14 +18,7 @@ Components::Label.data[@thing2.id].set(x: 740, y: 520, alignment_enum: 1) Components::Renderable.data[@thing2.id].z = 5 -#@map = Entity.new(ID.map, ID.renderable) -#Components::Map.data[@map.id].set(x: 0, -# y: 0, -# tilewidth: 128, -# tileheight: 128, -# json_name: 'map_test_map') - -@map2 = Entity.new(ID.map, ID.renderable) +@map2 = Entity.new(ID.map, ID.renderable, ID.overworld) Components::Map.data[@map2.id].set(x: 0, y: 0, tilewidth: 64, |
