cyberarm_engine 0.25.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -8
  3. data/.rubocop.yml +7 -7
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/Gemfile.lock +37 -25
  7. data/LICENSE.txt +21 -21
  8. data/README.md +74 -74
  9. data/Rakefile +10 -10
  10. data/assets/shaders/fragment/g_buffer.glsl +30 -30
  11. data/assets/shaders/fragment/lighting.glsl +115 -115
  12. data/assets/shaders/include/light_struct.glsl +11 -11
  13. data/assets/shaders/include/material_struct.glsl +16 -16
  14. data/assets/shaders/vertex/g_buffer.glsl +28 -28
  15. data/assets/shaders/vertex/lighting.glsl +24 -24
  16. data/assets/textures/ui/circle.png +0 -0
  17. data/assets/textures/ui/circle_small.png +0 -0
  18. data/assets/textures/ui/rounded.png +0 -0
  19. data/assets/textures/ui/rounded_bottom.png +0 -0
  20. data/assets/textures/ui/rounded_left.png +0 -0
  21. data/assets/textures/ui/rounded_left_bottom.png +0 -0
  22. data/assets/textures/ui/rounded_left_top.png +0 -0
  23. data/assets/textures/ui/rounded_right.png +0 -0
  24. data/assets/textures/ui/rounded_right_bottom.png +0 -0
  25. data/assets/textures/ui/rounded_right_top.png +0 -0
  26. data/assets/textures/ui/rounded_small.png +0 -0
  27. data/assets/textures/ui/rounded_tiny.png +0 -0
  28. data/assets/textures/ui/rounded_top.png +0 -0
  29. data/assets/textures/ui/square.png +0 -0
  30. data/bin/console +14 -14
  31. data/bin/setup +8 -8
  32. data/cyberarm_engine.gemspec +35 -36
  33. data/lib/cyberarm_engine/animator.rb +219 -219
  34. data/lib/cyberarm_engine/background.rb +156 -158
  35. data/lib/cyberarm_engine/background_image.rb +93 -93
  36. data/lib/cyberarm_engine/background_nine_slice.rb +182 -142
  37. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  38. data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
  39. data/lib/cyberarm_engine/cache/download_manager.rb +123 -123
  40. data/lib/cyberarm_engine/cache.rb +4 -4
  41. data/lib/cyberarm_engine/common.rb +133 -131
  42. data/lib/cyberarm_engine/config_file.rb +46 -46
  43. data/lib/cyberarm_engine/console/command.rb +157 -157
  44. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
  45. data/lib/cyberarm_engine/console/subcommand.rb +99 -99
  46. data/lib/cyberarm_engine/console.rb +248 -248
  47. data/lib/cyberarm_engine/event_bus.rb +39 -0
  48. data/lib/cyberarm_engine/game_object.rb +244 -244
  49. data/lib/cyberarm_engine/game_state.rb +134 -124
  50. data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +111 -111
  51. data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +30 -30
  52. data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -17
  53. data/lib/cyberarm_engine/model/material.rb +21 -21
  54. data/lib/cyberarm_engine/model/mesh.rb +131 -131
  55. data/lib/cyberarm_engine/model/parser.rb +74 -74
  56. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
  57. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
  58. data/lib/cyberarm_engine/model.rb +216 -216
  59. data/lib/cyberarm_engine/model_cache.rb +31 -31
  60. data/lib/cyberarm_engine/notification.rb +82 -82
  61. data/lib/cyberarm_engine/notification_manager.rb +241 -241
  62. data/lib/cyberarm_engine/opengl/light.rb +52 -52
  63. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
  64. data/lib/cyberarm_engine/opengl/perspective_camera.rb +41 -41
  65. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
  66. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +167 -167
  67. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +307 -307
  68. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +33 -33
  69. data/lib/cyberarm_engine/opengl/shader.rb +408 -408
  70. data/lib/cyberarm_engine/opengl/texture.rb +69 -69
  71. data/lib/cyberarm_engine/opengl.rb +53 -53
  72. data/lib/cyberarm_engine/pathfinding/graph.rb +64 -0
  73. data/lib/cyberarm_engine/pathfinding/graph_search.rb +6 -0
  74. data/lib/cyberarm_engine/pathfinding/graph_searches/astar_search.rb +6 -0
  75. data/lib/cyberarm_engine/pathfinding/graph_searches/breadth_first_search.rb +27 -0
  76. data/lib/cyberarm_engine/pathfinding/graph_searches/dijkstra_search.rb +6 -0
  77. data/lib/cyberarm_engine/pathfinding/graphs/grid.rb +52 -0
  78. data/lib/cyberarm_engine/ray.rb +56 -56
  79. data/lib/cyberarm_engine/result.rb +19 -0
  80. data/lib/cyberarm_engine/stats.rb +200 -200
  81. data/lib/cyberarm_engine/text.rb +288 -260
  82. data/lib/cyberarm_engine/timer.rb +27 -23
  83. data/lib/cyberarm_engine/transform.rb +296 -296
  84. data/lib/cyberarm_engine/trees/aabb_node.rb +126 -126
  85. data/lib/cyberarm_engine/trees/aabb_tree.rb +55 -55
  86. data/lib/cyberarm_engine/trees/aabb_tree_debug.rb +29 -29
  87. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
  88. data/lib/cyberarm_engine/ui/dialog.rb +24 -0
  89. data/lib/cyberarm_engine/ui/dsl.rb +170 -142
  90. data/lib/cyberarm_engine/ui/element.rb +664 -662
  91. data/lib/cyberarm_engine/ui/elements/button.rb +99 -100
  92. data/lib/cyberarm_engine/ui/elements/check_box.rb +58 -54
  93. data/lib/cyberarm_engine/ui/elements/container.rb +413 -407
  94. data/lib/cyberarm_engine/ui/elements/edit_box.rb +200 -179
  95. data/lib/cyberarm_engine/ui/elements/edit_line.rb +299 -297
  96. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
  97. data/lib/cyberarm_engine/ui/elements/image.rb +78 -72
  98. data/lib/cyberarm_engine/ui/elements/list_box.rb +79 -79
  99. data/lib/cyberarm_engine/ui/elements/menu.rb +27 -27
  100. data/lib/cyberarm_engine/ui/elements/menu_item.rb +6 -6
  101. data/lib/cyberarm_engine/ui/elements/progress.rb +95 -93
  102. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
  103. data/lib/cyberarm_engine/ui/elements/slider.rb +111 -107
  104. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
  105. data/lib/cyberarm_engine/ui/elements/text_block.rb +236 -222
  106. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +71 -67
  107. data/lib/cyberarm_engine/ui/elements/widget.rb +45 -0
  108. data/lib/cyberarm_engine/ui/event.rb +54 -54
  109. data/lib/cyberarm_engine/ui/gui_state.rb +402 -326
  110. data/lib/cyberarm_engine/ui/page.rb +39 -0
  111. data/lib/cyberarm_engine/ui/style.rb +94 -61
  112. data/lib/cyberarm_engine/ui/theme.rb +237 -225
  113. data/lib/cyberarm_engine/vector.rb +312 -312
  114. data/lib/cyberarm_engine/version.rb +4 -4
  115. data/lib/cyberarm_engine/window.rb +234 -195
  116. data/lib/cyberarm_engine.rb +88 -76
  117. data/mrbgem.rake +29 -29
  118. metadata +30 -5
