punks 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,27 @@
1
+ id, name, gender, size, type, more_names
2
+ 0, Human 1, m, l, Archetype - Human, Human Male 1 | Human 1 ♂ | Male 1
3
+ 1, Human 2, m, l, Archetype - Human, Human Male 2 | Human 2 ♂ | Male 2
4
+ 2, Human 3, m, l, Archetype - Human, Human Male 3 | Human 3 ♂ | Male 3
5
+ 3, Human Mid 1, m, l, Archetype - Human, Human Male Mid 1 | Human Mid 1 ♂ | Male Mid 1
6
+ 4, Human Mid 2, m, l, Archetype - Human, Human Male Mid 2 | Human Mid 2 ♂ | Male Mid 2
7
+ 5, Human Mid 3, m, l, Archetype - Human, Human Male Mid 3 | Human Mid 3 ♂ | Male Mid 3
8
+ 6, Human Female 1, f, s, Archetype - Human, Human 1 ♀ | Female 1
9
+ 7, Human Female 1A, f, s, Archetype - Human, Human 1A ♀ | Female 1A
10
+ 8, Human Female 2, f, s, Archetype - Human, Human 2 ♀ | Female 2
11
+ 9, Human Female 3, f, s, Archetype - Human, Human 3 ♀ | Female 3
12
+ 10, Human Female 3A, f, s, Archetype - Human, Human 3A ♀ | Female 3A
13
+ 11, Human Female Big 1, f, s, Archetype - Human, Human Big 1 ♀ | Female Big 1
14
+ 12, Human Female Big 2, f, s, Archetype - Human, Human Big 2 ♀ | Female Big 2
15
+ 13, Human Female Big 3, f, s, Archetype - Human, Human Big 3 ♀ | Female Big 3
16
+ 14, Human Female Big 3A, f, s, Archetype - Human, Human Big 3A ♀ | Female Big 3A
17
+ 15, Zombie, m, l, Archetype - Zombie, Zombie Male | Zombie ♂
18
+ 16, Ape, m, l, Archetype - Ape, Ape Male | Ape ♂
19
+ 17, Alien, m, l, Archetype - Alien, Alien Male | Alien ♂
20
+ 18, Zombie Female, f, s, Archetype - Zombie, Zombie ♀
21
+ 19, Zombie Female A, f, s, Archetype - Zombie, Zombie A ♀
22
+ 20, Zombie Female Big, f, s, Archetype - Zombie, Zombie Big ♀
23
+ 21, Ape Female, f, s, Archetype - Ape, Ape ♀
24
+ 22, Ape Female Big, f, s, Archetype - Ape, Ape Big ♀
25
+ 23, Alien Female, f, s, Archetype - Alien, Alien ♀
26
+ 24, Alien Female A, f, s, Archetype - Alien, Alien A ♀
27
+ 25, Alien Female Big, f, s, Archetype - Alien, Alien Big ♀
Binary file
@@ -15,63 +15,67 @@ id, category, name, more_names
15
15
  13, , medium 2,
16
16
  14, , dark 1,
17
17
  15, , dark 2,
