profilepic 0.1.1 → 0.1.4

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: 1ba2adc7eb706d797e6295d1aa4a2a66a84cb48e70e82355cdd60e519436fe78
4
- data.tar.gz: 0efd5f64c0506376f1a61af437dc2085a771a057719d9a59e1894d6c74a50604
3
+ metadata.gz: 5d41ebabc80cb160ec234b527e6c1fc7d04ef28794a57fc7c1bba83fa9d357fc
4
+ data.tar.gz: 83175dee4ce2769394a40aff87ad1358082c9a3f89522e918977577b69eaf0e2
5
5
  SHA512:
6
- metadata.gz: 0bf5c048b1ff9cf265b67c1b4d1b390f15dc46bc4d43b300ae52a7487b97836c849b1bacf0dbc107ba78284d8479e303216ff9f32e316ee1a2e0c6c37bfe7b79
7
- data.tar.gz: 6d6692873afe1b608c354bfc23124be010ec209d90beacfa6bade0bb119ae11400fe4af4a885bdccc516b7173b9891322b5cea9631a7f82c280e6952bc6c9e86
6
+ metadata.gz: b47049d03f7a3d935b31e2e3d9682d02ba55e9bc0238b4b8a55b9b93d6cd84518e2384945acaf562de43a1661094657f3e2ffb3ef8ca51765ee567e631863b6a
7
+ data.tar.gz: 2cd589f2713dfa6f007290566037b8956fe11b1f4010b358dcfd07dc5f1487a01ceb23cce0d2a9cc2cef92d1ebf63f211cedefd4286f736409e68dfcf05aa0bb
data/Manifest.txt CHANGED
@@ -5,11 +5,20 @@ Rakefile
5
5
  bin/profilepic
6
6
  lib/profilepic.rb
7
7
  lib/profilepic/builder.rb
8
+ lib/profilepic/public/doge-24x24.csv
9
+ lib/profilepic/public/doge-24x24.png
10
+ lib/profilepic/public/marcs-24x24.csv
11
+ lib/profilepic/public/marcs-24x24.png
12
+ lib/profilepic/public/spritesheet.js
8
13
  lib/profilepic/public/style.css
14
+ lib/profilepic/public/yeoldepunks-24x24.csv
15
+ lib/profilepic/public/yeoldepunks-24x24.png
9
16
  lib/profilepic/service.rb
10
17
  lib/profilepic/version.rb
18
+ lib/profilepic/views/doge.erb
11
19
  lib/profilepic/views/index.erb
12
20
  lib/profilepic/views/layout.erb
13
21
  lib/profilepic/views/marcs.erb
14
22
  lib/profilepic/views/shared/_more_options.erb
15
23
  lib/profilepic/views/shared/_version.erb
24
+ lib/profilepic/views/yeoldepunks.erb
@@ -56,25 +56,76 @@ class ImageReq ## (Generate) Image Request
56
56
  background: background )
57
57
  end
58
58
 
59
+ def self.build_doge( params )
60
+ puts "==> image request params:"
61
+ pp params
59
62
 
60
- def self._norm_key( str )
61
- str.downcase.strip
62
- end
63
+ name = 'doge'
64
+ archetype = _norm_key( params[:t] || 'classic' )
65
+ more_attributes = _parse_attributes( params[:attributes] || '' )
66
+
67
+ hair = _norm_key( params[:hair] || 'none' )
68
+ headwear = _norm_key( params[:headwear] || 'none' )
69
+ eyewear = _norm_key( params[:eyewear] || 'none' )
70
+
71
+ zoom = _parse_zoom( params[:z] || '1' )
72
+ background = _norm_key( params[:bg] || 'none' )
63
73
 
64
- def self._parse_attributes( str )
65
- # convert attributes to array
66
- ## allow various separators
67
- attributes = str.split( %r{[,;|+/]+} )
68
- attributes = attributes.map { |attr| attr.strip }
69
- attributes = attributes.select { |attr| !attr.empty?} ## remove empty strings (if any)
70
- attributes
74
+ attributes = [archetype]
75
+ attributes << hair if hair != 'none'
76
+ attributes << headwear if headwear != 'none'
77
+ attributes << eyewear if eyewear != 'none'
78
+
79
+ new( name: name,
80
+ attributes: attributes + more_attributes,
81
+ zoom: zoom,
82
+ background: background )
71
83
  end
