cyberarm_engine 0.19.0 → 0.19.1
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.
- checksums.yaml +4 -4
- data/.gitignore +8 -8
- data/.rubocop.yml +7 -7
- data/.travis.yml +5 -5
- data/Gemfile +6 -6
- data/LICENSE.txt +21 -21
- data/README.md +74 -74
- data/Rakefile +10 -10
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/cyberarm_engine.gemspec +39 -39
- data/lib/cyberarm_engine/animator.rb +219 -219
- data/lib/cyberarm_engine/background.rb +179 -179
- data/lib/cyberarm_engine/background_nine_slice.rb +142 -142
- data/lib/cyberarm_engine/bounding_box.rb +150 -150
- data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
- data/lib/cyberarm_engine/cache/download_manager.rb +121 -121
- data/lib/cyberarm_engine/cache.rb +4 -4
- data/lib/cyberarm_engine/common.rb +113 -113
- data/lib/cyberarm_engine/config_file.rb +46 -46
- data/lib/cyberarm_engine/console/command.rb +157 -157
- data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
- data/lib/cyberarm_engine/console/subcommand.rb +99 -99
- data/lib/cyberarm_engine/console.rb +248 -248
- data/lib/cyberarm_engine/game_object.rb +248 -248
- data/lib/cyberarm_engine/game_state.rb +97 -97
- data/lib/cyberarm_engine/model/material.rb +21 -21
- data/lib/cyberarm_engine/model/model_object.rb +131 -131
- data/lib/cyberarm_engine/model/parser.rb +74 -74
- data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
- data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
- data/lib/cyberarm_engine/model.rb +212 -212
- data/lib/cyberarm_engine/model_cache.rb +31 -31
- data/lib/cyberarm_engine/opengl/light.rb +50 -50
- data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
- data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -38
- data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
- data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -164
- data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +298 -298
- data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -22
- data/lib/cyberarm_engine/opengl/shader.rb +406 -406
- data/lib/cyberarm_engine/opengl/texture.rb +69 -69
- data/lib/cyberarm_engine/opengl.rb +28 -28
- data/lib/cyberarm_engine/ray.rb +56 -56
- data/lib/cyberarm_engine/stats.rb +21 -21
- data/lib/cyberarm_engine/text.rb +197 -197
- data/lib/cyberarm_engine/timer.rb +23 -23
- data/lib/cyberarm_engine/transform.rb +296 -296
- data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
- data/lib/cyberarm_engine/ui/dsl.rb +139 -139
- data/lib/cyberarm_engine/ui/element.rb +488 -488
- data/lib/cyberarm_engine/ui/elements/button.rb +97 -97
- data/lib/cyberarm_engine/ui/elements/check_box.rb +54 -54
- data/lib/cyberarm_engine/ui/elements/container.rb +256 -256
- data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -179
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +263 -263
- data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
- data/lib/cyberarm_engine/ui/elements/image.rb +72 -72
- data/lib/cyberarm_engine/ui/elements/list_box.rb +88 -82
- data/lib/cyberarm_engine/ui/elements/progress.rb +51 -51
- data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
- data/lib/cyberarm_engine/ui/elements/slider.rb +104 -104
- data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
- data/lib/cyberarm_engine/ui/elements/text_block.rb +162 -162
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +65 -65
- data/lib/cyberarm_engine/ui/event.rb +54 -54
- data/lib/cyberarm_engine/ui/gui_state.rb +256 -256
- data/lib/cyberarm_engine/ui/style.rb +49 -49
- data/lib/cyberarm_engine/ui/theme.rb +207 -207
- data/lib/cyberarm_engine/vector.rb +293 -293
- data/lib/cyberarm_engine/version.rb +4 -4
- data/lib/cyberarm_engine/window.rb +120 -120
- data/lib/cyberarm_engine.rb +71 -71
- metadata +3 -3
@@ -1,121 +1,121 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
module Cache
|
3
|
-
class DownloadManager
|
4
|
-
attr_reader :downloads
|
5
|
-
|
6
|
-
def initialize(max_parallel_downloads: 4)
|
7
|
-
@max_parallel_downloads = max_parallel_downloads
|
8
|
-
@downloads = []
|
9
|
-
end
|
10
|
-
|
11
|
-
def download(url:, save_as: nil, &callback)
|
12
|
-
uri = URI(url)
|
13
|
-
save_as ||= "filename_path" # TODO: if no save_as path is provided, then get one from the Cache controller
|
14
|
-
|
15
|
-
@downloads << Download.new(uri: uri, save_as: save_as, callback: callback)
|
16
|
-
end
|
17
|
-
|
18
|
-
def status
|
19
|
-
if active_downloads > 0
|
20
|
-
:busy
|
21
|
-
else
|
22
|
-
:idle
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def progress
|
27
|
-
remaining_bytes = @downloads.map { |d| d.remaining_bytes }.sum
|
28
|
-
total_bytes = @downloads.map { |d| d.total_bytes }.sum
|
29
|
-
|
30
|
-
v = 1.0 - (remaining_bytes.to_f / total_bytes)
|
31
|
-
return 0.0 if v.nan?
|
32
|
-
|
33
|
-
v
|
34
|
-
end
|
35
|
-
|
36
|
-
def active_downloads
|
37
|
-
@downloads.select { |d| %i[pending downloading].include?(d.status) }
|
38
|
-
end
|
39
|
-
|
40
|
-
def update
|
41
|
-
@downloads.each do |download|
|
42
|
-
if download.status == :pending && active_downloads.size <= @max_parallel_downloads
|
43
|
-
download.status = :downloading
|
44
|
-
Thread.start { download.download }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def prune
|
50
|
-
@downloads.delete_if { |d| d.status == :finished || d.status == :failed }
|
51
|
-
end
|
52
|
-
|
53
|
-
class Download
|
54
|
-
attr_accessor :status
|
55
|
-
attr_reader :uri, :save_as, :callback, :remaining_bytes, :total_downloaded_bytes, :total_bytes,
|
56
|
-
:error_message, :started_at, :finished_at
|
57
|
-
|
58
|
-
def initialize(uri:, save_as:, callback: nil)
|
59
|
-
@uri = uri
|
60
|
-
@save_as = save_as
|
61
|
-
@callback = callback
|
62
|
-
|
63
|
-
@status = :pending
|
64
|
-
|
65
|
-
@remaining_bytes = 0.0
|
66
|
-
@total_downloaded_bytes = 0.0
|
67
|
-
@total_bytes = 0.0
|
68
|
-
|
69
|
-
@error_message = ""
|
70
|
-
end
|
71
|
-
|
72
|
-
def progress
|
73
|
-
v = 1.0 - (@remaining_bytes.to_f / total_bytes)
|
74
|
-
return 0.0 if v.nan?
|
75
|
-
|
76
|
-
v
|
77
|
-
end
|
78
|
-
|
79
|
-
def download
|
80
|
-
@status = :downloading
|
81
|
-
@started_at = Time.now # TODO: monotonic time
|
82
|
-
|
83
|
-
io = File.open(@save_as, "w")
|
84
|
-
streamer = lambda do |chunk, remaining_bytes, total_bytes|
|
85
|
-
io.write(chunk)
|
86
|
-
|
87
|
-
@remaining_bytes = remaining_bytes.to_f
|
88
|
-
@total_downloaded_bytes += chunk.size
|
89
|
-
@total_bytes = total_bytes.to_f
|
90
|
-
end
|
91
|
-
|
92
|
-
begin
|
93
|
-
response = Excon.get(
|
94
|
-
@uri.to_s,
|
95
|
-
middlewares: Excon.defaults[:middlewares] + [Excon::Middleware::RedirectFollower],
|
96
|
-
response_block: streamer
|
97
|
-
)
|
98
|
-
|
99
|
-
if response.status == 200
|
100
|
-
@status = :finished
|
101
|
-
@finished_at = Time.now # TODO: monotonic time
|
102
|
-
@callback.call(self) if @callback
|
103
|
-
else
|
104
|
-
@error_message = "Got a non 200 HTTP status of #{response.status}"
|
105
|
-
@status = :failed
|
106
|
-
@finished_at = Time.now # TODO: monotonic time
|
107
|
-
@callback.call(self) if @callback
|
108
|
-
end
|
109
|
-
rescue StandardError => e # TODO: cherrypick errors to cature
|
110
|
-
@status = :failed
|
111
|
-
@finished_at = Time.now # TODO: monotonic time
|
112
|
-
@error_message = e.message
|
113
|
-
@callback.call(self) if @callback
|
114
|
-
end
|
115
|
-
ensure
|
116
|
-
io.close if io
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
module Cache
|
3
|
+
class DownloadManager
|
4
|
+
attr_reader :downloads
|
5
|
+
|
6
|
+
def initialize(max_parallel_downloads: 4)
|
7
|
+
@max_parallel_downloads = max_parallel_downloads
|
8
|
+
@downloads = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def download(url:, save_as: nil, &callback)
|
12
|
+
uri = URI(url)
|
13
|
+
save_as ||= "filename_path" # TODO: if no save_as path is provided, then get one from the Cache controller
|
14
|
+
|
15
|
+
@downloads << Download.new(uri: uri, save_as: save_as, callback: callback)
|
16
|
+
end
|
17
|
+
|
18
|
+
def status
|
19
|
+
if active_downloads > 0
|
20
|
+
:busy
|
21
|
+
else
|
22
|
+
:idle
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def progress
|
27
|
+
remaining_bytes = @downloads.map { |d| d.remaining_bytes }.sum
|
28
|
+
total_bytes = @downloads.map { |d| d.total_bytes }.sum
|
29
|
+
|
30
|
+
v = 1.0 - (remaining_bytes.to_f / total_bytes)
|
31
|
+
return 0.0 if v.nan?
|
32
|
+
|
33
|
+
v
|
34
|
+
end
|
35
|
+
|
36
|
+
def active_downloads
|
37
|
+
@downloads.select { |d| %i[pending downloading].include?(d.status) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def update
|
41
|
+
@downloads.each do |download|
|
42
|
+
if download.status == :pending && active_downloads.size <= @max_parallel_downloads
|
43
|
+
download.status = :downloading
|
44
|
+
Thread.start { download.download }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def prune
|
50
|
+
@downloads.delete_if { |d| d.status == :finished || d.status == :failed }
|
51
|
+
end
|
52
|
+
|
53
|
+
class Download
|
54
|
+
attr_accessor :status
|
55
|
+
attr_reader :uri, :save_as, :callback, :remaining_bytes, :total_downloaded_bytes, :total_bytes,
|
56
|
+
:error_message, :started_at, :finished_at
|
57
|
+
|
58
|
+
def initialize(uri:, save_as:, callback: nil)
|
59
|
+
@uri = uri
|
60
|
+
@save_as = save_as
|
61
|
+
@callback = callback
|
62
|
+
|
63
|
+
@status = :pending
|
64
|
+
|
65
|
+
@remaining_bytes = 0.0
|
66
|
+
@total_downloaded_bytes = 0.0
|
67
|
+
@total_bytes = 0.0
|
68
|
+
|
69
|
+
@error_message = ""
|
70
|
+
end
|
71
|
+
|
72
|
+
def progress
|
73
|
+
v = 1.0 - (@remaining_bytes.to_f / total_bytes)
|
74
|
+
return 0.0 if v.nan?
|
75
|
+
|
76
|
+
v
|
77
|
+
end
|
78
|
+
|
79
|
+
def download
|
80
|
+
@status = :downloading
|
81
|
+
@started_at = Time.now # TODO: monotonic time
|
82
|
+
|
83
|
+
io = File.open(@save_as, "w")
|
84
|
+
streamer = lambda do |chunk, remaining_bytes, total_bytes|
|
85
|
+
io.write(chunk)
|
86
|
+
|
87
|
+
@remaining_bytes = remaining_bytes.to_f
|
88
|
+
@total_downloaded_bytes += chunk.size
|
89
|
+
@total_bytes = total_bytes.to_f
|
90
|
+
end
|
91
|
+
|
92
|
+
begin
|
93
|
+
response = Excon.get(
|
94
|
+
@uri.to_s,
|
95
|
+
middlewares: Excon.defaults[:middlewares] + [Excon::Middleware::RedirectFollower],
|
96
|
+
response_block: streamer
|
97
|
+
)
|
98
|
+
|
99
|
+
if response.status == 200
|
100
|
+
@status = :finished
|
101
|
+
@finished_at = Time.now # TODO: monotonic time
|
102
|
+
@callback.call(self) if @callback
|
103
|
+
else
|
104
|
+
@error_message = "Got a non 200 HTTP status of #{response.status}"
|
105
|
+
@status = :failed
|
106
|
+
@finished_at = Time.now # TODO: monotonic time
|
107
|
+
@callback.call(self) if @callback
|
108
|
+
end
|
109
|
+
rescue StandardError => e # TODO: cherrypick errors to cature
|
110
|
+
@status = :failed
|
111
|
+
@finished_at = Time.now # TODO: monotonic time
|
112
|
+
@error_message = e.message
|
113
|
+
@callback.call(self) if @callback
|
114
|
+
end
|
115
|
+
ensure
|
116
|
+
io.close if io
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
module Cache
|
3
|
-
end
|
4
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
module Cache
|
3
|
+
end
|
4
|
+
end
|
@@ -1,113 +1,113 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
module Common
|
3
|
-
def push_state(klass, options = {})
|
4
|
-
window.push_state(klass, options)
|
5
|
-
end
|
6
|
-
|
7
|
-
def current_state
|
8
|
-
window.current_state
|
9
|
-
end
|
10
|
-
|
11
|
-
def previous_state
|
12
|
-
window.previous_state
|
13
|
-
end
|
14
|
-
|
15
|
-
def pop_state
|
16
|
-
window.pop_state
|
17
|
-
end
|
18
|
-
|
19
|
-
def shift_state
|
20
|
-
window.shift_state
|
21
|
-
end
|
22
|
-
|
23
|
-
def show_cursor
|
24
|
-
window.show_cursor
|
25
|
-
end
|
26
|
-
|
27
|
-
def show_cursor=(boolean)
|
28
|
-
window.show_cursor = boolean
|
29
|
-
end
|
30
|
-
|
31
|
-
def draw_rect(x, y, width, height, color, z = 0, mode = :default)
|
32
|
-
Gosu.draw_rect(x, y, width, height, color, z, mode)
|
33
|
-
end
|
34
|
-
|
35
|
-
def fill(color, z = 0)
|
36
|
-
draw_rect(0, 0, window.width, window.height, color, z)
|
37
|
-
end
|
38
|
-
|
39
|
-
def lighten(color, amount = 25)
|
40
|
-
if defined?(color.alpha)
|
41
|
-
Gosu::Color.rgba(color.red + amount, color.green + amount, color.blue + amount, color.alpha)
|
42
|
-
else
|
43
|
-
Gosu::Color.rgb(color.red + amount, color.green + amount, color.blue + amount)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def darken(color, amount = 25)
|
48
|
-
if defined?(color.alpha)
|
49
|
-
Gosu::Color.rgba(color.red - amount, color.green - amount, color.blue - amount, color.alpha)
|
50
|
-
else
|
51
|
-
Gosu::Color.rgb(color.red - amount, color.green - amount, color.blue - amount)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def opacity(color, ratio = 1.0)
|
56
|
-
alpha = 255 * ratio
|
57
|
-
|
58
|
-
Gosu::Color.rgba(color.red, color.green, color.blue, alpha)
|
59
|
-
end
|
60
|
-
|
61
|
-
def get_asset(path, hash, klass, retro = false, tileable = false)
|
62
|
-
asset = nil
|
63
|
-
hash.detect do |_asset, instance|
|
64
|
-
if _asset == path
|
65
|
-
asset = instance
|
66
|
-
true
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
unless asset
|
71
|
-
instance = nil
|
72
|
-
instance = if klass == Gosu::Image
|
73
|
-
klass.new(path, retro: retro, tileable: tileable)
|
74
|
-
else
|
75
|
-
klass.new(path)
|
76
|
-
end
|
77
|
-
|
78
|
-
hash[path] = instance
|
79
|
-
asset = instance
|
80
|
-
end
|
81
|
-
|
82
|
-
asset
|
83
|
-
end
|
84
|
-
|
85
|
-
def get_image(path, retro: false, tileable: false)
|
86
|
-
get_asset(path, Window::IMAGES, Gosu::Image, retro, tileable)
|
87
|
-
end
|
88
|
-
|
89
|
-
def get_sample(path)
|
90
|
-
get_asset(path, Window::SAMPLES, Gosu::Sample)
|
91
|
-
end
|
92
|
-
|
93
|
-
def get_song(path)
|
94
|
-
get_asset(path, Window::SONGS, Gosu::Song)
|
95
|
-
end
|
96
|
-
|
97
|
-
def window
|
98
|
-
$window
|
99
|
-
end
|
100
|
-
|
101
|
-
def control_down?
|
102
|
-
Gosu.button_down?(Gosu::KB_LEFT_CONTROL) || Gosu.button_down?(Gosu::KB_RIGHT_CONTROL)
|
103
|
-
end
|
104
|
-
|
105
|
-
def shift_down?
|
106
|
-
Gosu.button_down?(Gosu::KB_LEFT_SHIFT) || Gosu.button_down?(Gosu::KB_RIGHT_SHIFT)
|
107
|
-
end
|
108
|
-
|
109
|
-
def alt_down?
|
110
|
-
Gosu.button_down?(Gosu::KB_LEFT_ALT) || Gosu.button_down?(Gosu::KB_RIGHT_ALT)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
module Common
|
3
|
+
def push_state(klass, options = {})
|
4
|
+
window.push_state(klass, options)
|
5
|
+
end
|
6
|
+
|
7
|
+
def current_state
|
8
|
+
window.current_state
|
9
|
+
end
|
10
|
+
|
11
|
+
def previous_state
|
12
|
+
window.previous_state
|
13
|
+
end
|
14
|
+
|
15
|
+
def pop_state
|
16
|
+
window.pop_state
|
17
|
+
end
|
18
|
+
|
19
|
+
def shift_state
|
20
|
+
window.shift_state
|
21
|
+
end
|
22
|
+
|
23
|
+
def show_cursor
|
24
|
+
window.show_cursor
|
25
|
+
end
|
26
|
+
|
27
|
+
def show_cursor=(boolean)
|
28
|
+
window.show_cursor = boolean
|
29
|
+
end
|
30
|
+
|
31
|
+
def draw_rect(x, y, width, height, color, z = 0, mode = :default)
|
32
|
+
Gosu.draw_rect(x, y, width, height, color, z, mode)
|
33
|
+
end
|
34
|
+
|
35
|
+
def fill(color, z = 0)
|
36
|
+
draw_rect(0, 0, window.width, window.height, color, z)
|
37
|
+
end
|
38
|
+
|
39
|
+
def lighten(color, amount = 25)
|
40
|
+
if defined?(color.alpha)
|
41
|
+
Gosu::Color.rgba(color.red + amount, color.green + amount, color.blue + amount, color.alpha)
|
42
|
+
else
|
43
|
+
Gosu::Color.rgb(color.red + amount, color.green + amount, color.blue + amount)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def darken(color, amount = 25)
|
48
|
+
if defined?(color.alpha)
|
49
|
+
Gosu::Color.rgba(color.red - amount, color.green - amount, color.blue - amount, color.alpha)
|
50
|
+
else
|
51
|
+
Gosu::Color.rgb(color.red - amount, color.green - amount, color.blue - amount)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def opacity(color, ratio = 1.0)
|
56
|
+
alpha = 255 * ratio
|
57
|
+
|
58
|
+
Gosu::Color.rgba(color.red, color.green, color.blue, alpha)
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_asset(path, hash, klass, retro = false, tileable = false)
|
62
|
+
asset = nil
|
63
|
+
hash.detect do |_asset, instance|
|
64
|
+
if _asset == path
|
65
|
+
asset = instance
|
66
|
+
true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
unless asset
|
71
|
+
instance = nil
|
72
|
+
instance = if klass == Gosu::Image
|
73
|
+
klass.new(path, retro: retro, tileable: tileable)
|
74
|
+
else
|
75
|
+
klass.new(path)
|
76
|
+
end
|
77
|
+
|
78
|
+
hash[path] = instance
|
79
|
+
asset = instance
|
80
|
+
end
|
81
|
+
|
82
|
+
asset
|
83
|
+
end
|
84
|
+
|
85
|
+
def get_image(path, retro: false, tileable: false)
|
86
|
+
get_asset(path, Window::IMAGES, Gosu::Image, retro, tileable)
|
87
|
+
end
|
88
|
+
|
89
|
+
def get_sample(path)
|
90
|
+
get_asset(path, Window::SAMPLES, Gosu::Sample)
|
91
|
+
end
|
92
|
+
|
93
|
+
def get_song(path)
|
94
|
+
get_asset(path, Window::SONGS, Gosu::Song)
|
95
|
+
end
|
96
|
+
|
97
|
+
def window
|
98
|
+
$window
|
99
|
+
end
|
100
|
+
|
101
|
+
def control_down?
|
102
|
+
Gosu.button_down?(Gosu::KB_LEFT_CONTROL) || Gosu.button_down?(Gosu::KB_RIGHT_CONTROL)
|
103
|
+
end
|
104
|
+
|
105
|
+
def shift_down?
|
106
|
+
Gosu.button_down?(Gosu::KB_LEFT_SHIFT) || Gosu.button_down?(Gosu::KB_RIGHT_SHIFT)
|
107
|
+
end
|
108
|
+
|
109
|
+
def alt_down?
|
110
|
+
Gosu.button_down?(Gosu::KB_LEFT_ALT) || Gosu.button_down?(Gosu::KB_RIGHT_ALT)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -1,46 +1,46 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class ConfigFile
|
3
|
-
def initialize(file:)
|
4
|
-
@file = file
|
5
|
-
|
6
|
-
if File.exist?(@file)
|
7
|
-
deserialize
|
8
|
-
else
|
9
|
-
@data = {}
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def []=(*keys, value)
|
14
|
-
last_key = keys.last
|
15
|
-
|
16
|
-
if keys.size == 1
|
17
|
-
hash = @data
|
18
|
-
else
|
19
|
-
keys.pop
|
20
|
-
hash = @data[keys.shift] ||= {}
|
21
|
-
|
22
|
-
keys.each do |key|
|
23
|
-
hash = hash[key] ||= {}
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
hash[last_key] = value
|
28
|
-
end
|
29
|
-
|
30
|
-
def get(*keys)
|
31
|
-
@data.dig(*keys)
|
32
|
-
end
|
33
|
-
|
34
|
-
def serialize
|
35
|
-
JSON.dump(@data)
|
36
|
-
end
|
37
|
-
|
38
|
-
def deserialize
|
39
|
-
@data = JSON.parse(File.read(@file), symbolize_names: true)
|
40
|
-
end
|
41
|
-
|
42
|
-
def save!
|
43
|
-
File.open(@file, "w") { |f| f.write(serialize) }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class ConfigFile
|
3
|
+
def initialize(file:)
|
4
|
+
@file = file
|
5
|
+
|
6
|
+
if File.exist?(@file)
|
7
|
+
deserialize
|
8
|
+
else
|
9
|
+
@data = {}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def []=(*keys, value)
|
14
|
+
last_key = keys.last
|
15
|
+
|
16
|
+
if keys.size == 1
|
17
|
+
hash = @data
|
18
|
+
else
|
19
|
+
keys.pop
|
20
|
+
hash = @data[keys.shift] ||= {}
|
21
|
+
|
22
|
+
keys.each do |key|
|
23
|
+
hash = hash[key] ||= {}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
hash[last_key] = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def get(*keys)
|
31
|
+
@data.dig(*keys)
|
32
|
+
end
|
33
|
+
|
34
|
+
def serialize
|
35
|
+
JSON.dump(@data)
|
36
|
+
end
|
37
|
+
|
38
|
+
def deserialize
|
39
|
+
@data = JSON.parse(File.read(@file), symbolize_names: true)
|
40
|
+
end
|
41
|
+
|
42
|
+
def save!
|
43
|
+
File.open(@file, "w") { |f| f.write(serialize) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|