ehb_game_lib 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ehb_game_lib/media_path.rb +45 -0
- data/lib/ehb_game_lib/nes/palette.rb +20 -9
- data/lib/ehb_game_lib/nes/pvm_style_d93_palette.pal +0 -0
- data/lib/ehb_game_lib/palettes.rb +9 -0
- data/lib/ehb_game_lib/palettes/color.rb +92 -0
- data/lib/ehb_game_lib/palettes/palette.rb +48 -0
- data/lib/ehb_game_lib/palettes/sprite.rb +40 -0
- data/lib/ehb_game_lib/palettes/sprite_set/paletted.rb +31 -0
- data/lib/ehb_game_lib/palettes/sprite_set/source.rb +45 -0
- data/lib/ehb_game_lib/version.rb +1 -1
- metadata +30 -4
- data/lib/ehb_game_lib/nes/all_colors_palette.rb +0 -31
- data/lib/ehb_game_lib/nes/color.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bed38ad4e4913133709910358b6cefecc19b31806dbebf56fa0634436854df16
|
4
|
+
data.tar.gz: 6f5f10d50d575fd6318fb46ef148b779b2cb1dae36f221f9bb1f8c1c49af9ae4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56b31e0d389e0623a6eac2cef4b665b97f0bca16b3130c7f191d7d66186c5d35fd8f24e28bd1ce329433441edfffa64a77c839e5cdadefa0514abd6c1052681d
|
7
|
+
data.tar.gz: 49d76a3c978287e715977ec2c1117a437b698e1ede1a8de4c6e8f3340037198fcf8900d3459931db172e0a7011050b5be0f4c3163886b215c13f6c326db48eba
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'ehb_game_lib/palettes/sprite'
|
5
|
+
require 'ehb_game_lib/text/bitmap_font'
|
6
|
+
|
7
|
+
module EhbGameLib
|
8
|
+
class MediaPath
|
9
|
+
class << self
|
10
|
+
# @return [EhbGameLib::MediaPath]
|
11
|
+
def default
|
12
|
+
@default ||= new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Array]
|
17
|
+
def paths
|
18
|
+
@paths ||= []
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [Pathname]
|
22
|
+
def find(subpath)
|
23
|
+
paths.each do |path|
|
24
|
+
full_path = path.to_pathname.expand_path.join(subpath)
|
25
|
+
return full_path if full_path.exist?
|
26
|
+
end
|
27
|
+
raise "Subpath \"#{subpath}\" not found (Searched in: #{paths})"
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [EhbGameLib::Text::BitmapFont]
|
31
|
+
def load_bitmap_font(subpath, line_height)
|
32
|
+
::EhbGameLib::Text::BitmapFont.new(find(subpath).to_path, line_height)
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Gosu::Image]
|
36
|
+
def load_gosu_image(subpath)
|
37
|
+
::Gosu::Image.new(find(subpath).to_path, ::EhbGameLib::Palettes::Sprite.to_gosu_image_options)
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [EhbGameLib::Palettes::Sprite]
|
41
|
+
def load_sprite(subpath)
|
42
|
+
::EhbGameLib::Palettes::Sprite.from_file(find(subpath))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,20 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'ehb_game_lib/palettes/palette'
|
4
|
+
|
3
5
|
module EhbGameLib
|
4
6
|
module Nes
|
5
|
-
|
6
|
-
|
7
|
+
# Reference: http://www.firebrandx.com/nespalette.html
|
8
|
+
class Palette < ::EhbGameLib::Palettes::Palette
|
9
|
+
COLUMNS = %w[grey blue indigo purple violet red brown orange yellow lawn_green lime_green
|
10
|
+
sea_green cyan black].freeze
|
11
|
+
ROWS = %w[dd d l ll].freeze
|
7
12
|
|
8
|
-
|
9
|
-
|
13
|
+
COLUMNS.each_with_index do |c_name, c_index|
|
14
|
+
ROWS.each_with_index do |r_name, r_index|
|
15
|
+
const_set("#{c_name}_#{r_name}".upcase, r_index * 0x10 + c_index)
|
16
|
+
end
|
10
17
|
end
|
11
18
|
|
12
|
-
|
13
|
-
|
14
|
-
|
19
|
+
BLACK = BLACK_DD
|
20
|
+
WHITE = GREY_LL
|
21
|
+
TRANSPARENT = 0x3F
|
15
22
|
|
16
|
-
def
|
17
|
-
|
23
|
+
def initialize
|
24
|
+
colors = ::EhbGameLib::Palettes::Color.array_from_file(
|
25
|
+
::File.join(__dir__, 'pvm_style_d93_palette.pal')
|
26
|
+
)
|
27
|
+
colors[TRANSPARENT] = ::EhbGameLib::Palettes::Color.new(0x00, 0x00, 0x00, 0x00)
|
28
|
+
super(colors)
|
18
29
|
end
|
19
30
|
end
|
20
31
|
end
|
Binary file
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'gosu'
|
5
|
+
require 'rmagick'
|
6
|
+
|
7
|
+
module EhbGameLib
|
8
|
+
module Palettes
|
9
|
+
class Color
|
10
|
+
QUANTUM_MIN = 0
|
11
|
+
QUANTUM_MAX = 255
|
12
|
+
QUANTUM_RANGE = (QUANTUM_MIN..QUANTUM_MAX).freeze
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def validate_quantum(quantum)
|
16
|
+
raise "Not a integer: #{quantum}" unless quantum.is_a?(::Integer)
|
17
|
+
raise 'Out of bounds' unless QUANTUM_RANGE.include?(quantum)
|
18
|
+
|
19
|
+
quantum
|
20
|
+
end
|
21
|
+
|
22
|
+
def quantum_to_magick_range(quantum)
|
23
|
+
((quantum / QUANTUM_MAX.to_f) * ::Magick::QuantumRange).floor
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [Array<EhbGameLib::Palettes::Color>]
|
27
|
+
def array_from_file(file_path)
|
28
|
+
r = []
|
29
|
+
::File.open(file_path.to_s) do |file|
|
30
|
+
while (b = file.read(3))
|
31
|
+
b = b.bytes.to_a
|
32
|
+
r << ::EhbGameLib::Palettes::Color.new(b[0], b[1], b[2])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
r
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
enable_simple_cache
|
40
|
+
attr_reader :red, :green, :blue, :alpha
|
41
|
+
|
42
|
+
def initialize(red, green, blue, alpha = QUANTUM_MAX)
|
43
|
+
@red = self.class.validate_quantum(red)
|
44
|
+
@green = self.class.validate_quantum(green)
|
45
|
+
@blue = self.class.validate_quantum(blue)
|
46
|
+
@alpha = self.class.validate_quantum(alpha)
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Gosu::Color]
|
50
|
+
def gosu_color
|
51
|
+
@gosu_color ||= ::Gosu::Color.rgba(red, green, blue, alpha)
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Magick::Pixel]
|
55
|
+
def magick_pixel
|
56
|
+
@magick_pixel ||= ::Magick::Pixel.new(
|
57
|
+
*[red, green, blue, alpha].map { |n| self.class.quantum_to_magick_range(n) }
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
def names
|
62
|
+
Array(::Colorname.find(red, green, blue))
|
63
|
+
end
|
64
|
+
|
65
|
+
def rgb_to_s
|
66
|
+
values_to_s(red, green, blue)
|
67
|
+
end
|
68
|
+
|
69
|
+
def rgba_to_s
|
70
|
+
rgb_to_s + '|' + values_to_s(alpha)
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_a
|
74
|
+
[red, green, blue, alpha]
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_s
|
78
|
+
rgba_to_s
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_html
|
82
|
+
'#' + rgb_to_s
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def values_to_s(*values)
|
88
|
+
values.map { |i| i.to_s(16).rjust(2, '0') }.join.upcase
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'gosu'
|
4
|
+
require 'ehb_game_lib/palettes/color'
|
5
|
+
|
6
|
+
module EhbGameLib
|
7
|
+
module Palettes
|
8
|
+
class Palette
|
9
|
+
class << self
|
10
|
+
# @return [EhbGameLib::Palettes::Palette]
|
11
|
+
def from_file(file_path)
|
12
|
+
new(::EhbGameLib::Palettes::Color.array_from_file(file_path))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Array<Gosu::Color>]
|
17
|
+
attr_reader :colors
|
18
|
+
|
19
|
+
def initialize(colors)
|
20
|
+
colors.each_with_index do |color, index|
|
21
|
+
unless color.is_a?(::EhbGameLib::Palettes::Color)
|
22
|
+
raise "\##{index} is not a Palette::Color (#{color})"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
@colors = colors.to_a.freeze
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [EhbGameLib::Palettes::Color]
|
29
|
+
def color(index)
|
30
|
+
colors.fetch(index)
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [EhbGameLib::Palettes::Color]
|
34
|
+
def [](index)
|
35
|
+
colors.fetch(index)
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [EhbGameLib::Palettes::Palette]
|
39
|
+
def sub(*indexes)
|
40
|
+
sub_class.new(indexes.map { |index| color(index) })
|
41
|
+
end
|
42
|
+
|
43
|
+
def sub_class
|
44
|
+
::EhbGameLib::Palettes::Palette
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ehb_game_lib/media_path'
|
4
|
+
require 'rmagick'
|
5
|
+
|
6
|
+
module EhbGameLib
|
7
|
+
module Palettes
|
8
|
+
class Sprite
|
9
|
+
class << self
|
10
|
+
def from_file(file_path)
|
11
|
+
new(::Magick::Image.read(file_path.to_s).first)
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_gosu_image_options
|
15
|
+
{ retro: true, tileable: true }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
common_constructor :magick_image
|
20
|
+
|
21
|
+
# @return Gosu::Image
|
22
|
+
def gosu_image
|
23
|
+
@gosu_image ||= begin
|
24
|
+
the_path = '/tmp/temp_magick_image.png'
|
25
|
+
magick_image.write(the_path)
|
26
|
+
::Gosu::Image.new(the_path, self.class.to_gosu_image_options)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [EhbGameLib::Palettes::Sprite]
|
31
|
+
def palette_image(palette)
|
32
|
+
r = magick_image.dup
|
33
|
+
r.colors.times.each do |index|
|
34
|
+
r.colormap(index, palette.color(index).magick_pixel)
|
35
|
+
end
|
36
|
+
self.class.new(r)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module EhbGameLib
|
6
|
+
module Palettes
|
7
|
+
module SpriteSet
|
8
|
+
class Paletted
|
9
|
+
common_constructor :palette, :source_set
|
10
|
+
|
11
|
+
def [](name)
|
12
|
+
sprite(name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def sprite(name)
|
16
|
+
sprites_hash[name.to_sym] ||= source_set.sprite(name).palette_image(palette)
|
17
|
+
end
|
18
|
+
|
19
|
+
def sprites
|
20
|
+
source_set.sprites.keys.map { |name| [name, sprite(name)] }.to_h
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def sprites_hash
|
26
|
+
@sprites_hash ||= {}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'ehb_game_lib/media_path'
|
5
|
+
require 'ehb_game_lib/palettes/sprite'
|
6
|
+
|
7
|
+
module EhbGameLib
|
8
|
+
module Palettes
|
9
|
+
module SpriteSet
|
10
|
+
class Source
|
11
|
+
enable_simple_cache
|
12
|
+
common_constructor :media_path, default: [::EhbGameLib::MediaPath.default]
|
13
|
+
|
14
|
+
def add(name, sprite)
|
15
|
+
sprites_hash[name.to_sym] = sprite
|
16
|
+
reset_cache :sprites
|
17
|
+
end
|
18
|
+
|
19
|
+
def load(subpath, name = nil)
|
20
|
+
name ||= ::File.basename(subpath, '.*')
|
21
|
+
|
22
|
+
add(name, media_path.load_sprite(subpath))
|
23
|
+
end
|
24
|
+
|
25
|
+
def [](name)
|
26
|
+
sprite(name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def sprite(name)
|
30
|
+
sprites_hash.fetch(name.to_sym)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def sprites_uncached
|
36
|
+
sprites_hash.dup.freeze
|
37
|
+
end
|
38
|
+
|
39
|
+
def sprites_hash
|
40
|
+
@sprites_hash ||= {}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/ehb_game_lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ehb_game_lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo H. Bogoni
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chingu
|
@@ -66,6 +66,26 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rmagick
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.1'
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 4.1.2
|
79
|
+
type: :runtime
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - "~>"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '4.1'
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 4.1.2
|
69
89
|
- !ruby/object:Gem::Dependency
|
70
90
|
name: eac_ruby_gem_support
|
71
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,10 +155,16 @@ files:
|
|
135
155
|
- lib/ehb_game_lib/math/quadratic_equation.rb
|
136
156
|
- lib/ehb_game_lib/math/rectable_object.rb
|
137
157
|
- lib/ehb_game_lib/math/vector.rb
|
158
|
+
- lib/ehb_game_lib/media_path.rb
|
138
159
|
- lib/ehb_game_lib/nes.rb
|
139
|
-
- lib/ehb_game_lib/nes/all_colors_palette.rb
|
140
|
-
- lib/ehb_game_lib/nes/color.rb
|
141
160
|
- lib/ehb_game_lib/nes/palette.rb
|
161
|
+
- lib/ehb_game_lib/nes/pvm_style_d93_palette.pal
|
162
|
+
- lib/ehb_game_lib/palettes.rb
|
163
|
+
- lib/ehb_game_lib/palettes/color.rb
|
164
|
+
- lib/ehb_game_lib/palettes/palette.rb
|
165
|
+
- lib/ehb_game_lib/palettes/sprite.rb
|
166
|
+
- lib/ehb_game_lib/palettes/sprite_set/paletted.rb
|
167
|
+
- lib/ehb_game_lib/palettes/sprite_set/source.rb
|
142
168
|
- lib/ehb_game_lib/patches/chingu/basic_game_object.rb
|
143
169
|
- lib/ehb_game_lib/patches/gosu/font.rb
|
144
170
|
- lib/ehb_game_lib/text.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module EhbGameLib
|
4
|
-
module Nes
|
5
|
-
class AllColorsPalette
|
6
|
-
def initialize(pal_file)
|
7
|
-
@colors = []
|
8
|
-
File.open(pal_file) do |file|
|
9
|
-
while (b = file.read(3))
|
10
|
-
b = b.bytes.to_a
|
11
|
-
@colors << Gosu::Color.rgba(b[0], b[1], b[2], 0xFF)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
@colors.freeze
|
15
|
-
end
|
16
|
-
|
17
|
-
def gosu_color(i)
|
18
|
-
@colors[i]
|
19
|
-
end
|
20
|
-
|
21
|
-
def draw(x, y)
|
22
|
-
s = 32
|
23
|
-
@colors.each_with_index do |c, i|
|
24
|
-
cx = x + (i % 16) * s
|
25
|
-
cy = y + (i / 16) * s
|
26
|
-
Gosu.draw_rect(cx, cy, s, s, c)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module EhbGameLib
|
4
|
-
module Nes
|
5
|
-
class Color
|
6
|
-
attr_accessor :color_index
|
7
|
-
|
8
|
-
BLACK = 0x0F
|
9
|
-
YELLOW = 0x28
|
10
|
-
RED = 0x05
|
11
|
-
WHITE = 0x30
|
12
|
-
|
13
|
-
def initialize(all_colors, color_index)
|
14
|
-
@all_colors = all_colors
|
15
|
-
@color_index = color_index
|
16
|
-
end
|
17
|
-
|
18
|
-
def gosu_color
|
19
|
-
@all_colors.gosu_color(color_index)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|