diff --git a/.idea/misc.xml b/.idea/misc.xml index 3adce03..d34c32c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -27,7 +27,7 @@ - + \ No newline at end of file diff --git a/app/src/main/assets/Tokens/Core/Agility/brotherhoodassassin.webp b/app/src/main/assets/Tokens/Core/Agility/brotherhoodassassin.webp new file mode 100644 index 0000000..f69dd8c Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Agility/brotherhoodassassin.webp differ diff --git a/app/src/main/assets/Tokens/Core/Agility/cavernspider.webp b/app/src/main/assets/Tokens/Core/Agility/cavernspider.webp new file mode 100644 index 0000000..ea83ada Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Agility/cavernspider.webp differ diff --git a/app/src/main/assets/Tokens/Core/Agility/durzog.webp b/app/src/main/assets/Tokens/Core/Agility/durzog.webp new file mode 100644 index 0000000..12d0e8a Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Agility/durzog.webp differ diff --git a/app/src/main/assets/Tokens/Core/Agility/poisonousspider.webp b/app/src/main/assets/Tokens/Core/Agility/poisonousspider.webp new file mode 100644 index 0000000..1f63c71 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Agility/poisonousspider.webp differ diff --git a/app/src/main/assets/Tokens/Core/Agility/protectivespider.webp b/app/src/main/assets/Tokens/Core/Agility/protectivespider.webp new file mode 100644 index 0000000..3856391 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Agility/protectivespider.webp differ diff --git a/app/src/main/assets/Tokens/Core/Agility/snowfox.webp b/app/src/main/assets/Tokens/Core/Agility/snowfox.webp new file mode 100644 index 0000000..82a8873 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Agility/snowfox.webp differ diff --git a/app/src/main/assets/Tokens/Core/Agility/spiderling.webp b/app/src/main/assets/Tokens/Core/Agility/spiderling.webp new file mode 100644 index 0000000..a791d4c Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Agility/spiderling.webp differ diff --git a/app/src/main/assets/Tokens/Core/Agility/woodelfscout.webp b/app/src/main/assets/Tokens/Core/Agility/woodelfscout.webp new file mode 100644 index 0000000..59dca95 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Agility/woodelfscout.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/argonianrecruit.webp b/app/src/main/assets/Tokens/Core/Endurance/argonianrecruit.webp new file mode 100644 index 0000000..f4cdfc7 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/argonianrecruit.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/argonianveteran.webp b/app/src/main/assets/Tokens/Core/Endurance/argonianveteran.webp new file mode 100644 index 0000000..3fdd26b Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/argonianveteran.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/coloviantrooper.webp b/app/src/main/assets/Tokens/Core/Endurance/coloviantrooper.webp new file mode 100644 index 0000000..3bb72e1 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/coloviantrooper.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/corpsecurse.webp b/app/src/main/assets/Tokens/Core/Endurance/corpsecurse.webp new file mode 100644 index 0000000..2f08346 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/corpsecurse.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/drainlife.webp b/app/src/main/assets/Tokens/Core/Endurance/drainlife.webp new file mode 100644 index 0000000..9b2ad4b Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/drainlife.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/gargoyle.webp b/app/src/main/assets/Tokens/Core/Endurance/gargoyle.webp new file mode 100644 index 0000000..f15b335 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/gargoyle.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/northpointherald.webp b/app/src/main/assets/Tokens/Core/Endurance/northpointherald.webp new file mode 100644 index 0000000..b30e968 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/northpointherald.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/raisedead.webp b/app/src/main/assets/Tokens/Core/Endurance/raisedead.webp new file mode 100644 index 0000000..3432fbe Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/raisedead.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/shriveledmummy.webp b/app/src/main/assets/Tokens/Core/Endurance/shriveledmummy.webp new file mode 100644 index 0000000..03ad23b Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/shriveledmummy.webp differ diff --git a/app/src/main/assets/Tokens/Core/Endurance/skeleton.webp b/app/src/main/assets/Tokens/Core/Endurance/skeleton.webp new file mode 100644 index 0000000..c9c660e Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Endurance/skeleton.webp differ diff --git a/app/src/main/assets/Tokens/Core/Intelligence/alfefyr.webp b/app/src/main/assets/Tokens/Core/Intelligence/alfefyr.webp new file mode 100644 index 0000000..e4d6b44 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Intelligence/alfefyr.webp differ diff --git a/app/src/main/assets/Tokens/Core/Intelligence/beytefyr.webp b/app/src/main/assets/Tokens/Core/Intelligence/beytefyr.webp new file mode 100644 index 0000000..8a7043b Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Intelligence/beytefyr.webp differ diff --git a/app/src/main/assets/Tokens/Core/Intelligence/deltefyr.webp b/app/src/main/assets/Tokens/Core/Intelligence/deltefyr.webp new file mode 100644 index 0000000..f86c93d Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Intelligence/deltefyr.webp differ diff --git a/app/src/main/assets/Tokens/Core/Intelligence/flameatronach.webp b/app/src/main/assets/Tokens/Core/Intelligence/flameatronach.webp new file mode 100644 index 0000000..ffc90e2 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Intelligence/flameatronach.webp differ diff --git a/app/src/main/assets/Tokens/Core/Intelligence/frostatronach.webp b/app/src/main/assets/Tokens/Core/Intelligence/frostatronach.webp new file mode 100644 index 0000000..574b8b3 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Intelligence/frostatronach.webp differ diff --git a/app/src/main/assets/Tokens/Core/Intelligence/ironsword.webp b/app/src/main/assets/Tokens/Core/Intelligence/ironsword.webp new file mode 100644 index 0000000..1592a65 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Intelligence/ironsword.webp differ diff --git a/app/src/main/assets/Tokens/Core/Intelligence/stormatronach.webp b/app/src/main/assets/Tokens/Core/Intelligence/stormatronach.webp new file mode 100644 index 0000000..8f5bd01 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Intelligence/stormatronach.webp differ diff --git a/app/src/main/assets/Tokens/Core/Intelligence/sunderedshade.webp b/app/src/main/assets/Tokens/Core/Intelligence/sunderedshade.webp new file mode 100644 index 0000000..5d01bf6 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Intelligence/sunderedshade.webp differ diff --git a/app/src/main/assets/Tokens/Core/Intelligence/uupsefyr.webp b/app/src/main/assets/Tokens/Core/Intelligence/uupsefyr.webp new file mode 100644 index 0000000..3b79300 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Intelligence/uupsefyr.webp differ diff --git a/app/src/main/assets/Tokens/Core/Neutral/ancientgiant.webp b/app/src/main/assets/Tokens/Core/Neutral/ancientgiant.webp new file mode 100644 index 0000000..221ccc0 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Neutral/ancientgiant.webp differ diff --git a/app/src/main/assets/Tokens/Core/Neutral/steeldagger.webp b/app/src/main/assets/Tokens/Core/Neutral/steeldagger.webp new file mode 100644 index 0000000..0a11d19 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Neutral/steeldagger.webp differ diff --git a/app/src/main/assets/Tokens/Core/Willpower/imperialgrunt.webp b/app/src/main/assets/Tokens/Core/Willpower/imperialgrunt.webp new file mode 100644 index 0000000..6275b96 Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Willpower/imperialgrunt.webp differ diff --git a/app/src/main/assets/Tokens/Core/Willpower/youngwolf.webp b/app/src/main/assets/Tokens/Core/Willpower/youngwolf.webp new file mode 100644 index 0000000..ee8e88a Binary files /dev/null and b/app/src/main/assets/Tokens/Core/Willpower/youngwolf.webp differ diff --git a/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Agility/completedcontract.webp b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Agility/completedcontract.webp new file mode 100644 index 0000000..670df07 Binary files /dev/null and b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Agility/completedcontract.webp differ diff --git a/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Endurance/agelessvampire.webp b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Endurance/agelessvampire.webp new file mode 100644 index 0000000..cfc2ab4 Binary files /dev/null and b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Endurance/agelessvampire.webp differ diff --git a/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Intelligence/corsair.webp b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Intelligence/corsair.webp new file mode 100644 index 0000000..0ac4a07 Binary files /dev/null and b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Intelligence/corsair.webp differ diff --git a/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Neutral/makeshiftdefenses.webp b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Neutral/makeshiftdefenses.webp new file mode 100644 index 0000000..e312594 Binary files /dev/null and b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Neutral/makeshiftdefenses.webp differ diff --git a/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Neutral/target.webp b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Neutral/target.webp new file mode 100644 index 0000000..e773500 Binary files /dev/null and b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Neutral/target.webp differ diff --git a/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Strength/skeever.webp b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Strength/skeever.webp new file mode 100644 index 0000000..936c168 Binary files /dev/null and b/app/src/main/assets/Tokens/Fallofthedarkbrotherhood/Strength/skeever.webp differ diff --git a/app/src/main/assets/Tokens/Heroesofskyrim/Endurance/grandmasterdelphine.webp b/app/src/main/assets/Tokens/Heroesofskyrim/Endurance/grandmasterdelphine.webp new file mode 100644 index 0000000..387f37a Binary files /dev/null and b/app/src/main/assets/Tokens/Heroesofskyrim/Endurance/grandmasterdelphine.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Agility/brotherhoodassassin.webp b/app/src/main/assets/TokensArts/Core/Agility/brotherhoodassassin.webp new file mode 100644 index 0000000..0fe82df Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Agility/brotherhoodassassin.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Agility/cavernspider.webp b/app/src/main/assets/TokensArts/Core/Agility/cavernspider.webp new file mode 100644 index 0000000..d2e79af Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Agility/cavernspider.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Agility/durzog.webp b/app/src/main/assets/TokensArts/Core/Agility/durzog.webp new file mode 100644 index 0000000..90a7cee Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Agility/durzog.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Agility/poisonousspider.webp b/app/src/main/assets/TokensArts/Core/Agility/poisonousspider.webp new file mode 100644 index 0000000..542ec3a Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Agility/poisonousspider.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Agility/protectivespider.webp b/app/src/main/assets/TokensArts/Core/Agility/protectivespider.webp new file mode 100644 index 0000000..afae30d Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Agility/protectivespider.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Agility/snowfox.webp b/app/src/main/assets/TokensArts/Core/Agility/snowfox.webp new file mode 100644 index 0000000..b20cfb8 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Agility/snowfox.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Agility/spiderling.webp b/app/src/main/assets/TokensArts/Core/Agility/spiderling.webp new file mode 100644 index 0000000..61dcf08 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Agility/spiderling.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Agility/woodelfscout.webp b/app/src/main/assets/TokensArts/Core/Agility/woodelfscout.webp new file mode 100644 index 0000000..93fb75a Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Agility/woodelfscout.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/argonianrecruit.webp b/app/src/main/assets/TokensArts/Core/Endurance/argonianrecruit.webp new file mode 100644 index 0000000..73a9fbb Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/argonianrecruit.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/argonianveteran.webp b/app/src/main/assets/TokensArts/Core/Endurance/argonianveteran.webp new file mode 100644 index 0000000..3e46be8 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/argonianveteran.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/coloviantrooper.webp b/app/src/main/assets/TokensArts/Core/Endurance/coloviantrooper.webp new file mode 100644 index 0000000..51ff4d1 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/coloviantrooper.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/corpsecurse.webp b/app/src/main/assets/TokensArts/Core/Endurance/corpsecurse.webp new file mode 100644 index 0000000..b96b0af Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/corpsecurse.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/drainlife.webp b/app/src/main/assets/TokensArts/Core/Endurance/drainlife.webp new file mode 100644 index 0000000..4b92d49 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/drainlife.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/gargoyle.webp b/app/src/main/assets/TokensArts/Core/Endurance/gargoyle.webp new file mode 100644 index 0000000..a5d0d9e Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/gargoyle.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/northpointherald.webp b/app/src/main/assets/TokensArts/Core/Endurance/northpointherald.webp new file mode 100644 index 0000000..daeb7f9 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/northpointherald.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/raisedead.webp b/app/src/main/assets/TokensArts/Core/Endurance/raisedead.webp new file mode 100644 index 0000000..f19f288 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/raisedead.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/shriveledmummy.webp b/app/src/main/assets/TokensArts/Core/Endurance/shriveledmummy.webp new file mode 100644 index 0000000..c9559d3 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/shriveledmummy.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Endurance/skeleton.webp b/app/src/main/assets/TokensArts/Core/Endurance/skeleton.webp new file mode 100644 index 0000000..f315977 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Endurance/skeleton.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Intelligence/alfefyr.webp b/app/src/main/assets/TokensArts/Core/Intelligence/alfefyr.webp new file mode 100644 index 0000000..d8c4326 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Intelligence/alfefyr.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Intelligence/beytefyr.webp b/app/src/main/assets/TokensArts/Core/Intelligence/beytefyr.webp new file mode 100644 index 0000000..d8c4326 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Intelligence/beytefyr.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Intelligence/deltefyr.webp b/app/src/main/assets/TokensArts/Core/Intelligence/deltefyr.webp new file mode 100644 index 0000000..d8c4326 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Intelligence/deltefyr.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Intelligence/flameatronach.webp b/app/src/main/assets/TokensArts/Core/Intelligence/flameatronach.webp new file mode 100644 index 0000000..1372d64 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Intelligence/flameatronach.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Intelligence/frostatronach.webp b/app/src/main/assets/TokensArts/Core/Intelligence/frostatronach.webp new file mode 100644 index 0000000..4820f48 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Intelligence/frostatronach.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Intelligence/ironsword.webp b/app/src/main/assets/TokensArts/Core/Intelligence/ironsword.webp new file mode 100644 index 0000000..ecbd8a8 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Intelligence/ironsword.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Intelligence/stormatronach.webp b/app/src/main/assets/TokensArts/Core/Intelligence/stormatronach.webp new file mode 100644 index 0000000..eb6c001 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Intelligence/stormatronach.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Intelligence/sunderedshade.webp b/app/src/main/assets/TokensArts/Core/Intelligence/sunderedshade.webp new file mode 100644 index 0000000..1917b39 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Intelligence/sunderedshade.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Intelligence/uupsefyr.webp b/app/src/main/assets/TokensArts/Core/Intelligence/uupsefyr.webp new file mode 100644 index 0000000..d8c4326 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Intelligence/uupsefyr.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Neutral/ancientgiant.webp b/app/src/main/assets/TokensArts/Core/Neutral/ancientgiant.webp new file mode 100644 index 0000000..dedd328 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Neutral/ancientgiant.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Neutral/steeldagger.webp b/app/src/main/assets/TokensArts/Core/Neutral/steeldagger.webp new file mode 100644 index 0000000..c8529f3 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Neutral/steeldagger.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Willpower/imperialgrunt.webp b/app/src/main/assets/TokensArts/Core/Willpower/imperialgrunt.webp new file mode 100644 index 0000000..144dd67 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Willpower/imperialgrunt.webp differ diff --git a/app/src/main/assets/TokensArts/Core/Willpower/youngwolf.webp b/app/src/main/assets/TokensArts/Core/Willpower/youngwolf.webp new file mode 100644 index 0000000..8f78e81 Binary files /dev/null and b/app/src/main/assets/TokensArts/Core/Willpower/youngwolf.webp differ diff --git a/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Agility/completedcontract.webp b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Agility/completedcontract.webp new file mode 100644 index 0000000..e9abc6f Binary files /dev/null and b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Agility/completedcontract.webp differ diff --git a/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Endurance/agelessvampire.webp b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Endurance/agelessvampire.webp new file mode 100644 index 0000000..4e30ba3 Binary files /dev/null and b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Endurance/agelessvampire.webp differ diff --git a/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Intelligence/corsair.webp b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Intelligence/corsair.webp new file mode 100644 index 0000000..5364d27 Binary files /dev/null and b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Intelligence/corsair.webp differ diff --git a/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Neutral/makeshiftdefenses.webp b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Neutral/makeshiftdefenses.webp new file mode 100644 index 0000000..a5f3329 Binary files /dev/null and b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Neutral/makeshiftdefenses.webp differ diff --git a/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Neutral/target.webp b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Neutral/target.webp new file mode 100644 index 0000000..3447524 Binary files /dev/null and b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Neutral/target.webp differ diff --git a/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Strength/skeever.webp b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Strength/skeever.webp new file mode 100644 index 0000000..b1176f4 Binary files /dev/null and b/app/src/main/assets/TokensArts/Fallofthedarkbrotherhood/Strength/skeever.webp differ diff --git a/app/src/main/assets/TokensArts/Heroesofskyrim/Endurance/grandmasterdelphine.webp b/app/src/main/assets/TokensArts/Heroesofskyrim/Endurance/grandmasterdelphine.webp new file mode 100644 index 0000000..84ea9ed Binary files /dev/null and b/app/src/main/assets/TokensArts/Heroesofskyrim/Endurance/grandmasterdelphine.webp differ diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/App.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/App.kt index ab0a8ee..f3432f4 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/App.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/App.kt @@ -54,6 +54,7 @@ class App : MultiDexApplication() { val sync = !ConfigManager.isDBUpdating() && !ConfigManager.isVersionUnsupported() reference.child(BaseInteractor.NODE_BASICS).keepSynced(sync) reference.child(BaseInteractor.NODE_CARDS).keepSynced(sync) + reference.child(BaseInteractor.NODE_TOKENS).keepSynced(sync) reference.child(BaseInteractor.NODE_PATCHES).keepSynced(sync) reference.child(BaseInteractor.NODE_SEASONS).keepSynced(sync) reference.child(BaseInteractor.NODE_SPOILER).keepSynced(sync) @@ -62,4 +63,4 @@ class App : MultiDexApplication() { } } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/data/Card.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/data/Card.kt index e239db9..689a504 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/data/Card.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/data/Card.kt @@ -171,6 +171,7 @@ enum class CardRace(val desc: String) { enum class CardKeyword { ACTIVATE, + BATTLES, BREAKTHROUGH, CHANGE, CHARGE, @@ -185,6 +186,7 @@ enum class CardKeyword { REGENERATE, SHACKLE, SILENCE, + SHOUT, SLAY, SUMMON, WARD, @@ -336,7 +338,8 @@ data class CardBasicInfo( val shortName: String, val set: String, - val attr: String + val attr: String, + val isToken: Boolean ) data class CardSlot( @@ -387,7 +390,10 @@ data class Card( val arenaTierPlus: List, val evolves: Boolean, val season: String, - val shout: Int + val shout: Int, + val creators: List, + val generates: List, + val tokens: List ) : Comparable, Parcelable { @@ -400,10 +406,10 @@ data class Card( val DUMMY = Card("", "", CardSet.CORE, CardAttribute.DUAL, CardAttribute.STRENGTH, CardAttribute.WILLPOWER, CardRarity.EPIC, false, 0, 0, 0, CardType.ACTION, CardRace.ARGONIAN, emptyList(), "", CardArenaTier.AVERAGE, - listOf(), false, "", 0) + listOf(), false, "", 0, listOf(), listOf(), listOf()) const val ARTS_PATH = "Arts" - const val CARD_PATH = "Cards" + const val ARTS_TOKENS_PATH = "TokensArts" const val SOUNDS_PATH = "Sounds" const val SOUND_TYPE_ATTACK = "attack" const val SOUND_TYPE_PLAY = "enter_play" @@ -420,14 +426,17 @@ data class Card( mutableListOf().apply { source.readList(this, CardKeyword::class.java.classLoader) }, source.readString(), CardArenaTier.values()[source.readInt()], mutableListOf().apply { source.readList(this, CardArenaTierPlus::class.java.classLoader) }, - 1 == source.readInt(), source.readString(), source.readInt()) + 1 == source.readInt(), source.readString(), source.readInt(), + mutableListOf().apply { source.readStringList(this) }, + mutableListOf().apply { source.readStringList(this) }, + mutableListOf().apply { source.readStringList(this) }) override fun describeContents() = 0 fun fullArtPath(): String { val setName = set.name.toLowerCase().capitalize() val attrName = attr.name.toLowerCase().capitalize() - val artPath = "$ARTS_PATH/$setName/$attrName/$shortName.webp" + val artPath = "${ARTS_PATH.takeUnless { isToken() } ?: ARTS_TOKENS_PATH}/$setName/$attrName/$shortName.webp" return artPath } @@ -468,6 +477,12 @@ data class Card( } } + fun canGenerateCards(): Boolean = generates.isNotEmpty() + + fun canGenerateTokens(): Boolean = tokens.isNotEmpty() + + fun isToken(): Boolean = creators.isNotEmpty() + fun hasLocalAttackSound(resources: Resources): Boolean { return resources.getAssets().list(getLocalCardSoundPath()).contains("${shortName}_$SOUND_TYPE_ATTACK.mp3") } @@ -519,10 +534,13 @@ data class Card( dest?.writeInt((if (evolves) 1 else 0)) dest?.writeString(season) dest?.writeInt(shout) + dest?.writeStringList(creators) + dest?.writeStringList(generates) + dest?.writeStringList(tokens) } override fun compareTo(other: Card): Int { val compareCost = cost.compareTo(other.cost) - return if (compareCost != 0) compareCost else name.compareTo(other.name) + return if (compareCost != 0) compareCost else shortName.compareTo(other.shortName) } } diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/BaseInteractor.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/BaseInteractor.kt index 51f8e2f..c2df6ed 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/BaseInteractor.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/BaseInteractor.kt @@ -14,6 +14,7 @@ open class BaseInteractor { val NODE_BASICS = "basics" val NODE_CARDS = "cards" + val NODE_TOKENS = "tokens" val NODE_PATCHES = "patches" val NODE_SEASONS = "seasons" val NODE_SPOILER = "spoiler" @@ -116,4 +117,4 @@ open class BaseInteractor { } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/FirebaseParsers.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/FirebaseParsers.kt index 1147c1c..b3db8a6 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/FirebaseParsers.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/FirebaseParsers.kt @@ -33,6 +33,9 @@ abstract class FirebaseParsers { val attr2: String = "" val season: String = "" val shout: Int = 0 + val creators: String = "" + val generates: String = "" + val tokens: String = "" fun toCard(shortName: String, set: CardSet, attr: CardAttribute): Card { var clsAttr1 = attr @@ -49,7 +52,9 @@ abstract class FirebaseParsers { .mapTo(arrayListOf()) { CardKeyword.of(it) }, - text, CardArenaTier.of(arenaTier), getCardArenaTierPlus(), evolves, season, shout) + text, CardArenaTier.of(arenaTier), getCardArenaTierPlus(), evolves, season, shout, + creators.split(", ").filter { it.isNotEmpty() }, generates.split(", ").filter { it.isNotEmpty() }, + tokens.split(", ").filter { it.isNotEmpty() }) } private fun getCardArenaTierPlus(): List { diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/PublicInteractor.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/PublicInteractor.kt index 19165db..9e0ca79 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/PublicInteractor.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/interactor/PublicInteractor.kt @@ -111,6 +111,54 @@ object PublicInteractor : BaseInteractor() { } } + fun getTokens(set: CardSet?, onSuccess: (List) -> Unit) { + getListFromSets(set, onSuccess) { set, onEachSuccess -> + with(database.child(NODE_TOKENS).child(set.db).orderByChild(KEY_CARD_COST)) { + keepSynced() + addListenerForSingleValueEvent(object : ValueEventListener { + + override fun onDataChange(ds: DataSnapshot) { + val cards = ds.children.map { + val attr = CardAttribute.valueOf(it.key.toUpperCase()) + it.children.map { + it.getValue(FirebaseParsers.CardParser::class.java)?.toCard(it.key, set, attr) + }.filterNotNull() + }.flatMap { it } + onEachSuccess.invoke(cards) + } + + override fun onCancelled(de: DatabaseError) { + Timber.d("Fail: " + de.message) + } + + }) + } + } + } + + fun getTokens(set: CardSet?, attr: CardAttribute, onSuccess: (List) -> Unit) { + val onFinalSuccess: (List) -> Unit = { onSuccess(it.sorted()) } + getListFromSets(set, attr, onFinalSuccess) { set, attr, onEachSuccess -> + val node_attr = attr.name.toLowerCase() + database.child(NODE_TOKENS).child(set.db).child(node_attr).orderByChild(KEY_CARD_COST) + .addListenerForSingleValueEvent(object : ValueEventListener { + + override fun onDataChange(ds: DataSnapshot) { + val cards = ds.children.mapTo(arrayListOf()) { + it.getValue(FirebaseParsers.CardParser::class.java)?.toCard(it.key, set, attr) + }.filterNotNull() + Timber.d(cards.toString()) + onEachSuccess.invoke(cards) + } + + override fun onCancelled(de: DatabaseError) { + Timber.d("Fail: " + de.message) + } + + }) + } + } + fun isSpoilerEnable(onSuccess: (Boolean) -> Unit) { database.child(NODE_SPOILER).child(KEY_SPOILER_ENABLE) .addListenerForSingleValueEvent(object : ValueEventListener { diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/DashActivity.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/DashActivity.kt index 64419a6..2eef959 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/DashActivity.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/DashActivity.kt @@ -271,7 +271,11 @@ class DashActivity : BaseFilterActivity(), card?.let { val anim = ActivityOptionsCompat.makeSceneTransitionAnimation(ctx, dash_toolbar_title, getString(R.string.card_transition_name)) - ActivityCompat.startActivity(ctx, CardActivity.newIntent(ctx, it), anim.toBundle()) + try { + ActivityCompat.startActivity(ctx, CardActivity.newIntent(ctx, card), anim.toBundle()) + } catch (e: Exception) { + startActivity(CardActivity.newIntent(ctx, card)) + } } } } diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/arena/NewArenaDraftFragment.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/arena/NewArenaDraftFragment.kt index ccc877e..50b5239 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/arena/NewArenaDraftFragment.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/arena/NewArenaDraftFragment.kt @@ -22,6 +22,7 @@ import com.ediposouza.teslesgendstracker.util.inflate import kotlinx.android.synthetic.main.fragment_arena_draft.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe +import org.jetbrains.anko.toast import org.threeten.bp.LocalDateTime /** @@ -100,6 +101,7 @@ class NewArenaDraftFragment : BaseFragment() { arena_draft_cards3.config(activity, selectedClass, cards, cardListOnClick, arena_draft_cardlist) } MetricsManager.trackScreen(MetricScreen.SCREEN_NEW_ARENA_DRAFT()) + context.toast(R.string.new_arena_warning) } @Subscribe diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/base/BaseFragment.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/base/BaseFragment.kt index bd546de..6eeeb9d 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/base/BaseFragment.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/base/BaseFragment.kt @@ -99,6 +99,10 @@ open class BaseFragment : Fragment() { open fun configLoggedViews() { signin_buttons.visibility = View.INVISIBLE.takeIf { App.hasUserLogged() } ?: View.VISIBLE + configSignButtons() + } + + fun configSignButtons() { signin_google_button.setOnClickListener { showLogin() } with(signin_facebook_button) { setReadPermissions("email") diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/CardActivity.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/CardActivity.kt index de96e0d..0354092 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/CardActivity.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/CardActivity.kt @@ -31,9 +31,7 @@ import android.widget.Toast import com.ediposouza.teslesgendstracker.App import com.ediposouza.teslesgendstracker.R import com.ediposouza.teslesgendstracker.SEASON_UUID_PATTERN -import com.ediposouza.teslesgendstracker.data.Card -import com.ediposouza.teslesgendstracker.data.CardBasicInfo -import com.ediposouza.teslesgendstracker.data.CardSet +import com.ediposouza.teslesgendstracker.data.* import com.ediposouza.teslesgendstracker.interactor.PrivateInteractor import com.ediposouza.teslesgendstracker.interactor.PublicInteractor import com.ediposouza.teslesgendstracker.ui.base.BaseActivity @@ -58,9 +56,15 @@ class CardActivity : BaseActivity() { companion object { private val EXTRA_CARD = "cardExtra" + private val EXTRA_PREVIOUS_CARD = "previousCardExtra" + private val EXTRA_FROM_SPOILER = "fromSpoilerExtra" - fun newIntent(context: Context, card: Card): Intent { - return context.intentFor(EXTRA_CARD to card) + fun newIntent(context: Context, card: Card, previousCard: Card? = null, fromSpoiler: Boolean = false): Intent { + return context.intentFor(EXTRA_CARD to card, EXTRA_FROM_SPOILER to fromSpoiler).apply { + previousCard?.let { + putExtra(EXTRA_PREVIOUS_CARD, previousCard) + } + } } } @@ -70,15 +74,20 @@ class CardActivity : BaseActivity() { private val PERMISSION_WRITE_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE private val card: Card by lazy { intent.getParcelableExtra(EXTRA_CARD) ?: Card.DUMMY } + private val previousCard: Card by lazy { intent.getParcelableExtra(EXTRA_PREVIOUS_CARD) ?: Card.DUMMY } + private val fromSpoiler: Boolean by lazy { intent.getBooleanExtra(EXTRA_FROM_SPOILER, false) } private val cardInfoSheetBehavior: BottomSheetBehavior by lazy { BottomSheetBehavior.from(card_bottom_sheet) } private val cardVersions by lazy { - val cardBasicInfo = CardBasicInfo(card.shortName, card.set.toString(), card.attr.name) + val cardBasicInfo = CardBasicInfo(card.shortName, card.set.toString(), card.attr.name, card.isToken()) mutableListOf(Pair(cardBasicInfo, getString(R.string.card_patch_current))) } private var favorite: Boolean = false private var userCardQtd = 0 private val onCardClick = { + if (cardInfoSheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED) { + cardInfoSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED + } finishAndAnimateBack() MetricsManager.trackAction(MetricAction.ACTION_CARD_DETAILS_CLOSE_TAP()) } @@ -167,9 +176,10 @@ class CardActivity : BaseActivity() { } private fun configQtdAndFavoriteInfo() { - if (App.hasUserLogged()) { + if (App.hasUserLogged() && !card.isToken() && !fromSpoiler) { showUserCardQtd() } + card_favorite_btn.visibility = View.VISIBLE.takeUnless { card.isToken() } ?: View.GONE PrivateInteractor.isUserCardFavorite(card) { favorite = it updateFavoriteButton() @@ -294,14 +304,54 @@ class CardActivity : BaseActivity() { card_reward_label.visibility = View.VISIBLE } card_race.text = card.race.name.toLowerCase().capitalize().replace("_", " ") + card_race_label.visibility = View.VISIBLE.takeIf { card.type == CardType.CREATURE } ?: View.GONE + card_race.visibility = View.VISIBLE.takeIf { card.type == CardType.CREATURE } ?: View.GONE card_race_desc.text = card.race.desc card_race_desc.visibility = View.GONE.takeIf { card.race.desc.isEmpty() } ?: View.VISIBLE card_arena_tier.text = card.arenaTier.name.toLowerCase().capitalize() + configureTokens() configureShoutLevels() } + private fun configureTokens() { + if (card.canGenerateCards() || card.canGenerateTokens() || card.isToken()) { + card_tokens_label.setText(R.string.card_creators_label.takeIf { card.isToken() } ?: + R.string.card_generates_label.takeIf { card.canGenerateCards() } ?: R.string.card_tokens_label) + card_tokens_label.visibility = View.VISIBLE + with(card_tokens_rv) { + val relatedCards = mutableListOf() + visibility = View.VISIBLE + layoutManager = LinearLayoutManager(this@CardActivity, LinearLayoutManager.HORIZONTAL, false) + adapter = CardRelatedAdapter(relatedCards) { view, relatedCard -> + Timber.d("${relatedCard.shortName} - ${previousCard.shortName}") + if (relatedCard == previousCard) { + ActivityCompat.finishAfterTransition(this@CardActivity) + } else { + val intent = CardActivity.newIntent(this@CardActivity, relatedCard, card) + ActivityCompat.startActivity(this@CardActivity, intent, + ActivityOptionsCompat.makeSceneTransitionAnimation(this@CardActivity, + view, getString(R.string.card_transition_name)).toBundle()) + } + } + setHasFixedSize(true) + if (card.canGenerateTokens()) { + PublicInteractor.getTokens(null) { allTokens -> + relatedCards.addAll(allTokens.filter { card.tokens.contains(it.shortName) }) + adapter.notifyDataSetChanged() + } + } else { + PublicInteractor.getCards(null) { allCards -> + val related = card.generates.takeIf { card.canGenerateCards() } ?: card.creators + relatedCards.addAll(allCards.filter { related.contains(it.shortName) }) + adapter.notifyDataSetChanged() + } + } + } + } + } + private fun configureShoutLevels() { - if (card.shout > 1) { + if (card.keywords.contains(CardKeyword.SHOUT) && card.shout > 1) { card_levels_label.visibility = View.VISIBLE with(card_levels_rv) { visibility = View.VISIBLE @@ -337,7 +387,7 @@ class CardActivity : BaseActivity() { if (cardPatches.isNotEmpty()) { cardPatches.forEach { val cardPatchName = "${card.shortName}_${it.uuidDate}" - val cardBasicInfo = CardBasicInfo(cardPatchName, card.set.name, card.attr.name) + val cardBasicInfo = CardBasicInfo(cardPatchName, card.set.name, card.attr.name, card.isToken()) cardVersions.add(Pair(cardBasicInfo, getString(R.string.card_patch_pre, it.desc))) } with(card_recycler_view) { @@ -598,7 +648,7 @@ class CardActivity : BaseActivity() { isLast: Boolean, hasPatchVersion: Boolean, onCardClick: () -> Unit) { with(itemView) { with(card_patch_full_image) { - loadFromCard(cardBasicInfo.set, cardBasicInfo.attr, cardBasicInfo.shortName) + loadFromCard(cardBasicInfo.set, cardBasicInfo.attr, cardBasicInfo.shortName, cardBasicInfo.isToken) ViewCompat.setTransitionName(this, context.getString(R.string.card_transition_name).takeIf { isFirst } ?: "") setPadding(if (isLast) 0 else resources.getDimensionPixelSize(R.dimen.huge_margin), 0, 0, 0) } @@ -637,4 +687,28 @@ class CardActivity : BaseActivity() { } + class CardRelatedAdapter(val items: List, val onCardClick: (View, Card) -> Unit) : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): CardRelatedViewHolder { + return CardRelatedViewHolder(parent?.inflate(R.layout.itemlist_card_min)) + } + + override fun onBindViewHolder(holder: CardRelatedViewHolder?, position: Int) { + holder?.bind(items[position], onCardClick) + } + + override fun getItemCount(): Int = items.size + + } + + class CardRelatedViewHolder(view: View?) : RecyclerView.ViewHolder(view) { + + fun bind(card: Card, onCardClick: (View, Card) -> Unit) { + with(itemView) { + card_min_image.loadFromCard(card) + setOnClickListener { onCardClick(card_min_image, card) } + } + } + + } + } diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/CardsFragment.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/CardsFragment.kt index 357b5ea..9ebf2ec 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/CardsFragment.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/CardsFragment.kt @@ -18,7 +18,7 @@ import com.ediposouza.teslesgendstracker.R import com.ediposouza.teslesgendstracker.ui.base.* import com.ediposouza.teslesgendstracker.ui.cards.tabs.CardsAllFragment import com.ediposouza.teslesgendstracker.ui.cards.tabs.CardsCollectionFragment -import com.ediposouza.teslesgendstracker.ui.cards.tabs.CardsFavoritesFragment +import com.ediposouza.teslesgendstracker.ui.cards.tabs.CardsTokensFragment import com.ediposouza.teslesgendstracker.ui.cards.widget.CollectionStatistics import com.ediposouza.teslesgendstracker.util.* import kotlinx.android.synthetic.main.activity_dash.* @@ -57,7 +57,8 @@ class CardsFragment : BaseFragment(), SearchView.OnQueryTextListener { MetricsManager.trackScreen(when (position) { 0 -> MetricScreen.SCREEN_CARDS_ALL() 1 -> MetricScreen.SCREEN_CARDS_COLLECTION() - else -> MetricScreen.SCREEN_CARDS_FAVORED() + 2 -> MetricScreen.SCREEN_CARDS_FAVORED() + else -> MetricScreen.SCREEN_CARDS_TOKENS() }) } @@ -66,7 +67,7 @@ class CardsFragment : BaseFragment(), SearchView.OnQueryTextListener { private fun updateActivityTitle(position: Int) { val title = when (position) { 1 -> R.string.title_tab_cards_collection - 2 -> R.string.title_tab_cards_favorites + 2 -> R.string.title_tab_cards_tokens else -> R.string.title_tab_cards_all } eventBus.post(CmdUpdateTitle(title)) @@ -147,8 +148,10 @@ class CardsFragment : BaseFragment(), SearchView.OnQueryTextListener { menu?.clear() inflater?.inflate(R.menu.menu_search, menu) inflater?.inflate(R.menu.menu_import, menu) + inflater?.inflate(R.menu.menu_favorite, menu) inflater?.inflate(R.menu.menu_sets, menu) menu?.findItem(R.id.menu_import)?.isVisible = false + menu?.findItem(R.id.menu_only_favorite)?.isVisible = false searchView = MenuItemCompat.getActionView(menu?.findItem(R.id.menu_search)) as? SearchView searchView?.apply { queryHint = getString(R.string.cards_search_hint) @@ -184,14 +187,14 @@ class CardsFragment : BaseFragment(), SearchView.OnQueryTextListener { class CardsPageAdapter(ctx: Context, fm: FragmentManager) : FragmentStatePagerAdapter(fm) { var titles: Array = ctx.resources.getStringArray(R.array.cards_tabs) - val cardsCollectionFragment by lazy { CardsCollectionFragment() } - val cardsFavoritesFragment by lazy { CardsFavoritesFragment() } val cardsAllFragment by lazy { CardsAllFragment() } + val cardsCollectionFragment by lazy { CardsCollectionFragment() } + val cardsTokensFragment by lazy { CardsTokensFragment() } override fun getItem(position: Int): CardsAllFragment { return when (position) { 1 -> cardsCollectionFragment.apply { isEditStarted = false } - 2 -> cardsFavoritesFragment + 2 -> cardsTokensFragment else -> cardsAllFragment } } @@ -206,4 +209,4 @@ class CardsFragment : BaseFragment(), SearchView.OnQueryTextListener { } -} +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsAllFragment.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsAllFragment.kt index f9d0fff..14f15fa 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsAllFragment.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsAllFragment.kt @@ -1,5 +1,7 @@ package com.ediposouza.teslesgendstracker.ui.cards.tabs +import android.app.Activity +import android.content.Intent import android.os.Bundle import android.support.annotation.LayoutRes import android.support.v4.app.ActivityCompat @@ -8,9 +10,11 @@ import android.support.v7.util.DiffUtil import android.support.v7.widget.GridLayoutManager import android.support.v7.widget.RecyclerView import android.view.* +import android.widget.CompoundButton import com.ediposouza.teslesgendstracker.App import com.ediposouza.teslesgendstracker.R import com.ediposouza.teslesgendstracker.data.* +import com.ediposouza.teslesgendstracker.interactor.PrivateInteractor import com.ediposouza.teslesgendstracker.interactor.PublicInteractor import com.ediposouza.teslesgendstracker.ui.base.* import com.ediposouza.teslesgendstracker.ui.cards.* @@ -22,6 +26,7 @@ import com.ediposouza.teslesgendstracker.util.inflate import com.ediposouza.teslesgendstracker.util.loadFromCard import jp.wasabeef.recyclerview.animators.ScaleInAnimator import kotlinx.android.synthetic.main.fragment_cards_list.* +import kotlinx.android.synthetic.main.include_login_button.* import kotlinx.android.synthetic.main.itemlist_card.view.* import org.greenrobot.eventbus.Subscribe import org.jetbrains.anko.itemsSequence @@ -35,6 +40,7 @@ open class CardsAllFragment : BaseFragment() { open val ADS_EACH_ITEMS = 21 //after 7 lines open val CARDS_PER_ROW = 3 + val EXPAND_CODE = 123 var currentAttr: CardAttribute = CardAttribute.STRENGTH var cardsLoaded: List = listOf() @@ -44,6 +50,7 @@ open class CardsAllFragment : BaseFragment() { var rarityFilter: CardRarity? = null var searchFilter: String? = null var menuSets: SubMenu? = null + var onlyFavorites: CompoundButton? = null var sets: List = listOf() open var enableMenu: Boolean = true @@ -99,6 +106,17 @@ open class CardsAllFragment : BaseFragment() { super.onCreateOptionsMenu(menu, inflater) menuSets = menu?.findItem(R.id.menu_sets)?.subMenu getSets() + menu?.findItem(R.id.menu_only_favorite)?.isVisible = true + onlyFavorites = menu?.findItem(R.id.menu_only_favorite)?.actionView as? CompoundButton + onlyFavorites?.apply { + configSignButtons() + setOnCheckedChangeListener { _, _ -> + val shouldShowLogin = !App.hasUserLogged() && isChecked + cards_recycler_view.visibility = View.INVISIBLE.takeIf { shouldShowLogin } ?: View.VISIBLE + signin_buttons?.visibility = View.VISIBLE.takeIf { shouldShowLogin } ?: View.INVISIBLE + showCards() + } + } } override fun onOptionsItemSelected(item: MenuItem?): Boolean { @@ -109,6 +127,13 @@ open class CardsAllFragment : BaseFragment() { return super.onOptionsItemSelected(item) } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == EXPAND_CODE && resultCode == Activity.RESULT_OK) { + updateCardsList() + } + } + private fun getSets() { menuSets?.apply { clear() @@ -161,7 +186,11 @@ open class CardsAllFragment : BaseFragment() { @Suppress("unused", "UNUSED_PARAMETER") fun onCmdLoginSuccess(cmdLoginSuccess: CmdLoginSuccess) { configLoggedViews() - loadCardsByAttr(currentAttr) + if (onlyFavorites?.isChecked ?: false) { + showCards() + } else { + loadCardsByAttr(currentAttr) + } } @Subscribe @@ -226,9 +255,16 @@ open class CardsAllFragment : BaseFragment() { } open fun showCards() { - cardsAdapter.showCards(filteredCards()) - eventBus.post(CmdUpdateVisibility(true)) - scrollToTop() + if (onlyFavorites?.isChecked ?: false) { + PrivateInteractor.getUserFavoriteCards(setFilter, currentAttr) { userFavorites -> + cardsAdapter.showCards(filteredCards().filter { userFavorites.contains(it.shortName) }) + scrollToTop() + } + } else { + cardsAdapter.showCards(filteredCards()) + eventBus.post(CmdUpdateVisibility(true)) + scrollToTop() + } } protected fun scrollToTop() { @@ -293,8 +329,13 @@ open class CardsAllFragment : BaseFragment() { } open fun showCardExpanded(card: Card, view: View) { - ActivityCompat.startActivity(activity, CardActivity.newIntent(context, card), - ActivityOptionsCompat.makeSceneTransitionAnimation(activity, view, transitionName).toBundle()) + if (onlyFavorites?.isChecked ?: false) { + startActivityForResult(CardActivity.newIntent(context, card), EXPAND_CODE, + ActivityOptionsCompat.makeSceneTransitionAnimation(activity, view, transitionName).toBundle()) + } else { + ActivityCompat.startActivity(activity, CardActivity.newIntent(context, card), + ActivityOptionsCompat.makeSceneTransitionAnimation(activity, view, transitionName).toBundle()) + } } open class CardsAllAdapter(adsEachItems: Int, layoutManager: GridLayoutManager?, diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsCollectionFragment.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsCollectionFragment.kt index 3c29814..bc596c3 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsCollectionFragment.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsCollectionFragment.kt @@ -52,8 +52,6 @@ import java.util.* */ open class CardsCollectionFragment : CardsAllFragment() { - private val EXPAND_CODE = 123 - override val isCardsCollection: Boolean = true var isEditStarted: Boolean = false @@ -110,8 +108,9 @@ open class CardsCollectionFragment : CardsAllFragment() { } override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { - menu?.findItem(R.id.menu_import)?.isVisible = true super.onCreateOptionsMenu(menu, inflater) + menu?.findItem(R.id.menu_import)?.isVisible = true + menu?.findItem(R.id.menu_only_favorite)?.isVisible = false } override fun onOptionsItemSelected(item: MenuItem?): Boolean { diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsFavoritesFragment.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsFavoritesFragment.kt deleted file mode 100644 index 41ee3ad..0000000 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsFavoritesFragment.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.ediposouza.teslesgendstracker.ui.cards.tabs - -import android.app.Activity -import android.content.Intent -import android.support.v4.app.ActivityOptionsCompat -import android.view.View -import com.ediposouza.teslesgendstracker.data.Card -import com.ediposouza.teslesgendstracker.interactor.PrivateInteractor -import com.ediposouza.teslesgendstracker.ui.cards.CardActivity - -/** - * Created by EdipoSouza on 10/30/16. - */ -class CardsFavoritesFragment : CardsAllFragment() { - - val EXPAND_CODE = 123 - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == EXPAND_CODE && resultCode == Activity.RESULT_OK) { - updateCardsList() - } - } - - override fun configRecycleView() { - super.configRecycleView() - configLoggedViews() - } - - override fun showCards() { - PrivateInteractor.getUserFavoriteCards(setFilter, currentAttr) { userFavorites -> - cardsAdapter.showCards(filteredCards().filter { userFavorites.contains(it.shortName) }) - scrollToTop() - } - } - - override fun showCardExpanded(card: Card, view: View) { - startActivityForResult(CardActivity.newIntent(context, card), EXPAND_CODE, - ActivityOptionsCompat.makeSceneTransitionAnimation(activity, view, transitionName).toBundle()) - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsTokensFragment.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsTokensFragment.kt new file mode 100644 index 0000000..7bc5ff4 --- /dev/null +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/cards/tabs/CardsTokensFragment.kt @@ -0,0 +1,26 @@ +package com.ediposouza.teslesgendstracker.ui.cards.tabs + +import android.view.Menu +import android.view.MenuInflater +import com.ediposouza.teslesgendstracker.R +import com.ediposouza.teslesgendstracker.interactor.PublicInteractor + +/** + * Created by EdipoSouza on 10/30/16. + */ +class CardsTokensFragment : CardsAllFragment() { + + override fun showCards() { + PublicInteractor.getTokens(setFilter, currentAttr) { tokens -> + cardsLoaded = tokens.filter { it.isToken() } + cardsAdapter.showCards(filteredCards()) + scrollToTop() + } + } + + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + super.onCreateOptionsMenu(menu, inflater) + menu?.findItem(R.id.menu_only_favorite)?.isVisible = false + } + +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/decks/DeckActivity.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/decks/DeckActivity.kt index eeb6cbf..c2bc413 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/decks/DeckActivity.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/decks/DeckActivity.kt @@ -366,11 +366,13 @@ class DeckActivity : BaseActivity() { runOnUiThread { val name = ownerUser.name deck_details_create_by.text = name.takeIf { name.isNotEmpty() } ?: deck.owner - Glide.with(this@DeckActivity) - .load(ownerUser.photoUrl) - .placeholder(ContextCompat.getDrawable(this@DeckActivity, R.drawable.ic_user)) - .transform(CircleTransform(this@DeckActivity)) - .into(deck_details_create_by_photo) + if (!this@DeckActivity.isDestroyed) { + Glide.with(this@DeckActivity) + .load(ownerUser.photoUrl) + .placeholder(ContextCompat.getDrawable(this@DeckActivity, R.drawable.ic_user)) + .transform(CircleTransform(this@DeckActivity)) + .into(deck_details_create_by_photo) + } } } } diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/spoiler/SpoilerCardsFragment.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/spoiler/SpoilerCardsFragment.kt index 53b6cb4..a90f499 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/spoiler/SpoilerCardsFragment.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/ui/spoiler/SpoilerCardsFragment.kt @@ -1,9 +1,13 @@ package com.ediposouza.teslesgendstracker.ui.spoiler +import android.support.v4.app.ActivityCompat +import android.support.v4.app.ActivityOptionsCompat +import android.view.View import com.ediposouza.teslesgendstracker.data.Card import com.ediposouza.teslesgendstracker.data.CardAttribute import com.ediposouza.teslesgendstracker.interactor.PublicInteractor import com.ediposouza.teslesgendstracker.ui.base.CmdUpdateTitle +import com.ediposouza.teslesgendstracker.ui.cards.CardActivity import com.ediposouza.teslesgendstracker.ui.cards.CmdFilterAttrs import com.ediposouza.teslesgendstracker.ui.cards.tabs.CardsAllFragment import org.greenrobot.eventbus.Subscribe @@ -33,6 +37,11 @@ class SpoilerCardsFragment : CardsAllFragment() { }.sortedBy { it.name }.sortedBy { it.cost } } + override fun showCardExpanded(card: Card, view: View) { + ActivityCompat.startActivity(activity, CardActivity.newIntent(context, card, fromSpoiler = true), + ActivityOptionsCompat.makeSceneTransitionAnimation(activity, view, transitionName).toBundle()) + } + @Subscribe @Suppress("unused") fun onFilterAttrs(cmdFilterAttrs: CmdFilterAttrs) { diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/util/AppExtensions.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/util/AppExtensions.kt index 17ba49e..bda778d 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/util/AppExtensions.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/util/AppExtensions.kt @@ -189,12 +189,12 @@ fun ImageView.loadFromCard(card: Card, shoutLevel: Int = 0, transform: ((Bitmap) setImageResource(R.drawable.card_back) } else { val cardShortName = "${shortName}_lv$shoutLevel".takeIf { shoutLevel > 1 } ?: shortName - loadFromCard(set.toString(), attr.name, cardShortName, transform, onNotFound) + loadFromCard(set.toString(), attr.name, cardShortName, card.isToken(), transform, onNotFound) } } } -fun ImageView.loadFromCard(cardSet: String, cardAttr: String, cardShortName: String, +fun ImageView.loadFromCard(cardSet: String, cardAttr: String, cardShortName: String, isToken: Boolean = false, transform: ((Bitmap) -> Bitmap)? = null, onNotFound: (() -> Unit)? = null) { if (cardShortName.isEmpty()) { setImageResource(R.drawable.card_back) @@ -202,7 +202,7 @@ fun ImageView.loadFromCard(cardSet: String, cardAttr: String, cardShortName: Str } val setName = cardSet.toLowerCase().capitalize() val attrName = cardAttr.toLowerCase().capitalize() - val imagePath = "${Card.CARD_PATH}/$setName/$attrName/$cardShortName.webp" + val imagePath = "${"Cards".takeUnless { isToken } ?: "Tokens"}/$setName/$attrName/$cardShortName.webp" val remotePath = imagePath.takeIf { cardShortName.contains("_201") } ?: "v${context.getCurrentVersion()}/$imagePath" Timber.d("Local: $imagePath - Remote: $remotePath") Glide.with(context) diff --git a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/util/MetricsConstants.kt b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/util/MetricsConstants.kt index 9d8344f..a069ae2 100644 --- a/app/src/main/kotlin/com/ediposouza/teslesgendstracker/util/MetricsConstants.kt +++ b/app/src/main/kotlin/com/ediposouza/teslesgendstracker/util/MetricsConstants.kt @@ -257,6 +257,7 @@ sealed class MetricScreen(val name: String) { class SCREEN_CARDS_ALL : MetricScreen("CardsAll") class SCREEN_CARDS_COLLECTION : MetricScreen("CardsCollection") class SCREEN_CARDS_FAVORED : MetricScreen("CardsFavored") + class SCREEN_CARDS_TOKENS : MetricScreen("CardsTokens") class SCREEN_CARDS_STATISTICS : MetricScreen("CardsStatistics") class SCREEN_CARD_DETAILS : MetricScreen("CardDetails") class SCREEN_CARD_FULL_ART : MetricScreen("CardFullArt") diff --git a/app/src/main/res/drawable/ic_favorite_menu_checked.xml b/app/src/main/res/drawable/ic_favorite_menu_checked.xml new file mode 100644 index 0000000..210bac9 --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_menu_checked.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable/ic_favorite_menu_checked_svg.xml b/app/src/main/res/drawable/ic_favorite_menu_checked_svg.xml new file mode 100644 index 0000000..482e6e4 --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_menu_checked_svg.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_favorite_menu_unchecked.xml b/app/src/main/res/drawable/ic_favorite_menu_unchecked.xml new file mode 100644 index 0000000..580e103 --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_menu_unchecked.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable/ic_favorite_menu_unchecked_svg.xml b/app/src/main/res/drawable/ic_favorite_menu_unchecked_svg.xml new file mode 100644 index 0000000..e440aef --- /dev/null +++ b/app/src/main/res/drawable/ic_favorite_menu_unchecked_svg.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/xml_favorite.xml b/app/src/main/res/drawable/xml_favorite.xml new file mode 100644 index 0000000..777e7e5 --- /dev/null +++ b/app/src/main/res/drawable/xml_favorite.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-v21/widget_switch_favorite.xml b/app/src/main/res/layout-v21/widget_switch_favorite.xml new file mode 100644 index 0000000..493bdcf --- /dev/null +++ b/app/src/main/res/layout-v21/widget_switch_favorite.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_dash.xml b/app/src/main/res/layout/activity_dash.xml index e9cc3ce..efdfaf3 100644 --- a/app/src/main/res/layout/activity_dash.xml +++ b/app/src/main/res/layout/activity_dash.xml @@ -30,7 +30,7 @@ android:id="@+id/dash_toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" + android:layout_gravity="start" android:lines="1" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="@android:color/white" diff --git a/app/src/main/res/layout/fragment_cards.xml b/app/src/main/res/layout/fragment_cards.xml index bc29040..4178409 100644 --- a/app/src/main/res/layout/fragment_cards.xml +++ b/app/src/main/res/layout/fragment_cards.xml @@ -22,6 +22,7 @@ app:layout_scrollFlags="scroll|enterAlways" app:tabBackground="@android:color/transparent" app:tabGravity="fill" + app:tabMode="fixed" tools:targetApi="lollipop" /> diff --git a/app/src/main/res/layout/include_card_info.xml b/app/src/main/res/layout/include_card_info.xml index 4bee84e..44b9dfa 100644 --- a/app/src/main/res/layout/include_card_info.xml +++ b/app/src/main/res/layout/include_card_info.xml @@ -51,8 +51,11 @@ android:layout_alignParentEnd="true" android:layout_alignParentTop="true" android:clickable="true" + android:focusable="true" android:foreground="?attr/selectableItemBackgroundBorderless" - android:src="@drawable/ic_favorite_unchecked" /> + android:src="@drawable/ic_favorite_unchecked" + android:visibility="gone" + tools:visibility="visible" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_switch_favorite.xml b/app/src/main/res/layout/widget_switch_favorite.xml new file mode 100644 index 0000000..e1103b7 --- /dev/null +++ b/app/src/main/res/layout/widget_switch_favorite.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_favorite.xml b/app/src/main/res/menu/menu_favorite.xml new file mode 100644 index 0000000..ec60d10 --- /dev/null +++ b/app/src/main/res/menu/menu_favorite.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7449df2..a70b07c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -32,6 +32,7 @@ Sets Statistiken Kompakte Ansicht + Nur Favorit Nur Privat Nur aus der Sammlung Versteckt leere @@ -84,7 +85,7 @@ Karten Sammlung - Favoriten + Token Öffentlich Privatgelände Favoriten @@ -98,8 +99,8 @@ Rasse Rangliste - Kartensammlung - Favorisierte Karten + Sammlung + Token Öffentliche Decks Privatgelände Decks Favorisierte Decks @@ -125,6 +126,9 @@ Abspielen Extra Ebene: + Urheber: + Erzeugt: + Token: Neuste Version Voherige Version Bild im Download-Ordner gespeichert @@ -235,6 +239,7 @@ Wähle eine Klasse um die Arena zu beginnen. Arena Entwurf - %s + Höchster Wert ist nicht immer die beste Auswahl. Arena Tiers interessiert sich nicht für deine magische Kurve. Um eine Karte auszuwählen entweder lange auf die Karte drücken, oder auf den Pfeil drücken. Wähle eine Karte aus Synergie mit @@ -252,4 +257,4 @@ Deck Tracker mit Card Hover Feature und Attribut / Prophecy Karten zählen mit Hit Chancen. Spielverlauf und Statistik mit Win-Rate und Filtern für Modi und Saison. - \ No newline at end of file + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 548b141..6008d9f 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -32,6 +32,7 @@ Conjuntos Estadística Vista compacta + Solo Favorito Solo privado Solo da Colecione Ocultar vacio @@ -84,7 +85,7 @@ Cartas Colección - Favoritos + Fichas Público Propiedad Favoritos @@ -98,8 +99,8 @@ Razas Clasificado - Colección de cartas - Cartas Favoritos + Colección + Fichas Barajos Publicos Barajos propiedad Barajos Favoritos @@ -125,6 +126,9 @@ Jugar Extra Nivel: + Creadores: + Genera: + Fichas: Versión actual pre-%s Versión Imagen guardada en la carpeta de descarga. @@ -235,6 +239,7 @@ ¡Elige una clase para comenzar un nuevo proyecto de Arena! Draft de la Arena - %s + El valor más alto no siempre es la mejor elección. Arena Tiers no se preocupan por su curva magicka. Toque largo en la tarjeta o toque en Flecha para elegir su selección Seleccione una Carta Sinergia con: \n%s @@ -252,4 +257,4 @@ Deck Tracker con tarjeta de Hover características y atributo / profecía tarjetas cuentan con posibilidades de éxito. Historial y Estadísticas de las Partidas con Win-Rate y filtros para modos y temporada. - \ No newline at end of file + diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 1041c30..b6cbb0f 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -33,6 +33,7 @@ Expanções Statísticas Modo compacto + Apenas Favoritos Apenas Privados Apenas da Colleção Ocultar Vazios @@ -85,7 +86,7 @@ Cartas Coleção - Favoritos + Fichas Público Próprios Favoritos @@ -99,8 +100,8 @@ Raças Ranqueado - Coleção de Cartas - Cartas Favoritas + Coleção + Fichas Decks Público Decks Próprio Decks Favoritos @@ -126,6 +127,9 @@ Jogar Extra Níveis: + Criadores: + Gera: + Fichas: Versão Atual Versão pre-%s Imagem salva na pasta de downloads. @@ -236,6 +240,7 @@ Escolha uma class para iniciar um novo draft de Arena! Draft de Arena - %s + O valor mais alto nem sempre é o melhor pick. Arena Tiers não se preocupam com sua curva de magicka. Toque longo na Carta ou toque na Seta para indicar sua Escolha Selecione uma Carta Sinergia com: \n%s @@ -253,4 +258,4 @@ O Tracker do Deck com o recurso Hover do cartão e os cartões Atributo / Profecia contam com chances de sucesso. História e Estatística das partidas com Win-Rate e filtros para modos e estação. - \ No newline at end of file + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c0a204a..f122ef3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -32,10 +32,11 @@ Сеты Статистика Скрыть пустые + Только Любимый Только приватные Только из коллекции - любимый + Любимый Удалить из избранного подобно В отличие от @@ -84,7 +85,7 @@ Карты Коллекция - Избранные + Токены общественного Подержанный Избранные @@ -98,8 +99,8 @@ Pacas Ранжированный - Коллекция карт - карты Избранное + Коллекция + Токены Публичные колоды Приватная колоды вертушки Избранное @@ -125,6 +126,9 @@ Играть дополнительно Уровни: + Создатель: + Генерирует: + Токены:: Текущая версия до того-%s версии @@ -235,6 +239,7 @@ Выберите класс, чтобы начать новый проект Arena! Арена Проект - %s + Наивысшее значение не всегда является лучшим выбором. Arena Tiers не заботятся о вашей кривой магии. Длинное нажатие на карты или нажмите на стрелку, чтобы выбрать ваш выбор Выберите карту Взаимодействие с: \n%s diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 8c0bdff..80c1831 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -24,7 +24,7 @@ @string/tab_cards_all @string/tab_cards_collection - @string/tab_cards_favorites + @string/tab_cards_tokens diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 3674d76..b14313d 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -57,6 +57,7 @@ 24dp 16dp 20dp + 14dp 12dp 14dp 14dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0854291..0f90623 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -62,6 +62,7 @@ Sets Statistics Compact View + Only Favorite Only Private Only from Collection Hide Empty @@ -135,7 +136,7 @@ Cards Collection - Favorites + Tokens Public Owned Favorites @@ -151,8 +152,8 @@ Races Ranked @string/app_name_full - Cards Collection - Cards Favorites + Collection + Tokens Decks Public Decks Owned Decks Favorites @@ -182,6 +183,9 @@ Play Extra Levels: + Creators: + Generates: + Tokens: Current Version pre-%s Version card_transition @@ -322,6 +326,7 @@ Choose a class to start a new Arena draft! Arena Draft - %s + Highest value is not always the best pick. Arena Tiers don\'t care about your magicka curve. Long tap on Card or tap on Arrow to choose your Pick Select a Card Synergy with: \n%s diff --git a/build.gradle b/build.gradle index 6f1c39a..a36f996 100644 --- a/build.gradle +++ b/build.gradle @@ -2,11 +2,11 @@ buildscript { ext { - appVersionName = "1.3.1" + appVersionName = "1.4.0" appVersionCode = 38 prepareToRelease = false - kotlin_version = "1.1.2-4" + kotlin_version = "1.1.2-5" } repositories { diff --git a/database/dbCards.json b/database/dbCards.json index c4936c3..ea07ff1 100644 --- a/database/dbCards.json +++ b/database/dbCards.json @@ -152,7 +152,7 @@ "rarity": "Rare", "keyword": "Summon", "text": "Summon: Deal 2 damage to each player.", - "arenaTier": "Good", + "arenaTier": "Average", "arenaTierPlus": { "strategy": "Aggro" } @@ -203,7 +203,7 @@ "rarity": "Epic", "keyword": "", "text": "Mage Slayer can't be damaged by actions.", - "arenaTier": "Good" + "arenaTier": "Average" }, "northwindoutpost": { "name": "Northwind Outpost", @@ -338,7 +338,7 @@ "rarity": "Common", "keyword": "Charge", "text": "Charge", - "arenaTier": "Good" + "arenaTier": "Excellent" }, "blightedalit": { "name": "Blighted Alit", @@ -427,7 +427,8 @@ "rarity": "Rare", "keyword": "Charge", "text": "Put two 1/1 Nord Firebrands with Charge into your hand.", - "arenaTier": "Average" + "arenaTier": "Average", + "generates": "nordfirebrand" }, "riftenpillager": { "name": "Riften Pillager", @@ -548,7 +549,8 @@ "arenaTier": "Average", "arenaTierPlus": { "type": "Item" - } + }, + "tokens": "steeldagger" }, "bangkoraibutcher": { "name": "Bangkorai Butcher", @@ -699,7 +701,7 @@ "rarity": "Epic", "keyword": "", "text": "At the start of your turn, deal 4 damage to a random enemy.", - "arenaTier": "Terrible" + "arenaTier": "Poor" }, "whiterunrecruit": { "name": "Whiterun Recruit", @@ -758,7 +760,7 @@ "rarity": "Common", "keyword": "Guard", "text": "Guard", - "arenaTier": "Poor" + "arenaTier": "Average" }, "grahtwoodambusher": { "name": "Grahtwood Ambusher", @@ -782,7 +784,8 @@ "rarity": "Epic", "keyword": "Charge", "text": "When Markarth Bannerman attacks, put two 1/1 Nord Firebrands with Charge into your hand.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "generates": "nordfirebrand" }, "woodorcheadhunter": { "name": "Wood Orc Headhunter", @@ -845,7 +848,7 @@ "rarity": "Epic", "keyword": "Breakthrough", "text": "Breakthrough, You can't be damaged by actions or supports.", - "arenaTier": "Good", + "arenaTier": "Excellent", "season": "2017_01" }, "triumphantjarl": { @@ -858,7 +861,7 @@ "rarity": "Rare", "keyword": "Summon", "text": "Summon: If you have more health than your opponent, draw two cards.", - "arenaTier": "Excellent" + "arenaTier": "Insane" }, "whirlingduelist": { "name": "Whirling Duelist", @@ -870,7 +873,7 @@ "rarity": "Epic", "keyword": "", "text": "When Whirling Duelist equips an item, deal 1 damage to each enemy creature in this lane.", - "arenaTier": "Average", + "arenaTier": "Poor", "arenaTierPlus": { "type": "Item" } @@ -885,7 +888,7 @@ "rarity": "Epic", "keyword": "Breakthrough, Summon, Unsummon", "text": "Breakthrough. Summon: Unsummon a enemy creature or destroy an enemy support.", - "arenaTier": "Excellent" + "arenaTier": "Insane" }, "savageogre": { "name": "Savage Ogre", @@ -1011,7 +1014,8 @@ "arenaTier": "Good", "arenaTierPlus": { "text": "equip" - } + }, + "tokens": "steeldagger" }, "firebolt": { "name": "Firebolt", @@ -1092,7 +1096,8 @@ "arenaTier": "Good", "arenaTierPlus": { "text": "equip" - } + }, + "tokens": "ironsword" }, "evermoresteward": { "name": "Evermore Steward", @@ -1116,7 +1121,8 @@ "rarity": "Rare", "keyword": "Summon", "text": "Summon: Put a random Atronach into your hand.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "tokens": "flameatronach, frostatronach, stormatronach" }, "icespike": { "name": "Ice Spike", @@ -1209,7 +1215,8 @@ "rarity": "Common", "keyword": "", "text": "Sacrifice a creature to summon a 3/2 Sundered Shade in each lane.", - "arenaTier": "Good" + "arenaTier": "Average", + "tokens": "sunderedshade" }, "steelsword": { "name": "Steel Sword", @@ -1281,7 +1288,7 @@ "rarity": "Common", "keyword": "Summon", "text": "Summon: Deal 2 damage to your opponent.", - "arenaTier": "Average" + "arenaTier": "Good" }, "camlornsentinel": { "name": "Camlorn Sentinel", @@ -1323,7 +1330,8 @@ "arenaTier": "Excellent", "arenaTierPlus": { "attr": "intelligence" - } + }, + "generates": "firebolt" }, "daggerfallmage": { "name": "Daggerfall Mage", @@ -1335,7 +1343,8 @@ "rarity": "Legendary", "keyword": "Ward", "text": "Ward. After Daggerfall Mage's Ward is broken, put a Tome of Alteration into your hand.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "generates": "tomeofalteration" }, "darkrift": { "name": "Dark Rift", @@ -1347,7 +1356,8 @@ "rarity": "Epic", "keyword": "Activate", "text": "Uses: 5. Activate: Deal 1 damage to your opponent. If Dark Rift has dealt 5 damage, sacrifice it to summon a Storm Atronach.", - "arenaTier": "Good" + "arenaTier": "Good", + "tokens": "stormatronach" }, "desperateconjuring": { "name": "Desperate Conjuring", @@ -1359,7 +1369,8 @@ "rarity": "Epic", "keyword": "", "text": "Sacrifice a creature to summon a random creature that costs 2 more.", - "arenaTier": "Average" + "arenaTier": "Average", + "tokens": "ancientegiant" }, "farsightnereid": { "name": "Farsight Nereid", @@ -1446,7 +1457,8 @@ "rarity": "Epic", "keyword": "Ward, Guard", "text": "Ward. After Breton Conjurer's Ward is broken, summon a 5/5 Frost Atronach with Guard.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "tokens": "frostatronach" }, "dresguard": { "name": "Dres Guard", @@ -1470,7 +1482,7 @@ "rarity": "Rare", "keyword": "Guard", "text": "Guard. Other friendly creatures can't be Shackled.", - "arenaTier": "Average" + "arenaTier": "Good" }, "drestormentor": { "name": "Dres Tormentor", @@ -1509,7 +1521,7 @@ "rarity": "Rare", "keyword": "Prophecy", "text": "Prophecy. Deal 2 damage to all creatures in one lane.", - "arenaTier": "Good" + "arenaTier": "Average" }, "icewraith": { "name": "Ice Wraith", @@ -1521,7 +1533,8 @@ "rarity": "Epic", "keyword": "", "text": "At the start of your turn, draw an Ice Spike.", - "arenaTier": "Poor" + "arenaTier": "Poor", + "generates": "icespike" }, "lightningbolt": { "name": "Lightning Bolt", @@ -1665,7 +1678,7 @@ "rarity": "Epic", "keyword": "Summon", "text": "Summon: Friendly creatures get +1/+1 for each keyword they have.", - "arenaTier": "Terrible", + "arenaTier": "Poor", "arenaTierPlus": { "strategy": "keyword" }, @@ -1795,7 +1808,8 @@ "rarity": "Epic", "keyword": "", "text": "At the end of each turn, if you played two actions, summon a random Atronach.", - "arenaTier": "Terrible" + "arenaTier": "Terrible", + "tokens": "flameatronach, frostatronach, stormatronach" }, "wispmother": { "name": "Wispmother", @@ -1847,7 +1861,8 @@ "rarity": "Legendary", "keyword": "Summon, Breakthrough, Evolves", "text": "Summon: Summon a 5/3 Flame Atronach with Breakthrough in each lane.", - "evolves": true + "evolves": true, + "tokens": "flameatronach" }, "nahkriindragonpriest": { "name": "Nahkriin, Dragon Priest", @@ -1872,7 +1887,8 @@ "rarity": "Legendary", "keyword": "Summon", "text": "Summon: Summon a Flame Atronach in each lane. When you summon another creature, deal 2 damage to your opponent.", - "arenaTier": "Insane" + "arenaTier": "Insane", + "tokens": "flameatronach" }, "divaythfyr": { "name": "Divayth Fyr", @@ -1885,7 +1901,8 @@ "unique": true, "keyword": "Summon", "text": "Summon: Deal 6 damage to a random enemy. At the start of your turn, Divayth Fyr summons a Daughter of Fyr.", - "arenaTier": "Average" + "arenaTier": "Average", + "tokens": "alfefyr, beytefyr, deltefyr, uupsefyr" } }, "willpower": { @@ -1911,7 +1928,7 @@ "rarity": "Rare", "keyword": "Guard", "text": "Guard", - "arenaTier": "Poor" + "arenaTier": "Terrible" }, "aldmeripatriot": { "name": "Aldmeri Patriot", @@ -2013,7 +2030,8 @@ "rarity": "Common", "keyword": "", "text": "Summon a 1/1 Imperial Grunt in each lane.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "tokens": "imperialgrunt" }, "sunholdmedic": { "name": "Sunhold Medic", @@ -2314,7 +2332,8 @@ "arenaTier": "Average", "arenaTierPlus": { "strategy": "Aggro" - } + }, + "tokens": "youngwolf" }, "pitlion": { "name": "Pit Lion", @@ -2338,7 +2357,7 @@ "rarity": "Common", "keyword": "Pilfer", "text": "Pilfer: Draw a card.", - "arenaTier": "Good" + "arenaTier": "Average" }, "resoluteally": { "name": "Resolute Ally", @@ -2392,7 +2411,8 @@ "rarity": "Rare", "keyword": "", "text": "If your opponent doesn't damage you on their turn, sacrifice this and summon a Priest of the Moons in each lane.", - "arenaTier": "Terrible" + "arenaTier": "Poor", + "generates": "priestofthemoons" }, "alphawolf": { "name": "Alpha Wolf", @@ -2506,7 +2526,8 @@ "arenaTier": "Excellent", "arenaTierPlus": { "strategy": "Aggro" - } + }, + "tokens": "imperialgrunt" }, "warcry": { "name": "War Cry", @@ -2581,7 +2602,8 @@ "rarity": "Epic", "keyword": "", "text": "At the end of your turn, summon a 1/1 Imperial Grunt in a random lane.", - "arenaTier": "Poor" + "arenaTier": "Poor", + "tokens": "imperialgrunt" }, "imperialsiegeengine": { "name": "Imperial Siege Engine", @@ -2605,7 +2627,7 @@ "rarity": "Epic", "keyword": "Prophecy, Summon, Guard", "text": "Prophecy. Summon: Give a creature +2/+2 and Guard.", - "arenaTier": "Excellent" + "arenaTier": "Good" }, "piercingjavelin": { "name": "Piercing Javelin", @@ -2719,7 +2741,8 @@ "rarity": "Legendary", "keyword": "Breakthrough, Summon", "text": "Breakthrough. Summon: Summon a 1/1 Imperial Grunt, then gain 1 health for each friendly creature.", - "arenaTier": "Average" + "arenaTier": "Good", + "tokens": "imperialgrunt" }, "risinglegate": { "name": "Rising Legate", @@ -2731,7 +2754,8 @@ "rarity": "Legendary", "keyword": "Breakthrough, Summon, Evolves", "text": "Breakthrough. Summon: Summon a 1/1 Imperial Grunt.", - "evolves": true + "evolves": true, + "tokens": "imperialgrunt" }, "auroransentry": { "name": "Auroran Sentry", @@ -2743,7 +2767,7 @@ "rarity": "Legendary", "keyword": "Guard", "text": "Guard. When Auroran Sentry is dealt damage, you gain that much health.", - "arenaTier": "Good" + "arenaTier": "Average" }, "dawnswrath": { "name": "Dawn's Wrath", @@ -2767,7 +2791,7 @@ "rarity": "Epic", "keyword": "Guard, Summon", "text": "Guard. Summon: Destroy an enemy creature in this lane.", - "arenaTier": "Good" + "arenaTier": "Excellent" }, "miraakdragonborn": { "name": "Miraak, Dragonborn", @@ -2794,7 +2818,7 @@ "rarity": "Rare", "keyword": "", "text": "Give a creature -1/-1.", - "arenaTier": "Poor" + "arenaTier": "Average" }, "murkwatergoblin": { "name": "Murkwater Goblin", @@ -2818,7 +2842,7 @@ "rarity": "Common", "keyword": "Shackle", "text": "Shackle a creature and deal 1 damage to it.", - "arenaTier": "Poor" + "arenaTier": "Terrible" }, "mournholdguardian": { "name": "Mournhold Guardian", @@ -2855,7 +2879,8 @@ "unique": true, "keyword": "Summon", "text": "Summon: Shuffle three Brotherhood Assassins into your deck.", - "arenaTier": "Insane" + "arenaTier": "Insane", + "tokens": "brotherhoodassassin" }, "voraciousspriggan": { "name": "Voracious Spriggan", @@ -3005,7 +3030,8 @@ "rarity": "Epic", "keyword": "Last Gasp, Guard", "text": "Last Gasp: Your opponent summons a 2/1 Mournhold Guardian with Guard.", - "arenaTier": "Good" + "arenaTier": "Good", + "generates": "mournholdguardian" }, "murkwaterwitch": { "name": "Murkwater Witch", @@ -3116,7 +3142,7 @@ "rarity": "Common", "keyword": "Charge, Drain", "text": "Charge, Drain", - "arenaTier": "Average" + "arenaTier": "Good" }, "greenheartknight": { "name": "Greenheart Knight", @@ -3164,7 +3190,7 @@ "rarity": "Common", "keyword": "", "text": "If Murkwater Butcher is in your hand during your first turn, reduce his cost to 1.", - "arenaTier": "Poor" + "arenaTier": "Average" }, "murkwatersavage": { "name": "Murkwater Savage", @@ -3230,7 +3256,7 @@ "rarity": "Common", "keyword": "", "text": "Deal 3 damage to your opponent and gain 3 health.", - "arenaTier": "Terrible" + "arenaTier": "Poor" }, "varaniscourier": { "name": "Varanis Courier", @@ -3266,7 +3292,8 @@ "rarity": "Rare", "keyword": "Last Gasp", "text": "Last Gasp: Summon a 3/3 Deshaan Sneak.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "tokens": "deshaansneak" }, "deshaansneak": { "name": "Deshaan Sneak", @@ -3329,7 +3356,8 @@ "rarity": "Epic", "keyword": "", "text": "At the start of your turn, put a Curse into your hand.", - "arenaTier": "Good" + "arenaTier": "Excellent", + "generates": "curse" }, "murkwaterskirmisher": { "name": "Murkwater Skirmisher", @@ -3422,7 +3450,8 @@ "rarity": "Epic", "keyword": "Summon, Charge", "text": "Summon: Summon a 2/2 Wood Elf Scout with Charge in each lane with a wounded enemy creature.", - "arenaTier": "Poor" + "arenaTier": "Poor", + "tokens": "woodelfscout" }, "cliffracer": { "name": "Cliff Racer", @@ -3606,7 +3635,7 @@ "rarity": "Epic", "keyword": "Summon", "text": "Summon: Summon a random Animal.", - "arenaTier": "Average" + "arenaTier": "Good" }, "wildspriggan": { "name": "Wild Spriggan", @@ -3618,7 +3647,8 @@ "rarity": "Epic", "keyword": "Summon, Evolves", "text": "Summon: Summon a 2/3 Snow Fox.", - "evolves": true + "evolves": true, + "tokens": "snowfox" }, "chaurusreaper": { "name": "Chaurus Reaper", @@ -3642,7 +3672,8 @@ "rarity": "Epic", "keyword": "", "text": "At the start of your turn, summon a random Spider.", - "arenaTier": "Terrible" + "arenaTier": "Terrible", + "tokens": "cavernspider, poisonousspider, protectivespider, " }, "spiderdaedra": { "name": "Spider Daedra", @@ -3654,7 +3685,8 @@ "rarity": "Legendary", "keyword": "Summon", "text": "Summon: Fill your lanes with 2/1 Spiderlings. Last Gasp: Destroy all friendly Spiderlings.", - "arenaTier": "Poor" + "arenaTier": "Poor", + "tokens": "spiderling" }, "tazkadthepackmaster": { "name": "Tazkad the Packmaster", @@ -3667,7 +3699,8 @@ "unique": true, "keyword": "Breakthrough, Charge, Last Gasp", "text": "Breakthrough, Charge. Last Gasp: Summon a 4/4 Durzog.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "tokens": "durzog" }, "chaurusbreedingpit": { "name": "Chaurus Breeding Pit", @@ -3679,8 +3712,9 @@ "rarity": "Epic", "keyword": "", "text": "Summon a Chaurus Reaper in each lane", - "arenaTier": "Unknown", - "season": "2017_04" + "arenaTier": "Good", + "season": "2017_04", + "generates": "chaurusreaper" }, "nestofvipers": { "name": "Nest of Vipers", @@ -3692,7 +3726,8 @@ "rarity": "Legendary", "keyword": "", "text": "Fill a lane with territorial Vipers.", - "arenaTier": "Average" + "arenaTier": "Poor", + "generates": "territorialviper" } }, "endurance": { @@ -3742,7 +3777,8 @@ "rarity": "Common", "keyword": "Last Gasp", "text": "Last Gasp; Summon a 1/1 Skeleton.", - "arenaTier": "Average" + "arenaTier": "Average", + "tokens": "skeleton" }, "iliacsorcerer": { "name": "Iliac Sorcerer", @@ -3802,7 +3838,7 @@ "rarity": "Rare", "keyword": "Activate", "text": "Uses: 3. Activate: Give a creature +0/+1.", - "arenaTier": "Poor" + "arenaTier": "Terrible" }, "enchantedplate": { "name": "Enchanted Plate", @@ -3955,7 +3991,7 @@ "rarity": "Rare", "keyword": "", "text": "Friendly Orcs have +0/+2.", - "arenaTier": "Poor", + "arenaTier": "Terrible", "arenaTierPlus": { "race": "Orc" } @@ -4007,7 +4043,8 @@ "keyword": "Summon", "text": "Summon: +1 max magicka. At the start of your turn, if you have 15 or more max magicka, sacrifice this to summon an 8/8 Swamp Leviathan in each lane.", "arenaTier": "Poor", - "season": "2016_09" + "season": "2016_09", + "generates": "swampleviathan" }, "imperialarmor": { "name": "Imperial Armor", @@ -4019,7 +4056,7 @@ "rarity": "Common", "keyword": "", "text": "+0/+6", - "arenaTier": "Poor" + "arenaTier": "Terrible" }, "mummify": { "name": "Mummify", @@ -4031,7 +4068,8 @@ "rarity": "Rare", "keyword": "Prophecy", "text": "Prophecy. Transform a creature into a 2/2 Shriveled Mummy.", - "arenaTier": "Good" + "arenaTier": "Good", + "tokens": "shriveledmummy" }, "necromancersamulet": { "name": "Necromancer's Amulet", @@ -4085,7 +4123,7 @@ "rarity": "Common", "keyword": "Guard, Summon", "text": "Guard, Summon: Gain +1 max magicka.", - "arenaTier": "Average" + "arenaTier": "Poor" }, "wrothgarartisan": { "name": "Wrothgar Artisan", @@ -4172,7 +4210,8 @@ "rarity": "Legendary", "keyword": "", "text": "At the end of your turn, summon a 1/1 Argonian Recruit. If you have 7 or more max magicka, summon a 3/3 Argonian Veteran instead.", - "arenaTier": "Average" + "arenaTier": "Average", + "tokens": "argonianrecruit, argonianveteran" }, "cavegrahl": { "name": "Cave Grahl", @@ -4260,7 +4299,7 @@ "unique": true, "keyword": "Lethal", "text": "Lethal, When another friendly creature Slays, give it +2/+2.", - "arenaTier": "Excellent" + "arenaTier": "Good" }, "midnightsweep": { "name": "Midnight Sweep", @@ -4272,7 +4311,8 @@ "rarity": "Rare", "keyword": "Prophecy, Guard", "text": "Prophecy. Summon a 2/2 Colovian Trooper with Guard in each lane.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "tokens": "coloviantrooper" }, "northpointcaptain": { "name": "Northpoint Captain", @@ -4284,7 +4324,8 @@ "rarity": "Rare", "keyword": "Summon, Guard", "text": "Summon: Summon a 0/4 Northpoint Herald with Guard.", - "arenaTier": "Average" + "arenaTier": "Average", + "tokens": "northpointherald" }, "northpointlieutenant": { "name": "Northpoint Lieutenant", @@ -4508,7 +4549,8 @@ "rarity": "Legendary", "keyword": "Summon", "text": "Summon: Summon 1/1 Skeletons to fill this lane. Other friendly Undead have +1/+1.", - "arenaTier": "Good" + "arenaTier": "Excellent", + "tokens": "skeleton" }, "lowlandtroll": { "name": "Lowland Troll", @@ -4557,7 +4599,8 @@ "rarity": "Legendary", "keyword": "Summon, Slay", "text": "Summon and Slay: Put a Blood Magic Spell into your hand.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "tokens": "corpsecurse, drainlife, gargoyle, raisedead" }, "nighttalonlord": { "name": "Night Talon Lord", @@ -4690,7 +4733,8 @@ "text": "Guard. Last Gasp: Summon a 2/1 Mournhold Guardian with Guard.", "attr1": "intelligence", "attr2": "agility", - "arenaTier": "Good" + "arenaTier": "Good", + "generates": "mournholdguardian" }, "sentinelbattlemace": { "name": "Sentinel Battlemace", @@ -4842,7 +4886,8 @@ "text": "Summon: Summon a 2/2 Colovian Trooper with Guard in each lane. When a friendly creature is destroyed, General Tullius gains +1/+1.", "attr1": "willpower", "attr2": "endurance", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "tokens": "coloviantrooper" }, "gortwoggronagorm": { "name": "Gortwog gro-Nagorm", @@ -5224,7 +5269,8 @@ "rarity": "Rare", "keyword": "", "text": "Summon a Slaughterfish in each lane.", - "arenaTier": "Good" + "arenaTier": "Good", + "generates": "slaughterfish" }, "snappingdreugh": { "name": "Snapping Dreugh", @@ -5360,7 +5406,8 @@ "arenaTier": "Poor", "arenaTierPlus": { "race": "Dwemer" - } + }, + "generates": "dwarvenspider" }, "orbofvaermina": { "name": "Orb of Vaermina", @@ -5397,7 +5444,8 @@ "rarity": "Epic", "keyword": "Breakthrough, Guard", "text": "Brekathrough. When Dwarven Centurion is dealt damage, draw a 0/3 Dwarven Spider with Guard.", - "arenaTier": "Excellent" + "arenaTier": "Excellent", + "generates": "dwarvenspider" }, "goldbrand": { "name": "Goldbrand", @@ -5601,7 +5649,8 @@ "arenaTier": "Good", "arenaTierPlus": { "keyword": "lethal" - } + }, + "tokens": "completedcontract" }, "brotherhoodslayer": { "name": "Brotherhood Slayer", @@ -5613,7 +5662,8 @@ "rarity": "Common", "keyword": "Prophecy", "text": "Prophecy. Slay: Put a Completed Contract into your hand.", - "arenaTier": "Excellent" + "arenaTier": "Insane", + "tokens": "completedcontract" }, "brotherhoodsanctuary": { "name": "Brotherhood Sanctuary", @@ -5730,7 +5780,7 @@ "rarity": "Epic", "keyword": "", "text": "At the start of your turn, summon the highest cost creature from your discard pile and give Charge. At the end of the turn, put it on the bottom of your deck.", - "arenaTier": "Poor" + "arenaTier": "Average" }, "littlegirl": { "name": "Little Girl", @@ -5742,7 +5792,8 @@ "rarity": "Rare", "keyword": "Change", "text": "At the start of your turn, Little Girl Changes into a 5/5 Ageless Vampire with Drain", - "arenaTier": "Average" + "arenaTier": "Average", + "tokens": "agelessvampire" }, "stalkingshadowscale": { "name": "Stalking Shadowscale", @@ -5766,7 +5817,7 @@ "rarity": "Rare", "keyword": "Summon", "text": "Summon: Your opponent's cards cost 1 more next turn.", - "arenaTier": "Good" + "arenaTier": "Excellent" } }, "intelligence": { @@ -5795,7 +5846,8 @@ "arenaTier": "Average", "arenaTierPlus": { "strategy": "Aggro" - } + }, + "tokens": "corsair, steeldagger" }, "daggersinthedark": { "name": "Daggers in the Dark", @@ -5810,7 +5862,8 @@ "arenaTier": "Poor", "arenaTierPlus": { "text": "equip" - } + }, + "tokens": "steeldagger" }, "palaceconspirator": { "name": "Palace Conspirator", @@ -5822,7 +5875,7 @@ "rarity": "Common", "keyword": "Summon", "text": "Summon: Draw a card. Then discard a card.", - "arenaTier": "Good" + "arenaTier": "Poor" }, "speakerterenus": { "name": "Speaker Terenus", @@ -5865,7 +5918,7 @@ "rarity": "Common", "keyword": "Ward, Summon", "text": "Ward. Summon: +1/+1 for each action in your discard pile.", - "arenaTier": "Poor", + "arenaTier": "Terrible", "arenaTierPlus": { "type": "action" } @@ -5932,7 +5985,8 @@ "unique": true, "keyword": "Activate", "text": "Uses: Unlimited. Activate: Summon 0/1 Target with Guard for your opponent. Once 20 enemy creatures have died, deal 20 damage to your opponent, gain 20 health, and draw up to 10 cards.", - "arenaTier": "Terrible" + "arenaTier": "Terrible", + "tokens": "target" } }, "strength": { @@ -5998,7 +6052,8 @@ "rarity": "Rare", "text": "", "keyword": "Summon a Skeever in each lane with power and health equal to the number of Infestations you've played. Shuffle two copies of this into your deck.", - "arenaTier": "Good" + "arenaTier": "Good", + "tokens": "skeever" }, "underworldvigilante": { "name": "Underworld Vigilante", @@ -6024,6 +6079,7 @@ "text": "A friendly creature deals damage equal to its power to all other creatures in its lane.", "arenaTier": "Good", "arenaTierPlus": { + "attack": ">_4", "keyword": "Lethal" } } @@ -6066,7 +6122,8 @@ "keyword": "Summon", "text": "Summon: Put a 0/2 Makeshift Defenses with Guard into your hand.", "rarity": "Common", - "arenaTier": "Poor" + "arenaTier": "Poor", + "tokens": "makeshiftdefenses" }, "penitusoculatusagent": { "name": "Penitus Oculatus Agent", @@ -6102,7 +6159,7 @@ "rarity": "Common", "keyword": "", "text": "Destroy an enemy creature. Give all friendly creatures in its lane +1/+1.", - "arenaTier": "Average" + "arenaTier": "Excellent" }, "theblackdragon": { "name": "The Black Dragon", @@ -6119,4 +6176,4 @@ } } } -} \ No newline at end of file +} diff --git a/database/dbSpoiler.json b/database/dbSpoiler.json index 639700d..318d0d2 100644 --- a/database/dbSpoiler.json +++ b/database/dbSpoiler.json @@ -28,9 +28,49 @@ "keyword": "Last Gasp", "text": "Last Gasp: Put a random Shout into your hand.", "arenaTier": "Unknown" + }, + "drainvitality": { + "name": "Drain Vitality ", + "cost": "1", + "type": "Action", + "race": "", + "attack": "", + "health": "", + "rarity": "Common", + "keyword": "Shout", + "shout": 3, + "text": "Give an enemy creature -1/-1.", + "arenaTier": "Unknown" + }, + "shearpointdragon": { + "name": "Shearpoint Dragon", + "cost": "6", + "type": "Creature", + "race": "Dragon", + "attack": "4", + "health": "4", + "rarity": "Rare", + "keyword": "Summon", + "text": "Summon: Give a creature -2/-2. When you reduce a creature power or health with another effect, reduce it by an extra 1.", + "arenaTier": "Unknown" } }, "endurance": { + "innkeeperdelphine": { + "name": "Innkeeper Delphine", + "cost": "3", + "type": "Creature", + "race": "Breton", + "attack": "2", + "health": "3", + "rarity": "Legendary", + "unique": true, + "keyword": "", + "text": "After you play a Dragon or Schout, Innkeeper Delphine changes into Grandmaster Delphine.", + "arenaTier": "Unknown", + "shout": 2, + "tokens": "grandmasterdelphine" + }, "mentorofthewatch": { "name": "Mentor of the Watch", "cost": "3", @@ -72,7 +112,43 @@ } }, "neutral": { - + "greybeardmentor": { + "name": "Greybeard Mentor", + "cost": "4", + "type": "Creature", + "race": "Nord", + "attack": "2", + "health": "2", + "rarity": "Common", + "keyword": "Summon", + "text": "Summon: Draw a random Shout from your deck.", + "arenaTier": "Unknown" + }, + "journeytosovngarde": { + "name": "Journey to Sovngarde", + "cost": "7", + "type": "Action", + "race": "", + "attack": "", + "health": "", + "rarity": "Legendary", + "unique": true, + "keyword": "", + "text": "Shuffle all creatures from your discard pile into your deck. Give them +5/+5 and reduce their costs by 5.", + "arenaTier": "Unknown" + }, + "wordwall": { + "name": "Word Wall", + "cost": "1", + "type": "Creature", + "race": "Defense", + "attack": "0", + "health": "4", + "rarity": "Common", + "keyword": "Guard, Summon", + "text": "Guard. Summon: Upgrade a Shout in your hand.", + "arenaTier": "Unknown" + } }, "strength": { "duelatoptheworld": { @@ -125,8 +201,9 @@ "rarity": "Legendary", "keyword": "", "text": "Fill the left lane with Stormcloak Aggressors or the right lane with Colovian Troopers.", - "arenaTier": "Unknown" + "arenaTier": "Unknown", + "tokens": "coloviantrooper" } } } -} \ No newline at end of file +} diff --git a/database/dbTokens.json b/database/dbTokens.json new file mode 100644 index 0000000..1898e44 --- /dev/null +++ b/database/dbTokens.json @@ -0,0 +1,487 @@ +{ + "core": { + "agility": { + "brotherhoodassassin": { + "creators": "ungolimthelistener", + "name": "Brotherhood Assassin", + "cost": "1", + "type": "Creature", + "race": "Dark Elf", + "attack": "3", + "health": "3", + "rarity": "Legendary", + "keyword": "Lethal, Summon", + "text": "Lethal, Summon: Draw a card." + }, + "cavernspider": { + "creators": "spiderlair", + "name": "Cavern Spider", + "cost": "2", + "type": "Creature", + "race": "Spider", + "attack": "1", + "health": "1", + "rarity": "Common", + "keyword": "Summon", + "text": "Summon: Shackle a random enemy creature." + }, + "durzog": { + "creators": "tazkadthepackmaster", + "name": "Durzog", + "cost": "3", + "type": "Creature", + "race": "Reptile", + "attack": "4", + "health": "4", + "rarity": "Rare", + "keyword": "", + "text": "" + }, + "poisonousspider": { + "creators": "spiderlair", + "name": "Poisonous Spider", + "cost": "2", + "type": "Creature", + "race": "Spider", + "attack": "1", + "health": "1", + "rarity": "Common", + "keyword": "Lethal", + "text": "Lethal" + }, + "protectivespider": { + "creators": "spiderlair", + "name": "Protective Spider", + "cost": "2", + "type": "Creature", + "race": "Spider", + "attack": "1", + "health": "1", + "rarity": "Common", + "keyword": "Guard", + "text": "Guard" + }, + "snowfox": { + "creators": "wildspriggan", + "name": "Snowfox", + "cost": "3", + "type": "Creature", + "race": "Animal", + "attack": "2", + "health": "3", + "rarity": "Common", + "keyword": "", + "text": "" + }, + "spiderling": { + "creators": "spiderdaedra", + "name": "Spiderling", + "cost": "2", + "type": "Creature", + "race": "Daedra", + "attack": "2", + "health": "1", + "rarity": "Common", + "keyword": "", + "text": "" + }, + "woodelfscout": { + "creators": "camoranscoutleader", + "name": "Wood Elf Scout", + "cost": "3", + "type": "Creature", + "race": "Wood Elf", + "attack": "2", + "health": "2", + "rarity": "Common", + "keyword": "Charge", + "text": "Charge" + } + }, + "endurance": { + "argonianrecruit": { + "creators": "blackmarshwarden", + "name": "Argonian Recruit", + "cost": "1", + "type": "Creature", + "race": "Argonian", + "attack": "1", + "health": "1", + "rarity": "Common", + "keyword": "", + "text": "" + }, + "argonianveteran": { + "creators": "blackmarshwarden", + "name": "Argonian Veteran", + "cost": "3", + "type": "Creature", + "race": "Argonian", + "attack": "3", + "health": "3", + "rarity": "Common", + "keyword": "", + "text": "" + }, + "coloviantrooper": { + "creators": "midnightsweep, generaltullius, alanddivided", + "name": "Colovian Trooper", + "cost": "2", + "type": "Creature", + "race": "Imperial", + "attack": "2", + "health": "2", + "rarity": "Common", + "keyword": "Guard", + "text": "Guard" + }, + "corpsecurse": { + "creators": "bloodmagiclord", + "name": "Corpse Curse", + "cost": "2", + "type": "Action", + "race": "", + "attack": "", + "health": "", + "rarity": "Legendary", + "keyword": "", + "text": "Shackle all enemy creatures in a lane." + }, + "drainlife": { + "creators": "bloodmagiclord", + "name": "Drain Life", + "cost": "2", + "type": "Action", + "race": "", + "attack": "", + "health": "", + "rarity": "Legendary", + "keyword": "", + "text": "Deal 5 damage to your opponent and gain 5 health." + }, + "northpointherald": { + "creators": "northpointcaptain", + "name": "Northpoint Herald", + "cost": "2", + "type": "Creature", + "race": "Breton", + "attack": "0", + "health": "4", + "rarity": "Common", + "keyword": "Guard", + "text": "Guard" + }, + "gargoyle": { + "creators": "bloodmagiclord", + "name": "Gargoyle", + "cost": "2", + "type": "Creature", + "race": "Gargoyle", + "attack": "5", + "health": "5", + "rarity": "Legendary", + "keyword": "Guard", + "text": "Guard" + }, + "raisedead": { + "creators": "bloodmagiclord", + "name": "Raise Dead", + "cost": "2", + "type": "Action", + "race": "", + "attack": "", + "health": "", + "rarity": "Legendary", + "keyword": "", + "text": "Summon a random creature from each discard pile." + }, + "shriveledmummy": { + "creators": "mummify", + "name": "Shriveled Mummy", + "cost": "2", + "type": "Creature", + "race": "Mummy", + "attack": "2", + "health": "2", + "rarity": "Common", + "keyword": "", + "text": "" + }, + "skeleton": { + "creators": "deathlessdraugr, bonecolossus", + "name": "Skeleton", + "cost": "1", + "type": "Creature", + "race": "Skeleton", + "attack": "1", + "health": "1", + "rarity": "Common", + "keyword": "", + "text": "" + } + }, + "neutral": { + "ancientgiant": { + "creators": "desperateconjuring", + "name": "Ancient Giant", + "cost": "14", + "type": "Creature", + "race": "Giant", + "attack": "14", + "health": "14", + "rarity": "Legendary", + "keyword": "", + "text": "" + }, + "steeldagger": { + "creators": "alikrsurvivalist, crownquartermaster, daggersinthedark, corsairship", + "name": "Steel Dagger", + "cost": "1", + "type": "Item", + "race": "", + "attack": "", + "health": "", + "rarity": "Common", + "keyword": "", + "text": "+1/+0" + } + }, + "intelligence": { + "alfefyr": { + "creators": "divaythfyr", + "name": "Alfe Fyr", + "cost": "11", + "type": "Creature", + "race": "Dark Elf", + "attack": "6", + "health": "6", + "rarity": "Legendary", + "keyword": "Summon", + "text": "Summon: Deal 6 damage to a random enemy." + }, + "beytefyr": { + "creators": "divaythfyr", + "name": "Beyte Fyr", + "cost": "11", + "type": "Creature", + "race": "Dark Elf", + "attack": "6", + "health": "6", + "rarity": "Legendary", + "keyword": "Summon", + "text": "Summon: Deal 6 damage to a random enemy." + }, + "deltefyr": { + "creators": "divaythfyr", + "name": "Delte Fyr", + "cost": "11", + "type": "Creature", + "race": "Dark Elf", + "attack": "6", + "health": "6", + "rarity": "Legendary", + "keyword": "Summon", + "text": "Summon: Deal 6 damage to a random enemy." + }, + "flameatronach": { + "creators": "highrocksummoner, magesguildretreat, expertatromancer, supremeatromancer", + "name": "Flame Atronach", + "cost": "4", + "type": "Creature", + "race": "Daedra", + "attack": "5", + "health": "3", + "rarity": "Rare", + "keyword": "Breakthrough", + "text": "Breakthrough" + }, + "frostatronach": { + "creators": "highrocksummoner, bretonconjurer, magesguildretreat", + "name": "Frost Atronach", + "cost": "5", + "type": "Creature", + "race": "Daedra", + "attack": "5", + "health": "5", + "rarity": "Rare", + "keyword": "Guard", + "text": "Guard" + }, + "ironsword": { + "creators": "dunmernightblade", + "name": "Iron Sword", + "cost": "2", + "type": "Item", + "race": "", + "attack": "", + "health": "", + "rarity": "Common", + "keyword": "", + "text": "+2/+0" + }, + "stormatronach": { + "creators": "highrocksummoner, darkrift, magesguildretreat", + "name": "Storm Atronach", + "cost": "6", + "type": "Creature", + "race": "Daedra", + "attack": "7", + "health": "5", + "rarity": "Rare", + "keyword": "Ward", + "text": "Ward" + }, + "sunderedshade": { + "creators": "soulsplit", + "name": "Sundered Shade", + "cost": "2", + "type": "Creature", + "race": "Spirit", + "attack": "3", + "health": "2", + "rarity": "Common", + "keyword": "", + "text": "" + }, + "uupsefyr": { + "creators": "divaythfyr", + "name": "Uupse Fyr", + "cost": "11", + "type": "Creature", + "race": "Dark Elf", + "attack": "6", + "health": "6", + "rarity": "Legendary", + "keyword": "Summon", + "text": "Summon: Deal 6 damage to a random enemy." + } + }, + "willpower": { + "imperialgrunt": { + "creators": "scoutingpatrol, imperialreinforcements, imperialmight, renownedlegate, risinglegate", + "name": "Imperial Grunt", + "cost": "1", + "type": "Creature", + "race": "Imperial", + "attack": "1", + "health": "1", + "rarity": "Common", + "keyword": "", + "text": "" + }, + "youngwolf": { + "creators": "packwolf", + "name": "Young Wolf", + "cost": "1", + "type": "Creature", + "race": "Wolf", + "attack": "1", + "health": "1", + "rarity": "Common", + "keyword": "", + "text": "" + } + } + }, + "fallofthedarkbrotherhood": { + "agility": { + "completedcontract": { + "creators": "astrid, brotherhoodslayer", + "name": "Completed Contract", + "cost": "0", + "type": "Action", + "race": "", + "attack": "", + "health": "", + "rarity": "Common", + "keyword": "", + "text": "Gain 1 magicka this turn." + } + }, + "endurance": { + "agelessvampire": { + "creators": "littlegirl", + "name": "Ageless Vampire", + "cost": "5", + "type": "Creature", + "race": "Vampire", + "attack": "5", + "health": "5", + "rarity": "Rare", + "keyword": "Drain", + "text": "Drain" + } + }, + "intelligence": { + "corsair": { + "creators": "corsairship", + "name": "Corsair", + "cost": "1", + "type": "Creature", + "race": "Breton", + "attack": "1", + "health": "1", + "rarity": "Epic", + "keyword": "", + "text": "" + } + }, + "neutral": { + "makeshiftdefenses": { + "creators": "markedman", + "name": "Makeshift Defenses", + "cost": "0", + "type": "Creature", + "race": "Defense", + "attack": "0", + "health": "2", + "rarity": "Common", + "keyword": "Guard", + "text": "Guard" + }, + "target": { + "creators": "thenightmother", + "name": "Target", + "cost": "1", + "type": "Creature", + "race": "Khajiit", + "attack": "0", + "health": "1", + "rarity": "Common", + "keyword": "Guard", + "text": "Guard" + } + }, + "strength": { + "skeever": { + "creators": "skeeverinfestation", + "name": "Skeever", + "cost": "1", + "type": "Creature", + "race": "Beast", + "attack": "1", + "health": "1", + "rarity": "Common", + "keyword": "", + "text": "" + } + } + }, + "heroesofskyrim": { + "endurance": { + "grandmasterdelphine": { + "creators": "innkeeperdelphine", + "name": "Grandmaster Delphine", + "cost": "3", + "type": "Creature", + "race": "Breton", + "attack": "5", + "health": "5", + "rarity": "Legendary", + "unique": true, + "keyword": "", + "text": "Can't be damaged or targeted by enemy Dragons." + } + } + } +} \ No newline at end of file