profilepic 0.1.1 → 0.1.4

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 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, ?,