punkmaker 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f6692eb9ea8a32eb0d6f104039bba563dec993e5bebc83b771e18095e48b5f0d
4
- data.tar.gz: 39ef67f256eba06343e750875e39627e73962cf159d2a81b3fee71c44edd041f
3
+ metadata.gz: 44a12cf90683dcbdc1289eb5272daa165010d4e86bd0c31c9eca9d9f6cbfef42
4
+ data.tar.gz: 83ea621299ee91bd119ac9583cfc7df5b75ff0efe2e02b5e50e6225f9ba721a3
5
5
  SHA512:
6
- metadata.gz: 10e1f2e5cb734d461c66586eea4b8312c7fdf1251ca03fe9b36b37851aadf308a03fd7322d05388f45041915ece2420da40b225e1f02afd6dff0410dcd7ee201
7
- data.tar.gz: 5444664fa42726421e0ce510a69873249ac8d46b2c533dd7da118c429b49acdd1d8cc7a3b57873d660c51ad3ea6aacb12d9ae1eded5650435ff21d41f9b38ddd
6
+ metadata.gz: 5e94379084c7172fc7be35986e4f9033287ef42a99bd9aac91c7e2c50087b928051463c6c2e1c615e4b620c72f225158f16b642cad895343b65a1adf75bfbd3d
7
+ data.tar.gz: 93fe49aeb67af85fd2fea30d79db2deced0931e38f05ae8d7bbc2b916ab72f02af3568a90989dad8d0ce2246b21308209ecdd969597772c9e2943dabf5034696
data/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ### 0.2.0
1
+ ### 0.3.1
2
2
  ### 0.0.1 / 2023-04-20
3
3
 
4
4
  * Everything is new. First release
data/Manifest.txt CHANGED
@@ -2,12 +2,36 @@ CHANGELOG.md
2
2
  Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
+ config/alien-female.png
6
+ config/alien-male.png
7
+ config/ape-female.png
8
+ config/ape-male.png
9
+ config/demon-female.png
10
+ config/demon-male.png
5
11
  config/human-female4.png
6
12
  config/human-male4.png
7
13
  config/mummy-female.png
8
14
  config/mummy-male.png
15
+ config/orc-female.png
16
+ config/orc-male.png
17
+ config/robot-female.png
18
+ config/robot-male.png
19
+ config/skeleton-female.png
20
+ config/skeleton-male.png
21
+ config/vampire-female.png
22
+ config/vampire-male.png
23
+ config/zombie-female.png
24
+ config/zombie-male.png
9
25
  lib/punkmaker.rb
26
+ lib/punkmaker/alien.rb
27
+ lib/punkmaker/ape.rb
28
+ lib/punkmaker/demon.rb
10
29
  lib/punkmaker/hair.rb
11
30
  lib/punkmaker/human.rb
12
31
  lib/punkmaker/mummy.rb
32
+ lib/punkmaker/orc.rb
33
+ lib/punkmaker/robot.rb
34
+ lib/punkmaker/skeleton.rb
35
+ lib/punkmaker/vampire.rb
13
36
  lib/punkmaker/version.rb
37
+ lib/punkmaker/zombie.rb
data/README.md CHANGED
@@ -11,6 +11,7 @@ punkmaker gem - make your own (pixel) punk base (archetype) heads incl. humans,
11
11
 
12
12
 
13
13
 
14
+
14
15
  ## Usage
15
16
 
16
17
  Let's make golden punks...
@@ -20,8 +21,6 @@ require 'punkmaker'
20
21
 
21
22
  GOLD = '#ffd700'
22
23
 
23
- ###
24
- # humans
25
24
  punk_m = Punk::Human.make( GOLD, gender: 'm' )
26
25
  punk_m.save( 'human-male_gold.png' )
27
26
  punk_m.zoom(4).save( 'human-male_gold@4x.png' )
@@ -29,16 +28,6 @@ punk_m.zoom(4).save( 'human-male_gold@4x.png' )
29
28
  punk_f = Punk::Human.make( GOLD, gender: 'f' )
30
29
  punk_f.save( 'human-female_gold.png' )
31
30
  punk_f.zoom(4).save( 'human-female_gold@4x.png' )
