moonbirds 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1ac1faa3522772cfcd4fa687dbb7d7d916a7eac1adaf5308c8e4cf8b092a32b7
4
+ data.tar.gz: c4b31f6268acd238e47da390e06d07bc0a3518719ed315f73d18650b922f600c
5
+ SHA512:
6
+ metadata.gz: 66dcddda11a82cf0025c38fa7ec6eabb093d271c8b6ccb636b7987c0936f6632688868563f1bf21f4f872bb33fa0d2d2284fe2089a368eda2d758ea6f0015bd8
7
+ data.tar.gz: 362a0cb553d09766ab7e014b667347deb8ea12ac7237754c63317a80b10972a2c9a7eda5f7a7615b561e2a98d8f1e9413f29e18a5c7410588e7da5b0e8940353
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ### 0.0.1 / 2021-05-18
2
+
3
+ * Everything is new. First release
data/Manifest.txt ADDED
@@ -0,0 +1,9 @@
1
+ CHANGELOG.md
2
+ Manifest.txt
3
+ README.md
4
+ Rakefile
5
+ config/spritesheet.csv
6
+ config/spritesheet.png
7
+ lib/moonbirds.rb
8
+ lib/moonbirds/generator.rb
9
+ lib/moonbirds/version.rb
data/README.md ADDED
@@ -0,0 +1,179 @@
1
+ # Moonbirds (Pixel Owls 'n' Friends)
2
+
3
+ moonbirds - generate your own 42×42 pixel owl images (off chain) from text attributes (via built-in spritesheet); incl. 2x/4x/8x zoom for bigger sizes and more
4
+
5
+
6
+
7
+ * home :: [github.com/pixelartexchange/pixelart](https://github.com/pixelartexchange/pixelart)
8
+ * bugs :: [github.com/pixelartexchange/pixelart/issues](https://github.com/pixelartexchange/pixelart/issues)
9
+ * gem :: [rubygems.org/gems/moonbirds](https://rubygems.org/gems/moonbirds)
10
+ * rdoc :: [rubydoc.info/gems/moonbirds](http://rubydoc.info/gems/moonbirds)
11
+
12
+
13
+
14
+
15
+ ## Usage
16
+
17
+ Let's generate some super-rare never-before-seen
18
+ moonbirds (pixel owls):
19
+
20
+ ```ruby
21
+ require 'moonbirds'
22
+
23
+ ########
24
+ # Moonbird No. 1
25
+ bird = Moonbird::Image.generate( "Tabby Brown",
26
+ "Beak Small Orange",
27
+ "Eyes Open White" )
28
+ bird.save( "moonbird1.png" )
29
+ bird.zoom( 4 ).save( "moonbird1@4x.png" )
30
+
31
+ # let's add 3D Glasses
32
+ bird = Moonbird::Image.generate( "Tabby Brown",
33
+ "Beak Small Orange",
34
+ "Eyes Open White",
35
+ "3D Glasses" )
36
+ bird.save( "moonbird1b.png" )
37
+ bird.zoom( 4 ).save( "moonbird1b@4x.png" )
38
+
39
+ # let's add McDonald's Red (from the Fast Food Series)
40
+ bird = Moonbird::Image.generate( "Tabby Brown",
41
+ "Beak Small Orange",
42
+ "Eyes Open White",
43
+ "McDonald's Red" )
44
+ bird.zoom( 4 ).save( "moonbird1c@4x.png" )
45
+
46
+ # let's add Drive-Thru On Duty (from the Fast Food Series)
47
+ bird = Moonbird::Image.generate( "Tabby Brown",
48
+ "Beak Small Orange",
49
+ "Eyes Open White",
50
+ "McDonald's Red",
51
+ "Drive-Thru On Duty" )
52
+ bird.zoom( 4 ).save( "moonbird1d@4x.png" )
53
+
54
+ # let's add McDonald's Shirt - Old Skool (from the Fast Food Series)
55
+ bird = Moonbird::Image.generate( "Tabby Brown",
56
+ "Beak Small Orange",
57
+ "Eyes Open White",
58
+ "McDonald's Red",
59
+ "Drive-Thru On Duty",
60
+ "McDonald's Shirt (Old Skool)" )
61
+ bird.zoom( 4 ).save( "moonbird1e@4x.png" )
62
+ ```
63
+
64
+ Voila!
65
+
66
+ ![](i/moonbird1.png)
67
+ ![](i/moonbird1b.png)
68
+ ![](i/moonbird1c.png)
69
+ ![](i/moonbird1d.png)
70
+ ![](i/moonbird1e.png)
71
+
72
+ In 4x:
73
+
74
+ ![](i/moonbird1@4x.png)
75
+ ![](i/moonbird1b@4x.png)
76
+ ![](i/moonbird1c@4x.png)
77
+ ![](i/moonbird1d@4x.png)
78
+ ![](i/moonbird1e@4x.png)
79
+
80
+
81
+
82
+ ```ruby
83
+ ###
84
+ # Moonbird No. 2
85
+ bird = Moonbird::Image.generate( "Professor Golden",
86
+ "Beak Small Golden",
87
+ "Eyes Open Golden" )
88
+ bird.zoom( 4 ).save( "moonbird2@4x.png" )
89
+
90
+ # let's add Beanie
91
+ bird = Moonbird::Image.generate( "Crescent Golden",
92
+ "Beak Small Golden",
93
+ "Eyes Open Golden",
94
+ "Beanie" )
95
+ bird.zoom( 4 ).save( "moonbird2b@4x.png" )
96
+ ```
97
+
98
+ Voila!
99
+
100
+ ![](i/moonbird2.png)
101
+ ![](i/moonbird2b.png)
102
+
103
+ In 4x:
104
+
105
+ ![](i/moonbird2@4x.png)
106
+ ![](i/moonbird2b@4x.png)
107
+
108
+
109
+
110
+ ```ruby
111
+ ###
112
+ # Moonbird No. 3
113
+ bird = Moonbird::Image.generate( "Brave Glitch" )
114
+ bird.zoom( 4 ).save( "moonbird3@4x.png" )
115
+
116
+ # let's add a red background
117
+ bird = Moonbird::Image.generate( "Brave Glitch", background: 'red' )
118
+ bird.zoom( 4 ).save( "moonbird3b@4x.png" )
119
+
120
+ ```
121
+
122
+ Voila!
123
+
124
+ ![](i/moonbird3.png)
125
+ ![](i/moonbird3b.png)
126
+
127
+ In 4x:
128
+
129
+ ![](i/moonbird3@4x.png)
130
+ ![](i/moonbird3b@4x.png)
131
+
132
+
133
+ And so on.
134
+
135
+ ### Bonus - Look-Up Attributes (Via Built-In Spritesheet)
136
+
137
+
138
+ Let's look-up some attributes:
139
+
140
+ ```ruby
141
+ _3d_glasses = Moonbird::Sheet.find_by( name: '3D Glasses' )
142
+ beanie = Moonbird::Sheet.find_by( name: 'Beanie' )
143
+ chromie = Moonbird::Sheet.find_by( name: 'Chromie' )
144
+
145
+ mcdonalds_red = Moonbird::Sheet.find_by( name: "McDonald's Red" )
146
+
147
+ _3d_glasses.save( "3d_glasses.png" )
148
+ beanie.save( "beanie.png" )
149
+ chromie.save( "chromie.png" )
150
+ mcdonalds_red.save( "mcdonalds_red.png" )
151
+
152
+ _3d_glasses.zoom( 4 ).save( "3d_glasses@4x.png" )
153
+ beanie.zoom( 4 ).save( "beanie@4x.png" )
154
+ chromie.zoom( 4 ).save( "chromie@4x.png" )
155
+ mcdonalds_red.zoom( 4 ).save( "mcdonalds_red@4x.png" )
156
+ ```
157
+
158
+ Voila!
159
+
160
+ ![](i/3d_glasses.png)
161
+ ![](i/beanie.png)
162
+ ![](i/chromie.png)
163
+ ![](i/mcdonalds_red.png)
164
+
165
+ In 4x:
166
+
167
+ ![](i/3d_glasses@4x.png)
168
+ ![](i/beanie@4x.png)
169
+ ![](i/chromie@4x.png)
170
+ ![](i/mcdonalds_red@4x.png)
171
+
172
+ And so on.
173
+
174
+
175
+
176
+
177
+ ## Questions? Comments?
178
+
179
+ Post them on the [CryptoPunksDev reddit](https://old.reddit.com/r/CryptoPunksDev). Thanks.
data/Rakefile ADDED
@@ -0,0 +1,39 @@
1
+ require 'hoe'
2
+ require './lib/moonbirds/version.rb'
3
+
4
+ ###
5
+ # hack/ quick fix for broken intuit_values - overwrite with dummy
6
+ class Hoe
7
+ def intuit_values( input ); end
8
+ end
9
+
10
+
11
+
12
+ Hoe.spec 'moonbirds' do
13
+
14
+ self.version = Moonbirds::VERSION
15
+
16
+ self.summary = "moonbirds - generate your own 42×42 pixel owl images (off chain) from text attributes (via built-in spritesheet); incl. 2x/4x/8x zoom for bigger sizes and more"
17
+ self.description = summary
18
+
19
+ self.urls = { home: 'https://github.com/pixelartexchange/pixelart' }
20
+
21
+ self.author = 'Gerald Bauer'
22
+ self.email = 'wwwmake@googlegroups.com'
23
+
24
+ # switch extension to .markdown for gihub formatting
25
+ self.readme_file = 'README.md'
26
+ self.history_file = 'CHANGELOG.md'
27
+
28
+ self.extra_deps = [
29
+ ['pixelart', '>= 1.3.0'],
30
+ ['csvreader'],
31
+ ]
32
+
33
+ self.licenses = ['Public Domain']
34
+
35
+ self.spec_extras = {
36
+ required_ruby_version: '>= 2.3'
37
+ }
38
+
39
+ end
@@ -0,0 +1,218 @@
1
+ id, name, type, more_names
2
+ 0, body brave-brown, ?, brave-brown
3
+ 1, body crescent-brown, ?, crescent-brown
4
+ 2, body emperor-brown, ?, emperor-brown
5
+ 3, body guardian-brown, ?, guardian-brown
6
+ 4, body sage-brown, ?, sage-brown
7
+ 5, body stark-brown, ?, stark-brown
8
+ 6, body tabby-brown, ?, tabby-brown
9
+ 7, body tranquil-brown, ?, tranquil-brown
10
+ 8, body brave-red, ?, brave-red
11
+ 9, body crescent-red, ?, crescent-red
12
+ 10, body emperor-red, ?, emperor-red
13
+ 11, body guardian-red, ?, guardian-red
14
+ 12, body professor-red, ?, professor-red
15
+ 13, body sage-red, ?, sage-red
16
+ 14, body tabby-red, ?, tabby-red
17
+ 15, body tranquil-red, ?, tranquil-red
18
+ 16, body emperor-white, ?, emperor-white
19
+ 17, body guardian-white, ?, guardian-white
20
+ 18, body professor-white, ?, professor-white
21
+ 19, body stark-white, ?, stark-white
22
+ 20, body tabby-white, ?, tabby-white
23
+ 21, body tranquil-white, ?, tranquil-white
24
+ 22, body crescent-gray, ?, crescent-gray
25
+ 23, body emperor-gray, ?, emperor-gray
26
+ 24, body professor-gray, ?, professor-gray
27
+ 25, body tabby-gray, ?, tabby-gray
28
+ 26, body brave-black, ?, brave-black
29
+ 27, body crescent-black, ?, crescent-black
30
+ 28, body emperor-black, ?, emperor-black
31
+ 29, body stark-black, ?, stark-black
32
+ 30, body tranquil-black, ?, tranquil-black
33
+ 31, body brave-green, ?, brave-green
34
+ 32, body crescent-green, ?, crescent-green
35
+ 33, body emperor-green, ?, emperor-green
36
+ 34, body guardian-green, ?, guardian-green
37
+ 35, body crescent-pink, ?, crescent-pink
38
+ 36, body guardian-pink, ?, guardian-pink
39
+ 37, body sage-pink, ?, sage-pink
40
+ 38, body stark-pink, ?, stark-pink
41
+ 39, body tabby-pink, ?, tabby-pink
42
+ 40, body tranquil-pink, ?, tranquil-pink
43
+ 41, body brave-purple, ?, brave-purple
44
+ 42, body sage-purple, ?, sage-purple
45
+ 43, body stark-purple, ?, stark-purple
46
+ 44, body tabby-purple, ?, tabby-purple
47
+ 45, body tranquil-blue, ?, tranquil-blue
48
+ 46, body crescent-blue, ?, crescent-blue
49
+ 47, body professor-blue, ?, professor-blue
50
+ 48, body stark-blue, ?, stark-blue
51
+ 49, body crescent-golden, ?, crescent-golden
52
+ 50, body emperor-golden, ?, emperor-golden
53
+ 51, body professor-golden, ?, professor-golden
54
+ 52, body sage-golden, ?, sage-golden
55
+ 53, body ruby_skeleton, ?, ruby_skeleton
56
+ 54, body skeleton, ?, skeleton
57
+ 55, body robot, ?, robot
58
+ 56, body brave-jade, ?, brave-jade
59
+ 57, body crescent-jade, ?, crescent-jade
60
+ 58, body brave-cosmic, ?, brave-cosmic
61
+ 59, body crescent-cosmic, ?, crescent-cosmic
62
+ 60, body brave-enlightened, ?, brave-enlightened
63
+ 61, body crescent-enlightened, ?, crescent-enlightened
64
+ 62, body brave-glitch, ?, brave-glitch
65
+ 63, body guardian-glitch, ?, guardian-glitch
66
+ 64, beak small-gray, ?, small-gray
67
+ 65, beak small-orange, ?, small-orange
68
+ 66, beak small-ruby, ?, small-ruby
69
+ 67, beak small-skeleton, ?, small-skeleton
70
+ 68, beak short-skeleton, ?, short-skeleton
71
+ 69, beak long-skeleton, ?, long-skeleton
72
+ 70, beak small-robot, ?, small-robot
73
+ 71, beak short-robot, ?, short-robot
74
+ 72, beak long-robot, ?, long-robot
75
+ 73, beak small-golden, ?, small-golden
76
+ 74, eyes open-blue, ?, open-blue
77
+ 75, eyes open-green, ?, open-green
78
+ 76, eyes open-purple, ?, open-purple
79
+ 77, eyes open-red, ?, open-red
80
+ 78, eyes open-white, ?, open-white
81
+ 79, eyes adorable-skeleton, ?, adorable-skeleton
82
+ 80, eyes angry-skeleton, ?, angry-skeleton
83
+ 81, eyes open-skeleton, ?, open-skeleton
84
+ 82, eyes relaxed-skeleton, ?, relaxed-skeleton
85
+ 83, eyes angry-robot, ?, angry-robot
86
+ 84, eyes open-robot, ?, open-robot
87
+ 85, eyes angry-golden, ?, angry-golden
88
+ 86, eyes open-golden, ?, open-golden
89
+ 87, eyes side-eye-golden, ?, side-eye-golden
90
+ 88, 3D Glasses, ?,
91
+ 89, Black-Rimmed Glasses, ?,
92
+ 90, eyepatch, ?,
93
+ 91, gazelles, ?,
94
+ 92, jobs_glasses, ?,
95
+ 93, rose-colored_glasses, ?,
96
+ 94, sunglasses, ?,
97
+ 95, visor, ?,
98
+ 96, aviators, ?,
99
+ 97, chill, ?,
100
+ 98, green_shades, ?,
101
+ 99, neon_shades, ?,
102
+ 100, rainbow_shades, ?,
103
+ 101, red_shades, ?,
104
+ 102, round_glasses, ?,
105
+ 103, sunset_shades, ?,
106
+ 104, vipers, ?,
107
+ 105, Aviator's Cap, ?,
108
+ 106, backwards_hat, ?,
109
+ 107, bandana, ?,
110
+ 108, beanie, ?,
111
+ 109, bow, ?,
112
+ 110, bucket_hat, ?,
113
+ 111, Captain's Cap, ?,
114
+ 112, Cowboy Hat 1, ?, Cowboy Hat
115
+ 113, durag, ?,
116
+ 114, flowers, ?,
117
+ 115, forest_ranger, ?,
118
+ 116, headband, ?,
119
+ 117, headphones, ?,
120
+ 118, Hero's Cap, ?,
121
+ 119, karate_band, ?,
122
+ 120, lincoln, ?,
123
+ 121, Mohawk (Green), ?,
124
+ 122, Mohawk (Pink), ?,
125
+ 123, moon_hat, ?,
126
+ 124, Pirate's Hat, ?,
127
+ 125, Queen's Crown, ?,
128
+ 126, tiara, ?,
129
+ 127, Witch's Hat, ?,
130
+ 128, Wizard's Hat, ?,
131
+ 129, chromie, ?,
132
+ 130, crescent_talisman, ?,
133
+ 131, dancing_flame, ?,
134
+ 132, fire, ?,
135
+ 133, diamond, ?,
136
+ 134, grail, ?,
137
+ 135, gremplin, ?,
138
+ 136, halo, ?,
139
+ 137, raincloud, ?,
140
+ 138, rubber_duck, ?,
141
+ 139, skully, ?,
142
+ 140, tiny_crown, ?,
143
+ 141, Black Red Hat, ?,
144
+ 142, Cowboy Hat 2, ?,
145
+ 143, crown, ?,
146
+ 144, gold, ?,
147
+ 145, gray_hat, ?,
148
+ 146, blue_bucket, ?,
149
+ 147, red_bucket, ?,
150
+ 148, White Bucket, ?,
151
+ 149, star, ?,
152
+ 150, McDonald's 1, ?, McDonald's
153
+ 151, McDonald's 2, ?, McDonald's Visor
154
+ 152, McDonald's 3, ?, McDonald's Red 1 | McDonald's Red
155
+ 153, McDonald's 4, ?, McDonald's Red 2
156
+ 154, McDonald's 5, ?, McDonald's Bucket Black
157
+ 155, McDonald's 6, ?, McDonald's Black
158
+ 156, McDonald's 7, ?, McDonald's White
159
+ 157, Burger King 1, ?, Burger King
160
+ 158, Burger King 2, ?,
161
+ 159, Burger King Crown, ?,
162
+ 160, KF1 1, ?, KFC
163
+ 161, KFC 2, ?, KFC Family Bucket
164
+ 162, Chick-Fil-A, ?,
165
+ 163, Denny's, ?,
166
+ 164, Domino's 1, ?, Domino's
167
+ 165, Domino's 2, ?,
168
+ 166, Dunkin' Donuts 1, ?, Dunkin' Donuts
169
+ 167, Dunkin' Donuts 2, ?,
170
+ 168, Hooters, ?,
171
+ 169, In-N-Out 2, ?,
172
+ 170, In-N-Out 1, ?, In-N-Out
173
+ 171, wendys, ?,
174
+ 172, white_castle, ?,
175
+ 173, Pizza Hut 1, ?,
176
+ 174, Pizza Hut 2, ?,
177
+ 175, Subway 2, ?, Subway Visor
178
+ 176, Subway 1, ?, Subway
179
+ 177, Taco Bell, ?,
180
+ 178, Walmart 1 Walmart, ?,
181
+ 179, Walmart 2, ?,
182
+ 180, Starbucks 1, ?, Starbucks
183
+ 181, Starbucks 2, ?,
184
+ 182, coffee_boy, ?,
185
+ 183, Ben & Jerry's, ?,
186
+ 184, chef-red, ?,
187
+ 185, chef-white, ?,
188
+ 186, grill_cook, ?,
189
+ 187, drive-thru-on-duty, ?,
190
+ 188, burger, ?,
191
+ 189, fries, ?,
192
+ 190, chicken, ?,
193
+ 191, cola, ?,
194
+ 192, popcorn, ?,
195
+ 193, ice_cream_cone, ?,
196
+ 194, taco, ?,
197
+ 195, Hoodie, ?,
198
+ 196, Hoodie Down, ?,
199
+ 197, Punk Jacket, ?,
200
+ 198, Blue Hoodie, ?,
201
+ 199, Green Hoodie, ?,
202
+ 200, Blue Shirt, ?,
203
+ 201, Green Shirt, ?,
204
+ 202, Orange Shirt, ?,
205
+ 203, Red Shirt, ?,
206
+ 204, tee, ?,
207
+ 205, blue_scarf, ?,
208
+ 206, green_scarf, ?,
209
+ 207, red_scarf, ?,
210
+ 208, el_pollo_loco_mascot, ?,
211
+ 209, McDonald's Shirt, ?,
212
+ 210, McDonald's Shirt (Classic), ?,
213
+ 211, McDonald's Shirt (Old Skool), ?,
214
+ 212, Manager Shirt, ?,
215
+ 213, KFC Shirt, ?,
216
+ 214, Starbucks Apron 1, ?, Starbucks Apron
217
+ 215, Starbucks Apron 2, ?,
218
+ 216, hibachi, ?,
Binary file
@@ -0,0 +1,190 @@
1
+
2
+ module Moonbirds
3
+
4
+ class Metadata
5
+ class Sprite
6
+ attr_reader :id, :name, :type, :more_names
7
+
8
+ def initialize( id:,
9
+ name:,
10
+ type:,
11
+ more_names: [] )
12
+ @id = id # zero-based index eg. 0,1,2,3, etc.
13
+ @name = name
14
+ @type = type
15
+ @more_names = more_names
16
+ end
17
+ end # class Metadata::Sprite
18
+ end # class Metadata
19
+
20
+
21
+
22
+
23
+ class Generator
24
+
25
+ ######
26
+ # static helpers - (turn into "true" static self.class methods - why? why not?)
27
+ #
28
+ def self.normalize_key( str )
29
+ ## add & e.g. B&W
30
+ ## add ' e.g. McDonald's Red
31
+ str.downcase.gsub(/[ ()&°'_-]/, '').strip
32
+ end
33
+
34
+ def self.normalize_name( str )
35
+ ## normalize spaces in more names
36
+ str.strip.gsub( /[ ]{2,}/, ' ' )
37
+ end
38
+
39
+ def normalize_key( str ) self.class.normalize_key( str ); end
40
+ def normalize_name( str ) self.class.normalize_name( str ); end
41
+
42
+
43
+
44
+ def build_attributes_by_name( recs )
45
+ h = {}
46
+ recs.each_with_index do |rec|
47
+ names = [rec.name] + rec.more_names
48
+
49
+ names.each do |name|
50
+ key = normalize_key( name )
51
+
52
+ if h[ key ]
53
+ puts "!!! ERROR - attribute name is not unique:"
54
+ pp rec
55
+ puts "duplicate:"
56
+ pp h[key]
57
+ exit 1
58
+ end
59
+ h[ key ] = rec
60
+ end
61
+ end
62
+ ## pp h
63
+ h
64
+ end
65
+
66
+
67
+ def build_recs( recs ) ## build and normalize (meta data) records
68
+ ## sort by id
69
+ recs = recs.sort do |l,r|
70
+ l['id'].to_i( 10 ) <=> r['id'].to_i( 10 ) # use base10 (decimal)
71
+ end
72
+
73
+ ## assert all recs are in order by id (0 to size)
74
+ recs.each_with_index do |rec, exp_id|
75
+ id = rec['id'].to_i(10)
76
+ if id != exp_id
77
+ puts "!! ERROR - meta data record ids out-of-order - expected id #{exp_id}; got #{id}"
78
+ exit 1
79
+ end
80
+ end
81
+
82
+ ## convert to "wrapped / immutable" kind-of struct
83
+ recs = recs.map do |rec|
84
+ id = rec['id'].to_i( 10 )
85
+ name = normalize_name( rec['name'] )
86
+ type = rec['type']
87
+
88
+ more_names = (rec['more_names'] || '').split( '|' )
89
+ more_names = more_names.map {|str| normalize_name( str ) }
90
+
91
+ Metadata::Sprite.new(
92
+ id: id,
93
+ name: name,
94
+ type: type,
95
+ more_names: more_names )
96
+ end
97
+ recs
98
+ end # method build_recs
99
+
100
+
101
+
102
+ def initialize( image_path="./spritesheet.png",
103
+ meta_path="./spritesheet.csv" )
104
+ @sheet = Pixelart::ImageComposite.read( image_path, width: 42, height: 42 )
105
+ recs = CsvHash.read( meta_path )
106
+
107
+ @recs = build_recs( recs )
108
+
109
+ ## lookup by "case/space-insensitive" name / key
110
+ @attributes_by_name = build_attributes_by_name( @recs )
111
+ end
112
+
113
+
114
+ def spritesheet() @sheet; end
115
+ alias_method :sheet, :spritesheet
116
+
117
+
118
+ def records() @recs; end
119
+ alias_method :meta, :records
120
+
121
+
122
+
123
+
124
+ def find_meta( q )
125
+ key = normalize_key( q ) ## normalize q(uery) string/symbol
126
+
127
+ rec = @attributes_by_name[ key ]
128
+ if rec
129
+ puts " lookup >#{key}< => #{rec.id}: #{rec.name} / #{rec.type}"
130
+ else
131
+ puts "!! WARN - no lookup found for key >#{key}<"
132
+ end
133
+
134
+ rec
135
+ end
136
+
137
+ def find( q )
138
+ rec = find_meta( q )
139
+
140
+ ## return image if record found
141
+ rec ? @sheet[ rec.id ] : nil
142
+ end
143
+
144
+
145
+ def to_recs( *values )
146
+ recs = []
147
+
148
+ attribute_names = values
149
+
150
+ attribute_names.each do |attribute_name|
151
+ attribute = find_meta( attribute_name )
152
+ if attribute.nil?
153
+ puts "!! ERROR - attribute >#{attribute_name}< not found; sorry"
154
+ exit 1
155
+ end
156
+ recs << attribute
157
+ end
158
+
159
+ recs
160
+ end
161
+
162
+
163
+
164
+
165
+ def generate_image( *values, background: nil )
166
+
167
+ ids = if values[0].is_a?( Integer ) ## assume integer number (indexes)
168
+ values
169
+ else ## assume strings (names)
170
+ to_recs( *values ).map { |rec| rec.id }
171
+ end
172
+
173
+
174
+ img = Pixelart::Image.new( 42, 42 )
175
+
176
+ if background ## for now assume background is (simply) color
177
+ img.compose!( Pixelart::Image.new( 42, 42, background ) )
178
+ end
179
+
180
+ ids.each do |id|
181
+ img.compose!( @sheet[ id ] )
182
+ end
183
+
184
+ img
185
+ end
186
+ alias_method :generate, :generate_image
187
+
188
+ end # class Generator
189
+
190
+ end # module Moonbirds
@@ -0,0 +1,23 @@
1
+
2
+
3
+ module Moonbirds
4
+
5
+ MAJOR = 0
6
+ MINOR = 1
7
+ PATCH = 0
8
+ VERSION = [MAJOR,MINOR,PATCH].join('.')
9
+
10
+ def self.version
11
+ VERSION
12
+ end
13
+
14
+ def self.banner
15
+ "moonbirds/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in (#{root})"
16
+ end
17
+
18
+ def self.root
19
+ File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
20
+ end
21
+
22
+ end # module Moonbirds
23
+
data/lib/moonbirds.rb ADDED
@@ -0,0 +1,69 @@
1
+ ## 3rd party
2
+ require 'pixelart/base'
3
+ require 'csvreader'
4
+
5
+
6
+
7
+ ## our own code
8
+ require 'moonbirds/version' # note: let version always go first
9
+
10
+
11
+ ## forward define superclass for image
12
+ module Moonbirds
13
+ class Image < Pixelart::Image; end
14
+ end
15
+
16
+ require 'moonbirds/generator'
17
+
18
+ ###
19
+ ## add convenience pre-configurated generatored with build-in spritesheet (see config)
20
+
21
+ module Moonbirds
22
+
23
+ def self.generator
24
+ @generator ||= Generator.new( "#{root}/config/spritesheet.png",
25
+ "#{root}/config/spritesheet.csv" )
26
+ end
27
+
28
+
29
+ class Image
30
+ def self.generate( *values, background: nil )
31
+ img = Moonbirds.generator.generate( *values, background: background )
32
+ ## note: unwrap inner image before passing on to c'tor (requires ChunkyPNG image for now)
33
+ new( 42, 42, img.image )
34
+ end # method Image.generate
35
+ end # class Image
36
+
37
+
38
+ class Spritesheet
39
+ ## note: for now class used for "namespace" only
40
+ def self.find_by( name: ) ## return archetype/attribute image by name
41
+ # note: pass along name as q (query string)
42
+ Moonbirds.generator.find( name )
43
+ end
44
+ end # class Spritesheet
45
+ ## add convenience (alternate spelling) alias - why? why not?
46
+ SpriteSheet = Spritesheet
47
+ Sheet = Spritesheet
48
+ Sprite = Spritesheet
49
+ end # module Moonbirds
50
+
51
+
52
+ ### add some convenience shortcuts
53
+ MoonBirds = Moonbirds
54
+ Birds = Moonbirds
55
+ ## add singular too -why? why not?
56
+ Moonbird = Moonbirds
57
+ MoonBird = Moonbirds
58
+ Bird = Moonbirds
59
+
60
+
61
+
62
+
63
+ ###
64
+ # note: for convenience auto include Pixelart namespace!!! - why? why not?
65
+ include Pixelart
66
+
67
+
68
+
69
+ puts Moonbirds.banner # say hello
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: moonbirds
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gerald Bauer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pixelart
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: csvreader
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdoc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '7'
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '4.0'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '7'
61
+ - !ruby/object:Gem::Dependency
62
+ name: hoe
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.23'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.23'
75
+ description: moonbirds - generate your own 42×42 pixel owl images (off chain) from
76
+ text attributes (via built-in spritesheet); incl. 2x/4x/8x zoom for bigger sizes
77
+ and more
78
+ email: wwwmake@googlegroups.com
79
+ executables: []
80
+ extensions: []
81
+ extra_rdoc_files:
82
+ - CHANGELOG.md
83
+ - Manifest.txt
84
+ - README.md
85
+ files:
86
+ - CHANGELOG.md
87
+ - Manifest.txt
88
+ - README.md
89
+ - Rakefile
90
+ - config/spritesheet.csv
91
+ - config/spritesheet.png
92
+ - lib/moonbirds.rb
93
+ - lib/moonbirds/generator.rb
94
+ - lib/moonbirds/version.rb
95
+ homepage: https://github.com/pixelartexchange/pixelart
96
+ licenses:
97
+ - Public Domain
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options:
101
+ - "--main"
102
+ - README.md
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '2.3'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubygems_version: 3.3.7
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: moonbirds - generate your own 42×42 pixel owl images (off chain) from text
120
+ attributes (via built-in spritesheet); incl. 2x/4x/8x zoom for bigger sizes and
121
+ more
122
+ test_files: []