18
- 16, , white shemagh,
19
- 17, , white shemagh agal,
20
- 18, , white shemagh gold agal,
21
- 19, , white shemagh stylish gold agal,
22
- 20, , white shemagh crown,
23
- 21, , brown shemagh agal,
24
- 22, , brown shemagh crown,
25
- 23, , red shemagh,
26
- 24, , red shemagh agal,
27
- 25, , red shemagh crown,
28
- 26, , messy white beard,
29
- 27, , short white beard,
30
- 28, , normal white beard,
31
- 29, , luxurious white beard,
32
- 30, , short grey beard,
33
- 31, , messy brown beard,
34
- 32, , normal brown beard,
35
- 33, , luxurious brown beard,
36
- 34, , shadow beard,
37
- 35, , shadow beard mustache,
38
- 36, , light beard,
39
- 37, , mustache,
40
- 38, , stylish mustache,
41
- 39, , sideburns,
42
- 40, , sideburns mustache,
43
- 41, , normal beard,
44
- 42, , normal brown beard mustache,
45
- 43, , luxurious beard,
46
- 44, , horn rimmed glasses,
47
- 45, , rimless glasses,
48
- 46, , nerd glasses,
49
- 47, , stylish nerd glasses,
50
- 48, , classic shades,
51
- 49, , classic green shades,
52
- 50, , classic gold shades,
53
- 51, , regular pixel shades,
54
- 52, , regular reflective shades,
55
- 53, , big green shades,
56
- 54, , big pixel shades,
57
- 55, , big purple shades,
58
- 56, , big shades,
59
- 57, , small shades,
60
- 58, , regular shades,
61
- 59, , round shades,
62
- 60, , big round shades,
63
- 61, , square reflective shades,
64
- 62, , square shades,
65
- 63, , 3d glasses,
66
- 64, , vr,
67
- 65, , laser eyes,
68
- 66, , max bidding,
69
- 67, , cigarette,
70
- 68, , shadowless cigarette,
71
- 69, , miswak,
72
- 70, , vape,
73
- 71, , shadowless vape,
74
- 72, , cigar,
75
- 73, , pearwood pipe,
76
- 74, , rosewood pipe,
77
- 75, , bubble gum,
18
+ 16, , green,
19
+ 17, , dark green,
20
+ 18, , cyan,
21
+ 19, , pink,
22
+ 20, , white shemagh,
23
+ 21, , white shemagh agal,
24
+ 22, , white shemagh gold agal,
25
+ 23, , white shemagh stylish gold agal,
26
+ 24, , white shemagh crown,
27
+ 25, , brown shemagh agal,
28
+ 26, , brown shemagh crown,
29
+ 27, , red shemagh,
30
+ 28, , red shemagh agal,
31
+ 29, , red shemagh crown,
32
+ 30, , messy white beard,
33
+ 31, , short white beard,
34
+ 32, , normal white beard,
35
+ 33, , luxurious white beard,
36
+ 34, , short grey beard,
37
+ 35, , messy brown beard,
38
+ 36, , normal brown beard,
39
+ 37, , luxurious brown beard,
40
+ 38, , shadow beard,
41
+ 39, , shadow beard mustache,
42
+ 40, , light beard,
43
+ 41, , mustache,
44
+ 42, , stylish mustache,
45
+ 43, , sideburns,
46
+ 44, , sideburns mustache,
47
+ 45, , normal beard,
48
+ 46, , normal brown beard mustache,
49
+ 47, , luxurious beard,
50
+ 48, , horn rimmed glasses,
51
+ 49, , rimless glasses,
52
+ 50, , nerd glasses,
53
+ 51, , stylish nerd glasses,
54
+ 52, , classic shades,
55
+ 53, , classic green shades,
56
+ 54, , classic gold shades,
57
+ 55, , regular pixel shades,
58
+ 56, , regular reflective shades,
59
+ 57, , big green shades,
60
+ 58, , big pixel shades,
61
+ 59, , big purple shades,
62
+ 60, , big shades,
63
+ 61, , small shades,
64
+ 62, , regular shades,
65
+ 63, , round shades,
66
+ 64, , big round shades,
67
+ 65, , square reflective shades,
68
+ 66, , square shades,
69
+ 67, , 3d glasses,
70
+ 68, , vr,
71
+ 69, , laser eyes,
72
+ 70, , max bidding,
73
+ 71, , cigarette,
74
+ 72, , shadowless cigarette,
75
+ 73, , miswak,
76
+ 74, , vape,
77
+ 75, , shadowless vape,
78
+ 76, , cigar,
79
+ 77, , pearwood pipe,
80
+ 78, , rosewood pipe,
81
+ 79, , bubble gum,
Binary file
@@ -0,0 +1,131 @@
1
+
2
+
3
+ module Punk32
4
+
5
+ class Spritesheet
6
+ def self.builtin
7
+ @builtin ||= Pixelart::SpritesheetEx.read( "#{Pixelart::Module::Punks.root}/config/punks-32x32.png",
8
+ "#{Pixelart::Module::Punks.root}/config/punks-32x32.csv",
9
+ width: 32,
10
+ height: 32 )
11
+ end
12
+
13
+ ## note: for now class used for "namespace" only
14
+ def self.find_by( name:, gender: nil, size: nil, warn: true ) ## return archetype/attribute image by name
15
+ # note: pass along name as q (query string)
16
+ builtin.find_by( name: name,
17
+ gender: gender,
18
+ size: size,
19
+ warn: warn )
20
+ end
21
+ def self.find_meta_by( name:, gender: nil, size: nil, warn: true ) ## return archetype/attribute image by name
22
+ # note: pass along name as q (query string)
23
+ builtin.find_meta_by( name: name,
24
+ gender: gender,
25
+ size: size,
26
+ warn: warn )
27
+ end
28
+ def self.image() builtin.image; end
29
+
30
+ ## helpers
31
+ def self.normalize_key( str ) Pixelart::SpritesheetEx.normalize_key( str ); end
32
+ end # class Spritesheet
33
+
34
+
35
+ ## add convenience (alternate spelling) alias - why? why not?
36
+ SpriteSheet = Spritesheet
37
+ Sheet = Spritesheet
38
+ Sprite = Spritesheet
39
+
40
+
41
+
42
+ class Image < Pixelart::Image
43
+
44
+ def self.generate( *values, patch: nil )
45
+
46
+ attributes = [] ## collect all attribute images (32x32, 24x24, etc.) to merge/paste here
47
+
48
+
49
+ archetype_name = values[0]
50
+
51
+ if archetype_name.is_a?( Pixelart::Image )
52
+ archetype = archetype_name
53
+ attributes << archetype
54
+ ### for now assume (support only)
55
+ ## large & male (l/m) for "inline/patch" archetypes - why? why not?
56
+ ## change male to unisex - why? why not? (note: for now unisex is not doing a backup lookup using male/female)
57
+ attribute_gender = 'm'
58
+ attribute_size = 'l'
59
+ elsif patch && img=patch[ Sheet.normalize_key(archetype_name) ]
60
+ archetype = img
61
+ attributes << archetype
62
+ if archetype_name.downcase.index( 'female' )
63
+ ## note: attribute lookup requires gender from archetype!!!!
64
+ ## quick & dirty hack for now
65
+ ## if name incl. female (automagically) switch to f(emale)/s(mall)
66
+ attribute_gender = 'f'
67
+ attribute_size = 's'
68
+ else
69
+ attribute_gender = 'm'
70
+ attribute_size = 'l'
71
+ end
72
+ else ## assume it's a string
73
+ ### todo/fix: check for nil/not found!!!!
74
+ ## todo/check/fix: assert meta record returned is archetype NOT attribute!!!!
75
+ archetype = Sheet.find_meta_by( name: archetype_name )
76
+ if archetype.nil?
77
+ puts "!! ERROR - archetype >#{archetype}< not found; sorry"
78
+ exit 1
79
+ end
80
+ attributes << Sheet.image[ archetype.id ]
81
+ attribute_gender = archetype.gender
82
+ attribute_size = archetype.size
83
+ end
84
+
85
+ attribute_names = values[1..-1]
86
+ attribute_names.each do |attribute_name|
87
+ ## note: quick hack - allow "inline" raw images for now - why? why not?
88
+ ## pass through as-is
89
+ if attribute_name.is_a?( Pixelart::Image )
90
+ attributes << attribute_name
91
+ elsif patch && img=patch[ Sheet.normalize_key(attribute_name) ]
92
+ attributes << img
93
+ else
94
+ attribute = Sheet.find_by( name: attribute_name,
95
+ gender: attribute_gender,
96
+ size: attribute_size,
97
+ warn: false )
98
+ ## try 24x24 punk attribute next
99
+ attribute = Punk::Sheet.find_by( name: attribute_name,
100
+ gender: attribute_gender,
101
+ size: attribute_size ) if attribute.nil?
102
+
103
+ if attribute.nil?
104
+ puts "!! ERROR - attribute >#{attribute_name}< for (#{attribute_gender}+#{attribute_size}) not found; sorry"
105
+ exit 1
106
+ end
107
+
108
+ attributes << attribute
109
+ end
110
+ end
111
+
112
+ punk = new( 32, 32 )
113
+
114
+ attributes.each do |attribute|
115
+ if attribute.width == 24 && attribute.height == 24
116
+ ## cut-off top 1px (24x23)
117
+ attribute = attribute.crop( 0, 1, 24, 23 )
118
+ ## offset x/y for classic 24x24 attributes in 40x40 canvas
119
+ punk.compose!( attribute, 6, 0 )
120
+ elsif attribute.width == 32 && attribute.height == 32
121
+ punk.compose!( attribute )
122
+ else
123
+ puts "!! ERROR - unsupported attribute size; got #{attribute.width}x#{attribute.height} - expected 32x32 or 24x24; sorry"
124
+ exit 1
125
+ end
126
+ end
127
+ punk
128
+ end # method Image.generate
129
+ end # class Image
130
+ end # module Punk32
131
+
@@ -0,0 +1,107 @@
1
+
2
+
3
+ module Punk40
4
+
5
+ class Spritesheet
6
+ ## helpers
7
+ def self.normalize_key( str ) Pixelart::SpritesheetEx.normalize_key( str ); end
8
+ end # class Spritesheet
9
+
10
+ ## add convenience (alternate spelling) alias - why? why not?
11
+ SpriteSheet = Spritesheet
12
+ Sheet = Spritesheet
13
+ Sprite = Spritesheet
14
+
15
+
16
+
17
+ class Image < Pixelart::Image
18
+
19
+ def self.generate( *values, patch: nil )
20
+
21
+ attributes = [] ## collect all attribute images (32x32, 24x24, etc.) to merge/paste here
22
+
23
+
24
+ archetype_name = values[0]
25
+
26
+ if archetype_name.is_a?( Pixelart::Image )
27
+ archetype = archetype_name
28
+ attributes << archetype
29
+ ### for now assume (support only)
30
+ ## large & male (l/m) for "inline/patch" archetypes - why? why not?
31
+ ## change male to unisex - why? why not? (note: for now unisex is not doing a backup lookup using male/female)
32
+ attribute_gender = 'm'
33
+ attribute_size = 'l'
34
+ elsif patch && img=patch[ Sheet.normalize_key(archetype_name) ]
35
+ archetype = img
36
+ attributes << archetype
37
+ if archetype_name.downcase.index( 'female' )
38
+ ## note: attribute lookup requires gender from archetype!!!!
39
+ ## quick & dirty hack for now
40
+ ## if name incl. female (automagically) switch to f(emale)/s(mall)
41
+ attribute_gender = 'f'
42
+ attribute_size = 's'
43
+ else
44
+ attribute_gender = 'm'
45
+ attribute_size = 'l'
46
+ end
47
+ else ## assume it's a string
48
+ ### todo/fix: check for nil/not found!!!!
49
+ ## todo/check/fix: assert meta record returned is archetype NOT attribute!!!!
50
+ archetype = Punk32::Sheet.find_meta_by( name: archetype_name )
51
+ if archetype.nil?
52
+ puts "!! ERROR - archetype >#{archetype}< not found; sorry"
53
+ exit 1
54
+ end
55
+ attributes << Punk32::Sheet.image[ archetype.id ]
56
+ attribute_gender = archetype.gender
57
+ attribute_size = archetype.size
58
+ end
59
+
60
+
61
+ attribute_names = values[1..-1]
62
+ attribute_names.each do |attribute_name|
63
+ ## note: quick hack - allow "inline" raw images for now - why? why not?
64
+ ## pass through as-is
65
+ if attribute_name.is_a?( Pixelart::Image )
66
+ attributes << attribute_name
67
+ elsif patch && img=patch[ Sheet.normalize_key(attribute_name) ]
68
+ attributes << img
69
+ else
70
+ attribute = Punk32::Sheet.find_by( name: attribute_name,
71
+ gender: attribute_gender,
72
+ size: attribute_size,
73
+ warn: false )
74
+ ## try 24x24 punk attribute next
75
+ attribute = Punk::Sheet.find_by( name: attribute_name,
76
+ gender: attribute_gender,
77
+ size: attribute_size ) if attribute.nil?
78
+
79
+ if attribute.nil?
80
+ puts "!! ERROR - attribute >#{attribute_name}< for (#{attribute_gender}+#{attribute_size}) not found; sorry"
81
+ exit 1
82
+ end
83
+
84
+ attributes << attribute
85
+ end
86
+ end
87
+
88
+ punk = new( 40, 40 )
89
+
90
+ attributes.each do |attribute|
91
+ offset = if attribute.width == 24 && attribute.height == 24
92
+ [6,7] ## offset x/y for classic 24x24 attributes in 40x40 canvas
93
+ elsif attribute.width == 32 && attribute.height == 32
94
+ [0,8]
95
+ elsif attribute.width == 40 && attribute.height == 40
96
+ [0,0]
97
+ else
98
+ puts "!! ERROR - unsupported attribute size; got #{attribute.width}x#{attribute.height} - expected 40x40, 32x32 or 24x24; sorry"
99
+ exit 1
100
+ end
101
+ punk.compose!( attribute, *offset )
102
+ end
103
+ punk
104
+ end # method Image.generate
105
+ end # class Image
106
+ end # module Punk40
107
+
data/lib/punks/philips.rb CHANGED
@@ -8,7 +8,7 @@ module Philip
8
8
  PHILIP = Pixelart::Image.read( "#{Pixelart::Module::Punks.root}/config/philip-24x24.png" )