@@ -1,126 +1,126 @@
1
- # frozen_string_literal: true
2
-
3
- module CyberarmEngine
4
- class AABBTree
5
- class AABBNode
6
- attr_accessor :bounding_box, :parent, :object
7
- attr_reader :a, :b
8
-
9
- def initialize(parent:, object:, bounding_box:)
10
- @parent = parent
11
- @object = object
12
- @bounding_box = bounding_box
13
-
14
- @a = nil
15
- @b = nil
16
- end
17
-
18
- def a=(leaf)
19
- @a = leaf
20
- @a.parent = self
21
- end
22
-
23
- def b=(leaf)
24
- @b = leaf
25
- @b.parent = self
26
- end
27
-
28
- def leaf?
29
- @object
30
- end
31
-
32
- def insert_subtree(leaf)
33
- if leaf?
34
- new_node = AABBNode.new(parent: nil, object: nil, bounding_box: @bounding_box.union(leaf.bounding_box))
35
-
36
- new_node.a = self
37
- new_node.b = leaf
38
-
39
- new_node
40
- else
41
- cost_a = @a.bounding_box.volume + @b.bounding_box.union(leaf.bounding_box).volume
42
- cost_b = @b.bounding_box.volume + @a.bounding_box.union(leaf.bounding_box).volume
43
-
44
- if cost_a == cost_b
45
- cost_a = @a.proximity(leaf)
46
- cost_b = @b.proximity(leaf)
47
- end
48
-
49
- if cost_b < cost_a
50
- self.b = @b.insert_subtree(leaf)
51
- else
52
- self.a = @a.insert_subtree(leaf)
53
- end
54
-
55
- @bounding_box = @bounding_box.union(leaf.bounding_box)
56
-
57
- self
58
- end
59
- end
60
-
61
- def search_subtree(collider, items = [])
62
- if @bounding_box.intersect?(collider)
63
- if leaf?
64
- items << self
65
- else
66
- @a.search_subtree(collider, items)
67
- @b.search_subtree(collider, items)
68
- end
69
- end
70
-
71
- items
72
- end
73
-
74
- def remove_subtree(leaf)
75
- if leaf
76
- self
77
- elsif leaf.parent == self
78
- other_child = other(leaf)
79
- other_child.parent = @parent
80
- other_child
81
- else
82
- leaf.parent.disown_child(leaf)
83
- self
84
- end
85
- end
86
-
87
- def other(leaf)
88
- @a == leaf ? @b : @a
89
- end
90
-
91
- def disown_child(leaf)
92
- value = other(leaf)
93
- raise "Can not replace child of a leaf!" if @parent.leaf?
94
- raise "Node is not a child of parent!" unless leaf.child_of?(@parent)
95
-
96
- if @parent.a == self
97
- @parent.a = value
98
- else
99
- @parent.b = value
100
- end
101
-
102
- @parent.update_bounding_box
103
- end
104
-
105
- def child_of?(leaf)
106
- self == leaf.a || self == leaf.b
107
- end
108
-
109
- def proximity(leaf)
110
- (@bounding_box - leaf.bounding_box).sum.abs
111
- end
112
-
113
- def update_bounding_box
114
- node = self
115
-
116
- unless node.leaf?
117
- node.bounding_box = node.a.bounding_box.union(node.b.bounding_box)
118
-
119
- while (node = node.parent)
120
- node.bounding_box = node.a.bounding_box.union(node.b.bounding_box)
121
- end
122
- end
123
- end
124
- end
125
- end
126
- end
1
+ # frozen_string_literal: true
2
+
3
+ module CyberarmEngine
4
+ class AABBTree
5
+ class AABBNode
6
+ attr_accessor :bounding_box, :parent, :object
7
+ attr_reader :a, :b
8
+
9
+ def initialize(parent:, object:, bounding_box:)
10
+ @parent = parent
11
+ @object = object
12
+ @bounding_box = bounding_box
13
+
14
+ @a = nil
15
+ @b = nil
16
+ end
17
+
18
+ def a=(leaf)
19
+ @a = leaf
20
+ @a.parent = self
21
+ end
22
+
23
+ def b=(leaf)
24
+ @b = leaf
25
+ @b.parent = self
26
+ end
27
+
28
+ def leaf?
29
+ @object
30
+ end
31
+
32
+ def insert_subtree(leaf)
33
+ if leaf?
34
+ new_node = AABBNode.new(parent: nil, object: nil, bounding_box: @bounding_box.union(leaf.bounding_box))
35
+
36
+ new_node.a = self
37
+ new_node.b = leaf
38
+
39
+ new_node
40
+ else
41
+ cost_a = @a.bounding_box.volume + @b.bounding_box.union(leaf.bounding_box).volume
42
+ cost_b = @b.bounding_box.volume + @a.bounding_box.union(leaf.bounding_box).volume
43
+
44
+ if cost_a == cost_b
45
+ cost_a = @a.proximity(leaf)
46
+ cost_b = @b.proximity(leaf)
47
+ end
48
+
49
+ if cost_b < cost_a
50
+ self.b = @b.insert_subtree(leaf)
51
+ else
52
+ self.a = @a.insert_subtree(leaf)
53
+ end
54
+
55
+ @bounding_box = @bounding_box.union(leaf.bounding_box)
56
+
57
+ self
58
+ end
59
+ end
60
+
61
+ def search_subtree(collider, items = [])
62
+ if @bounding_box.intersect?(collider)
63
+ if leaf?
64
+ items << self
65
+ else
66
+ @a.search_subtree(collider, items)
67
+ @b.search_subtree(collider, items)
68
+ end
69
+ end
70
+
71
+ items
72
+ end
73
+
74
+ def remove_subtree(leaf)
75
+ if leaf
76
+ self
77
+ elsif leaf.parent == self
78
+ other_child = other(leaf)
79
+ other_child.parent = @parent
80
+ other_child
81
+ else
82
+ leaf.parent.disown_child(leaf)
83
+ self
84
+ end
85
+ end
86
+
87
+ def other(leaf)
88
+ @a == leaf ? @b : @a
89
+ end
90
+
91
+ def disown_child(leaf)
92
+ value = other(leaf)
93
+ raise "Can not replace child of a leaf!" if @parent.leaf?
94
+ raise "Node is not a child of parent!" unless leaf.child_of?(@parent)
95
+
96
+ if @parent.a == self
97
+ @parent.a = value
98
+ else
99
+ @parent.b = value
100
+ end
101
+
102
+ @parent.update_bounding_box
103
+ end
104
+
105
+ def child_of?(leaf)
106
+ self == leaf.a || self == leaf.b
107
+ end
108
+
109
+ def proximity(leaf)
110
+ (@bounding_box - leaf.bounding_box).sum.abs
111
+ end
112
+
113
+ def update_bounding_box
114
+ node = self
115
+
116
+ unless node.leaf?
117
+ node.bounding_box = node.a.bounding_box.union(node.b.bounding_box)
118
+
119
+ while (node = node.parent)
120
+ node.bounding_box = node.a.bounding_box.union(node.b.bounding_box)
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -1,55 +1,55 @@
1
- # frozen_string_literal: true
2
-
3
- module CyberarmEngine
4
- class AABBTree
5
- include AABBTreeDebug
6
-
7
- attr_reader :root, :objects, :branches, :leaves
8
-
9
- def initialize
10
- @objects = {}
11
- @root = nil
12
- @branches = 0
13
- @leaves = 0
14
- end
15
-
16
- def insert(object, bounding_box)
17
- raise "BoundingBox can't be nil!" unless bounding_box
18
- raise "Object can't be nil!" unless object
19
- # raise "Object already in tree!" if @objects[object] # FIXME
20
-
21
- leaf = AABBNode.new(parent: nil, object: object, bounding_box: bounding_box.dup)
22
- @objects[object] = leaf
23
-
24
- insert_leaf(leaf)
25
- end
26
-
27
- def insert_leaf(leaf)
28
- @root = @root ? @root.insert_subtree(leaf) : leaf
29
- end
30
-
31
- def update(object, bounding_box)
32
- leaf = remove(object)
33
- leaf.bounding_box = bounding_box
34
- insert_leaf(leaf)
35
- end
36
-
37
- # Returns a list of all objects that collided with collider
38
- def search(collider, return_nodes = false)
39
- items = []
40
- if @root
41
- items = @root.search_subtree(collider)
42
- items.map!(&:object) unless return_nodes
43
- end
44
-
45
- items
46
- end
47
-
48
- def remove(object)
49
- leaf = @objects.delete(object)
50
- @root = @root.remove_subtree(leaf) if leaf
51
-
52
- leaf
53
- end
54
- end
55
- end
1
+ # frozen_string_literal: true
2
+
3
+ module CyberarmEngine
4
+ class AABBTree
5
+ include AABBTreeDebug
6
+
7
+ attr_reader :root, :objects, :branches, :leaves
8
+
9
+ def initialize
10
+ @objects = {}
11
+ @root = nil
12
+ @branches = 0
13
+ @leaves = 0
14
+ end
15
+
16
+ def insert(object, bounding_box)
17
+ raise "BoundingBox can't be nil!" unless bounding_box
18
+ raise "Object can't be nil!" unless object
19
+ # raise "Object already in tree!" if @objects[object] # FIXME
20
+
21
+ leaf = AABBNode.new(parent: nil, object: object, bounding_box: bounding_box.dup)
22
+ @objects[object] = leaf
23
+
24
+ insert_leaf(leaf)
25
+ end
26
+
27
+ def insert_leaf(leaf)
28
+ @root = @root ? @root.insert_subtree(leaf) : leaf
29
+ end
30
+
31
+ def update(object, bounding_box)
32
+ leaf = remove(object)
33
+ leaf.bounding_box = bounding_box
34
+ insert_leaf(leaf)
35
+ end
36
+
37
+ # Returns a list of all objects that collided with collider
38
+ def search(collider, return_nodes = false)
39
+ items = []
40
+ if @root
41
+ items = @root.search_subtree(collider)
42
+ items.map!(&:object) unless return_nodes
43
+ end
44
+
45
+ items
46
+ end
47
+
48
+ def remove(object)
49
+ leaf = @objects.delete(object)
50
+ @root = @root.remove_subtree(leaf) if leaf
51
+
52
+ leaf
53
+ end
54
+ end
55
+ end
@@ -1,29 +1,29 @@
1
- # frozen_string_literal: true
2
-
3
- module CyberarmEngine
4
- # Gets included into AABBTree
5
- module AABBTreeDebug
6
- def inspect
7
- @branches = 0
8
- @leaves = 0
9
- if @root
10
- node = @root
11
-
12
- debug_search(node.a)
13
- debug_search(node.b)
14
- end
15
-
16
- puts "<#{self.class}:#{object_id}> has #{@branches} branches and #{@leaves} leaves"
17
- end
18
-
19
- def debug_search(node)
20
- if node.leaf?
21
- @leaves += 1
22
- else
23
- @branches += 1
24
- debug_search(node.a)
25
- debug_search(node.b)
26
- end
27
- end
28
- end
29
- end
1
+ # frozen_string_literal: true
2
+
3
+ module CyberarmEngine
4
+ # Gets included into AABBTree
5
+ module AABBTreeDebug
6
+ def inspect
7
+ @branches = 0
8
+ @leaves = 0
9
+ if @root
10
+ node = @root
11
+
12
+ debug_search(node.a)
13
+ debug_search(node.b)
14
+ end
15
+
16
+ puts "<#{self.class}:#{object_id}> has #{@branches} branches and #{@leaves} leaves"
17
+ end
18
+
19
+ def debug_search(node)
20
+ if node.leaf?
21
+ @leaves += 1
22
+ else
23
+ @branches += 1
24
+ debug_search(node.a)
25
+ debug_search(node.b)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,102 +1,102 @@
1
- module CyberarmEngine
2
- class BorderCanvas
3
- attr_reader :element, :top, :right, :bottom, :left
4
-
5
- def initialize(element:)
6
- @element = element
7
-
8
- @top = Background.new
9
- @right = Background.new
10
- @bottom = Background.new
11
- @left = Background.new
12
- end
13
-
14
- def color=(color)
15
- if color.is_a?(Numeric)
16
- @top.background = color
17
- @right.background = color
18
- @bottom.background = color
19
- @left.background = color
20
-
21
- elsif color.is_a?(Gosu::Color)
22
- @top.background = color
23
- @right.background = color
24
- @bottom.background = color
25
- @left.background = color
26
-
27
- elsif color.is_a?(Array)
28
- if color.size == 1
29
- color = color.first
30
-
31
- elsif color.size == 2
32
- @top.background = color.first
33
- @right.background = color.first
34
- @bottom.background = color.last
35
- @left.background = color.last
36
-
37
- elsif color.size == 4
38
- @top.background = color[0]
39
- @right.background = color[1]
40
- @bottom.background = color[2]
41
- @left.background = color[3]
42
- else
43
- raise ArgumentError, "color array was empty or had wrong number of elements (expected 2 or 4 elements)"
44
- end
45
-
46
- elsif color.is_a?(Hash)
47
- @top.background = color[:top]
48
- @right.background = color[:right]
49
- @bottom.background = color[:bottom]
50
- @left.background = color[:left]
51
- else
52
- raise ArgumentError, "color '#{color}' of type '#{color.class}' was not able to be processed"
53
- end
54
- end
55
-
56
- def draw
57
- @top.draw
58
- @right.draw
59
- @bottom.draw
60
- @left.draw
61
- end
62
-
63
- def update
64
- # TOP
65
- @top.x = @element.x + @element.style.border_thickness_left
66
- @top.y = @element.y
67
- @top.z = @element.z
68
-
69
- @top.width = @element.width - @element.style.border_thickness_left
70
- @top.height = @element.style.border_thickness_top
71
-
72
- # RIGHT
73
- @right.x = @element.x + @element.width
74
- @right.y = @element.y + @element.style.border_thickness_top
75
- @right.z = @element.z
76
-
77
- @right.width = -@element.style.border_thickness_right
78
- @right.height = @element.height - @element.style.border_thickness_top
79
-
80
- # BOTTOM
81
- @bottom.x = @element.x
82
- @bottom.y = @element.y + @element.height
83
- @bottom.z = @element.z
84
-
85
- @bottom.width = @element.width - @element.style.border_thickness_right
86
- @bottom.height = -@element.style.border_thickness_bottom
87
-
88
- # LEFT
89
- @left.x = @element.x
90
- @left.y = @element.y
91
- @left.z = @element.z
92
-
93
- @left.width = @element.style.border_thickness_left
94
- @left.height = @element.height - @element.style.border_thickness_bottom
95
-
96
- @top.update
97
- @right.update
98
- @bottom.update
99
- @left.update
100
- end
101
- end
102
- end
1
+ module CyberarmEngine
2
+ class BorderCanvas
3
+ attr_reader :element, :top, :right, :bottom, :left
4
+
5
+ def initialize(element:)
6
+ @element = element
7
+
8
+ @top = Background.new
9
+ @right = Background.new
10
+ @bottom = Background.new
11
+ @left = Background.new
12
+ end
13
+
14
+ def color=(color)
15
+ if color.is_a?(Numeric)
16
+ @top.background = color
17
+ @right.background = color
18
+ @bottom.background = color
19
+ @left.background = color
20
+
21
+ elsif color.is_a?(Gosu::Color)
22
+ @top.background = color
23
+ @right.background = color
24
+ @bottom.background = color
25
+ @left.background = color
26
+
27
+ elsif color.is_a?(Array)
28
+ if color.size == 1
29
+ color = color.first
30
+
31
+ elsif color.size == 2
32
+ @top.background = color.first
33
+ @right.background = color.first
34
+ @bottom.background = color.last
35
+ @left.background = color.last
36
+
37
+ elsif color.size == 4
38
+ @top.background = color[0]
39
+ @right.background = color[1]
40
+ @bottom.background = color[2]
41
+ @left.background = color[3]
42
+ else
43
+ raise ArgumentError, "color array was empty or had wrong number of elements (expected 2 or 4 elements)"
44
+ end
45
+
46
+ elsif color.is_a?(Hash)
47
+ @top.background = color[:top]
48
+ @right.background = color[:right]
49
+ @bottom.background = color[:bottom]
50
+ @left.background = color[:left]
51
+ else
52
+ raise ArgumentError, "color '#{color}' of type '#{color.class}' was not able to be processed"
53
+ end
54
+ end
55
+
56
+ def draw
57
+ @top.draw
58
+ @right.draw
59
+ @bottom.draw
60
+ @left.draw
61
+ end
62
+
63
+ def update
64
+ # TOP
65
+ @top.x = @element.x + @element.styled(:margin_left) + @element.styled(:border_thickness_left)
66
+ @top.y = @element.y + @element.styled(:margin_top)
67
+ @top.z = @element.z
68
+
69
+ @top.width = @element.width - @element.styled(:border_thickness_left)
70
+ @top.height = @element.styled(:border_thickness_top)
71
+
72
+ # RIGHT
73
+ @right.x = @element.x + @element.styled(:margin_left) + @element.width
74
+ @right.y = @element.y + @element.styled(:margin_top) + @element.styled(:border_thickness_top)
75
+ @right.z = @element.z
76
+
77
+ @right.width = -@element.styled(:border_thickness_right)
78
+ @right.height = @element.height - @element.styled(:border_thickness_top)
79
+
80
+ # BOTTOM
81
+ @bottom.x = @element.x + @element.styled(:margin_left)
82
+ @bottom.y = @element.y + @element.styled(:margin_top) + @element.height
83
+ @bottom.z = @element.z
84
+
85
+ @bottom.width = @element.width - @element.styled(:border_thickness_right)
86
+ @bottom.height = -@element.styled(:border_thickness_bottom)
87
+
88
+ # LEFT
89
+ @left.x = @element.x + @element.styled(:margin_left)
90
+ @left.y = @element.y + @element.styled(:margin_top)
91
+ @left.z = @element.z
92
+
93
+ @left.width = @element.styled(:border_thickness_left)
94
+ @left.height = @element.height - @element.styled(:border_thickness_bottom)
95
+
96
+ @top.update
97
+ @right.update
98
+ @bottom.update
99
+ @left.update
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,24 @@
1
+ module CyberarmEngine
2
+ class Dialog < CyberarmEngine::GuiState
3
+ def draw
4
+ previous_state&.draw
5
+
6
+ Gosu.flush
7
+
8
+ super
9
+ end
10
+
11
+ def update
12
+ super
13
+
14
+ return unless window.current_state == self
15
+
16
+ window.states.reverse.each do |state|
17
+ # Don't update ourselves, forever
18
+ next if state == self && state.is_a?(CyberarmEngine::GuiState)
19
+
20
+ state.update
21
+ end
22
+ end
23
+ end
24
+ end