kittyverse 0.4.0 → 0.4.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
  SHA1:
3
- metadata.gz: e56df36f3f3c53df42e7ecd83ebda939624943f1
4
- data.tar.gz: 4bfcfff584c9e0329c2dfe5de70bf262dd605cd2
3
+ metadata.gz: 4216c923457a71aed326af9ffa9146848c4866ff
4
+ data.tar.gz: 4b2063cee7ba1b685581bbe1b915afff47701d5b
5
5
  SHA512:
6
- metadata.gz: 6ad27041804377e2ed42ab9161f74a03a601f154b80af45972a96bdf4c233866ec5f10aafbb165b6f173a39eaaaa8d130dab2ec66300ffaff79992fd57359983
7
- data.tar.gz: 585438e11230eaf60ad40115045a6a3198934f14fb0d7d35f8eb2cac6ceb4df01289244f280ae3c817fdb4d482d87239c23466ce3713fa02d5a9da4f9a9f0ab9
6
+ metadata.gz: abe587be776050fb01626c8cc4650c069e75c08201f31a847b2cd7e6f0b9bc107e2c1aab09e3e52e0b3d7fb3d1aa459e7280cdeaa7ddb83bb2ea3d4c013daf15
7
+ data.tar.gz: 8e7a2babf9c0110a75135e41c34f0572d6a4c77b0e64085e64bb309f6a5b8ef7b1f39133e20c0361e2eea3b0a31f7fbe21f452c70375593a78b23ea8b4a4de8f
@@ -13,6 +13,7 @@ lib/kittyverse/fancies.rb
13
13
  lib/kittyverse/links.rb
14
14
  lib/kittyverse/mewtations.rb
15
15
  lib/kittyverse/pages/genes.rb
16
+ lib/kittyverse/recipes.rb
16
17
  lib/kittyverse/traits.rb
17
18
  lib/kittyverse/version.rb
18
19
  test/helper.rb
data/README.md CHANGED
@@ -206,6 +206,8 @@ end
206
206
  Auto-generated CryptoKitties reference pages / cheat sheets include:
207
207
 
208
208
  - [**CryptoKitties Cattributes Rarity / Popularity Statistics**](CATTRIBUTES.md)
209
+ - [**CryptoKitties Genome / Genes Cheat Sheet**](GENES.md) - Fur (FU) • Pattern (PA) • Eye Color (EC) • Eye Shape (ES) • Base Color (BC) • Highlight Color (HC) • Accent Color (AC) • Wild Element (WE) • Mouth (MO) • Environment (EN) • Secret Y Gene (SE) • Purrstige (PU)
210
+ - [**CryptoKitties Traits Cheat Sheet (with Codes, Mewtation Levels / Tiers, Search Links and More)**](TRAITS.md)
209
211
  - [**CryptoKitties Updates - Fancy / Exclusive / Special Edition Cats - Timeline**](updates/FANCIES.md)
210
212
  - [**CryptoKitties Updates - Purrstige Trait Recipes / Formulas - Timeline**](updates/PURRSTIGES.md)
211
213
  - and others
@@ -23,7 +23,7 @@ require 'kittyverse/links'
23
23
 
24
24
  require 'kittyverse/pages/genes'
25
25
 
26
-
26
+ require 'kittyverse/recipes'
27
27
  require 'kittyverse/traits'
28
28
  require 'kittyverse/cattributes'
29
29
  require 'kittyverse/fancies'
@@ -31,4 +31,4 @@ require 'kittyverse/fancies'
31
31
 
32
32
 
33
33
  # say hello
34
- puts Kittyverse.banner if defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG
34
+ puts Kittyverse.banner if defined?($RUBYCOCO_DEBUG) && $RUBYCOCO_DEBUG
@@ -36,7 +36,8 @@ class Cattribute
36
36
  :key,
37
37
  :name,
38
38
  :traits,
39
- :recipe
39
+ :recipe,
40
+ :count
40
41
 
41
42
  def initialize( **kwargs )
42
43
  update( kwargs )
@@ -107,12 +108,19 @@ class Cattribute
107
108
  puts "key: #{key}"
108
109
  pp h
109
110
 
111
+ recipe = Recipe.new(
112
+ traits: h[:recipe][:traits], ## todo/fix: turn strings into trait objs!!!!
113
+ limit: h[:recipe][:limit],
114
+ time_start: h[:recipe][:time] && h[:recipe][:time][:start] ? Date.strptime( h[:recipe][:time][:start], '%Y-%m-%d' ) : nil,
115
+ time_end: h[:recipe][:time] && h[:recipe][:time][:end] ? Date.strptime( h[:recipe][:time][:end], '%Y-%m-%d' ) : nil )
116
+
110
117
  cattribute = Cattribute.new(
111
118
  key: key,
112
119
  name: h[:name],
113
120
  type: tt,
114
121
  traits: [], ## empty traits
115
- recipe: h[:recipe] ## todo/fix: add recipe as a struct (NOT as a hash)
122
+ count: h[:recipe][:count], # note: add count from recipe hash (NOT incl. in recipe struct)
123
+ recipe: recipe
116
124
  )
117
125
  tt.cattributes << cattribute
118
126
 
@@ -30,19 +30,41 @@
30
30
 
31
31
  FANCIES =
32
32
  {
33
+ 'curdlin': { name: 'Curdlin',
34
+ recipe: {
35
+ time: { start: '2019-05-11', end: '2019-11-30' }, count: 4,
36
+ traits: ['nachocheez', 'saycheese', 'missmuffett', 'dippedcone']},
37
+ desc: 'Cheeze Wizard Cat - Celebrating the Launch of the Cheeze Wizards on the Blockchain'
38
+ ## see https://www.cryptokitties.co/blog/post/things-are-getting-cheezy-in-cryptokitties
39
+ },
40
+
41
+ 'kitt-e': { name: 'KITT-E', date: '2019-05-10',
42
+ specialedition: {
43
+ limit: 500 },
44
+ desc: 'Dapper (Crypto Contract) Wallet Promotion Cat'
45
+ },
46
+ 'dapp-e': { name: 'DAPP-E', date: '2019-05-10',
47
+ exclusive: {
48
+ limit: 50, ids: (1829..1878).to_a },
49
+ desc: 'Dapper (Crypto Contract) Wallet Promotion Cat'
50
+ },
51
+
33
52
  # Apr 27, 2019
34
53
  # Krakitten Fancy Cat is discovered. Fancy Cat
35
54
  krakitten: { name: 'Krakitten',
36
55
  recipe: {
37
- time: { start: '2019-04-27', end: '2019-05-06' },
38
- traits: ['cobalt', 'ducky', 'salty', 'splat']}
56
+ time: { start: '2019-04-27', end: '2019-05-06' }, count: 1221,
57
+ traits: ['cobalt', 'ducky', 'salty', 'splat']},
58
+ ## desc: 'Beware the Krakitten in the briny deep.'
39
59
  },
40
60
  # Apr 13, 2019