32
-
33
- ###
34
- # mummies
35
- punk_m = Punk::Mummy.make( GOLD, gender: 'm' )
36
- punk_m.save( 'mummy-male_gold.png' )
37
- punk_m.zoom(4).save( 'mummy-male_gold@4x.png' )
38
-
39
- punk_f = Punk::Mummy.make( GOLD, gender: 'f' )
40
- punk_f.save( 'mummy-female_gold.png' )
41
- punk_f.zoom(4).save( 'mummy-female_gold@4x.png' )
42
31
  ```
43
32
 
44
33
 
@@ -47,17 +36,247 @@ Voila!
47
36
  ![](i/human-male_gold.png)
48
37
  ![](i/human-female_gold.png)
49
38
 
50
- ![](i/mummy-male_gold.png)
51
- ![](i/mummy-female_gold.png)
52
-
53
39
  4x
54
40
 
55
41
  ![](i/human-male_gold@4x.png)
56
42
  ![](i/human-female_gold@4x.png)
57
43
 
58
- ![](i/mummy-male_gold@4x.png)
44
+
45
+
46
+ Let's try some more base (arche)types:
47
+
48
+ ``` ruby
49
+ types = [
50
+ Punk::Mummy,
51
+ Punk::Alien,
52
+ Punk::Ape,
53
+ Punk::Skeleton,
54
+ Punk::Zombie,
55
+ Punk::Demon,
56
+ Punk::Orc,
57
+ Punk::Robot,
58
+ Punk::Vampire,
59
+ ]
60
+
61
+ types.each do |type|
62
+ ## get last name e.g. Orc from Punk::Orc
63
+ name = type.name.split('::')[-1].downcase
64
+
65
+ punk_m = type.make( GOLD, gender: 'm' )
66
+ punk_m.save( "#{name}-male_gold.png" )
67
+ punk_m.zoom(4).save( "#{name}-male_gold@4x.png" )
68
+
69
+ punk_f = type.make( GOLD, gender: 'f' )
70
+ punk_f.save( "#{name}-female_gold.png" )
71
+ punk_f.zoom(4).save( "#{name}-female_gold@4x.png" )
72
+ end
73
+ ```
74
+
75
+ Voila!
76
+
77
+ ![](i/mummy-male_gold.png)
78
+ ![](i/alien-male_gold.png)
79
+ ![](i/ape-male_gold.png)
80
+ ![](i/skeleton-male_gold.png)
81
+ ![](i/zombie-male_gold.png)
82
+ ![](i/demon-male_gold.png)
83
+ ![](i/orc-male_gold.png)
84
+ ![](i/robot-male_gold.png)
85
+ ![](i/vampire-male_gold.png) <br>
86
+ ![](i/mummy-female_gold.png)
87
+ ![](i/alien-female_gold.png)
88
+ ![](i/ape-female_gold.png)
89
+ ![](i/skeleton-female_gold.png)
90
+ ![](i/zombie-female_gold.png)
91
+ ![](i/demon-female_gold.png)
92
+ ![](i/orc-female_gold.png)
93
+ ![](i/robot-female_gold.png)
94
+ ![](i/vampire-female_gold.png)
95
+
96
+ 4x
97
+
98
+ ![](i/mummy-male_gold@4x.png)
99
+ ![](i/alien-male_gold@4x.png)
100
+ ![](i/ape-male_gold@4x.png)
101
+ ![](i/skeleton-male_gold@4x.png)
102
+ ![](i/zombie-male_gold@4x.png)
103
+ ![](i/demon-male_gold@4x.png)
104
+ ![](i/orc-male_gold@4x.png)
105
+ ![](i/robot-male_gold@4x.png)
106
+ ![](i/vampire-male_gold@4x.png) <br>
59
107
  ![](i/mummy-female_gold@4x.png)
108
+ ![](i/alien-female_gold@4x.png)
109
+ ![](i/ape-female_gold@4x.png)
110
+ ![](i/skeleton-female_gold@4x.png)
111
+ ![](i/zombie-female_gold@4x.png)
112
+ ![](i/demon-female_gold@4x.png)
113
+ ![](i/orc-female_gold@4x.png)
114
+ ![](i/robot-female_gold@4x.png)
115
+ ![](i/vampire-female_gold@4x.png)
116
+
117
+
118
+ Let's try some more colors:
119
+
120
+ ```ruby
121
+ NEONGREEN = '#c3ff00'
122
+ DEEPPINK = '#ff1493'
123
+ DEEPPURPLE = '#aa4399'
124
+
125
+
126
+ colors = {
127
+ 'green' => NEONGREEN,
128
+ 'pink' => DEEPPINK,
129
+ 'purple' => DEEPPURPLE,
130
+ }
131
+
132
+ types = [Punk::Human]+types ## add human first
133
+
134
+ types.each do |type|
135
+ ## get last name e.g. Orc from Punk::Orc
136
+ name = type.name.split('::')[-1].downcase
137
+ colors.each do |color_name, color|
138
+ punk_m = type.make( color, gender: 'm' )
139
+ punk_m.save( "#{name}-male_#{color_name}.png" )
140
+ punk_m.zoom(4).save( "#{name}-male_#{color_name}@4x.png" )
141
+
142
+ punk_f = type.make( color, gender: 'f' )
143
+ punk_f.save( "#{name}-female_#{color_name}.png" )
144
+ punk_f.zoom(4).save( "#{name}-female_#{color_name}@4x.png" )
145
+ end
146
+ end
147
+ ```
148
+
149
+ Voila!
150
+
151
+ ![](i/human-male_green.png)
152
+ ![](i/mummy-male_green.png)
153
+ ![](i/alien-male_green.png)
154
+ ![](i/ape-male_green.png)
155
+ ![](i/skeleton-male_green.png)
156
+ ![](i/zombie-male_green.png)
157
+ ![](i/demon-male_green.png)
158
+ ![](i/orc-male_green.png)
159
+ ![](i/robot-male_green.png)
160
+ ![](i/vampire-male_green.png) <br>
161
+ ![](i/human-female_green.png)
162
+ ![](i/mummy-female_green.png)
163
+ ![](i/alien-female_green.png)
164
+ ![](i/ape-female_green.png)
165
+ ![](i/skeleton-female_green.png)
166
+ ![](i/zombie-female_green.png)
167
+ ![](i/demon-female_green.png)
168
+ ![](i/orc-female_green.png)
169
+ ![](i/robot-female_green.png)
170
+ ![](i/vampire-female_green.png) <br>
171
+ ![](i/human-male_pink.png)
172
+ ![](i/mummy-male_pink.png)
173
+ ![](i/alien-male_pink.png)
174
+ ![](i/ape-male_pink.png)
175
+ ![](i/skeleton-male_pink.png)
176
+ ![](i/zombie-male_pink.png)
177
+ ![](i/demon-male_pink.png)
178
+ ![](i/orc-male_pink.png)
179
+ ![](i/robot-male_pink.png)
180
+ ![](i/vampire-male_pink.png) <br>
181
+ ![](i/human-female_pink.png)
182
+ ![](i/mummy-female_pink.png)
183
+ ![](i/alien-female_pink.png)
184
+ ![](i/ape-female_pink.png)
185
+ ![](i/skeleton-female_pink.png)
186
+ ![](i/zombie-female_pink.png)
187
+ ![](i/demon-female_pink.png)
188
+ ![](i/orc-female_pink.png)
189
+ ![](i/robot-female_pink.png)
190
+ ![](i/vampire-female_pink.png) <br>
191
+ ![](i/human-male_purple.png)
192
+ ![](i/mummy-male_purple.png)
193
+ ![](i/alien-male_purple.png)
194
+ ![](i/ape-male_purple.png)
195
+ ![](i/skeleton-male_purple.png)
196
+ ![](i/zombie-male_purple.png)
197
+ ![](i/demon-male_purple.png)
198
+ ![](i/orc-male_purple.png)
199
+ ![](i/robot-male_purple.png)
200
+ ![](i/vampire-male_purple.png) <br>
201
+ ![](i/human-female_purple.png)
202
+ ![](i/mummy-female_purple.png)
203
+ ![](i/alien-female_purple.png)
204
+ ![](i/ape-female_purple.png)
205
+ ![](i/skeleton-female_purple.png)
206
+ ![](i/zombie-female_purple.png)
207
+ ![](i/demon-female_purple.png)
208
+ ![](i/orc-female_purple.png)
209
+ ![](i/robot-female_purple.png)
210
+ ![](i/vampire-female_purple.png)
211
+
212
+
213
+
214
+ 4x
60
215
 
216
+ ![](i/human-male_green@4x.png)
217
+ ![](i/mummy-male_green@4x.png)
218
+ ![](i/alien-male_green@4x.png)
219
+ ![](i/ape-male_green@4x.png)
220
+ ![](i/skeleton-male_green@4x.png)
221
+ ![](i/zombie-male_green@4x.png)
222
+ ![](i/demon-male_green@4x.png)
223
+ ![](i/orc-male_green@4x.png)
224
+ ![](i/robot-male_green@4x.png)
225
+ ![](i/vampire-male_green@4x.png) <br>
226
+ ![](i/human-female_green@4x.png)
227
+ ![](i/mummy-female_green@4x.png)
228
+ ![](i/alien-female_green@4x.png)
229
+ ![](i/ape-female_green@4x.png)
230
+ ![](i/skeleton-female_green@4x.png)
231
+ ![](i/zombie-female_green@4x.png)
232
+ ![](i/demon-female_green@4x.png)
233
+ ![](i/orc-female_green@4x.png)
234
+ ![](i/robot-female_green@4x.png)
235
+ ![](i/vampire-female_green@4x.png) <br>
236
+ ![](i/human-male_pink@4x.png)
237
+ ![](i/mummy-male_pink@4x.png)
238
+ ![](i/alien-male_pink@4x.png)
239
+ ![](i/ape-male_pink@4x.png)
240
+ ![](i/skeleton-male_pink@4x.png)
241
+ ![](i/zombie-male_pink@4x.png)
242
+ ![](i/demon-male_pink@4x.png)
243
+ ![](i/orc-male_pink@4x.png)
244
+ ![](i/robot-male_pink@4x.png)
245
+ ![](i/vampire-male_pink@4x.png) <br>
246
+ ![](i/human-female_pink@4x.png)
247
+ ![](i/mummy-female_pink@4x.png)
248
+ ![](i/alien-female_pink@4x.png)
249
+ ![](i/ape-female_pink@4x.png)
250
+ ![](i/skeleton-female_pink@4x.png)
251
+ ![](i/zombie-female_pink@4x.png)
252
+ ![](i/demon-female_pink@4x.png)
253
+ ![](i/orc-female_pink@4x.png)
254
+ ![](i/robot-female_pink@4x.png)
255
+ ![](i/vampire-female_pink@4x.png) <br>
256
+ ![](i/human-male_purple@4x.png)
257
+ ![](i/mummy-male_purple@4x.png)
258
+ ![](i/alien-male_purple@4x.png)
259
+ ![](i/ape-male_purple@4x.png)
260
+ ![](i/skeleton-male_purple@4x.png)
261
+ ![](i/zombie-male_purple@4x.png)
262
+ ![](i/demon-male_purple@4x.png)
263
+ ![](i/orc-male_purple@4x.png)
264
+ ![](i/robot-male_purple@4x.png)
265
+ ![](i/vampire-male_purple@4x.png) <br>
266
+ ![](i/human-female_purple@4x.png)
267
+ ![](i/mummy-female_purple@4x.png)
268
+ ![](i/alien-female_purple@4x.png)
269
+ ![](i/ape-female_purple@4x.png)
270
+ ![](i/skeleton-female_purple@4x.png)
271
+ ![](i/zombie-female_purple@4x.png)
272
+ ![](i/demon-female_purple@4x.png)
273
+ ![](i/orc-female_purple@4x.png)
274
+ ![](i/robot-female_purple@4x.png)
275
+ ![](i/vampire-female_purple@4x.png)
276
+
277
+
278
+
279
+ That's it.
61
280
 
62
281
 
63
282
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,105 @@
1
+
2
+
3
+ module Punk
4
+
5
+ module Alien ## make it a class - why? why not?
6
+
7
+ BASE_M = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/alien-male.png" )
8
+ BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/alien-female.png" )
9
+
10
+
11
+ def self.make( color=nil,
12
+ shine: true,
13
+ gender: 'm' )
14
+
15
+ base = gender == 'm' ? BASE_M : BASE_F
16
+
17
+ ## note: make a copy of base
18
+ punk = Image.new( base.width, base.height )
19
+ punk.compose!( base )
20
+
21
+ if color ## change skin tone (& eyebrows)?
22
+ color_map = derive_color_map( color )
23
+ punk = punk.change_colors( color_map )
24
+ end
25
+
26
+
27
+ if shine
28
+ shine_color = color ? derive_shine( color ) : 0xf1ffffff
29
+ if gender == 'm'
30
+ punk[9,7] = shine_color
31
+ punk[8,8] = shine_color
32
+ else
33
+ punk[9,9] = shine_color
34
+ end
35
+ end
36
+ punk
37
+ end
38
+
39
+
40
+ def self.derive_shine( color )
41
+ ## was before - reuse old formula- why? why not?
42
+ ## todo/check - check "formula" used in skintones script for humans!!!
43
+ ## lighter = Color.from_hsl(
44
+ ## (h+1)%360, # todo/check: make lighter by -1 on hue? or +1????
45
+ ## [1.0,s+0.10].min,
46
+ ## [1.0,l+0.25].min)
47
+
48
+ color = Color.parse( color ) if color.is_a?( String )
49
+
50
+ hsv = Color.to_hsv( color )
51
+ # pp hsv
52
+
53
+ h, s, v = hsv
54
+ h = h % 360 # make always positive (might be -50 or such)
55
+ ## pp [h,s,v]
56
+
57
+ ## add extra saturation if v(alue) / brightness is max 1.0 - why? why not?
58
+ sdiff = v >= 0.99 ? 0.35 : 0.25
59
+
60
+ lighter = Color.from_hsv( h, [0.0, s-sdiff].max, [v+0.1,1.0].min )
61
+ lighter
62
+ end
63
+
64
+
65
+
66
+ def self.derive_color_map( color )
67
+
68
+ # 2 pixels #f1ffff / rgb(241 255 255) - hsl(180° 100% 97%) - lighter
69
+ # 125 pixels #c8fbfb / rgb(200 251 251) - hsl(180° 86% 88%) - base (use as base)
70
+ # 6 pixels #9be0e0 / rgb(155 224 224) - hsl(180° 53% 74%) - darker
71
+ # 2 pixels #75bdbd / rgb(117 189 189) - hsl(180° 35% 60%) - darkest
72
+ color = Color.parse( color ) if color.is_a?( String )
73
+ base = color
74
+
75
+ hsl = Color.to_hsl( color )
76
+ pp hsl
77
+
78
+ h, s, l = hsl
79
+ h = h % 360 # make always positive (might be -50 or such)
80
+ pp [h,s,l]
81
+
82
+
83
+ darker = Color.from_hsl(
84
+ h,
85
+ [0.0,s-0.05].max,
86
+ [0.0,l-0.10].max)
87
+
88
+ darkest = Color.from_hsl(
89
+ h,
90
+ [0.0,s-0.10].max,
91
+ [0.0,l-0.20].max)
92
+
93
+
94
+ color_map = {
95
+ '#c8fbfb' => base,
96
+ '#9be0e0' => darker,
97
+ '#75bdbd' => darkest,
98
+ }
99
+
100
+ color_map
101
+ end
102
+
103
+ end # module Alien
104
+ end # module Punk
105
+
@@ -0,0 +1,63 @@
1
+ module Punk
2
+
3
+
4
+ module Ape ## make it a class - why? why not?
5
+
6
+ BASE_M = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/ape-male.png" )
7
+ BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/ape-female.png" )
8
+
9
+ def self.make( color=nil,
10
+ gender: 'm' )
11
+ base = gender == 'm' ? BASE_M : BASE_F
12
+
13
+ ## note: make a copy of base
14
+ punk = Image.new( base.width, base.height )
15
+ punk.compose!( base )
16
+
17
+ if color
18
+ color_map = derive_color_map( color )
19
+ punk = punk.change_colors( color_map )
20
+ end
21
+
22
+ punk
23
+ end
24
+
25
+ def self.derive_color_map( color )
26
+ color = Color.parse( color ) if color.is_a?( String )
27
+
28
+ darkest = color
29
+
30
+ hsl = Color.to_hsl( color )
31
+ pp hsl
32
+
33
+ h, s, l = hsl
34
+ h = h % 360 # make always positive (might be -50 or such)
35
+ pp [h,s,l]
36
+
37
+ darker = Color.from_hsl(
38
+ h,
39
+ s,
40
+ [1.0,l+0.05].min)
41
+
42
+ light = Color.from_hsl(
43
+ (h+1)%360,
44
+ [1.0,s+0.10].min,
45
+ [1.0,l+0.20].min)
46
+
47
+ lighter = Color.from_hsl(
48
+ (h+1)%360,
49
+ [1.0,s+0.20].min,
50
+ [1.0,l+0.35].min)
51
+
52
+ color_map = {
53
+ '#352410' => darkest, # darkest - 56 pixels (base!!)
54
+ '#6a563f' => darker, # darker - 4 pixels
55
+ '#856f56' => light, # light - 63 pixels
56
+ '#a98c6b' => lighter # lighter
57
+ }
58
+
59
+ color_map
60
+ end
61
+ end # module Ape
62
+ end # module Punk
63
+
@@ -0,0 +1,65 @@
1
+ module Punk
2
+
3
+
4
+ module Demon ## make it a class - why? why not?
5
+
6
+ BASE_M = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/demon-male.png" )
7
+ BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/demon-female.png" )
8
+
9
+ def self.make( color=nil,
10
+ gender: 'm' )
11
+ base = gender == 'm' ? BASE_M : BASE_F
12
+
13
+ ## note: make a copy of base
14
+ punk = Image.new( base.width, base.height )
15
+ punk.compose!( base )
16
+
17
+ if color
18
+ color_map = derive_color_map( color )
19
+ punk = punk.change_colors( color_map )
20
+ end
21
+
22
+ punk
23
+
24
+ end
25
+
26
+ def self.derive_color_map( color )
27
+ color = Color.parse( color ) if color.is_a?( String )
28
+
29
+ # 134 pixels #850008 / rgb(133 0 8) - hsl(356° 100% 26%) - base
30
+ # 2 pixels #630006 / rgb( 99 0 6) - hsl(356° 100% 19%) - darker
31
+ # 4 pixels #390102 / rgb( 57 1 2) - hsl(359° 97% 11%) - darkest
32
+ #
33
+ # 373 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - α( 0%) - TRANSPARENT
34
+ # 63 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - BLACK
35
+
36
+ base = color
37
+
38
+ hsl = Color.to_hsl( color )
39
+ pp hsl
40
+
41
+ h, s, l = hsl
42
+ h = h % 360 # make always positive (might be -50 or such)
43
+ pp [h,s,l]
44
+
45
+ darker = Color.from_hsl(
46
+ h,
47
+ s,
48
+ [0.0,l-0.08].max)
49
+
50
+ darkest = Color.from_hsl(
51
+ (h+2)%360,
52
+ [0.0,s-0.05].max,
53
+ [0.0,l-0.15].max)
54
+
55
+
56
+ color_map = {
57
+ '#850008' => base,
58
+ '#630006' => darker,
59
+ '#390102' => darkest,
60
+ }
61
+
62
+ color_map
63
+ end
64
+ end # module Demon
65
+ end # module Punk
@@ -8,38 +8,72 @@ module Human ## make it a class - why? why not?
8
8
  BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/human-female4.png" )
9
9
 
10
10
 
11
- def self.make( color,
11
+ def self.make( color=nil,
12
+ shine: true,
12
13
  eye_color: nil,
13
14
  gender: 'm' )
14
- color_map = derive_color_map( color )
15
-
16
- eye_color = Color.parse( eye_color ) if eye_color && eye_color.is_a?( String )
17
-
18
- punk = nil
19
- if gender == 'm'
20
- punk = BASE_M.change_colors( color_map )
21
- punk[10,12] = Color::WHITE # left eye dark-ish pixel to white
22
- punk[15,12] = Color::WHITE # right eye ---
23
- if eye_color
24
- punk[9,12] = eye_color
25
- punk[14,12] = eye_color
26
- end
27
- else ## assume 'f'
28
- ## for female - change lips to all black (like in male for now) - why? why not?
29
- color_map[ '#711010' ] = '#000000'
30
- punk = BASE_F.change_colors( color_map )
31
- punk[10,13] = Color::WHITE # left eye dark-ish pixel to white
32
- punk[15,13] = Color::WHITE # right eye ---
33
- if eye_color
34
- punk[9,13] = eye_color
35
- punk[14,13] = eye_color
36
- end
15
+
16
+ base = gender == 'm' ? BASE_M : BASE_F
17
+
18
+ ## note: make a copy of base
19
+ punk = Image.new( base.width, base.height )
20
+ punk.compose!( base )
21
+
22
+ if color ## change skin tone (& eyebrows)?
23
+ color_map = derive_color_map( color )
24
+ punk = punk.change_colors( color_map )
25
+ end
26
+
27
+ if eye_color ## change eye color?
28
+ eye_color = Color.parse( eye_color ) if eye_color.is_a?( String )
29
+ if gender == 'm'
30
+ punk[9,12] = eye_color
31
+ punk[14,12] = eye_color
32
+ else
33
+ punk[9,13] = eye_color
34
+ punk[14,13] = eye_color
35
+ end
36
+ end
37
+
38
+ if shine ## add shine?
39
+ # note: default shine color is white
40
+ shine_color = color ? derive_shine( color ) : 0xffffffff
41
+ if gender == 'm'
42
+ punk[9,7] = shine_color
43
+ punk[8,8] = shine_color
44
+ else
45
+ punk[9,9] = shine_color
46
+ end
37
47
  end
38
48
 
39
49
  punk
40
50
  end
41
51
 
42
52
 
53
+ def self.derive_shine( color )
54
+ color = Color.parse( color ) if color.is_a?( String )
55
+
56
+ hsv = Color.to_hsv( color )
57
+ # pp hsv
58
+
59
+ h, s, v = hsv
60
+ h = h % 360 # make always positive (might be -50 or such)
61
+ ## pp [h,s,v]
62
+
63
+ ## add extra saturation if v(alue) / brightness is max 1.0 - why? why not?
64
+ sdiff = v >= 0.99 ? 0.25 : 0.15
65
+
66
+ lighter = Color.from_hsv( h, [0.0, s-sdiff].max, [v+0.1,1.0].min )
67
+ lighter
68
+ end
69
+
70
+
71
+ ##
72
+ ## todo/check:
73
+ ## add a derive_colors or dervice_skintones method - why? why not?
74
+ ## - change to name skintone_palette - why? why not?
75
+ ## def self.derive_skintone_colors( color or base ) ???
76
+
43
77
  def self.derive_color_map( color )
44
78
  color = Color.parse( color ) if color.is_a?( String )
45
79
 
@@ -52,28 +86,16 @@ module Human ## make it a class - why? why not?
52
86
  h = h % 360 # make always positive (might be -50 or such)
53
87
  pp [h,s,l]
54
88
 
55
- darker = Color.from_hsl(
56
- h,
57
- [0.0, s-0.05].max,
58
- [0.14, l-0.1].max)
59
-
60
89
  ## sub one degree on hue on color wheel (plus +10% on lightness??)
61
- darkest = Color.from_hsl(
62
- (h-1) % 360,
90
+ ## darker
91
+ eyebrows = Color.from_hsl(
92
+ h,
63
93
  s,
64
94
  [0.05, l-0.1].max)
65
95
 
66
-
67
- lighter = Color.from_hsl(
68
- (h+1) % 360,
69
- s,
70
- [1.0, l+0.1].min)
71
-
72
96
  color_map = {
73
97
  '#ead9d9' => base,
74
- '#ffffff' => lighter,
75
- '#a58d8d' => darkest,
76
- '#c9b2b2' => darker
98
+ '#a58d8d' => eyebrows,
77
99
  }
78
100
  color_map
79
101
  end
@@ -7,29 +7,34 @@ module Punk
7
7
  BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/mummy-female.png" )
8
8
 
9
9
 
10
- def self.make( color,
10
+ def self.make( color=nil,
11
11
  eye_color: nil,
12
12
  gender: 'm' )
13
- color_map = derive_color_map( color )
13
+ base = gender == 'm' ? BASE_M : BASE_F
14
+
15
+ ## note: make a copy of base
16
+ punk = Image.new( base.width, base.height )
17
+ punk.compose!( base )
18
+
19
+ if color
20
+ color_map = derive_color_map( color )
21
+ punk = punk.change_colors( color_map )
22
+ end
14
23
 
15
- eye_color = Color.parse( eye_color ) if eye_color && eye_color.is_a?( String )
24
+ if eye_color
25
+ eye_color = Color.parse( eye_color ) if eye_color.is_a?( String )
16
26
 
17
- punk = nil
18
27
  if gender == 'm'
19
- punk = BASE_M.change_colors( color_map )
20
- if eye_color
21
28
  punk[9,12] = eye_color
22
29
  punk[14,12] = eye_color
23
- end
24
30
  else ## assume 'f'
25
- punk = BASE_F.change_colors( color_map )
26
- if eye_color
27
31
  punk[10,13] = eye_color ## note: eye pos +1 pix!!
28
32
  punk[14,13] = eye_color
29
- end
30
33
  end
31
- punk
32
34
  end
35
+ punk
36
+ end
37
+
33
38
 
34
39
  def self.derive_color_map( color )
35
40
  color = Color.parse( color ) if color.is_a?( String )
@@ -0,0 +1,65 @@
1
+ module Punk
2
+
3
+
4
+ module Orc ## make it a class - why? why not?
5
+
6
+ BASE_M = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/orc-male.png" )
7
+ BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/orc-female.png" )
8
+
9
+ def self.make( color=nil,
10
+ gender: 'm' )
11
+ base = gender == 'm' ? BASE_M : BASE_F
12
+
13
+ ## note: make a copy of base
14
+ punk = Image.new( base.width, base.height )
15
+ punk.compose!( base )
16
+
17
+ if color
18
+ color_map = derive_color_map( color )
19
+ punk = punk.change_colors( color_map )
20
+ end
21
+
22
+ punk
23
+ end
24
+
25
+ def self.derive_color_map( color )
26
+ color = Color.parse( color ) if color.is_a?( String )
27
+
28
+ # 380 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - α( 0%) - TRANSPARENT
29
+ # 63 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - BLACK
30
+ # 120 pixels #50650e / rgb( 80 101 14) - hsl( 74° 76% 23%) - hsv( 74° 86% 40%)
31
+ # 7 pixels #171a08 / rgb( 23 26 8) - hsl( 70° 53% 7%) - hsv( 70° 69% 10%)
32
+ # 6 pixels #ffffff / rgb(255 255 255) - hsl( 0° 0% 100%) - hsv( 0° 0% 100%) - WHITE
33
+ # ---
34
+ # 423 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - α( 0%) - TRANSPARENT
35
+ # 55 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - BLACK
36
+ # 87 pixels #50650e / rgb( 80 101 14) - hsl( 74° 76% 23%) - hsv( 74° 86% 40%)
37
+ # 7 pixels #171a08 / rgb( 23 26 8) - hsl( 70° 53% 7%) - hsv( 70° 69% 10%)
38
+ # 4 pixels #ffffff / rgb(255 255 255) - hsl( 0° 0% 100%) - hsv( 0° 0% 100%) - WHITE
39
+ base = color
40
+
41
+ hsl = Color.to_hsl( color )
42
+ pp hsl
43
+
44
+ h, s, l = hsl
45
+ h = h % 360 # make always positive (might be -50 or such)
46
+ pp [h,s,l]
47
+
48
+
49
+ darker = Color.from_hsl(
50
+ h,
51
+ s,
52
+ [0.0,l-0.16].max)
53
+
54
+
55
+
56
+ color_map = {
57
+ '#50650e' => base,
58
+ '#171a08' => darker,
59
+ }
60
+
61
+ color_map
62
+ end
63
+ end # module Orc
64
+ end # module Punk
65
+
@@ -0,0 +1,66 @@
1
+ module Punk
2
+
3
+
4
+ module Robot ## make it a class - why? why not?
5
+
6
+ BASE_M = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/robot-male.png" )
7
+ BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/robot-female.png" )
8
+
9
+ def self.make( color=nil,
10
+ gender: 'm' )
11
+ base = gender == 'm' ? BASE_M : BASE_F
12
+
13
+ ## note: make a copy of base
14
+ punk = Image.new( base.width, base.height )
15
+ punk.compose!( base )
16
+
17
+ if color
18
+ color_map = derive_color_map( color )
19
+ punk = punk.change_colors( color_map )
20
+ end
21
+
22
+ punk
23
+ end
24
+
25
+ def self.derive_color_map( color )
26
+ color = Color.parse( color ) if color.is_a?( String )
27
+
28
+ # 384 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - α( 0%) - TRANSPARENT
29
+ # 74 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - BLACK
30
+ # 100 pixels #a4a4a4 / rgb(164 164 164) - hsl( 0° 0% 64%) - hsv( 0° 0% 64%) - 8-BIT GRAYSCALE #164
31
+ # 16 pixels #535353 / rgb( 83 83 83) - hsl( 0° 0% 33%) - hsv( 0° 0% 33%) - 8-BIT GRAYSCALE #83
32
+ # 2 pixels #a9f7ff / rgb(169 247 255) - hsl(186° 100% 83%) - hsv(186° 34% 100%)
33
+ # ---
34
+ # 427 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - α( 0%) - TRANSPARENT
35
+ # 65 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - BLACK
36
+ # 67 pixels #a4a4a4 / rgb(164 164 164) - hsl( 0° 0% 64%) - hsv( 0° 0% 64%) - 8-BIT GRAYSCALE #164
37
+ # 15 pixels #535353 / rgb( 83 83 83) - hsl( 0° 0% 33%) - hsv( 0° 0% 33%) - 8-BIT GRAYSCALE #83
38
+ # 2 pixels #a9f7ff / rgb(169 247 255) - hsl(186° 100% 83%) - hsv(186° 34% 100%)
39
+
40
+ base = color
41
+
42
+ hsl = Color.to_hsl( color )
43
+ pp hsl
44
+
45
+ h, s, l = hsl
46
+ h = h % 360 # make always positive (might be -50 or such)
47
+ pp [h,s,l]
48
+
49
+
50
+ darker = Color.from_hsl(
51
+ h,
52
+ s,
53
+ [0.0,l-0.20].max)
54
+
55
+ color_map = {
56
+ '#a4a4a4' => base,
57
+ '#535353' => darker,
58
+ }
59
+
60
+ color_map
61
+ end
62
+ end # module Robot
63
+ end # module Punk
64
+
65
+
66
+
@@ -0,0 +1,42 @@
1
+ module Punk
2
+
3
+ module Skeleton ## make it a class - why? why not?
4
+
5
+ BASE_M = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/skeleton-male.png" )
6
+ BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/skeleton-female.png" )
7
+
8
+ def self.make( color=nil,
9
+ gender: 'm' )
10
+ base = gender == 'm' ? BASE_M : BASE_F
11
+
12
+ ## note: make a copy of base
13
+ punk = Image.new( base.width, base.height )
14
+ punk.compose!( base )
15
+
16
+ if color
17
+ color_map = derive_color_map( color )
18
+ punk = punk.change_colors( color_map )
19
+ end
20
+
21
+ punk
22
+ end
23
+
24
+ def self.derive_color_map( color )
25
+ color = Color.parse( color ) if color.is_a?( String )
26
+
27
+ # 122 pixels #e0e0e0 / rgb(224 224 224) - hsl( 0° 0% 88%) - 8-BIT GRAYSCALE #224
28
+
29
+ # 385 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - α( 0%) - TRANSPARENT
30
+ # 69 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - BLACK
31
+
32
+ base = color
33
+
34
+ color_map = {
35
+ '#e0e0e0' => base,
36
+ }
37
+
38
+ color_map
39
+ end
40
+ end # module Skeleton
41
+ end # module Punk
42
+
@@ -0,0 +1,74 @@
1
+ module Punk
2
+
3
+
4
+ module Vampire ## make it a class - why? why not?
5
+
6
+ BASE_M = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/vampire-male.png" )
7
+ BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/vampire-female.png" )
8
+
9
+ def self.make( color=nil,
10
+ gender: 'm' )
11
+ base = gender == 'm' ? BASE_M : BASE_F
12
+
13
+ ## note: make a copy of base
14
+ punk = Image.new( base.width, base.height )
15
+ punk.compose!( base )
16
+
17
+ if color
18
+ color_map = derive_color_map( color )
19
+ punk = punk.change_colors( color_map )
20
+ end
21
+
22
+ punk
23
+ end
24
+
25
+ def self.derive_color_map( color )
26
+ color = Color.parse( color ) if color.is_a?( String )
27
+
28
+ # 366 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - α( 0%) - TRANSPARENT
29
+ # 67 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - BLACK
30
+ # 126 pixels #e0e0e0 / rgb(224 224 224) - hsl( 0° 0% 88%) - hsv( 0° 0% 88%) - 8-BIT GRAYSCALE #224
31
+ # 4 pixels #535353 / rgb( 83 83 83) - hsl( 0° 0% 33%) - hsv( 0° 0% 33%) - 8-BIT GRAYSCALE #83
32
+ # 2 pixels #ffffff / rgb(255 255 255) - hsl( 0° 0% 100%) - hsv( 0° 0% 100%) - WHITE
33
+ # 2 pixels #f6000b / rgb(246 0 11) - hsl(357° 100% 48%) - hsv(357° 100% 96%)
34
+ # 9 pixels #131313 / rgb( 19 19 19) - hsl( 0° 0% 7%) - hsv( 0° 0% 7%) - 8-BIT GRAYSCALE #19
35
+ # ---
36
+ # 403 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - α( 0%) - TRANSPARENT
37
+ # 62 pixels #000000 / rgb( 0 0 0) - hsl( 0° 0% 0%) - hsv( 0° 0% 0%) - BLACK
38
+ # 92 pixels #e0e0e0 / rgb(224 224 224) - hsl( 0° 0% 88%) - hsv( 0° 0% 88%) - 8-BIT GRAYSCALE #224
39
+ # 4 pixels #535353 / rgb( 83 83 83) - hsl( 0° 0% 33%) - hsv( 0° 0% 33%) - 8-BIT GRAYSCALE #83
40
+ # 2 pixels #ffffff / rgb(255 255 255) - hsl( 0° 0% 100%) - hsv( 0° 0% 100%) - WHITE
41
+ # 2 pixels #f6000b / rgb(246 0 11) - hsl(357° 100% 48%) - hsv(357° 100% 96%)
42
+ # 11 pixels #131313 / rgb( 19 19 19) - hsl( 0° 0% 7%) - hsv( 0° 0% 7%) - 8-BIT GRAYSCALE #19
43
+ base = color
44
+
45
+ hsl = Color.to_hsl( color )
46
+ pp hsl
47
+
48
+ h, s, l = hsl
49
+ h = h % 360 # make always positive (might be -50 or such)
50
+ pp [h,s,l]
51
+
52
+
53
+ darker = Color.from_hsl(
54
+ h,
55
+ s,
56
+ [0.0,l-0.20].max)
57
+
58
+
59
+ darkest = Color.from_hsl(
60
+ h,
61
+ s,
62
+ [0.0,l-0.35].max)
63
+
64
+ color_map = {
65
+ '#e0e0e0' => base,
66
+ '#535353' => darker,
67
+ '#131313' => darkest,
68
+ }
69
+
70
+ color_map
71
+ end
72
+ end # module Vampire
73
+ end # module Punk
74
+
@@ -2,8 +2,8 @@ module Pixelart
2
2
  module Module
3
3
  module Punkmaker
4
4
  MAJOR = 0
5
- MINOR = 2
6
- PATCH = 0
5
+ MINOR = 3
6
+ PATCH = 1
7
7
  VERSION = [MAJOR,MINOR,PATCH].join('.')
8
8
 
9
9
  def self.version
@@ -0,0 +1,94 @@
1
+ module Punk
2
+
3
+
4
+ module Zombie ## make it a class - why? why not?
5
+
6
+ BASE_M = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/zombie-male.png" )
7
+ BASE_F = Image.read( "#{Pixelart::Module::Punkmaker.root}/config/zombie-female.png" )
8
+
9
+ def self.make( color=nil,
10
+ shine: true,
11
+ gender: 'm' )
12
+ base = gender == 'm' ? BASE_M : BASE_F
13
+
14
+ ## note: make a copy of base
15
+ punk = Image.new( base.width, base.height )
16
+ punk.compose!( base )
17
+
18
+ if color
19
+ color_map = derive_color_map( color )
20
+ punk = punk.change_colors( color_map )
21
+ end
22
+
23
+ if shine
24
+ shine_color = color ? derive_shine( color ) : 0x9bbc88ff
25
+ if gender == 'm'
26
+ punk[9,7] = shine_color
27
+ punk[8,8] = shine_color
28
+ else
29
+ punk[9,9] = shine_color
30
+ end
31
+ end
32
+
33
+ punk
34
+ end
35
+
36
+
37
+ def self.derive_shine( color )
38
+ ## was before - reuse - why? why not?
39
+ ## todo/check - check "formula" used in skintones script for humans!!!
40
+ ## lighter = Color.from_hsl(
41
+ ## (h+1)%360, # todo/check: make lighter by -1 on hue? or +1????
42
+ ## [1.0,s+0.10].min,
43
+ ## [1.0,l+0.25].min)
44
+
45
+ color = Color.parse( color ) if color.is_a?( String )
46
+
47
+ hsv = Color.to_hsv( color )
48
+ # pp hsv
49
+
50
+ h, s, v = hsv
51
+ h = h % 360 # make always positive (might be -50 or such)
52
+ ## pp [h,s,v]
53
+
54
+ ## add extra saturation if v(alue) / brightness is max 1.0 - why? why not?
55
+ sdiff = v >= 0.99 ? 0.25 : 0.15
56
+
57
+ lighter = Color.from_hsv( h, [0.0, s-sdiff].max, [v+0.1,1.0].min )
58
+ lighter
59
+ end
60
+
61
+
62
+ def self.derive_color_map( color )
63
+ color = Color.parse( color ) if color.is_a?( String )
64
+
65
+ # 2 pixels #9bbc88 / rgb(155 188 136) - hsl( 98° 28% 64%) - lighter
66
+ # 125 pixels #7da269 / rgb(125 162 105) - hsl( 99° 23% 52%) - base (use as base)
67
+ # 7 pixels #5e7253 / rgb( 94 114 83) - hsl( 99° 16% 39%) - darker
68
+
69
+ base = color
70
+
71
+ hsl = Color.to_hsl( color )
72
+ pp hsl
73
+
74
+ h, s, l = hsl
75
+ h = h % 360 # make always positive (might be -50 or such)
76
+ pp [h,s,l]
77
+
78
+ darker = Color.from_hsl(
79
+ h,
80
+ [0.0,s-0.05].max,
81
+ [0.0,l-0.12].max)
82
+
83
+
84
+ color_map = {
85
+ '#7da269' => base,
86
+ '#5e7253' => darker,
87
+ }
88
+
89
+ color_map
90
+ end
91
+ end # module Zombie
92
+ end # module Punk
93
+
94
+
data/lib/punkmaker.rb CHANGED
@@ -3,9 +3,19 @@ require 'spritesheet'
3
3
 
4
4
 
5
5
  require_relative 'punkmaker/version' ## let version always go first
6
+
6
7
  ## more base / archetypes
7
8
  require_relative 'punkmaker/human'
9
+ require_relative 'punkmaker/alien'
8
10
  require_relative 'punkmaker/mummy'
11
+ require_relative 'punkmaker/ape'
12
+ require_relative 'punkmaker/skeleton'
13
+ require_relative 'punkmaker/zombie'
14
+ require_relative 'punkmaker/demon'
15
+ require_relative 'punkmaker/orc'
16
+ require_relative 'punkmaker/robot'
17
+ require_relative 'punkmaker/vampire'
18
+
9
19
 
10
20
  ## more hair (incl. beards & eyebrows)
11
21
  require_relative 'punkmaker/hair'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: punkmaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-27 00:00:00.000000000 Z
11
+ date: 2023-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pixelart
@@ -86,15 +86,39 @@ files:
86
86
  - Manifest.txt
87
87
  - README.md
88
88
  - Rakefile
89
+ - config/alien-female.png
90
+ - config/alien-male.png
91
+ - config/ape-female.png
92
+ - config/ape-male.png
93
+ - config/demon-female.png
94
+ - config/demon-male.png
89
95
  - config/human-female4.png
90
96
  - config/human-male4.png
91
97
  - config/mummy-female.png
92
98
  - config/mummy-male.png
99
+ - config/orc-female.png
100
+ - config/orc-male.png
101
+ - config/robot-female.png
102
+ - config/robot-male.png
103
+ - config/skeleton-female.png
104
+ - config/skeleton-male.png
105
+ - config/vampire-female.png
106
+ - config/vampire-male.png
107
+ - config/zombie-female.png
108
+ - config/zombie-male.png
93
109
  - lib/punkmaker.rb
110
+ - lib/punkmaker/alien.rb
111
+ - lib/punkmaker/ape.rb
112
+ - lib/punkmaker/demon.rb
94
113
  - lib/punkmaker/hair.rb
95
114
  - lib/punkmaker/human.rb
96
115
  - lib/punkmaker/mummy.rb
116
+ - lib/punkmaker/orc.rb
117
+ - lib/punkmaker/robot.rb
118
+ - lib/punkmaker/skeleton.rb
119
+ - lib/punkmaker/vampire.rb
97
120
  - lib/punkmaker/version.rb
121
+ - lib/punkmaker/zombie.rb
98
122
  homepage: https://github.com/cryptopunksnotdead/punkart.sandbox
99
123
  licenses:
100
124
  - Public Domain