summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2021-05-20 05:04:21 -0400
committerrealtradam <[email protected]>2021-05-20 05:04:21 -0400
commitf97a9ca95e464e728bba9337b579bc380c33bc7d (patch)
treedd45a6e615e6e873cee15cb41daaca24b3357ea6
parentfee80f42f0889f2d484e25f4366f14b68c65ba70 (diff)
downloadtypemon-code-f97a9ca95e464e728bba9337b579bc380c33bc7d.tar.gz
typemon-code-f97a9ca95e464e728bba9337b579bc380c33bc7d.zip
implemented hitboxes
-rw-r--r--app/ECS/base_component.rb46
-rw-r--r--app/ECS/components/06_level.rb25
-rw-r--r--app/ECS/systems/00_player.rb14
-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.rb4
-rw-r--r--app/lib/components/07_indoor.rb4
-rw-r--r--app/lib/components/07_overworld.rb16
-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.rb76
-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.rb34
-rw-r--r--app/lib/systems/10_player.rb41
-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.rb15
-rw-r--r--app/tick.rb59
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,