41
61
  # Furbeard Fancy Cat is discovered. Fancy Cat
42
- furbeard: { name: 'Furbeard', date: '2019-04-13',
62
+ furbeard: { name: 'Furbeard',
43
63
  recipe: {
44
- limit: 3733, ### todo -check if furbear was time windowed???
45
- traits: ['inflatablepool', 'hanauma', 'neckbeard']}
64
+ time: { start: '2019-04-13', end: '2019-04-26'}, count: 3733,
65
+ traits: ['inflatablepool', 'hanauma', 'neckbeard']},
66
+ desc: 'Dread Pirate Cat' # Avast Ye! This Old Salt knows a few tricks: how to avoid a meowtiny, how to get out of swabbing the litter deck, and just where the captain's log is buried.
67
+ ## see https://www.cryptokitties.co/blog/post/pirate-cats-are-plundering-cryptokitties/
46
68
  },
47
69
 
48
70
  # Apr 10, 2019
@@ -63,7 +85,7 @@ FANCIES =
63
85
  # Glitter Fancy Cat is discovered. Fancy Cat
64
86
  glitter: { name: 'Glitter',
65
87
  recipe: {
66
- time: { start: '2019-03-30', end: '2019-11-30'},
88
+ time: { start: '2019-03-30', end: '2019-11-30'}, count: 658, ## note: ++count NOT FINAL!!!
67
89
  traits: ['rorschach', 'juju', 'unicorn', 'hyacinth'] }
68
90
  },
69
91
 
@@ -118,14 +140,14 @@ FANCIES =
118
140
  # Al Fancy Cat is discovered. Fancy Cat
119
141
  al: { name: 'Al',
120
142
  recipe: {
121
- time: { start: '2019-02-17', end: '2019-12-01'},
143
+ time: { start: '2019-02-17', end: '2019-12-01'}, count: 3209, ## note: count NOT FINAL!!!
122
144
  traits: ['munchkin','moue','cashewmilk','brownies'] }
123
145
  },
124
146
  # Feb 16, 2019
125
147
  # Pizzazz Fancy Cat is discovered.Fancy Cat
126
148
  pizzazz: { name: 'Pizzazz',
127
149
  recipe: {
128
- time: { start: '2019-02-16', end: '2019-12-01'},
150
+ time: { start: '2019-02-16', end: '2019-12-01'}, count: 1438, ## note: count NOT FINAL!!!
129
151
  traits: ['mekong', 'scarlet', 'spangled', 'wonky'] }
130
152
  },
131
153
 
@@ -138,11 +160,12 @@ FANCIES =
138
160
 
139
161
  # Feb 9, 2019
140
162
  # Miss Purrfect Fancy Cat is discovered.Fancy Cat
