kittyverse 0.0.1 → 0.1.0
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 +4 -4
- data/Manifest.txt +3 -0
- data/README.md +1 -1
- data/lib/kittyverse.rb +262 -3
- data/lib/kittyverse/traits.rb +377 -0
- data/lib/kittyverse/version.rb +2 -2
- data/test/helper.rb +10 -0
- data/test/test_traits.rb +199 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70c6b5c648ee1718de835e129f15a847a66979b2
|
4
|
+
data.tar.gz: 65b590568925c9948c3ed8f929eff8b4589c6ebc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6216a9e6016f61e492300ed64e0791bbff10563800530b4898fda3a93d8028866d0c037ee56d9362264c6ecbc8901a6adcf8501f7d95a05489ded1ed88de6f22
|
7
|
+
data.tar.gz: b6f629dfbbc8352a2e2abbec68f31dc5846064d982af3dac6300e0faa2e03e13f7b42b6a78db9b483c113381f7d238ee77c3df821ee1a3a3bbe43ca4c6d2d9c7
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Kittyverse
|
2
2
|
|
3
3
|
|
4
|
-
kittyverse library
|
4
|
+
kittyverse library - helper classes for cattributes, trait types, traits, genes, genomes and more for cryptokitties and copycats
|
5
5
|
|
6
6
|
* home :: [github.com/cryptocopycats/kittyverse](https://github.com/cryptocopycats/kittyverse)
|
7
7
|
* bugs :: [github.com/cryptocopycats/kittyverse/issues](https://github.com/cryptocopycats/kittyverse/issues)
|
data/lib/kittyverse.rb
CHANGED
@@ -1,11 +1,270 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'base32-alphabets'
|
4
4
|
|
5
5
|
|
6
6
|
## our own code
|
7
7
|
require 'kittyverse/version' # note: let version always go first
|
8
|
+
require 'kittyverse/traits'
|
8
9
|
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
|
12
|
+
class Trait
|
13
|
+
|
14
|
+
def self.traits_by_name() @@traits_by_name ||= {}; end
|
15
|
+
def self.traits_by_code() @@traits_by_code ||= {}; end
|
16
|
+
|
17
|
+
def self.find_by_code( code )
|
18
|
+
## note: allow string AND symbols (thus, use .to_s)
|
19
|
+
## e.g. allow 'FU01', 'fu01', :fu01, :FU01, etc.
|
20
|
+
@@traits_by_code[ code.upcase.to_s ]
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.find_by_name( name )
|
24
|
+
## note: allow string AND symbols (thus, use .to_s !!!)
|
25
|
+
## note: downcase name e.g. allow Savannah too (not just savannah)
|
26
|
+
@@traits_by_name[ name.downcase.to_s ]
|
27
|
+
end
|
28
|
+
|
29
|
+
## add "generic" convenience find helper
|
30
|
+
def self.find_by( **kwargs )
|
31
|
+
if kwargs[ :name ]
|
32
|
+
find_by_name( kwargs[ :name ] )
|
33
|
+
elsif kwargs[ :code ]
|
34
|
+
find_by_code( kwargs[ :code] )
|
35
|
+
else
|
36
|
+
## todo/fix: throw argument except!!!
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
attr_accessor :type,
|
44
|
+
:name,
|
45
|
+
:kai # kai char e.g. '1', '2', etc.
|
46
|
+
|
47
|
+
def initialize( **kwargs )
|
48
|
+
update( kwargs )
|
49
|
+
end
|
50
|
+
|
51
|
+
def update( **kwargs )
|
52
|
+
kwargs.each do |name,value|
|
53
|
+
send( "#{name}=", value ) ## use "regular" plain/classic attribute setter
|
54
|
+
end
|
55
|
+
self ## return self for chaining
|
56
|
+
end
|
57
|
+
|
58
|
+
def num() Kai::NUMBER[@kai]; end
|
59
|
+
def code() @type.code + Kai::CODE[@kai]; end
|
60
|
+
end # class Trait
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
class TraitType
|
65
|
+
|
66
|
+
def self.trait_types_by_key() @@trait_types_by_key ||= {}; end
|
67
|
+
def self.trait_types_by_code() @@trait_types_by_code ||= {}; end
|
68
|
+
def self.trait_types_by_name() @@trait_types_by_name ||= {}; end
|
69
|
+
|
70
|
+
# quick hack - map copycats keys to (internal) cryptokitties trait type keys
|
71
|
+
# note: all keys are the same except:
|
72
|
+
ALT_TRAIT_TYPE_KEYS =
|
73
|
+
{
|
74
|
+
:colorprimary => :color1,
|
75
|
+
:colorsecondary => :color2,
|
76
|
+
:colortertiary => :color3
|
77
|
+
}
|
78
|
+
|
79
|
+
def self.find_by_key( key )
|
80
|
+
## note: allow string AND symbols (thus, use .to_sym !!!)
|
81
|
+
## note: allow known alternative mappings/key (e.g. "internal" cryptokitties keys if different)
|
82
|
+
key = ALT_TRAIT_TYPE_KEYS[ key.to_sym ] if ALT_TRAIT_TYPE_KEYS[ key.to_sym ]
|
83
|
+
|
84
|
+
@@trait_types_by_key[ key.to_sym ]
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.find_by_code( code )
|
88
|
+
## note: allow string AND symbols (thus, use .to_s)
|
89
|
+
## e.g. allow 'FU', 'fu', :fu, :FU, etc.
|
90
|
+
@@trait_types_by_code[ code.upcase.to_s ]
|
91
|
+
end
|
92
|
+
|
93
|
+
ALT_TRAIT_TYPE_NAMES =
|
94
|
+
{
|
95
|
+
'body' => 'fur',
|
96
|
+
'eyes' => 'eye shape',
|
97
|
+
'eye type' => 'eye shape',
|
98
|
+
'body color' => 'base color',
|
99
|
+
'primary color' => 'base color',
|
100
|
+
'base colour' => 'base color', # british (canadian) spelling
|
101
|
+
'secondary color' => 'highlight color',
|
102
|
+
'sec color' => 'highlight color',
|
103
|
+
'pattern color' => 'highlight color',
|
104
|
+
'highlight colour' => 'highlight color', # british (canadian) spelling
|
105
|
+
'tertiary color' => 'accent color',
|
106
|
+
'accent colour' => 'accent color', # british (canadian) spelling
|
107
|
+
'wild' => 'wild element',
|
108
|
+
'secrect' => 'secret y gene'
|
109
|
+
}
|
110
|
+
|
111
|
+
def self.find_by_name( name )
|
112
|
+
## note: downcase name e.g. allow fur too (not just Fur)
|
113
|
+
## note: allow known alternative mappings/key (e.g. "internal" cryptokitties keys if different)
|
114
|
+
name = ALT_TRAIT_TYPE_NAMES[ name.downcase ] if ALT_TRAIT_TYPE_NAMES[ name.downcase ]
|
115
|
+
|
116
|
+
@@trait_types_by_name[ name.downcase ]
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
## add "generic" convenience find helper
|
121
|
+
def self.find_by( **kwargs )
|
122
|
+
if kwargs[ :key ]
|
123
|
+
find_by_key( kwargs[ :key ] )
|
124
|
+
elsif kwargs[ :code ]
|
125
|
+
find_by_code( kwargs[ :code ] )
|
126
|
+
elsif kwargs[ :name ]
|
127
|
+
find_by_name( kwargs[ :name ] )
|
128
|
+
else
|
129
|
+
## todo/fix: throw argument except!!!
|
130
|
+
nil
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.each
|
135
|
+
@@trait_types_by_key.each do |(key,type)|
|
136
|
+
yield( type )
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.each_with_index
|
141
|
+
@@trait_types_by_key.each_with_index do |(key,type),i|
|
142
|
+
yield( type,i )
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
|
147
|
+
attr_accessor :key,
|
148
|
+
:name,
|
149
|
+
:code,
|
150
|
+
:genes,
|
151
|
+
:traits ## array of 32 traits
|
152
|
+
|
153
|
+
def initialize( **kwargs )
|
154
|
+
update( kwargs )
|
155
|
+
end
|
156
|
+
|
157
|
+
def update( **kwargs )
|
158
|
+
kwargs.each do |name,value|
|
159
|
+
send( "#{name}=", value ) ## use "regular" plain/classic attribute setter
|
160
|
+
end
|
161
|
+
self ## return self for chaining
|
162
|
+
end
|
163
|
+
|
164
|
+
def [](key)
|
165
|
+
if key.is_a? Integer ## assume 0,1,2,3,.. index
|
166
|
+
traits[ key ]
|
167
|
+
elsif key.size == 2 && key =~ /^[0-9]{2}$/ ## assume code e.g. '00', '01', .. etc.
|
168
|
+
traits[ key.to_i(10) ]
|
169
|
+
else ## assume kai char
|
170
|
+
traits[ Kai::NUMBER[key] ]
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
TRAITS.reduce( TraitType.trait_types_by_key ) do |types, (key, h)|
|
176
|
+
|
177
|
+
type = TraitType.new(
|
178
|
+
key: key,
|
179
|
+
name: h[:name], # e.g. 'Fur'
|
180
|
+
code: h[:code], # e.g. 'FU'
|
181
|
+
genes: h[:genes] # e.g. '0-3'
|
182
|
+
)
|
183
|
+
|
184
|
+
# auto-fill kai mapping
|
185
|
+
## note: to keep "insertion" order - recreate new hash mapping
|
186
|
+
hash_kai = h[:kai]
|
187
|
+
hash_kai2 = {}
|
188
|
+
Kai::ALPHABET.each do |kai|
|
189
|
+
name = hash_kai[kai]
|
190
|
+
if name.nil?
|
191
|
+
## puts "#{key} - #{kai} is missing"
|
192
|
+
hash_kai2[kai] = "#{key}_#{kai}"
|
193
|
+
elsif name.empty?
|
194
|
+
## puts "#{key} - #{kai} is empty"
|
195
|
+
hash_kai2[kai] = "#{key}_#{kai}"
|
196
|
+
else
|
197
|
+
hash_kai2[kai] = name
|
198
|
+
end
|
199
|
+
end
|
200
|
+
h[:kai] = hash_kai2
|
201
|
+
|
202
|
+
type.traits = h[:kai].reduce([]) do |traits, (kai,name)| # array of 32 traits
|
203
|
+
trait = Trait.new(
|
204
|
+
type: type,
|
205
|
+
name: name,
|
206
|
+
kai: kai
|
207
|
+
)
|
208
|
+
|
209
|
+
## (auto-)add traits for lookup by name, code, etc. via (hash) mapping
|
210
|
+
Trait.traits_by_name[ trait.name ] = trait
|
211
|
+
Trait.traits_by_code[ trait.code ] = trait
|
212
|
+
|
213
|
+
traits << trait
|
214
|
+
traits
|
215
|
+
end
|
216
|
+
|
217
|
+
types[key] = type
|
218
|
+
types
|
219
|
+
end
|
220
|
+
|
221
|
+
TraitType.trait_types_by_key.reduce( TraitType.trait_types_by_code ) do |types, (key, type)|
|
222
|
+
types[type.code] = type
|
223
|
+
types
|
224
|
+
end
|
225
|
+
|
226
|
+
TraitType.trait_types_by_key.reduce( TraitType.trait_types_by_name ) do |types, (key, type)|
|
227
|
+
## note: downcase Fur to fur and so on (for case insensitive match)
|
228
|
+
types[type.name.downcase] = type
|
229
|
+
types
|
230
|
+
end
|
231
|
+
|
232
|
+
end # class TraitType
|
233
|
+
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
class Traits
|
238
|
+
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
|
+
## check for codes e.g. FU, PA, ... (or fu, pa,...).
|
245
|
+
if key.size == 2 && key =~ /^[A-Za-z]{2}$/
|
246
|
+
TraitType.find_by_code( key )
|
247
|
+
## check for codes e.g. FU00, FU01 ... (or fu00, fu01, ...)
|
248
|
+
elsif key.size == 4 && key =~ /^[A-Za-z]{2}[0-9]{2}$/
|
249
|
+
Trait.find_by_code( key )
|
250
|
+
else
|
251
|
+
if key.is_a? Symbol ## e.g. :body, :pattern, etc.
|
252
|
+
t = TraitType.find_by_key( key )
|
253
|
+
t = Trait.find_by_name( key ) if t.nil? ## try trait name next - why? why not?
|
254
|
+
t
|
255
|
+
else ## assume string
|
256
|
+
t = TraitType.find_by_name( key )
|
257
|
+
t = Trait.find_by_name( key ) if t.nil? ## try trait name next
|
258
|
+
t
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
def self.each() TraitType.each { |type| yield(type) }; end
|
264
|
+
def self.each_with_index() TraitType.each_with_index { |type,i| yield(type,i) }; end
|
265
|
+
end # class Traits
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
# say hello
|
270
|
+
puts Kittyverse.banner if defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG
|
@@ -0,0 +1,377 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# trais / kaittributes
|
5
|
+
# see https://cryptokittydex.com/kaittributes
|
6
|
+
# https://docs.google.com/spreadsheets/d/1ShiBKSglFAB2vJe4Uow3iF09FBVq6ZAaOzTCIECf4iA
|
7
|
+
# http://www.rolldice.club/cryptokitties/wkt_tree.php
|
8
|
+
# https://www.cryptokitties.co/cattributes (official cattributes list)
|
9
|
+
#
|
10
|
+
#
|
11
|
+
# for latest updates on new cattributes see:
|
12
|
+
# https://updates.cryptokitties.co (official latest updates/timeline)
|
13
|
+
|
14
|
+
## ordered by gene position (0,1,3.4,5,... etc.)
|
15
|
+
## 12 traits (4 genes each)
|
16
|
+
TRAITS =
|
17
|
+
{
|
18
|
+
body: {
|
19
|
+
genes: '0-3',
|
20
|
+
name: 'Fur', code: 'FU',
|
21
|
+
kai: {
|
22
|
+
'1' => 'savannah',
|
23
|
+
'2' => 'selkirk',
|
24
|
+
'3' => 'chantilly',
|
25
|
+
'4' => 'birman',
|
26
|
+
'5' => 'koladiviya',
|
27
|
+
'6' => 'bobtail',
|
28
|
+
'7' => 'manul',
|
29
|
+
'8' => 'pixiebob',
|
30
|
+
'9' => 'siberian',
|
31
|
+
'a' => 'cymric',
|
32
|
+
'b' => 'chartreux',
|
33
|
+
'c' => 'himalayan',
|
34
|
+
'd' => 'munchkin',
|
35
|
+
'e' => 'sphynx',
|
36
|
+
'f' => 'ragamuffin',
|
37
|
+
'g' => 'ragdoll',
|
38
|
+
'h' => 'norwegianforest',
|
39
|
+
'i' => 'mekong',
|
40
|
+
'j' => 'highlander',
|
41
|
+
'k' => 'balinese',
|
42
|
+
'm' => 'lynx',
|
43
|
+
'n' => 'mainecoon',
|
44
|
+
'o' => 'laperm',
|
45
|
+
'p' => 'persian',
|
46
|
+
'q' => 'fox',
|
47
|
+
'r' => 'kurilian',
|
48
|
+
's' => 'toyger',
|
49
|
+
't' => 'manx',
|
50
|
+
'u' => 'lykoi',
|
51
|
+
'v' => 'burmilla',
|
52
|
+
'w' => 'liger',
|
53
|
+
'x' => ''
|
54
|
+
}
|
55
|
+
},
|
56
|
+
pattern: {
|
57
|
+
genes: '4-7',
|
58
|
+
name: 'Pattern', code: 'PA',
|
59
|
+
kai: {
|
60
|
+
'1' => 'vigilante',
|
61
|
+
'2' => 'tiger',
|
62
|
+
'3' => 'rascal',
|
63
|
+
'4' => 'ganado',
|
64
|
+
'5' => 'leopard',
|
65
|
+
'6' => 'camo',
|
66
|
+
'7' => 'rorschach',
|
67
|
+
'8' => 'spangled',
|
68
|
+
'9' => 'calicool',
|
69
|
+
'a' => 'luckystripe',
|
70
|
+
'b' => 'amur',
|
71
|
+
'c' => 'jaguar',
|
72
|
+
'd' => 'spock',
|
73
|
+
'e' => 'mittens',
|
74
|
+
'f' => 'totesbasic_f', ## use totesbasic_f - why? why not?
|
75
|
+
'g' => 'totesbasic_g', ## use totesbasic_g
|
76
|
+
'h' => 'splat',
|
77
|
+
'i' => 'thunderstruck',
|
78
|
+
'j' => 'dippedcone',
|
79
|
+
'k' => 'highsociety',
|
80
|
+
'm' => 'tigerpunk',
|
81
|
+
'n' => 'henna',
|
82
|
+
'o' => 'arcreactor',
|
83
|
+
'p' => 'totesbasic_p', ## use totesbasic_p
|
84
|
+
'q' => 'scorpius',
|
85
|
+
'r' => 'razzledazzle',
|
86
|
+
's' => 'hotrod',
|
87
|
+
't' => 'allyouneed',
|
88
|
+
'u' => 'avatar',
|
89
|
+
'v' => 'gyre',
|
90
|
+
'w' => 'moonrise',
|
91
|
+
'x' => ''
|
92
|
+
}
|
93
|
+
},
|
94
|
+
coloreyes: {
|
95
|
+
genes: '8-11',
|
96
|
+
name: 'Eye Color', code: 'EC',
|
97
|
+
kai: {
|
98
|
+
'1' => 'thundergrey',
|
99
|
+
'2' => 'gold',
|
100
|
+
'3' => 'topaz',
|
101
|
+
'4' => 'mintgreen',
|
102
|
+
'5' => 'isotope',
|
103
|
+
'6' => 'sizzurp',
|
104
|
+
'7' => 'chestnut',
|
105
|
+
'8' => 'strawberry',
|
106
|
+
'9' => 'sapphire',
|
107
|
+
'a' => 'forgetmenot',
|
108
|
+
'b' => 'dahlia',
|
109
|
+
'c' => 'coralsunrise',
|
110
|
+
'd' => 'olive',
|
111
|
+
'e' => 'doridnudibranch',
|
112
|
+
'f' => 'parakeet',
|
113
|
+
'g' => 'cyan',
|
114
|
+
'h' => 'pumpkin',
|
115
|
+
'i' => 'limegreen',
|
116
|
+
'j' => 'bridesmaid',
|
117
|
+
'k' => 'bubblegum',
|
118
|
+
'm' => 'twilightsparkle',
|
119
|
+
'n' => 'palejade',
|
120
|
+
'o' => 'pinefresh',
|
121
|
+
'p' => 'eclipse',
|
122
|
+
'q' => 'babypuke',
|
123
|
+
'r' => 'downbythebay',
|
124
|
+
's' => 'autumnmoon',
|
125
|
+
't' => 'oasis',
|
126
|
+
'u' => 'gemini',
|
127
|
+
'v' => 'dioscuri',
|
128
|
+
'w' => 'kaleidoscope',
|
129
|
+
'x' => ''
|
130
|
+
}
|
131
|
+
},
|
132
|
+
eyes: {
|
133
|
+
genes: '12-15',
|
134
|
+
name: 'Eye Shape', code: 'ES', ## eye type
|
135
|
+
kai: {
|
136
|
+
'1' => 'swarley',
|
137
|
+
'2' => 'wonky',
|
138
|
+
'3' => 'serpent',
|
139
|
+
'4' => 'googly',
|
140
|
+
'5' => 'otaku',
|
141
|
+
'6' => 'simple',
|
142
|
+
'7' => 'crazy',
|
143
|
+
'8' => 'thicccbrowz',
|
144
|
+
'9' => 'caffeine',
|
145
|
+
'a' => 'wowza',
|
146
|
+
'b' => 'baddate',
|
147
|
+
'c' => 'asif',
|
148
|
+
'd' => 'chronic',
|
149
|
+
'e' => 'slyboots',
|
150
|
+
'f' => 'wiley',
|
151
|
+
'g' => 'stunned',
|
152
|
+
'h' => 'chameleon',
|
153
|
+
'i' => 'alien',
|
154
|
+
'j' => 'fabulous',
|
155
|
+
'k' => 'raisedbrow',
|
156
|
+
'm' => 'tendertears',
|
157
|
+
'n' => 'hacker',
|
158
|
+
'o' => 'sass',
|
159
|
+
'p' => 'sweetmeloncakes',
|
160
|
+
'q' => 'oceanid',
|
161
|
+
'r' => 'wingtips',
|
162
|
+
's' => 'firedup',
|
163
|
+
't' => 'buzzed',
|
164
|
+
'u' => 'bornwithit',
|
165
|
+
'v' => 'candyshoppe',
|
166
|
+
'w' => 'drama',
|
167
|
+
'x' => ''
|
168
|
+
}
|
169
|
+
},
|
170
|
+
color1: {
|
171
|
+
genes: '16-19',
|
172
|
+
name: 'Base Color', code: 'BC', ## colorprimary / body color
|
173
|
+
kai: {
|
174
|
+
'1' => 'shadowgrey',
|
175
|
+
'2' => 'salmon',
|
176
|
+
'3' => 'meowgarine',
|
177
|
+
'4' => 'orangesoda',
|
178
|
+
'5' => 'cottoncandy',
|
179
|
+
'6' => 'mauveover',
|
180
|
+
'7' => 'aquamarine',
|
181
|
+
'8' => 'nachocheez',
|
182
|
+
'9' => 'harbourfog',
|
183
|
+
'a' => 'cinderella',
|
184
|
+
'b' => 'greymatter',
|
185
|
+
'c' => 'tundra',
|
186
|
+
'd' => 'brownies',
|
187
|
+
'e' => 'dragonfruit',
|
188
|
+
'f' => 'hintomint',
|
189
|
+
'g' => 'bananacream',
|
190
|
+
'h' => 'cloudwhite',
|
191
|
+
'i' => 'cornflower',
|
192
|
+
'j' => 'oldlace',
|
193
|
+
'k' => 'koala',
|
194
|
+
'm' => 'lavender',
|
195
|
+
'n' => 'glacier',
|
196
|
+
'o' => 'redvelvet',
|
197
|
+
'p' => 'verdigris',
|
198
|
+
'q' => 'icicle',
|
199
|
+
'r' => 'onyx',
|
200
|
+
's' => 'hyacinth',
|
201
|
+
't' => 'martian',
|
202
|
+
'u' => 'hotcocoa',
|
203
|
+
'v' => 'shamrock',
|
204
|
+
'w' => 'firstblush',
|
205
|
+
'x' => ''
|
206
|
+
}
|
207
|
+
},
|
208
|
+
color2: {
|
209
|
+
genes: '20-23',
|
210
|
+
name: 'Highlight Color', code: 'HC', ## colorsecondary / sec color / pattern color
|
211
|
+
kai: {
|
212
|
+
'1' => 'cyborg',
|
213
|
+
'2' => 'springcrocus',
|
214
|
+
'3' => 'egyptiankohl',
|
215
|
+
'4' => 'poisonberry',
|
216
|
+
'5' => 'lilac',
|
217
|
+
'6' => 'apricot',
|
218
|
+
'7' => 'royalpurple',
|
219
|
+
'8' => 'padparadscha',
|
220
|
+
'9' => 'swampgreen',
|
221
|
+
'a' => 'violet',
|
222
|
+
'b' => 'scarlet',
|
223
|
+
'c' => 'barkbrown',
|
224
|
+
'd' => 'coffee',
|
225
|
+
'e' => 'lemonade',
|
226
|
+
'f' => 'chocolate',
|
227
|
+
'g' => 'butterscotch',
|
228
|
+
'h' => 'ooze',
|
229
|
+
'i' => 'safetyvest',
|
230
|
+
'j' => 'turtleback',
|
231
|
+
'k' => 'rosequartz',
|
232
|
+
'm' => 'wolfgrey',
|
233
|
+
'n' => 'cerulian',
|
234
|
+
'o' => 'skyblue',
|
235
|
+
'p' => 'garnet',
|
236
|
+
'q' => 'peppermint',
|
237
|
+
'r' => 'universe',
|
238
|
+
's' => 'royalblue',
|
239
|
+
't' => 'mertail',
|
240
|
+
'u' => 'inflatablepool',
|
241
|
+
'v' => 'pearl',
|
242
|
+
'w' => 'prairierose',
|
243
|
+
'x' => ''
|
244
|
+
}
|
245
|
+
},
|
246
|
+
color3: {
|
247
|
+
genes: '24-27',
|
248
|
+
name: 'Accent Color', code: 'AC', ## colortertiary
|
249
|
+
kai: {
|
250
|
+
'1' => 'belleblue',
|
251
|
+
'2' => 'sandalwood',
|
252
|
+
'3' => 'peach',
|
253
|
+
'4' => 'icy',
|
254
|
+
'5' => 'granitegrey',
|
255
|
+
'6' => 'cashewmilk',
|
256
|
+
'7' => 'kittencream',
|
257
|
+
'8' => 'emeraldgreen',
|
258
|
+
'9' => 'kalahari',
|
259
|
+
'a' => 'shale',
|
260
|
+
'b' => 'purplehaze',
|
261
|
+
'c' => 'hanauma',
|
262
|
+
'd' => 'azaleablush',
|
263
|
+
'e' => 'missmuffett',
|
264
|
+
'f' => 'morningglory',
|
265
|
+
'g' => 'frosting',
|
266
|
+
'h' => 'daffodil',
|
267
|
+
'i' => 'flamingo',
|
268
|
+
'j' => 'buttercup',
|
269
|
+
'k' => 'bloodred',
|
270
|
+
'm' => 'atlantis',
|
271
|
+
'n' => 'summerbonnet',
|
272
|
+
'o' => 'periwinkle',
|
273
|
+
'p' => 'patrickstarfish',
|
274
|
+
'q' => 'seafoam',
|
275
|
+
'r' => 'cobalt',
|
276
|
+
's' => 'mallowflower',
|
277
|
+
't' => 'mintmacaron',
|
278
|
+
'u' => 'sully',
|
279
|
+
'v' => 'fallspice',
|
280
|
+
'w' => 'dreamboat',
|
281
|
+
'x' => ''
|
282
|
+
}
|
283
|
+
},
|
284
|
+
wild: {
|
285
|
+
genes: '28-31',
|
286
|
+
name: 'Wild Element', code: 'WE',
|
287
|
+
kai: {
|
288
|
+
'h' => 'littlefoot',
|
289
|
+
'i' => 'elk',
|
290
|
+
'j' => 'ducky',
|
291
|
+
'k' => 'trioculus',
|
292
|
+
'm' => 'daemonwings',
|
293
|
+
'n' => 'featherbrain',
|
294
|
+
'o' => 'flapflap',
|
295
|
+
'p' => 'daemonhorns',
|
296
|
+
'q' => 'dragontail',
|
297
|
+
'r' => 'aflutter',
|
298
|
+
's' => 'foghornpawhorn',
|
299
|
+
't' => 'unicorn',
|
300
|
+
'u' => 'dragonwings',
|
301
|
+
'v' => 'alicorn',
|
302
|
+
'w' => 'wyrm',
|
303
|
+
'x' => ''
|
304
|
+
}
|
305
|
+
},
|
306
|
+
mouth: {
|
307
|
+
genes: '32-35',
|
308
|
+
name: 'Mouth', code: 'MO',
|
309
|
+
kai: {
|
310
|
+
'1' => 'whixtensions',
|
311
|
+
'2' => 'wasntme',
|
312
|
+
'3' => 'wuvme',
|
313
|
+
'4' => 'gerbil',
|
314
|
+
'5' => 'confuzzled',
|
315
|
+
'6' => 'impish',
|
316
|
+
'7' => 'belch',
|
317
|
+
'8' => 'rollercoaster',
|
318
|
+
'9' => 'beard',
|
319
|
+
'a' => 'pouty',
|
320
|
+
'b' => 'saycheese',
|
321
|
+
'c' => 'grim',
|
322
|
+
'd' => 'fangtastic',
|
323
|
+
'e' => 'moue',
|
324
|
+
'f' => 'happygokitty',
|
325
|
+
'g' => 'soserious',
|
326
|
+
'h' => 'cheeky',
|
327
|
+
'i' => 'starstruck',
|
328
|
+
'j' => 'samwise',
|
329
|
+
'k' => 'ruhroh',
|
330
|
+
'm' => 'dali',
|
331
|
+
'n' => 'grimace',
|
332
|
+
'o' => 'majestic',
|
333
|
+
'p' => 'tongue',
|
334
|
+
'q' => 'yokel',
|
335
|
+
'r' => 'topoftheworld',
|
336
|
+
's' => 'neckbeard',
|
337
|
+
't' => 'satiated',
|
338
|
+
'u' => 'walrus',
|
339
|
+
'v' => 'struck',
|
340
|
+
'w' => 'delite',
|
341
|
+
'x' => ''
|
342
|
+
}
|
343
|
+
},
|
344
|
+
environment: {
|
345
|
+
genes: '36-39',
|
346
|
+
name: 'Environment', code: 'EN',
|
347
|
+
kai: {
|
348
|
+
'h' => 'salty',
|
349
|
+
'i' => 'dune',
|
350
|
+
'j' => 'juju',
|
351
|
+
'k' => 'tinybox',
|
352
|
+
'm' => 'myparade',
|
353
|
+
'n' => 'finalfrontier',
|
354
|
+
'o' => 'metime',
|
355
|
+
'p' => 'drift',
|
356
|
+
'q' => 'secretgarden',
|
357
|
+
'r' => 'frozen',
|
358
|
+
's' => 'roadtogold',
|
359
|
+
't' => 'jacked',
|
360
|
+
'u' => 'floorislava',
|
361
|
+
'v' => 'prism',
|
362
|
+
'w' => 'junglebook',
|
363
|
+
'x' => ''
|
364
|
+
}
|
365
|
+
},
|
366
|
+
secret: {
|
367
|
+
genes: '40-43',
|
368
|
+
name: 'Secret Y Gene', code: 'SE', ## todo: change to Y Gene or Y (see https://guide.cryptokitties.co/guide/cat-features/genes)
|
369
|
+
kai: { }
|
370
|
+
},
|
371
|
+
prestige: {
|
372
|
+
genes: '44-47',
|
373
|
+
name: 'Purrstige', code: 'PU',
|
374
|
+
kai: { }
|
375
|
+
## prune, furball, duckduckcat, or thatsawrap - more like fancies (not really traits)
|
376
|
+
}
|
377
|
+
}
|
data/lib/kittyverse/version.rb
CHANGED
data/test/helper.rb
ADDED
data/test/test_traits.rb
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_traits.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
class TestTraits < MiniTest::Test
|
12
|
+
|
13
|
+
|
14
|
+
def test_find
|
15
|
+
|
16
|
+
t = Traits[ 'FU00' ]
|
17
|
+
assert_equal Trait, t.class
|
18
|
+
assert_equal "savannah", t.name
|
19
|
+
assert_equal "Fur", t.type.name
|
20
|
+
assert_equal "FU00", t.code
|
21
|
+
assert_equal "1", t.kai
|
22
|
+
|
23
|
+
t = Trait.find_by_code( 'FU00' )
|
24
|
+
assert_equal Trait, t.class
|
25
|
+
assert_equal "savannah", t.name
|
26
|
+
assert_equal "Fur", t.type.name
|
27
|
+
assert_equal "FU00", t.code
|
28
|
+
assert_equal "1", t.kai
|
29
|
+
|
30
|
+
|
31
|
+
t = Trait.find_by( code: 'FU00' )
|
32
|
+
assert_equal Trait, t.class
|
33
|
+
assert_equal "savannah", t.name
|
34
|
+
assert_equal "Fur", t.type.name
|
35
|
+
assert_equal "FU00", t.code
|
36
|
+
assert_equal "1", t.kai
|
37
|
+
|
38
|
+
|
39
|
+
t = Traits[ 'savannah' ]
|
40
|
+
assert_equal Trait, t.class
|
41
|
+
assert_equal "savannah", t.name
|
42
|
+
assert_equal "Fur", t.type.name
|
43
|
+
assert_equal "FU00", t.code
|
44
|
+
assert_equal "1", t.kai
|
45
|
+
|
46
|
+
t = Traits[ 'Savannah' ]
|
47
|
+
assert_equal Trait, t.class
|
48
|
+
assert_equal "savannah", t.name
|
49
|
+
assert_equal "Fur", t.type.name
|
50
|
+
assert_equal "FU00", t.code
|
51
|
+
assert_equal "1", t.kai
|
52
|
+
|
53
|
+
t = Trait.find_by_name( 'Savannah' )
|
54
|
+
assert_equal Trait, t.class
|
55
|
+
assert_equal "savannah", t.name
|
56
|
+
assert_equal "Fur", t.type.name
|
57
|
+
assert_equal "FU00", t.code
|
58
|
+
assert_equal "1", t.kai
|
59
|
+
|
60
|
+
t = Trait.find_by( name: 'Savannah' )
|
61
|
+
assert_equal Trait, t.class
|
62
|
+
assert_equal "savannah", t.name
|
63
|
+
assert_equal "Fur", t.type.name
|
64
|
+
assert_equal "FU00", t.code
|
65
|
+
assert_equal "1", t.kai
|
66
|
+
|
67
|
+
t = Traits[ :body ][ '1' ]
|
68
|
+
assert_equal Trait, t.class
|
69
|
+
assert_equal "savannah", t.name
|
70
|
+
assert_equal "Fur", t.type.name
|
71
|
+
assert_equal "FU00", t.code
|
72
|
+
assert_equal "1", t.kai
|
73
|
+
|
74
|
+
t = Traits[ :body ][ 'x' ]
|
75
|
+
assert_equal Trait, t.class
|
76
|
+
assert_equal "body_x", t.name
|
77
|
+
assert_equal "Fur", t.type.name
|
78
|
+
assert_equal "FU31", t.code
|
79
|
+
assert_equal "x", t.kai
|
80
|
+
|
81
|
+
t = Traits[ :body ][ '00' ]
|
82
|
+
assert_equal Trait, t.class
|
83
|
+
assert_equal "savannah", t.name
|
84
|
+
assert_equal "Fur", t.type.name
|
85
|
+
assert_equal "FU00", t.code
|
86
|
+
assert_equal "1", t.kai
|
87
|
+
|
88
|
+
t = Traits[ :body ][ '31' ]
|
89
|
+
assert_equal Trait, t.class
|
90
|
+
assert_equal "body_x", t.name
|
91
|
+
assert_equal "Fur", t.type.name
|
92
|
+
assert_equal "FU31", t.code
|
93
|
+
assert_equal "x", t.kai
|
94
|
+
|
95
|
+
t = Traits[ :body ][ 0 ]
|
96
|
+
assert_equal Trait, t.class
|
97
|
+
assert_equal "savannah", t.name
|
98
|
+
assert_equal "Fur", t.type.name
|
99
|
+
assert_equal "FU00", t.code
|
100
|
+
assert_equal "1", t.kai
|
101
|
+
|
102
|
+
t = Traits[ :body ][ 31 ]
|
103
|
+
assert_equal Trait, t.class
|
104
|
+
assert_equal "body_x", t.name
|
105
|
+
assert_equal "Fur", t.type.name
|
106
|
+
assert_equal "FU31", t.code
|
107
|
+
assert_equal "x", t.kai
|
108
|
+
|
109
|
+
|
110
|
+
t = Traits[ :body ]
|
111
|
+
assert_equal TraitType, t.class
|
112
|
+
assert_equal "Fur", t.name
|
113
|
+
|
114
|
+
t = TraitType.find_by_key( :body )
|
115
|
+
assert_equal TraitType, t.class
|
116
|
+
assert_equal "Fur", t.name
|
117
|
+
|
118
|
+
t = TraitType.find_by( :key => :body )
|
119
|
+
assert_equal TraitType, t.class
|
120
|
+
assert_equal "Fur", t.name
|
121
|
+
|
122
|
+
|
123
|
+
t = Traits['FU']['00']
|
124
|
+
assert_equal Trait, t.class
|
125
|
+
assert_equal "savannah", t.name
|
126
|
+
assert_equal "Fur", t.type.name
|
127
|
+
assert_equal "FU00", t.code
|
128
|
+
assert_equal "1", t.kai
|
129
|
+
|
130
|
+
t = Traits['FU'][0]
|
131
|
+
assert_equal Trait, t.class
|
132
|
+
assert_equal "savannah", t.name
|
133
|
+
assert_equal "Fur", t.type.name
|
134
|
+
assert_equal "FU00", t.code
|
135
|
+
assert_equal "1", t.kai
|
136
|
+
|
137
|
+
t = Traits[:FU][0]
|
138
|
+
assert_equal Trait, t.class
|
139
|
+
assert_equal "savannah", t.name
|
140
|
+
assert_equal "Fur", t.type.name
|
141
|
+
assert_equal "FU00", t.code
|
142
|
+
assert_equal "1", t.kai
|
143
|
+
|
144
|
+
t = Traits[:FU00]
|
145
|
+
assert_equal Trait, t.class
|
146
|
+
assert_equal "savannah", t.name
|
147
|
+
assert_equal "Fur", t.type.name
|
148
|
+
assert_equal "FU00", t.code
|
149
|
+
assert_equal "1", t.kai
|
150
|
+
|
151
|
+
t = Traits['Fur'][0]
|
152
|
+
assert_equal Trait, t.class
|
153
|
+
assert_equal "savannah", t.name
|
154
|
+
assert_equal "Fur", t.type.name
|
155
|
+
assert_equal "FU00", t.code
|
156
|
+
assert_equal "1", t.kai
|
157
|
+
|
158
|
+
t = Traits['Pattern'][0]
|
159
|
+
assert_equal Trait, t.class
|
160
|
+
assert_equal "vigilante", t.name
|
161
|
+
assert_equal "Pattern", t.type.name
|
162
|
+
assert_equal "PA00", t.code
|
163
|
+
assert_equal "1", t.kai
|
164
|
+
|
165
|
+
t = Traits['PA00']
|
166
|
+
assert_equal Trait, t.class
|
167
|
+
assert_equal "vigilante", t.name
|
168
|
+
assert_equal "Pattern", t.type.name
|
169
|
+
assert_equal "PA00", t.code
|
170
|
+
assert_equal "1", t.kai
|
171
|
+
|
172
|
+
t = Traits['Vigilante']
|
173
|
+
assert_equal Trait, t.class
|
174
|
+
assert_equal "vigilante", t.name
|
175
|
+
assert_equal "Pattern", t.type.name
|
176
|
+
assert_equal "PA00", t.code
|
177
|
+
assert_equal "1", t.kai
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
def test_each
|
182
|
+
TraitType.each do |type|
|
183
|
+
puts "#{type.key} => #{type.name} (#{type.code}), genes #{type.genes}"
|
184
|
+
end
|
185
|
+
|
186
|
+
Traits.each do |type|
|
187
|
+
puts "#{type.key} => #{type.name} (#{type.code}), genes #{type.genes}"
|
188
|
+
end
|
189
|
+
|
190
|
+
TraitType.each_with_index do |type,i|
|
191
|
+
puts "#{i}: #{type.key} => #{type.name} (#{type.code}), genes #{type.genes}"
|
192
|
+
end
|
193
|
+
|
194
|
+
Traits.each_with_index do |type,i|
|
195
|
+
puts "#{i}: #{type.key} => #{type.name} (#{type.code}), genes #{type.genes}"
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
end # class TestTraits
|
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.0
|
4
|
+
version: 0.1.0
|
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-01-
|
11
|
+
date: 2019-01-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: base32-alphabets
|
@@ -69,7 +69,10 @@ files:
|
|
69
69
|
- README.md
|
70
70
|
- Rakefile
|
71
71
|
- lib/kittyverse.rb
|
72
|
+
- lib/kittyverse/traits.rb
|
72
73
|
- lib/kittyverse/version.rb
|
74
|
+
- test/helper.rb
|
75
|
+
- test/test_traits.rb
|
73
76
|
homepage: https://github.com/cryptocopycats/kittyverse
|
74
77
|
licenses:
|
75
78
|
- Public Domain
|