72
84
 
73
- def self._parse_zoom( str )
74
- str.strip.to_i( 10 )
85
+
86
+ def self.build_yeoldepunk( params )
87
+ puts "==> image request params:"
88
+ pp params
89
+
90
+ name = 'yeoldepunk'
91
+ archetype = _norm_key( params[:t] || 'male 3' )
92
+
93
+ hair = _norm_key( params[:hair] || 'none' )
94
+ beard = _norm_key( params[:beard] || 'none' )
95
+ eyes = _norm_key( params[:eyes] || 'none' )
96
+ eyewear = _norm_key( params[:eyewear] || 'none' )
97
+ blemish = _norm_key( params[:blemish] || 'none' )
98
+ nose = _norm_key( params[:nose] || 'none' )
99
+ mouth = _norm_key( params[:mouth] || 'none' )
100
+ mouthprop = _norm_key( params[:mouthprop] || 'none' )
101
+ earring = _norm_key( params[:earring] || 'none' )
102
+ headwear = _norm_key( params[:headwear] || 'none' )
103
+ neck = _norm_key( params[:neck] || 'none' )
104
+
105
+ zoom = _parse_zoom( params[:z] || '1' )
106
+ background = _norm_key( params[:bg] || 'none' )
107
+
108
+ attributes = [archetype]
109
+ attributes << hair if hair != 'none'
110
+ attributes << blemish if blemish != 'none'
111
+ attributes << beard if beard != 'none'
112
+ attributes << eyes if eyes != 'none'
113
+ attributes << eyewear if eyewear != 'none'
114
+ attributes << nose if nose != 'none'
115
+ attributes << mouth if mouth != 'none'
116
+ attributes << mouthprop if mouthprop != 'none'
117
+ attributes << earring if earring != 'none'
118
+ attributes << headwear if headwear != 'none'
119
+ attributes << neck if neck != 'none'
120
+
121
+ new( name: name,
122
+ attributes: attributes,
123
+ zoom: zoom,
124
+ background: background )
75
125
  end
76
126
 
77
127
 
128
+
78
129
  attr_reader :name,
79
130
  :attributes,
80
131
  :zoom,
@@ -101,5 +152,26 @@ class ImageReq ## (Generate) Image Request
101
152
  end
102
153
  @key
103
154
  end
155
+
156
+ #####
157
+ # (static) helpers
158
+
159
+ def self._norm_key( str )
160
+ str.downcase.strip
161
+ end
162
+
163
+ def self._parse_attributes( str )
164
+ # convert attributes to array
165
+ ## allow various separators
166
+ attributes = str.split( %r{[,;|+/]+} )
167
+ attributes = attributes.map { |attr| attr.strip }
168
+ attributes = attributes.select { |attr| !attr.empty?} ## remove empty strings (if any)
169
+ attributes
170
+ end
171
+
172
+ def self._parse_zoom( str )
173
+ str.strip.to_i( 10 )
174
+ end
175
+
104
176
  end
105
177
 