9
9
 
10
10
  def self.generate( *values )
11
- punk = Image.new( 24, 24 )
11
+ punk = new( 24, 24 )
12
12
  punk.compose!( PHILIP )
13
13
 
14
14
  values.each do |name|
@@ -0,0 +1,134 @@
1
+
2
+ module Pixelart
3
+ class GeneratorEx
4
+
5
+ def self.read( image_path="./spritesheet.png",
6
+ meta_path="./spritesheet.csv",
7
+ width: 24,
8
+ height: 24,
9
+ image_class: Image )
10
+
11
+ sheet = SpritesheetEx.read( image_path,
12
+ meta_path,
13
+ width: width, height: height )
14
+ new( sheet, image_class: image_class )
15
+ end
16
+
17
+ def self.use( sheet, image_class: Image ) ### check - allow more sheets - why? why not?
18
+ new( sheet, image_class: image_class )
19
+ end
20
+
21
+
22
+
23
+ def normalize_key( str ) SpritesheetEx.normalize_key( str ); end
24
+ def normalize_gender( str ) SpritesheetEx.normalize_gender( str ); end
25
+ def normalize_size( str ) SpritesheetEx.normalize_size( str ); end
26
+ def normalize_name( str ) SpritesheetEx.normalize_name( str ); end
27
+
28
+
29
+ def initialize( sheet, image_class: )
30
+ @sheet = sheet
31
+ @image_class = image_class
32
+
33
+ puts " [punkfactory] using image class >#{@image_class.name}< for #{@sheet.image.tile_width}x#{@sheet.image.tile_height} images"
34
+ end
35
+
36
+ def spritesheet() @sheet; end
37
+ alias_method :sheet, :spritesheet
38
+
39
+
40
+ def to_recs( *values, style: nil, patch: nil )
41
+
42
+ recs = []
43
+
44
+ archetype_name = values[0]
45
+
46
+ if archetype_name.is_a?( Image )
47
+ archetype = archetype_name
48
+ recs << archetype
49
+ ### for now assume (support only)
50
+ ## large & male (l/m) for "inline/patch" archetypes - why? why not?
51
+ ## change male to unisex - why? why not? (note: for now unisex is not doing a backup lookup using male/female)
52
+ attribute_gender = 'm'
53
+ attribute_size = 'l'
54
+ elsif patch && img=patch[ normalize_key(archetype_name) ]
55
+ archetype = img
56
+ recs << archetype
57
+ if archetype_name.downcase.index( 'female' )
58
+ ## note: attribute lookup requires gender from archetype!!!!
59
+ ## quick & dirty hack for now
60
+ ## if name incl. female (automagically) switch to f(emale)/s(mall)
61
+ attribute_gender = 'f'
62
+ attribute_size = 's'
63
+ else
64
+ ## large & male (l/m) for "inline/patch" archetypes - why? why not?
65
+ ## change male to unisex - why? why not? (note: for now unisex is not doing a backup lookup using male/female)
66
+ attribute_gender = 'm'
67
+ attribute_size = 'l'
68
+ end
69
+ else ## assume it's a string
70
+ ### todo/fix: check for nil/not found!!!!
71
+ ## todo/check/fix: assert meta record returned is archetype NOT attribute!!!!
72
+ archetype = @sheet.find_meta_by( name: archetype_name )
73
+ if archetype.nil?
74
+ puts "!! ERROR - archetype >#{archetype}< not found; sorry"
75
+ exit 1
76
+ end
77
+ recs << archetype
78
+ attribute_gender = archetype.gender
79
+ attribute_size = archetype.size
80
+ end
81
+
82
+
83
+ attribute_names = values[1..-1]
84
+ attribute_names.each do |attribute_name|
85
+ ## note: quick hack - allow "inline" raw images for now - why? why not?
86
+ ## pass through as-is
87
+ if attribute_name.is_a?( Image )
88
+ recs << attribute_name
89
+ elsif patch && img=patch[ normalize_key(attribute_name) ]
90
+ recs << img
91
+ else
92
+ rec = @sheet.find_meta_by( name: attribute_name,
93
+ gender: attribute_gender,
94
+ size: attribute_size,
95
+ style: style )
96
+ if rec.nil?
97
+ puts "!! ERROR - attribute >#{attribute_name}< for (#{attribute_gender}+#{attribute_size}) not found; sorry"
98
+ exit 1
99
+ end
100
+
101
+ recs << rec
102
+ end
103
+ end
104
+
105
+ recs
106
+ end
107
+
108
+
109
+ def generate_image( *values, style: nil, patch: nil )
110
+ ## check: rename patch to more/extras/foreign or ... - why? why not?
111
+
112
+ recs = to_recs( *values, style: style, patch: patch )
113
+
114
+ punk = @image_class.new( @sheet.image.tile_width,
115
+ @sheet.image.tile_height )
116
+
117
+ recs.each do |rec|
118
+ ## note: quick hack - allow "inline" raw images for now - why? why not?
119
+ ## pass through as-is
120
+ img = if rec.is_a?( Image )
121
+ rec
122
+ else
123
+ @sheet.image[ rec.id ]
124
+ end
125
+ punk.compose!( img )
126
+ end
127
+
128
+ punk
129
+ end
130
+ alias_method :generate, :generate_image
131
+
132
+ end # class Generator
133
+
134
+ end # module Pixelart