141
- misspurrfect: { name: 'Miss Purrfect', date: '2019-02-09',
163
+ misspurrfect: { name: 'Miss Purrfect',
142
164
  recipe: {
143
- limit: 1298,
165
+ time: { start: '2019-02-09', end: '2019-02-14'}, count: 1298,
144
166
  traits: ['allyouneed', 'butterscotch', 'asif', 'satiated', 'flapflap']},
145
167
  desc: "Celebrating St. Valentine's Day 2019 (Feb/14th)"
168
+ ## see https://www.cryptokitties.co/blog/post/how-to-breed-miss-purrfect/
146
169
  },
147
170
 
148
171
  ## 2019
@@ -152,9 +175,10 @@ FANCIES =
152
175
  # Squib Fancy Cat is discovered. Fancy Cat
153
176
  squib: { name: 'Squib', date: '2019-01-26',
154
177
  recipe: {
155
- limit: 1443,
178
+ limit: 1443, ## todo/check: check if time-windows?
156
179
  traits: ['oldlace', 'razzledazzle', 'buzzed', 'rollercoaster']},
157
180
  desc: 'Celebrating American Football Super Bowl LIII in 2019'
181
+ ## see https://www.cryptokitties.co/blog/post/how-to-breed-squib/
158
182
  },
159
183
 
160
184
  tallythepurrocious: { name: 'Tally The Purrocious',
@@ -195,7 +219,7 @@ FANCIES =
195
219
  },
196
220
  pawrula: { name: 'Pawrula the Bright',
197
221
  recipe: {
198
- time: { start: '2018-12-15', end: '2019-11-30' },
222
+ time: { start: '2018-12-15', end: '2019-11-30' }, count: 1952, ## note: count NOT FINAL!!!
199
223
  traits: ['camo', 'butterscotch', 'fox'] },
200
224
  desc: 'Neha Narula - Director of the Digital Currency Initiative at the MIT Media Lab'
201
225
  },
@@ -367,7 +391,7 @@ FANCIES =
367
391
  ## May
368
392
  page: { name: 'Page', date: '2018-05-31',
369
393
  recipe: {
370
- limit: 50_000,
394
+ limit: 50_000, count: 3936, ## note: count NOT FINAL!!!
371
395
  traits: ['rascal', 'peach', 'wasntme' ]}
372
396
  },
373
397
  "schrödingerscat": { name: "Schrödinger's Cat", date: '2018-05-20',
@@ -512,7 +536,7 @@ FANCIES =
512
536
  santaclaws: { name: 'Santa Claws', date: '2017-12-12',
513
537
  recipe: {
514
538
  limit: 1000, overflow: 2,
515
- traits: ['cloudwhite','scarlet','beard','wild_d'] },
539
+ traits: ['cloudwhite','scarlet','beard','WE12'] },
516
540
  desc: 'Ho Ho Ho - Santa Claus Kitty'
517
541
  },
518
542
  mistletoe: { name: 'Mistletoe', date: '2017-12-09',
@@ -57,43 +57,43 @@ squelch: { name: 'Squelch',
57
57
  # Scratchingpost trait is discovered. Purrstige
58
58
  scratchingpost: { name: 'Scratchingpost',
59
59
  recipe: {
60
- time: { start: '2019-04-13', end: '2019-05-10' },
60
+ time: { start: '2019-04-13', end: '2019-05-10' }, count: 772,
61
61
  traits: ['WE10', 'PU26'] }
62
62
  },
63
63
  # Hooked trait is discovered. Purrstige
64
64
  hooked: { name: 'Hooked',
65
65
  recipe: {
66
- time: { start: '2019-04-13', end: '2019-05-10' },
66
+ time: { start: '2019-04-13', end: '2019-05-10' }, count: 1277,
67
67
  traits: ['WE10', 'PU27'] }
68
68
  },
69
69
  # Landlubber trait is discovered. Purrstige
70
70
  landlubber: { name: 'Landlubber',
71
71
  recipe: {
72
- time: { start: '2019-04-13', end: '2019-05-10' },
72
+ time: { start: '2019-04-13', end: '2019-05-10' }, count: 711,
73
73
  traits: ['WE10', 'PU29'] }
74
74
  },
75
75
  # Wrecked trait is discovered. Purrstige
76
76
  wrecked: { name: 'Wrecked',
77
77
  recipe: {
78
- time: { start: '2019-04-13', end: '2019-05-10' },
78
+ time: { start: '2019-04-13', end: '2019-05-10' }, count: 959,
79
79
  traits: ['EN00', 'PU26'] }
80
80
  },
81
81
  # Purrbados trait is discovered. Purrstige
82
82
  purrbados: { name: 'Purrbados',
83
83
  recipe: {
84
- time: { start: '2019-04-13', end: '2019-05-10' },
84
+ time: { start: '2019-04-13', end: '2019-05-10' }, count: 1344,
85
85
  traits: ['EN01', 'PU26'] }
86
86
  },
87
87
  # Timbers trait is discovered. Purrstige
88
88
  timbers: { name: 'Timbers',
89
89
  recipe: {
90
- time: { start: '2019-04-13', end: '2019-05-10' },
90
+ time: { start: '2019-04-13', end: '2019-05-10' }, count: 472,
91
91
  traits: ['WE10', 'EN00', 'PU26'] }
92
92
  },
93
93
  # Maraud trait is discovered. Purrstige
94
94
  maraud: { name: 'Maraud',
95
95
  recipe: {
96
- time: { start: '2019-04-13', end: '2019-05-10' },
96
+ time: { start: '2019-04-13', end: '2019-05-10' }, count: 620,
97
97
  traits: ['WE10', 'EN01', 'PU26'] }
98
98
  },
99
99
 
@@ -95,7 +95,7 @@ TRAITS =
95
95
  genes: '8-11',
96
96
  name: 'Eye Color', code: 'EC',
97
97
  kai: {
98
- '1' => 'Hundergrey',
98
+ '1' => 'Thundergrey',
99
99
  '2' => 'Gold',
100
100
  '3' => 'Topaz',
101
101
  '4' => 'Mintgreen',
@@ -375,3 +375,53 @@ TRAITS =
375
375
  ## prune, furball, duckduckcat, or thatsawrap - more like fancies (not really traits)
376
376
  }
377
377
  }
378
+
379
+
380
+ # quick hack - map copycats keys to (internal) cryptokitties trait type keys
381
+ # note: all keys are the same except:
382
+ ALT_TRAIT_TYPE_KEYS =
383
+ {
384
+ :color1 => :colorprimary,
385
+ :color2 => :colorsecondary,
386
+ :color3 => :colortertiary,
387
+ :purrstige => :prestige,
388
+ ## add :fur, etc. too - why? why not?
389
+ }
390
+
391
+ ALT_TRAIT_TYPE_NAMES =
392
+ {
393
+ 'body' => 'fur',
394
+ 'eyes' => 'eye shape',
395
+ 'eye type' => 'eye shape',
396
+ 'body color' => 'base color',
397
+ 'primary color' => 'base color',
398
+ 'base colour' => 'base color', # british (canadian) spelling
399
+ 'secondary color' => 'highlight color',
400
+ 'sec color' => 'highlight color',
401
+ 'pattern color' => 'highlight color',
402
+ 'highlight colour' => 'highlight color', # british (canadian) spelling
403
+ 'tertiary color' => 'accent color',
404
+ 'accent colour' => 'accent color', # british (canadian) spelling
405
+ 'wild' => 'wild element',
406
+ 'secret' => 'secret y gene',
407
+ 'prestige' => 'purrstige',
408
+ }
409
+
410
+ ALT_TRAIT_NAMES =
411
+ {
412
+ 'totesbasic (14)' => 'totesbasic 1',
413
+ 'totesbasic (15)' => 'totesbasic 2',
414
+ 'totesbasic (23)' => 'totesbasic 3',
415
+ 'totesbasic_14' => 'totesbasic 1',
416
+ 'totesbasic_15' => 'totesbasic 2',
417
+ 'totesbasic_23' => 'totesbasic 3',
418
+ 'totesbasic (f)' => 'totesbasic 1',
419
+ 'totesbasic (g)' => 'totesbasic 2',
420
+ 'totesbasic (p)' => 'totesbasic 3',
421
+ 'totesbasic_f' => 'totesbasic 1',
422
+ 'totesbasic_g' => 'totesbasic 2',
423
+ 'totesbasic_p' => 'totesbasic 3',
424
+ 'totesbasic_1' => 'totesbasic 1',
425
+ 'totesbasic_2' => 'totesbasic 2',
426
+ 'totesbasic_3' => 'totesbasic 3',
427
+ }
@@ -3,12 +3,6 @@
3
3
 
4
4
  class Fancy
5
5
 
6
- def self.special_editions() @@special_editions ||= []; end # special edition fancies
7
- def self.exclusives() @@exclusives ||= []; end # exclusive fancies
8
- def self.fancies() @@fancies ||= []; end # "normal" fancies
9
-
10
-
11
-
12
6
  def self.fancies_by_key() @@fancies_by_key ||= {}; end
13
7
  def self.fancies_by_name() @@fancies_by_name ||= {}; end
14
8
 
@@ -54,6 +48,23 @@ class Fancy
54
48
  end
55
49
  end
56
50
 
51
+
52
+ def self.special_editions # special edition fancies
53
+ @@fancies_by_key.values.select { |fancy| fancy.special_edition? }
54
+ end
55
+ def self.exclusives # exclusive fancies
56
+ @@fancies_by_key.values.select { |fancy| fancy.exclusive? }
57
+ end
58
+ def self.fancies # "normal" fancies
59
+ @@fancies_by_key.values.select { |fancy| fancy.recipe? }
60
+ end
61
+
62
+ def self.breedable ## todo: find a better name (or add alias) e.g. use unlocked why? why not?
63
+ today = Date.today
64
+ @@fancies_by_key.values.select { |fancy| fancy.breedable?( today ) }
65
+ end
66
+
67
+
57
68
  def self.size() @@fancies_by_key.size; end ## todo: add length alias too? why? why not?
58
69
 
59
70
 
@@ -70,9 +81,12 @@ class Fancy
70
81
  :recipe,
71
82
  :count,
72
83
  :limit,
73
- :ids
84
+ :ids,
85
+ :time_start,
86
+ :time_end
74
87
 
75
88
  def initialize( **kwargs )
89
+ @exclusive = @specialedition = @recipe = nil
76
90
  update( kwargs )
77
91
  end
78
92
 
@@ -88,64 +102,97 @@ class Fancy
88
102
  alias_method :special_edition?, :specialedition?
89
103
  def recipe?() @recipe.nil? == false; end
90
104
 
105
+ def overflow?() @count && @limit && @count > @limit; end
106
+ def overflow() @count - @limit; end ## todo: check for count limit set - why? why not?
107
+ def limit?() @limit; end
108
+ def count?() @count; end
109
+
110
+ def time?() @time_start && @time_end; end ## is fancy(recipe,specialedition) time windowed? true/false
111
+
112
+ def time_days() (@time_end.jd - @time_start.jd) + 1; end
113
+
114
+
115
+ def unlocked?( today=Date.today )
116
+ if @recipe
117
+ if @recipe.time? ## time windowed recipe
118
+ if @recipe.time_end >= today
119
+ true
120
+ else
121
+ false
122
+ end
123
+ else ## assume limit
124
+ if @count && @count < @limit
125
+ true
126
+ else
127
+ false
128
+ end
129
+ end
130
+ else
131
+ false
132
+ end
133
+ end
134
+
135
+ alias_method :breedable?, :unlocked?
136
+
137
+ def locked?( today=Date.today ) !unlocked?( today ); end
91
138
 
92
139
 
93
- ## auto-fill
140
+ ###########################################
141
+ ## auto-fill fancies
94
142
  FANCIES.each do |key,h|
95
143
 
144
+ name = h[:name]
145
+ name_cn = h[:name_cn] # add chinese name if present
146
+
96
147
  date_str = h[:date]
97
148
  date_str = h[:recipe][:time][:start] if date_str.nil? && h[:recipe]
98
149
  date_str = h[:specialedition][:time][:start] if date_str.nil? && h[:specialedition]
99
150
 
100
151
  date = Date.strptime( date_str, '%Y-%m-%d' )
101
152
 
102
-
103
- name = h[:name]
104
- name_cn = h[:name_cn] # add chinese name if present
105
- desc = h[:desc]
106
-
107
- exclusive = h[:exclusive]
108
- specialedition = h[:specialedition]
109
- recipe = h[:recipe]
110
-
111
153
  attribs = {
112
154
  key: key,
113
- date: date,
114
155
  name: name,
115
156
  name_cn: name_cn,
116
- desc: desc,
117
- exclusive: exclusive,
118
- specialedition: specialedition,
119
- recipe: recipe,
157
+ date: date,
158
+ desc: h[:desc]
120
159
  }
121
160
 
122
-
123
- ## todo: check for overflow - if overflow use limit+overflow = count
124
- ## add traits and time windows
125
- if exclusive
126
- attribs = attribs.merge( limit: h[:exclusive][:limit],
127
- count: h[:exclusive][:count],
128
- ids: h[:exclusive][:ids] )
129
- elsif specialedition
130
- attribs = attribs.merge( limit: h[:specialedition][:limit],
131
- count: h[:specialedition][:count] )
132
- else ## assume "normal/regular" fancy with recipes
133
- attribs = attribs.merge( limit: h[:recipe][:limit],
134
- count: h[:recipe][:count] )
135
- end
161
+ attribs = if h[:exclusive]
162
+ attribs.merge( exclusive: true,
163
+ limit: h[:exclusive][:limit],
164
+ ids: h[:exclusive][:ids] )
165
+ elsif h[:specialedition]
166
+ attribs.merge( specialedition: true,
167
+ limit: h[:specialedition][:limit],
168
+ time_start: h[:specialedition][:time] && h[:specialedition][:time][:start] ? Date.strptime( h[:specialedition][:time][:start], '%Y-%m-%d' ) : nil,
169
+ time_end: h[:specialedition][:time] && h[:specialedition][:time][:end] ? Date.strptime( h[:specialedition][:time][:end], '%Y-%m-%d' ) : nil )
170
+ else ## assume "normal/regular" fancy with recipes
171
+ pp h[:recipe]
172
+ recipe = Recipe.new(
173
+ traits: h[:recipe][:traits], ## todo/fix: turn strings into trait objs!!!!
174
+ variants: h[:recipe][:variants], ## todo/fix: turn variant hash into variant ??? - why? why not?
175
+ limit: h[:recipe][:limit],
176
+ time_start: h[:recipe][:time] && h[:recipe][:time][:start] ? Date.strptime( h[:recipe][:time][:start], '%Y-%m-%d' ) : nil,
177
+ time_end: h[:recipe][:time] && h[:recipe][:time][:end] ? Date.strptime( h[:recipe][:time][:end], '%Y-%m-%d' ) : nil )
178
+
179
+ ## note: support overflow "shortcut" - overflow+limit => count
180
+ count = if h[:recipe][:overflow]
181
+ recipe.limit + h[:recipe][:overflow]
182
+ else
183
+ h[:recipe][:count]
184
+ end
185
+
186
+ attribs.merge( recipe: recipe,
187
+ limit: recipe.limit,
188
+ time_start: recipe.time_start,
189
+ time_end: recipe.time_end,
190
+ count: count )
191
+ end
136
192
 
137
193
 
138
194
  fancy = Fancy.new( **attribs )
139
- pp fancy
140
-
141
- if fancy.exclusive?
142
- exclusives << fancy
143
- elsif fancy.special_edition?
144
- special_editions << fancy
145
- else ## assume "normal/regular" fancy (with recipe)
146
- fancies << fancy
147
- end
148
-
195
+ ## pp fancy
149
196
 
150
197
  ## note: key MUST be a symbol (NOT a string)
151
198
  fancies_by_key[key] = fancy
@@ -40,10 +40,18 @@ def kitties_specialedition_search_url( fancy ) kitties_fancy_search_url( fancy )
40
40
  ################################
41
41
  # /media - image links
42
42
 
43
- def media_fancy_pic_url( key, variant_key=nil ) ### todo: find a better name - why? why not?
43
+ def media_fancy_url( key, variant_key=nil ) ### todo: find a better name - why? why not?
44
44
  if variant_key
45
45
  "https://cryptocopycats.github.io/media/kitties/100x100/fancy-#{key}-#{variant_key}.png"
46
46
  else
47
47
  "https://cryptocopycats.github.io/media/kitties/100x100/fancy-#{key}.png"
48
48
  end
49
49
  end
50
+
51
+ ## (old) alias for media_fany_url
52
+ def media_fancy_pic_url( key, variant_key=nil ) media_fancy_url( key, variant_key ); end
53
+
54
+
55
+ def media_icon_url( key ) ## note: use :unlocked, :locked, etc.
56
+ "https://cryptocopycats.github.io/media/icons/18x18/#{key}.png"
57
+ end
@@ -1,117 +1,120 @@
1
- # encoding: utf-8
2
-
3
-
4
- ##################################
5
- # Tier 0 (Base) (1-g)
6
- # Tier 1 (Mewtation I) (h-p)
7
- # Tier 2 (Mewtation II) (q-t)
8
- # Tier 3 (Mewtation III) (u,v)
9
- # Tier 4 (Mewtation IIII) (w)
10
- #
11
- TIER = { ## todo/fix: use an algo to calculate - why? why not?
12
- '1' => 0,
13
- '2' => 0,
14
- '3' => 0,
15
- '4' => 0,
16
- '5' => 0,
17
- '6' => 0,
18
- '7' => 0,
19
- '8' => 0,
20
- '9' => 0,
21
- 'a' => 0,
22
- 'b' => 0,
23
- 'c' => 0,
24
- 'd' => 0,
25
- 'e' => 0,
26
- 'f' => 0,
27
- 'g' => 0,
28
- 'h' => 1,
29
- 'i' => 1,
30
- 'j' => 1,
31
- 'k' => 1,
32
- 'm' => 1,
33
- 'n' => 1,
34
- 'o' => 1,
35
- 'p' => 1,
36
- 'q' => 2,
37
- 'r' => 2,
38
- 's' => 2,
39
- 't' => 2,
40
- 'u' => 3,
41
- 'v' => 3,
42
- 'w' => 4,
43
- 'x' => nil
44
- }
45
-
46
- ## (quick 'n' dirty) kai to mutation/mewtation level (I,II,III,IIII)
47
- MUTATION_LEVEL = {
48
- '1' => '',
49
- '2' => '',
50
- '3' => '',
51
- '4' => '',
52
- '5' => '',
53
- '6' => '',
54
- '7' => '',
55
- '8' => '',
56
- '9' => '',
57
- 'a' => '',
58
- 'b' => '',
59
- 'c' => '',
60
- 'd' => '',
61
- 'e' => '',
62
- 'f' => '',
63
- 'g' => '',
64
- 'h' => 'I',
65
- 'i' => 'I',
66
- 'j' => 'I',
67
- 'k' => 'I',
68
- 'm' => 'I',
69
- 'n' => 'I',
70
- 'o' => 'I',
71
- 'p' => 'I',
72
- 'q' => 'II',
73
- 'r' => 'II',
74
- 's' => 'II',
75
- 't' => 'II',
76
- 'u' => 'III',
77
- 'v' => 'III',
78
- 'w' => 'IIII',
79
- 'x' => ''
80
- }
81
- MEWTATION_LEVEL = MUTATION_LEVEL ## add alias
82
-
83
- MUTATION_PAIR = {
84
- '1' => '', ## todo: use nil for "" - why? why not?
85
- '2' => '',
86
- '3' => '',
87
- '4' => '',
88
- '5' => '',
89
- '6' => '',
90
- '7' => '',
91
- '8' => '',
92
- '9' => '',
93
- 'a' => '',
94
- 'b' => '',
95
- 'c' => '',
96
- 'd' => '',
97
- 'e' => '',
98
- 'f' => '',
99
- 'g' => '',
100
- 'h' => '1+2',
101
- 'i' => '3+4',
102
- 'j' => '5+6',
103
- 'k' => '7+8',
104
- 'm' => '9+a',
105
- 'n' => 'b+c',
106
- 'o' => 'd+e',
107
- 'p' => 'f+g',
108
- 'q' => 'h+i',
109
- 'r' => 'j+k',
110
- 's' => 'm+n',
111
- 't' => 'o+p',
112
- 'u' => 'q+r',
113
- 'v' => 's+t',
114
- 'w' => 'u+v',
115
- 'x' => ''
116
- }
117
- MEWTATION_PAIR = MUTATION_PAIR ## add alias
1
+ # encoding: utf-8
2
+
3
+ ##################################
4
+ # Tier 0 (Base) (1-g)
5
+ # Tier 1 (Mewtation I) (h-p)
6
+ # Tier 2 (Mewtation II) (q-t)
7
+ # Tier 3 (Mewtation III) (u,v)
8
+ # Tier 4 (Mewtation IIII) (w) # note: use IIII instead of IV
9
+ #
10
+
11
+ MUTATION_TIER = { ## todo/fix: use an algo to calculate - why? why not?
12
+ '1' => 0,
13
+ '2' => 0,
14
+ '3' => 0,
15
+ '4' => 0,
16
+ '5' => 0,
17
+ '6' => 0,
18
+ '7' => 0,
19
+ '8' => 0,
20
+ '9' => 0,
21
+ 'a' => 0,
22
+ 'b' => 0,
23
+ 'c' => 0,
24
+ 'd' => 0,
25
+ 'e' => 0,
26
+ 'f' => 0,
27
+ 'g' => 0,
28
+ 'h' => 1,
29
+ 'i' => 1,
30
+ 'j' => 1,
31
+ 'k' => 1,
32
+ 'm' => 1,
33
+ 'n' => 1,
34
+ 'o' => 1,
35
+ 'p' => 1,
36
+ 'q' => 2,
37
+ 'r' => 2,
38
+ 's' => 2,
39
+ 't' => 2,
40
+ 'u' => 3,
41
+ 'v' => 3,
42
+ 'w' => 4,
43
+ 'x' => nil
44
+ }
45
+
46
+ ## (quick 'n' dirty) kai to mutation/mewtation tier level in roman numerals (I,II,III,IIII) - as strings (and nil)
47
+ MUTATION_TIER_ROMAN = {
48
+ '1' => '',
49
+ '2' => '',
50
+ '3' => '',
51
+ '4' => '',
52
+ '5' => '',
53
+ '6' => '',
54
+ '7' => '',
55
+ '8' => '',
56
+ '9' => '',
57
+ 'a' => '',
58
+ 'b' => '',
59
+ 'c' => '',
60
+ 'd' => '',
61
+ 'e' => '',
62
+ 'f' => '',
63
+ 'g' => '',
64
+ 'h' => 'I',
65
+ 'i' => 'I',
66
+ 'j' => 'I',
67
+ 'k' => 'I',
68
+ 'm' => 'I',
69
+ 'n' => 'I',
70
+ 'o' => 'I',
71
+ 'p' => 'I',
72
+ 'q' => 'II',
73
+ 'r' => 'II',
74
+ 's' => 'II',
75
+ 't' => 'II',
76
+ 'u' => 'III',
77
+ 'v' => 'III',
78
+ 'w' => 'IIII',
79
+ 'x' => '' ## Use nil and NOT empty string "" - why? why not?
80
+ }
81
+
82
+ MUTATION_PAIR = {
83
+ '1' => '', ## todo: use nil for "" - why? why not?
84
+ '2' => '',
85
+ '3' => '',
86
+ '4' => '',
87
+ '5' => '',
88
+ '6' => '',
89
+ '7' => '',
90
+ '8' => '',
91
+ '9' => '',
92
+ 'a' => '',
93
+ 'b' => '',
94
+ 'c' => '',
95
+ 'd' => '',
96
+ 'e' => '',
97
+ 'f' => '',
98
+ 'g' => '',
99
+ 'h' => '1+2',
100
+ 'i' => '3+4',
101
+ 'j' => '5+6',
102
+ 'k' => '7+8',
103
+ 'm' => '9+a',
104
+ 'n' => 'b+c',
105
+ 'o' => 'd+e',
106
+ 'p' => 'f+g',
107
+ 'q' => 'h+i',
108
+ 'r' => 'j+k',
109
+ 's' => 'm+n',
110
+ 't' => 'o+p',
111
+ 'u' => 'q+r',
112
+ 'v' => 's+t',
113
+ 'w' => 'u+v',
114
+ 'x' => ''
115
+ }
116
+
117
+ ## add alias(es)
118
+ MEWTATION_TIER = MUTATION_TIER
119
+ MEWTATION_TIER_ROMAN = MUTATION_TIER_ROMAN
120
+ MEWTATION_PAIR = MUTATION_PAIR
@@ -5,39 +5,22 @@ class GenesPage
5
5
 
6
6
  def build
7
7
  buf = ""
8
- buf << "# Genes (#{TRAITS.keys.size} x 4)\n\n"
8
+ buf << "# Genes (#{TraitType.size} x 4)\n\n"
9
9
 
10
10
  headings = []
11
- TRAITS.values.each do |trait|
12
- headings << "#{trait[:name]} (#{trait[:genes]})"
11
+ TraitType.each do |tt|
12
+ anchor = "#{tt.name} #{tt.code}".downcase.gsub( ' ', '-' )
13
+ headings << "[#{tt.name} (#{tt.code})](##{anchor})"
13
14
  end
14
15
 
15
16
  buf << headings.join( " • " )
16
17
  buf << "\n\n"
17
18
 
18
19
 
19
- TRAITS.values.each do |trait|
20
-
21
- puts "Kai Name"
22
- items = []
23
- Kai::ALPHABET.each do |kai|
24
- value = trait[:kai][kai]
25
- code = "#{trait[:code]}%02d" % Kai::NUMBER[kai] ## e.g. FU00, FU01, FU02, etc.
26
- if value =~ /_[0-9a-z]$/
27
- if value.start_with?( "totesbasic" ) ## note: special case for three totesbasic traits
28
- else
29
- value = '?'
30
- end
31
- end
32
- items << [kai, code, value]
33
- end
34
-
35
- items.each do |item|
36
- puts "#{item[0]} #{item[1]} #{item[2]}"
37
- end
38
-
39
- buf << "## #{trait[:name]} (#{trait[:code]}) - Genes #{trait[:genes]}\n\n"
40
- buf << make_table( items )
20
+ TraitType.each do |tt|
21
+ buf << "## #{tt.name} (#{tt.code})\n\n"
22
+ buf << "_Genes #{tt.genes}_\n\n"
23
+ buf << make_table( tt.traits )
41
24
  buf << "\n\n"
42
25
  end
43
26
 
@@ -48,9 +31,9 @@ end ## method build
48
31
 
49
32
 
50
33
 
51
- def make_table( items )
52
- rows = make_rows( items, columns: 2 ) ## was 4
53
- pp rows
34
+ def make_table( traits )
35
+ rows = make_rows( traits, columns: 2 ) ## was 4
36
+ ## pp rows
54
37
 
55
38
  buf = ""
56
39
  buf << "|Kai|Code|Name |Kai|Code|Name |\n"
@@ -59,22 +42,32 @@ def make_table( items )
59
42
  rows.each do |row|
60
43
  buf << "| "
61
44
 
62
- parts = row.map do |item|
63
- kai = item[0]
64
- name = item[2]
65
-
66
- if name == '?'
67
- cattribute = "?"
45
+ parts = row.map do |trait|
46
+ kai = trait.kai
47
+ ## binary = "%05b" % Kai::NUM[kai]
48
+ code = trait.code
49
+ name = trait.name
50
+ tier = trait.tier_roman ## e.g. I,II,III, etc. : String
51
+
52
+ if name.nil?
53
+ ## note: so far x/31 trait is unknown/undefined!!!
54
+ if kai == "x"
55
+ cattribute = "?"
56
+ elsif trait.type.key == :secret
57
+ cattribute = "? #{tier}" ## unknown unknown
58
+ else ## "anonymous / unnamed" gene / trait
59
+ cattribute = "∅ #{tier}" ## known unknown :-)
60
+ end
68
61
  else
69
- if name.start_with?( "totesbasic" ) ## note: special case for three totesbasic traits
62
+ if name.downcase.start_with?( "totesbasic" ) ## note: special case for three totesbasic traits
70
63
  q = "totesbasic"
71
64
  else
72
65
  q = name
73
66
  end
74
- cattribute = "**[#{name}](#{kitties_search_url(q)})** #{MEWTATION_LEVEL[kai]}"
67
+ cattribute = "**[#{name}](#{kitties_search_url(q)})** #{tier}"
75
68
  end
76
69
 
77
- "#{item[0]} | #{item[1]} | #{cattribute}"
70
+ "#{kai} | #{code} | #{cattribute}"
78
71
  end
79
72
 
80
73
  buf << parts.join( " | " )
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+
4
+
5
+ class Recipe
6
+
7
+ attr_accessor :time_start, ## use date_start -why? why not?
8
+ :time_end,
9
+ :traits,
10
+ :variants,
11
+ :limit
12
+
13
+ def initialize( **kwargs )
14
+ update( kwargs )
15
+ end
16
+
17
+ def update( **kwargs )
18
+ kwargs.each do |name,value|
19
+ send( "#{name}=", value ) ## use "regular" plain/classic attribute setter
20
+ end
21
+ self ## return self for chaining
22
+ end
23
+
24
+ ## is recipe time windowed? true/false
25
+ def time?() @time_start && @time_end; end
26
+
27
+ def time_days() (@time_end.jd - @time_start.jd) + 1; end
28
+
29
+ end # class Recipe
@@ -3,8 +3,8 @@
3
3
 
4
4
  class Trait
5
5
 
6
- def self.traits_by_name() @@traits_by_name ||= {}; end
7
6
  def self.traits_by_code() @@traits_by_code ||= {}; end
7
+ def self.traits_by_name() @@traits_by_name ||= {}; end
8
8
 
9
9
  def self.find_by_code( code )
10
10
  ## note: allow string AND symbols (thus, use .to_s)
@@ -15,21 +15,34 @@ class Trait
15
15
  def self.find_by_name( name )
16
16
  ## note: allow string AND symbols (thus, use .to_s !!!)
17
17
  ## note: downcase name e.g. allow Savannah too (not just savannah)
18
- @@traits_by_name[ name.downcase.to_s ]
18
+
19
+ name = name.to_s.downcase
20
+ name = ALT_TRAIT_NAMES[ name ] if ALT_TRAIT_NAMES[ name ]
21
+
22
+ @@traits_by_name[ name ]
19
23
  end
20
24
 
21
- ## add "generic" convenience find helper
25
+
26
+ ## add "generic" convenience find helpers
22
27
  def self.find_by( **kwargs )
23
- if kwargs[ :name ]
24
- find_by_name( kwargs[ :name ] )
25
- elsif kwargs[ :code ]
28
+ if kwargs[ :code ]
26
29
  find_by_code( kwargs[ :code] )
30
+ elsif kwargs[ :name ]
31
+ find_by_name( kwargs[ :name ] )
27
32
  else
28
33
  ## todo/fix: throw argument except!!!
29
34
  nil
30
35
  end
31
36
  end
32
37
 
38
+ def self.[]( key )
39
+ if key.size == 4 && key =~ /^[A-Za-z]{2}[0-9]{2}$/
40
+ Trait.find_by_code( key )
41
+ else
42
+ Trait.find_by_name( key )
43
+ end
44
+ end
45
+
33
46
 
34
47
 
35
48
  attr_accessor :type,
@@ -47,8 +60,34 @@ class Trait
47
60
  self ## return self for chaining
48
61
  end
49
62
 
50
- def num() Kai::NUMBER[@kai]; end
51
- def code() @type.code + Kai::CODE[@kai]; end
63
+ def num() Kai::NUMBER[@kai]; end
64
+ def code() "#{@type.code}#{Kai::CODE[@kai]}"; end
65
+ def binary() "%05b" % num; end
66
+ alias_method :bin, :binary
67
+
68
+
69
+ def tier( format=:num )
70
+ ## num => 0,1,2,3,4,nil : Integer|Nil
71
+ ## roman => "","I","II","III","IIII",nil : String|Nil
72
+
73
+ if format == :roman
74
+ MUTATION_TIER_ROMAN[@kai]
75
+ else ## assume integer num(ber)
76
+ MUTATION_TIER[@kai]
77
+ end
78
+ end
79
+
80
+ def tier_roman() tier(:roman); end
81
+
82
+ alias_method :level, :tier
83
+ alias_method :m, :tier # m = mewtation/mutation
84
+
85
+ def base?() tier == 0; end # base level 0 - no mutation
86
+ def m1?() tier == 1; end # m1 - mutation level 1
87
+ def m2?() tier == 2; end # m2 - mutation level 2
88
+ def m3?() tier == 3; end # m3 - mutation level 3
89
+ def m4?() tier == 4; end # m4 - mutation level 4
90
+
52
91
  end # class Trait
53
92
 
54
93
 
@@ -59,58 +98,30 @@ class TraitType
59
98
  def self.trait_types_by_code() @@trait_types_by_code ||= {}; end
60
99
  def self.trait_types_by_name() @@trait_types_by_name ||= {}; end
61
100
 
62
- # quick hack - map copycats keys to (internal) cryptokitties trait type keys
63
- # note: all keys are the same except:
64
- ALT_TRAIT_TYPE_KEYS =
65
- {
66
- # :colorprimary => :color1,
67
- # :colorsecondary => :color2,
68
- # :colortertiary => :color3
69
-
70
- :color1 => :colorprimary,
71
- :color2 => :colorsecondary,
72
- :color3 => :colortertiary
73
- }
74
-
75
101
 
76
102
  def self.find_by_key( key )
77
103
  ## note: allow string AND symbols (thus, use .to_sym !!!)
78
104
  ## note: allow known alternative mappings/key (e.g. "internal" cryptokitties keys if different)
79
- key = ALT_TRAIT_TYPE_KEYS[ key.to_sym ] if ALT_TRAIT_TYPE_KEYS[ key.to_sym ]
105
+ key = key.to_sym
106
+ key = ALT_TRAIT_TYPE_KEYS[ key ] if ALT_TRAIT_TYPE_KEYS[ key ]
80
107
 
81
- @@trait_types_by_key[ key.to_sym ]
108
+ @@trait_types_by_key[ key]
82
109
  end
83
110
 
84
111
  def self.find_by_code( code )
85
112
  ## note: allow string AND symbols (thus, use .to_s)
86
113
  ## e.g. allow 'FU', 'fu', :fu, :FU, etc.
87
- @@trait_types_by_code[ code.upcase.to_s ]
114
+ code = code.to_s.upcase
115
+ @@trait_types_by_code[ code ]
88
116
  end
89
117
 
90
- ALT_TRAIT_TYPE_NAMES =
91
- {
92
- 'body' => 'fur',
93
- 'eyes' => 'eye shape',
94
- 'eye type' => 'eye shape',
95
- 'body color' => 'base color',
96
- 'primary color' => 'base color',
97
- 'base colour' => 'base color', # british (canadian) spelling
98
- 'secondary color' => 'highlight color',
99
- 'sec color' => 'highlight color',
100
- 'pattern color' => 'highlight color',
101
- 'highlight colour' => 'highlight color', # british (canadian) spelling
102
- 'tertiary color' => 'accent color',
103
- 'accent colour' => 'accent color', # british (canadian) spelling
104
- 'wild' => 'wild element',
105
- 'secret' => 'secret y gene'
106
- }
107
-
108
118
  def self.find_by_name( name )
109
119
  ## note: downcase name e.g. allow fur too (not just Fur)
110
120
  ## note: allow known alternative mappings/key (e.g. "internal" cryptokitties keys if different)
111
- name = ALT_TRAIT_TYPE_NAMES[ name.downcase ] if ALT_TRAIT_TYPE_NAMES[ name.downcase ]
121
+ name = name.to_s.downcase
122
+ name = ALT_TRAIT_TYPE_NAMES[ name ] if ALT_TRAIT_TYPE_NAMES[ name ]
112
123
 
113
- @@trait_types_by_name[ name.downcase ]
124
+ @@trait_types_by_name[ name ]
114
125
  end
115
126
 
116
127
 
@@ -128,6 +139,19 @@ class TraitType
128
139
  end
129
140
  end
130
141
 
142
+ def self.[]( key )
143
+ ## check for codes e.g. FU, PA, ... (or fu, pa,...).
144
+ if key.size == 2 && key =~ /^[A-Za-z]{2}$/
145
+ TraitType.find_by_code( key )
146
+ else
147
+ if key.is_a? Symbol ## e.g. :body, :pattern, etc.
148
+ TraitType.find_by_key( key )
149
+ else ## assume string
150
+ TraitType.find_by_name( key )
151
+ end
152
+ end
153
+ end
154
+
131
155
  def self.each
132
156
  @@trait_types_by_key.each do |(key,type)|
133
157
  yield( type )
@@ -140,6 +164,8 @@ class TraitType
140
164
  end
141
165
  end
142
166
 
167
+ def self.size() @@trait_types_by_key.size; end ## todo: add length alias too? why? why not?
168
+
143
169
 
144
170
  attr_accessor :key,
145
171
  :name,
@@ -236,11 +262,6 @@ end # class TraitType
236
262
 
237
263
  class Traits
238
264
  def self.[]( key )
239
-
240
- ## todo:
241
- ## add lookup trait type by alt_names (string)
242
- ## add lookup trait type by alt_keys (symbol)
243
-
244
265
  ## check for codes e.g. FU, PA, ... (or fu, pa,...).
245
266
  if key.size == 2 && key =~ /^[A-Za-z]{2}$/
246
267
  TraitType.find_by_code( key )
@@ -5,7 +5,7 @@ class Kittyverse
5
5
 
6
6
  MAJOR = 0
7
7
  MINOR = 4
8
- PATCH = 0
8
+ PATCH = 1
9
9
  VERSION = [MAJOR,MINOR,PATCH].join('.')
10
10
 
11
11
  def self.version
@@ -37,6 +37,31 @@ def test_bugcat_v2
37
37
  end
38
38
 
39
39
 
40
+ def test_curdlin
41
+ fancy = Fancy[ 'Curdlin' ]
42
+ assert_equal :curdlin, fancy.key
43
+ assert fancy.exclusive? == false
44
+ assert fancy.specialedition? == false
45
+ assert fancy.special_edition? == false
46
+
47
+ assert fancy.time?
48
+ assert fancy.recipe?
49
+ assert fancy.recipe.time?
50
+ assert 4, fancy.recipe.traits.size
51
+ assert 204, fancy.time_days
52
+ assert 204, fancy.recipe.time_days
53
+
54
+ today = Date.new( 2019, 5, 5 )
55
+ assert fancy.unlocked?( today )
56
+ assert fancy.breedable?( today )
57
+ assert fancy.locked?( today ) == false
58
+ future = Date.new( 2019, 12, 20 )
59
+ assert fancy.unlocked?( future ) == false
60
+ assert fancy.breedable?( future ) == false
61
+ assert fancy.locked?( future )
62
+ end
63
+
64
+
40
65
  def test_misc
41
66
  Fancy.each do |fancy|
42
67
  p fancy.name
@@ -12,13 +12,16 @@ class TestTraits < MiniTest::Test
12
12
 
13
13
 
14
14
  def test_savannah
15
- [ Traits[ 'FU00' ],
15
+ [ Trait[ 'FU00' ],
16
16
  Trait.find_by_code( 'FU00' ),
17
17
  Trait.find_by( code: 'FU00' ),
18
- Traits[ 'savannah' ],
19
- Traits[ 'Savannah' ],
18
+ Trait[ 'savannah' ],
19
+ Trait[ 'Savannah' ],
20
20
  Trait.find_by_name( 'Savannah' ),
21
21
  Trait.find_by( name: 'Savannah' ),
22
+ Traits[ 'FU00' ],
23
+ Traits[ 'savannah' ],
24
+ Traits[ 'Savannah' ],
22
25
  Traits[ :body ][ '1' ],
23
26
  Traits[ :body ][ '00' ],
24
27
  Traits[ :body ][ 0 ],
@@ -33,19 +36,91 @@ def test_savannah
33
36
  assert_equal "Fur", t.type.name
34
37
  assert_equal "FU00", t.code
35
38
  assert_equal "1", t.kai
39
+ assert_equal 0, t.num
40
+ assert_equal "00000", t.bin
41
+ assert_equal "00000", t.binary
42
+ assert_equal 0, t.tier
43
+ assert_equal "", t.tier_roman
44
+ assert_equal "", t.tier(:roman)
45
+ assert t.base?
46
+ assert t.m1? == false
47
+ assert t.m2? == false
48
+ assert t.m3? == false
49
+ assert t.m4? == false
50
+ end
51
+ end
52
+
53
+ def test_moonrise
54
+ t = Trait[ 'Moonrise' ]
55
+ assert_equal "PA30", t.code
56
+ assert_equal "w", t.kai
57
+ assert_equal 30, t.num
58
+ assert_equal "11110", t.bin
59
+ assert_equal "11110", t.binary
60
+ assert_equal 4, t.tier
61
+ assert_equal 4, t.level
62
+ assert_equal 4, t.m
63
+ assert_equal "IIII", t.tier_roman
64
+ assert_equal "IIII", t.tier(:roman)
65
+ assert_equal "IIII", t.level(:roman)
66
+ assert_equal "IIII", t.m(:roman)
67
+ assert t.base? == false
68
+ assert t.m1? == false
69
+ assert t.m2? == false
70
+ assert t.m3? == false
71
+ assert t.m4?
72
+ end
73
+
74
+
75
+ def test_totesbasic
76
+ [ Trait.find_by_name( 'totesbasic 1' ),
77
+ Trait.find_by_name( 'totesbasic_1' ),
78
+ Trait.find_by_name( 'totesbasic (14)' ),
79
+ Trait.find_by_name( 'totesbasic_14' ),
80
+ Trait.find_by_name( 'totesbasic (f)' ),
81
+ Trait.find_by_name( 'totesbasic_f' ),
82
+ Trait[ 'totesbasic 1' ],
83
+ Trait[ 'totesbasic_1' ],
84
+ ].each do |t|
85
+ assert_equal Trait, t.class
86
+ assert_equal "Totesbasic 1", t.name
87
+ assert_equal "Pattern", t.type.name
88
+ assert_equal "PA14", t.code
89
+ assert_equal "f", t.kai
90
+ assert_equal 14, t.num
91
+ assert t.base?
92
+ assert_equal 0, t.tier
93
+ assert_equal "", t.tier_roman
94
+ assert_equal "", t.tier(:roman)
36
95
  end
37
96
  end
38
97
 
98
+
39
99
  def test_fu31
40
100
  [ Traits[ :body ][ 'x' ],
41
101
  Traits[ :body ][ '31' ],
42
102
  Traits[ :body ][ 31 ]
43
103
  ].each do |t|
44
104
  assert_equal Trait, t.class
45
- assert_equal nil, t.name
105
+ assert t.name == nil
46
106
  assert_equal "Fur", t.type.name
47
107
  assert_equal "FU31", t.code
48
108
  assert_equal "x", t.kai
109
+ assert_equal 31, t.num
110
+ assert_equal "11111", t.bin
111
+ assert_equal "11111", t.binary
112
+ assert t.tier == nil
113
+ assert t.level == nil
114
+ assert t.m == nil
115
+ assert_equal "", t.tier_roman
116
+ assert_equal "", t.tier(:roman)
117
+ assert_equal "", t.level(:roman)
118
+ assert_equal "", t.m(:roman)
119
+ assert t.base? == false
120
+ assert t.m1? == false
121
+ assert t.m2? == false
122
+ assert t.m3? == false
123
+ assert t.m4? == false
49
124
  end
50
125
  end
51
126
 
@@ -59,6 +134,7 @@ def test_vigilante
59
134
  assert_equal "Pattern", t.type.name
60
135
  assert_equal "PA00", t.code
61
136
  assert_equal "1", t.kai
137
+ assert_equal 0, t.num
62
138
  end
63
139
  end
64
140
 
@@ -69,6 +145,8 @@ def test_body
69
145
  ].each do |tt|
70
146
  assert_equal TraitType, tt.class
71
147
  assert_equal "Fur", tt.name
148
+ assert_equal :body, tt.key
149
+ assert_equal 32, tt.traits.size
72
150
  end
73
151
  end
74
152
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kittyverse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.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: 2019-05-09 00:00:00.000000000 Z
11
+ date: 2019-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base32-alphabets
@@ -78,6 +78,7 @@ files:
78
78
  - lib/kittyverse/links.rb
79
79
  - lib/kittyverse/mewtations.rb
80
80
  - lib/kittyverse/pages/genes.rb
81
+ - lib/kittyverse/recipes.rb
81
82
  - lib/kittyverse/traits.rb
82
83
  - lib/kittyverse/version.rb
83
84
  - test/helper.rb