@@ -0,0 +1,23 @@
1
+ id, category, name, more_names
2
+ 0, , classic,
3
+ 1, , dark,
4
+ 2, , zombie,
5
+ 3, , alien,
6
+ 4, , crazyhair,
7
+ 5, , beanie,
8
+ 6, , cap,
9
+ 7, , capforward,
10
+ 8, , cowboyhat,
11
+ 9, , fedora,
12
+ 10, , knittedcap,
13
+ 11, , tophat,
14
+ 12, , bandana,
15
+ 13, , headband,
16
+ 14, , tiara,
17
+ 15, , 3dglasses,
18
+ 16, , bigshades,
19
+ 17, , classicshades,
20
+ 18, , regularshades,
21
+ 19, , smallshades,
22
+ 20, , nerdglasses,
23
+ 21, , eyepatch,
@@ -0,0 +1,149 @@
1
+ id, category, name, more_names
2
+ 0, , marc-classic,
3
+ 1, , ape-classic,
4
+ 2, , Marc 1, Marc Dark
5
+ 3, , Marc 2, Marc Mid | Marc Medium
6
+ 4, , Marc 3, Marc | Marc Light
7
+ 5, , Marc 4, Marc Albino
8
+ 6, , Marc Gold, Gold | Marc Golden
9
+ 7, , madlad,
10
+ 8, , zombie,
11
+ 9, , ape,
12
+ 10, , Golden Ape, Ape Gold | Ape Golden
13
+ 11, , Pink Ape, Ape Pink
14
+ 12, , Blue Alien, Alien | Alien Blue
15
+ 13, , Green Alien, Alien Green
16
+ 14, , Devil 1, Devil | Demon | Demon 1
17
+ 15, , Devil 2, Demon 2
18
+ 16, , Devil 3, Demon 3
19
+ 17, , orc,
20
+ 18, , skeleton,
21
+ 19, , bot,
22
+ 20, , blue_eyes,
23
+ 21, , green_eyes,
24
+ 22, , blue_eye_shadow,
25
+ 23, , green_eye_shadow,
26
+ 24, , purple_eye_shadow,
27
+ 25, , bagner,
28
+ 26, , horns,
29
+ 27, , marc_tyson,
30
+ 28, , cleft,
31
+ 29, , mole,
32
+ 30, , rosy_cheeks,
33
+ 31, , shine,
34
+ 32, , spots,
35
+ 33, , black_lipstick,
36
+ 34, , hot_lipstick,
37
+ 35, , purple_lipstick,
38
+ 36, , buck_teeth,
39
+ 37, , clown_nose,
40
+ 38, , gold_ring,
41
+ 39, , diamond_earring,
42
+ 40, , gold_earring,
43
+ 41, , diamond_helix,
44
+ 42, , gold_helix,
45
+ 43, , frown,
46
+ 44, , smile,
47
+ 45, , big_beard_white,
48
+ 46, , big_beard,
49
+ 47, , chinstrap,
50
+ 48, , front_beard,
51
+ 49, , front_beard_dark,
52
+ 50, , full_mustache,
53
+ 51, , full_mustache_dark,
54
+ 52, , goat,
55
+ 53, , goat_dark,
56
+ 54, , handlebar,
57
+ 55, , luxurious_beard,
58
+ 56, , mustache,
59
+ 57, , mutton_chop,
60
+ 58, , normal_beard,
61
+ 59, , normal_beard_black,
62
+ 60, , shadow_beard,
63
+ 61, , soul_patch,
64
+ 62, , bandana,
65
+ 63, , beanie,
66
+ 64, , bunny_ears,
67
+ 65, , cap,
68
+ 66, , skull_cap,
69
+ 67, , cap_forward,
70
+ 68, , police_cap,
71
+ 69, , cowboy_hat,
72
+ 70, , do_rag,
73
+ 71, , fast_food,
74
+ 72, , marcdonalds,
75
+ 73, , fedora,
76
+ 74, , headband,
77
+ 75, , roaring_headband,
78
+ 76, , hoodie,
79
+ 77, , purple_hoodie,
80
+ 78, , knitted_cap,
81
+ 79, , laurels,
82
+ 80, , shemagh,
83
+ 81, , tassle_hat,
84
+ 82, , tiarra,
85
+ 83, , top_hat,
86
+ 84, , uncle_sam,
87
+ 85, , viking,
88
+ 86, , welding_goggles,
89
+ 87, , blonde_bob,
90
+ 88, , chad,
91
+ 89, , clown_hair,
92
+ 90, , crazy_white_hair,
93
+ 91, , crazy_hair,
94
+ 92, , frumpy_hair,
95
+ 93, , marc_three,
96
+ 94, , purple_hair,
97
+ 95, , stringy_hair,
98
+ 96, , vampire_hair,
99
+ 97, , wild_blonde_hair,
100
+ 98, , wild_hair,
101
+ 99, , clown_eyes_blue,
102
+ 100, , clown_eyes_green,
103
+ 101, , lasers,
104
+ 102, , tears,
105
+ 103, , 3d_glasses,
106
+ 104, , aviators,
107
+ 105, , big_shades,
108
+ 106, , classic_shades,
109
+ 107, , deal_with_it,
110
+ 108, , glasses,
111
+ 109, , gold_glasses,
112
+ 110, , horned_rim_glasses,
113
+ 111, , monocle,
114
+ 112, , nerd_glasses,
115
+ 113, , pink_shades,
116
+ 114, , polarized,
117
+ 115, , polarized_white,
118
+ 116, , regular_shades,
119
+ 117, , small_shades,
120
+ 118, , VR Headset, VR
121
+ 119, , eye_mask,
122
+ 120, , eye_patch,
123
+ 121, , cigar,
124
+ 122, , cigarette,
125
+ 123, , hookah,
126
+ 124, , pipe,
127
+ 125, , vape,
128
+ 126, , medical_mask,
129
+ 127, , bubble_gum,
130
+ 128, , black_tie,
131
+ 129, , blue_tie,
132
+ 130, , red_tie,
133
+ 131, , blue_shirt,
134
+ 132, , blue_t_shirt,
135
+ 133, , Fast Food Shirt,
136
+ 134, , green_shirt,
137
+ 135, , grey_shirt,
138
+ 136, , purple_t_shirt,
139
+ 137, , white_t_shirt,
140
+ 138, , jumpsuit,
141
+ 139, , labcoat,
142
+ 140, , choker,
143
+ 141, , double_gold_chain,
144
+ 142, , gold_chain,
145
+ 143, , silver_chain,
146
+ 144, , thick_chain,
147
+ 145, , hemp,
148
+ 146, , ice,
149
+ 147, , medallion,
@@ -0,0 +1,126 @@
1
+ function parseCsv( str ) {
2
+ const lines = str.split( /\r?\n/ );
3
+ let rows = [];
4
+
5
+ for( let line of lines ) {
6
+ line = line.trim();
7
+
8
+ // skip empty & comment lines
9
+ if( line.length === 0 || line.startsWith('#') ) {
10
+ continue;
11
+ }
12
+ values = line.split(',');
13
+
14
+ values = values.map( (val, index) => val.trim() );
15
+ console.log( values );
16
+
17
+ rows.push( values );
18
+ }
19
+
20
+ return rows
21
+ }
22
+
23
+
24
+ class Spritesheet {
25
+ constructor( img, names,
26
+ tileWidth=24,
27
+ tileHeight=24 ) {
28
+ this.img = img;
29
+ this.names = this._build_names( names );
30
+ this.tileWidth = tileWidth;
31
+ this.tileHeight = tileHeight;
32
+ }
33
+ static read( src, names,
34
+ tileWidth=24,
35
+ tileHeight=24 ) {
36
+ let img = new Image();
37
+ img.src = src;
38
+ return new Spritesheet( img, names, tileWidth, tileHeight );
39
+ }
40
+
41
+
42
+ _build_names( str ) {
43
+ // assume text records in comma-separated values (.csv)
44
+ // e.g.
45
+ // 0, Male 1
46
+ // 1, Male 2
47
+ // ...
48
+ // 11, Rosy Cheeks (m)
49
+
50
+ const rows = parseCsv( str );
51
+ let names = {};
52
+ for( let row of rows ) {
53
+ let id = parseInt( row[0] );
54
+ let name = this._norm_name( row[1] );
55
+
56
+ names[ name ] = id;
57
+ }
58
+
59
+ return names;
60
+ }
61
+
62
+ _norm_name( str ) {
63
+ str = str.toLowerCase();
64
+ str = str.replaceAll( /[ _-]/ig, '' );
65
+ console.log( str );
66
+ return str;
67
+ }
68
+
69
+ drawSprite( name, sel, zoom=1 ) {
70
+ let el = (typeof sel === 'string') ?
71
+ document.querySelector( sel )
72
+ :
73
+ sel;
74
+
75
+ let num = this.names[ this._norm_name( name ) ];
76
+ this._drawSprite( num, el, zoom );
77
+ }
78
+
79
+ _drawSprite( num, el, zoom=1 ) {
80
+
81
+ let canvas = document.createElement( 'canvas' );
82
+
83
+ canvas.width = this.tileWidth*zoom;
84
+ canvas.height =this.tileHeight*zoom;
85
+
86
+ console.log( "==> Spritesheet.drawSprite" );
87
+ console.log( canvas.width, canvas.height );
88
+
89
+ let cols = this.img.naturalWidth / this.tileHeight;
90
+ let rows = this.img.naturalHeight / this.tileWidth;
91
+ console.log( cols, rows );
92
+
93
+ let dy = Math.floor( num / cols );
94
+ let dx = num % cols;
95
+ console.log( dx, dy );
96
+
97
+ let cx = canvas.getContext( "2d" );
98
+ cx.clearRect( 0, 0, this.tileWidth, this.tileHeight );
99
+ cx.imageSmoothingEnabled = false;
100
+ cx.drawImage( this.img,
101
+ // source rect
102
+ dx*this.tileWidth, dy*this.tileHeight, this.tileWidth, this.tileHeight,
103
+ // dest rect
104
+ 0, 0, this.tileWidth*zoom, this.tileHeight*zoom );
105
+
106
+ el.appendChild( canvas );
107
+ }
108
+
109
+ draw( sel='span.sprite', zoom=1 ) {
110
+ // note: use onload (async) callback to wait for (required) image download to complete
111
+ this.img.onload = () => {
112
+ console.log( " image.onload callback " );
113
+ let els = document.querySelectorAll( sel );
114
+ // console.log( els );
115
+
116
+ for( let el of Array.from( els ) ) {
117
+ let name = el.dataset.name;
118
+ console.log( name );
119
+
120
+ this.drawSprite( name, el, zoom );
121
+ }
122
+ console.log( "done Spritesheet.draw()" );
123
+ }
124
+ }
125
+ }
126
+
@@ -0,0 +1,134 @@
1
+ id, name, gender, size, type, more_names
2
+ 0, Male 1, m, l, Archetype,
3
+ 1, Male 2, m, l, Archetype,
4
+ 2, Male 3, m, l, Archetype,
5
+ 3, Male 4, m, l, Archetype,
6
+ 4, Female 1, f, s, Archetype,
7
+ 5, Female 2, f, s, Archetype,
8
+ 6, Female 3, f, s, Archetype,
9
+ 7, Female 4, f, s, Archetype,
10
+ 8, Zombie, m, l, Archetype,
11
+ 9, Ape, m, l, Archetype,
12
+ 10, Alien, m, l, Archetype,
13
+ 11, Rosy Cheeks, m, l, ?,
14
+ 12, Luxurious Beard, m, l, ?,
15
+ 13, Clown Hair Green, m, l, ?,
16
+ 14, Mohawk Dark, m, l, ?,
17
+ 15, Cowboy Hat, m, l, ?,
18
+ 16, Mustache, m, l, ?,
19
+ 17, Clown Nose, m, l, ?,
20
+ 18, Cigarette, m, l, ?,
21
+ 19, Nerd Glasses, m, l, ?,
22
+ 20, Regular Shades, m, l, ?,
23
+ 21, Knitted Cap, m, l, ?,
24
+ 22, Shadow Beard, m, l, ?,
25
+ 23, Frown, m, l, ?,
26
+ 24, Cap Forward, m, l, ?,
27
+ 25, Goat, m, l, ?,
28
+ 26, Mole, m, l, ?,
29
+ 27, Purple Hair, m, l, ?,
30
+ 28, Small Shades, m, l, ?,
31
+ 29, Shaved Head, m, l, ?,
32
+ 30, Classic Shades, m, l, ?,
33
+ 31, Vape, m, l, ?,
34
+ 32, Silver Chain, m, l, ?,
35
+ 33, Smile, m, l, ?,
36
+ 34, Big Shades, m, l, ?,
37
+ 35, Mohawk Thin, m, l, ?,
38
+ 36, Beanie, m, l, ?,
39
+ 37, Cap, m, l, ?,
40
+ 38, Clown Eyes Green, m, l, ?,
41
+ 39, Normal Beard Black, m, l, ?,
42
+ 40, Medical Mask, m, l, ?,
43
+ 41, Normal Beard, m, l, ?,
44
+ 42, VR, m, l, ?,
45
+ 43, Eye Patch, m, l, ?,
46
+ 44, Wild Hair, m, l, ?,
47
+ 45, Top Hat, m, l, ?,
48
+ 46, Bandana, m, l, ?,
49
+ 47, Handlebars, m, l, ?,
50
+ 48, Frumpy Hair, m, l, ?,
51
+ 49, Crazy Hair, m, l, ?,
52
+ 50, Police Cap, m, l, ?,
53
+ 51, Buck Teeth, m, l, ?,
54
+ 52, Do-rag, m, l, ?,
55
+ 53, Front Beard, m, l, ?,
56
+ 54, Spots, m, l, ?,
57
+ 55, Big Beard, m, l, ?,
58
+ 56, Vampire Hair, m, l, ?,
59
+ 57, Peak Spike, m, l, ?,
60
+ 58, Chinstrap, m, l, ?,
61
+ 59, Fedora, m, l, ?,
62
+ 60, Earring, m, l, ?,
63
+ 61, Horned Rim Glasses, m, l, ?,
64
+ 62, Headband, m, l, ?,
65
+ 63, Pipe, m, l, ?,
66
+ 64, Messy Hair, m, l, ?,
67
+ 65, Front Beard Dark, m, l, ?,
68
+ 66, Hoodie, m, l, ?,
69
+ 67, Gold Chain, m, l, ?,
70
+ 68, Muttonchops, m, l, ?,
71
+ 69, Stringy Hair, m, l, ?,
72
+ 70, Eye Mask, m, l, ?,
73
+ 71, 3D Glasses, m, l, ?,
74
+ 72, Clown Eyes Blue, m, l, ?,
75
+ 73, Mohawk, m, l, ?,
76
+ 74, Pilot Helmet, f, s, ?,
77
+ 75, Tassle Hat, f, s, ?,
78
+ 76, Hot Lipstick, f, s, ?,
79
+ 77, Blue Eye Shadow, f, s, ?,
80
+ 78, Straight Hair Dark, f, s, ?,
81
+ 79, Choker, f, s, ?,
82
+ 80, Crazy Hair, f, s, ?,
83
+ 81, Regular Shades, f, s, ?,
84
+ 82, Wild Blonde, f, s, ?,
85
+ 83, 3D Glasses, f, s, ?,
86
+ 84, Mole, f, s, ?,
87
+ 85, Wild White Hair, f, s, ?,
88
+ 86, Spots, f, s, ?,
89
+ 87, Frumpy Hair, f, s, ?,
90
+ 88, Nerd Glasses, f, s, ?,
91
+ 89, Tiara, f, s, ?,
92
+ 90, Orange Side, f, s, ?,
93
+ 91, Red Mohawk, f, s, ?,
94
+ 92, Messy Hair, f, s, ?,
95
+ 93, Clown Eyes Blue, f, s, ?,
96
+ 94, Pipe, f, s, ?,
97
+ 95, Wild Hair, f, s, ?,
98
+ 96, Purple Eye Shadow, f, s, ?,
99
+ 97, Stringy Hair, f, s, ?,
100
+ 98, Dark Hair, f, s, ?,
101
+ 99, Eye Patch, f, s, ?,
102
+ 100, Blonde Short, f, s, ?,
103
+ 101, Classic Shades, f, s, ?,
104
+ 102, Eye Mask, f, s, ?,
105
+ 103, Clown Hair Green, f, s, ?,
106
+ 104, Cap, f, s, ?,
107
+ 105, Medical Mask, f, s, ?,
108
+ 106, Bandana, f, s, ?,
109
+ 107, Purple Lipstick, f, s, ?,
110
+ 108, Clown Nose, f, s, ?,
111
+ 109, Headband, f, s, ?,
112
+ 110, Pigtails, f, s, ?,
113
+ 111, Straight Hair Blonde, f, s, ?,
114
+ 112, Knitted Cap, f, s, ?,
115
+ 113, Clown Eyes Green, f, s, ?,
116
+ 114, Cigarette, f, s, ?,
117
+ 115, Welding Goggles, f, s, ?,
118
+ 116, Mohawk Thin, f, s, ?,
119
+ 117, Gold Chain, f, s, ?,
120
+ 118, VR, f, s, ?,
121
+ 119, Vape, f, s, ?,
122
+ 120, Pink With Hat, f, s, ?,
123
+ 121, Blonde Bob, f, s, ?,
124
+ 122, Mohawk, f, s, ?,
125
+ 123, Big Shades, f, s, ?,
126
+ 124, Earring, f, s, ?,
127
+ 125, Green Eye Shadow, f, s, ?,
128
+ 126, Straight Hair, f, s, ?,
129
+ 127, Rosy Cheeks, f, s, ?,
130
+ 128, Half Shaved, f, s, ?,
131
+ 129, Mohawk Dark, f, s, ?,
132
+ 130, Black Lipstick, f, s, ?,
133
+ 131, Horned Rim Glasses, f, s, ?,
134
+ 132, Silver Chain, f, s, ?,